Пример #1
0
 public int MakeTurn(Connect4Board b)
 {
     int depth = 5;
     if (round >= 25) depth = 7;
     else if (round >= 32) depth = 100;
     double max = -10000.0;
     int bestMoveSoFar = 0;
     for (int i = 0; i < b.GetNrColumns(); i++)
     {
         if (b.IsValidMove(i))
         {
             Connect4Board testBoard = new Connect4Board(b);
             testBoard.AddDisc(i, botId);
             double moveScore = AlphaBeta(testBoard, depth, -100000.0, 100000.0, false);
             //DisplayScore(moveScore, i);
             if (moveScore > max)
             {
                 max = moveScore;
                 bestMoveSoFar = i;
             }
         }
     }
     //b.DisplayBoard();
     return bestMoveSoFar;
 }
Пример #2
0
 public double AlphaBeta(Connect4Board oldBoard, int depth, double alpha, double beta, bool player)
 {
     if ((depth == 0) || (CheckForWin(oldBoard) != 0 || CheckForDraw(oldBoard)))
     {
         return Score(oldBoard);
     }
     if (player)
     {
         double val = -10000.0;
         for (int i = 0; i < oldBoard.GetNrColumns(); i++)
         {
             if (oldBoard.IsValidMove(i))
             {
                 Connect4Board newBoard = new Connect4Board(oldBoard);
                 newBoard.AddDisc(i, botId);
                 val = Math.Max(val, gamma * AlphaBeta(newBoard, depth-1, alpha, beta, !player));
                 alpha = Math.Max(alpha, val);
                 if (beta <= alpha) break;
             }
         }
         return alpha;
     }
     else
     {
         double val = 10000.0;
         for (int i = 0; i < oldBoard.GetNrColumns(); i++)
         {
             if (oldBoard.IsValidMove(i))
             {
                 Connect4Board newBoard = new Connect4Board(oldBoard);
                 newBoard.AddDisc(i, botId);
                 val = Math.Min(val, gamma * AlphaBeta(newBoard, depth-1, alpha, beta, !player));
                 beta = Math.Min(val, beta);
                 if (beta <= alpha) break;
             }
         }
         return beta;
     }
 }
Пример #3
0
 public int MakeTurn(Connect4Board b)
 {
     double max = -10000.0;
     int bestMoveSoFar = 0;
     for (int i = 0; i < b.GetNrColumns(); i++)
     {
         if (b.IsValidMove(i))
         {
             Connect4Board testBoard = new Connect4Board(b);
             testBoard.AddDisc(i, botId);
             double moveScore = AlphaBeta(testBoard, depth, -10000.0, 10000.0, false);
             if (moveScore > max)
             {
                 max = moveScore;
                 bestMoveSoFar = i;
             }
         }
     }
     return bestMoveSoFar;
 }
Пример #4
0
 public Connect4Board(Connect4Board oldBoard)
 {
     cols = oldBoard.GetNrColumns();
     rows = oldBoard.GetNrRows();
     board = new int[cols, rows];
     for (int i = 0; i < cols; i++)
     {
         for (int j = 0; j < rows; j++)
         {
             board[i, j] = oldBoard.GetDisc(i, j);
         }
     }
 }
Пример #5
0
        public int CheckForWin(Connect4Board b)
        {
            int piece;
            //Checking vertically
            for (int i = 0; i < b.GetNrColumns(); i++)
            {
                for (int j = 0; j < b.GetNrRows()-3; j++)
                {
                    if ((piece = b.GetDisc(i, j)) != 0)
                    {
                        if (piece == b.GetDisc(i, j+1))
                        {
                            if (piece == b.GetDisc(i, j+2))
                            {
                                if (piece == b.GetDisc(i, j+3)) return piece;

                                else j += 2;
                            }
                            else j += 1;
                        }
                    }
                }
            }
            //Checking horizontally
            for (int j = 0; j < b.GetNrRows(); j++)
            {
                for (int i = 0; i < b.GetNrColumns()-3; i++)
                {
                    if ((piece = b.GetDisc(i, j)) != 0)
                    {
                        if (piece == b.GetDisc(i+1, j))
                        {
                            if (piece == b.GetDisc(i+2, j))
                            {
                                if (piece == b.GetDisc(i+3, j)) return piece;

                                else i += 2;
                            }
                            else i += 1;
                        }
                    }
                }
            }

            //Checking diagonally
            for (int i = 0; i < b.GetNrColumns()-3; i++)
            {
                for (int j = 0; j < b.GetNrRows()-3; j++)
                {
                    if ((piece = b.GetDisc(i, j)) != 0)
                    {
                        if (piece == b.GetDisc(i + 1, j + 1) && piece == b.GetDisc(i + 2, j + 2) && piece == b.GetDisc(i + 3, j + 3)) return piece;
                    }
                    if ((piece = b.GetDisc(i+3, j)) != 0)
                    {
                        if (piece == b.GetDisc(i + 2, j + 1) && piece == b.GetDisc(i + 1, j + 2) && piece == b.GetDisc(i, j + 3)) return piece;
                    }
                }
            }
            return 0;
        }
Пример #6
0
 public bool CheckForDraw(Connect4Board b)
 {
     for (int i = 0; i < b.GetNrColumns(); i++)
     {
         if (b.IsValidMove(i)) return false;
     }
     return true;
 }
Пример #7
0
        public double EvalBoardPosition(Connect4Board b)
        {
            double accumScore = 0.0;

            //Vertical
            for (int i = 0; i < b.GetNrColumns(); i++)
            {
                for (int j = 0; j < b.GetNrRows()-3; j++)
                {
                    accumScore += EvalSingle(b, i, j, 0, 1, botId);
                    accumScore -= EvalSingle(b, i, j, 0, 1, 3 - botId);
                }
            }

            //Horizontal
            for (int j = 0; j < b.GetNrRows(); j++)
            {
                for (int i = 0; i < b.GetNrColumns()-3; i++)
                {
                    accumScore += EvalSingle(b, i, j, 1, 0, botId);
                    accumScore -= EvalSingle(b, i, j, 1, 0, 3 - botId);
                }
            }

            for (int i = 0; i < b.GetNrColumns()-3; i++)
            {
                for (int j = 0; j < b.GetNrRows()-3; j++)
                {
                    accumScore += EvalSingle(b, i, j, 1, 1, botId);
                    accumScore -= EvalSingle(b, i, j, 1, 1, 3 - botId);
                    accumScore += EvalSingle(b, i + 3, j, -1, 1, botId);
                    accumScore -= EvalSingle(b, i + 3, j, -1, 1, 3 - botId);
                }
            }

            return accumScore;
        }