public int makeMove(int r, int q) { int win = -1; int rChecker = r + fieldRadius; int qChecker = q + fieldRadius; //Radius check if (rChecker >= 20 || qChecker >= 20 || rChecker <= -1 || qChecker <= -1) { return(win); } if (myField[r + fieldRadius, q + fieldRadius] != 3 && myField[r + fieldRadius, q + fieldRadius] != 4) { //Invalid move! -> not playable return(win); } else { if (black) { myField[r + fieldRadius, q + fieldRadius] = 1; Console.WriteLine("SET POS: " + (r + fieldRadius) + " ; " + (q + fieldRadius) + " set to black"); } else { myField[r + fieldRadius, q + fieldRadius] = 2; Console.WriteLine("SET POS: " + (r + fieldRadius) + " ; " + (q + fieldRadius) + " set to red"); } //remove last recommendation removeMoves(4); //Check the field for possible moves myField = checkPosMoves(myField); CheckWin check = new CheckWin(this); //Check for winner win = check.checkWin(myField); //Next players turn! black = !black; if (win == 1 || win == 2) { removeMoves(3); } //Make a deep copy int[,] bufferField = myField.Clone() as int[, ]; //add move to moveList moveList.Add(bufferField); moveCounter++; return(win); } }
public int alphaBeta(Move move, int[,] scoreField, int depth, int alpha, int beta, bool black) { //first check for win int win = check.checkWin(scoreField); if (win == 1) { return(2000); } if (win == 2) { return(-2000); } //depth = 0 --> evaluate position if (depth == 0) { return(evalPos(scoreField)); } //return evalPos(scoreField); //Console.WriteLine("checking move: " + (move.r +fieldRadius) + ";" + (move.q + fieldRadius)); if (black) { scoreField = map.checkPosMoves(scoreField); //get all new possible moves List <Move> posAB = map.getPosMoves(scoreField); int maxEval = -9999; int eval = 0; for (int i = 0; i < posAB.Count; i++) { Move bufferMove = posAB.ElementAt(i); //Make a deep copy int[,] bufferField = new int[20, 20]; bufferField = scoreField.Clone() as int[, ]; //set the new possible move bufferField[bufferMove.r + fieldRadius, bufferMove.q + fieldRadius] = 1; eval = alphaBeta(bufferMove, bufferField, depth - 1, alpha, beta, false); //Console.WriteLine("Move: " + (bufferMove.r + fieldRadius) + " ; " + (bufferMove.q + fieldRadius) + " " + eval) maxEval = Math.Max(maxEval, eval); //alphaBeta alpha = Math.Max(alpha, eval); if (beta <= alpha) { break; } } return(maxEval); } else { scoreField = map.checkPosMoves(scoreField); //get all new possible moves List <Move> posAB = map.getPosMoves(scoreField); int minEval = 9999; int eval = 0; for (int i = 0; i < posAB.Count; i++) { Move bufferMove = posAB.ElementAt(i); //Make a deep copy int[,] bufferField = new int[20, 20]; bufferField = scoreField.Clone() as int[, ]; //set the new possible move bufferField[bufferMove.r + fieldRadius, bufferMove.q + fieldRadius] = 2; eval = alphaBeta(bufferMove, bufferField, depth - 1, alpha, beta, true); minEval = Math.Min(minEval, eval); //alphaBeta beta = Math.Min(beta, eval); if (beta <= alpha) { break; } } return(minEval); } }