Algorithm is supposed to choose a move based on it's evaluated score but the algorithm rather chooses incrementing values of available slots.
public string Human = "O";
public string Computer = "X";
PlayerMove player = new PlayerMove();
ComputerMove ai = new ComputerMove();
static void Main(string[] args)
{
Program program = new Program();
program.PrintBoard();
program.startGame();
}
void startGame()
{
string turn = "Computer";
while (EmptySquares() != 0 && Winner() == " ")
{
if (turn == "Computer")
{
string[] cloneBoard = (string[])RealBoard.Clone();
int ComputerPick = ai.GetMove(cloneBoard);
RealBoard[ComputerPick] = Computer;
PrintBoard();
turn = "Human";
}
else if (turn == "Human")
{
int HumanMove = player.GetMove(RealBoard);
RealBoard[HumanMove - 1] = Human;
PrintBoard();
turn = "Computer";
}
}
if (EmptySquares() == 0)
{
Console.WriteLine("Tie!");
}
else if (Winner() == "X")
{
Console.WriteLine("X Wins!");
}
else if (Winner() == "O")
{
Console.WriteLine("O Wins");
}
}
int EmptySquares()
{
int Counter = 0;
for (int i = 0; i < 9; i++)
{
if (RealBoard[i] == " ")
{
Counter++;
}
}
return Counter;
}
string Winner()
{
if (RealBoard[0] == RealBoard[1] && RealBoard[1] == RealBoard[2])
{
return RealBoard[0];
}
if (RealBoard[3] == RealBoard[4] && RealBoard[4] == RealBoard[5])
{
return RealBoard[3];
}
if (RealBoard[6] == RealBoard[7] && RealBoard[7] == RealBoard[8])
{
return RealBoard[6];
}
if (RealBoard[0] == RealBoard[3] && RealBoard[3] == RealBoard[6])
{
return RealBoard[0];
}
if (RealBoard[1] == RealBoard[4] && RealBoard[4] == RealBoard[7])
{
return RealBoard[1];
}
if (RealBoard[2] == RealBoard[5] && RealBoard[5] == RealBoard[8])
{
return RealBoard[2];
}
if (RealBoard[0] == RealBoard[4] && RealBoard[4] == RealBoard[8])
{
return RealBoard[0];
}
if (RealBoard[2] == RealBoard[4] && RealBoard[4] == RealBoard[6])
{
return RealBoard[2];
}
return " ";
}
void PrintBoard()
{
for (int i = 0; i < 9; i++)
{
if (RealBoard[i] == " ")
{
Console.Write(" ");
}
else if (RealBoard[i] == "X")
{
Console.Write("X");
}
else if (RealBoard[i] == "O")
{
Console.Write("O");
}
if (i == 0 || i == 3 || i == 6 || i == 1 | i == 4 | i == 7)
{
Console.Write(" | ");
}
if (i == 2 || i == 5)
{
Console.WriteLine("");
}
}
Console.WriteLine("");
Console.WriteLine("");
}
Above is the code that is inside the game class that calls the computer class to calculate a move
public int GetMove(string[] board)
{
int Move = -1;
Console.WriteLine("Make a move:");
Move = Int32.Parse(Console.ReadLine());
if (board[Move - 1] != " ")
{
GetMove(board);
}
return Move;
}
This is already working code from inputting the user's choice of move
class ComputerMove
{
public string Human = "O";
public string Computer = "X";
public int GetMove(string[] board)
{
int Move = 0;
int bestScore = -800;
for (int i = 0; i < 9; i++)
{
if (board[i] == " ")
{
board[i] = Computer;
int score = minimax(board, 0 , false);
if (score > bestScore)
{
bestScore = score;
Move = i;
}
}
}
return Move;
}
int minimax(string[] board, int depth, Boolean isMaximize)
{
int score;
var result = checkWinner(board, "X");
if (checkWinner(board, Computer))
{
return 1;
} else if (checkWinner(board, Human))
{
return -1;
} else if (checkDraw(board))
{
return 0;
}
if (isMaximize == true)
{
int maxEval = -800;
for (int i = 0; i < 9; i++)
{
if (board[i] == " ")
{
board[i] = Computer;
score = minimax(board, depth + 1, false);
if (score > maxEval)
{
maxEval = score;
}
}
}
return maxEval;
} else
{
int minEval = 800;
for (int i = 0; i < 9; i++)
{
if (board[i] == " ")
{
board[i] = Human;
score = minimax(board, depth + 1, true);
if (score < minEval)
{
minEval = score;
}
}
}
return minEval;
}
}
Boolean checkWinner(string[] board, string Letter)
{
string winner = "";
if (board[0] == board[1] && board[1] == board[2] && board[0] == Letter)
{
return true;
}
if (board[3] == board[4] && board[4] == board[5] && board[3] == Letter)
{
return true;
}
if (board[6] == board[7] && board[7] == board[8] && board[6] == Letter)
{
return true;
}
if (board[0] == board[3] && board[3] == board[6] && board[0] == Letter)
{
return true;
}
if (board[1] == board[4] && board[4] == board[7] && board[1] == Letter)
{
return true;
}
if (board[2] == board[5] && board[5] == board[8] && board[2] == Letter)
{
return true;
}
if (board[0] == board[4] && board[4] == board[8] && board[0] == Letter)
{
return true;
}
if (board[2] == board[4] && board[4] == board[6] && board[2] == Letter)
{
return true;
}
return false;
}
Boolean checkDraw(string[] board)
{
int Counter = 0;
for (int i = 0; i < 9; i++)
{
if (board[i] == " ")
{
return false;
}
}
return true;
}
}
This is the code that is supposed to evaluate each possible moving using minimax, if you find any problems could you let me know?