Ejemplo n.º 1
0
        public static void AddChildren(BoardTree node, string player)
        {
            if (node.endState == false)
            {
                bool emtpySpaces = false;
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        if (node.Board[i, j] != "X" && node.Board[i, j] != "O")
                        {
                            BoardTree newchild = new BoardTree((string[, ])node.Board.Clone());
                            newchild.Board[i, j] = player;
                            //newchild.plays = node.plays +1;
                            node.AddChild(newchild, i, j, node.plays);
                            if (debug == true)
                            {
                                Console.WriteLine(newchild);
                                Console.WriteLine($"win: {newchild.winner.ToString()} . Endstate {newchild.endState.ToString()} Plays: {newchild.plays}");
                                Console.ReadLine();
                            }
                            emtpySpaces = true;
                            AddChildren(newchild, player == "X"?"O":player == "O"?"X":player);
                        }
                    }
                }


                if (emtpySpaces == false)
                {
                    node.endState = true;
                    node.winner   = 0;
                }
            }
        }
Ejemplo n.º 2
0
 private void Setwinner(BoardTree board, int row, int column)
 {
     if (board.Board[row, column] == "X")
     {
         board.winner = 100;
     }
     if (board.Board[row, column] == "O")
     {
         board.winner = -100;
     }
     board.endState = true;
 }
Ejemplo n.º 3
0
 public void AddChild(BoardTree node, int row, int column, int plays)
 {
     this.Children.Add(node);
     node.CheckWin(row, column);
     node.plays  = plays + 1;
     node.parent = this;
     if (node.winner != 0)
     {
         node.numChild = 1;
         node.winValue = node.winner;
         node.SetWinStats();
     }
     if (node.plays == 9)
     {
         node.endState = true;
         node.SetWinStats();
     }
 }
Ejemplo n.º 4
0
        public static BoardTree AddMove(BoardTree currentBoard, string enteredPosition)
        {
            bool canConvert = int.TryParse(enteredPosition, out int enteredNum);

            if (canConvert == true)
            {
                if (enteredNum > 0 && enteredNum < 10)
                {
                    int    row      = (enteredNum - 1) / 3;
                    int    column   = (enteredNum - (row * 3)) - 1;
                    string existing = currentBoard.Board[row, column];
                    if (existing != "X" && existing != "O")
                    {
                        currentBoard.Board[row, column] = currentPlayer;
                        SwitchPlayer();
                    }
                }
            }
            return(currentBoard);
        }
Ejemplo n.º 5
0
        private void SetWinStats()
        {
            if (this.parent != null)
            {
                BoardTree parent = this.parent;
                if (this.winner != 0)
                {
                    parent.nextMoveWin = true;
                }

                /*
                 * else
                 * {
                 *  parent.nextMoveWin = false;
                 * }
                 */
                parent.winValue = (((parent.winValue * parent.Children.Count)) + this.winValue) / (parent.Children.Count + 1);
                //parent.numChild += 1;
                parent.SetWinStats();
            }
        }
Ejemplo n.º 6
0
        static void Main(string[] args)
        {
            //Declares a 3x3 array for the board.
            //Any given position in the board can be accessed by the x,y coordiantes IE: tickTacToeBoard[1,2]

            /*
             * string[,] tickTacToeBoard = new string[3, 3];
             *
             * ResetBoard(tickTacToeBoard);
             *
             *
             *
             * PrintBoard(tickTacToeBoard);
             * Console.ReadLine();
             */

            //this section is for testing
            BoardTree allBoards    = new BoardTree();
            BoardTree currentBoard = new BoardTree();

            ResetBoard(allBoards.Board);
            ResetBoard(currentBoard.Board);
            AddChildren(allBoards, "X");
            currentPlayer = "X";
            bool humanTurn = true;

            while (currentBoard.endState == false)
            {
                Console.Clear();
                PrintBoard(currentBoard.Board);
                Console.WriteLine($"win: {currentBoard.winner.ToString()} . Endstate {currentBoard.endState.ToString()} Plays: {currentBoard.plays} WinValue: {currentBoard.winValue}");
                //this loop is used to troubleshoot what the next move is

                foreach (var nextBoard in currentBoard.Children)
                {
                    Console.WriteLine(nextBoard.winValue.ToString() + nextBoard.nextMoveWin);
                }

                if (humanTurn)
                {
                    Console.Write($"Player {currentPlayer} Enter Position to Play (1-9):");
                    string enteredPosition = Console.ReadLine();
                    currentBoard = AddMove(currentBoard, enteredPosition);
                    foreach (var childBoard in allBoards.Children)
                    {
                        if (childBoard.ToString() == currentBoard.ToString())
                        {
                            currentBoard = childBoard;
                            break;
                        }
                    }

                    allBoards = currentBoard;
                    humanTurn = false;
                }
                else
                {
                    Console.WriteLine("Computers turn, hit enter");
                    Console.ReadLine();
                    decimal   maxwin    = 0;
                    bool      first     = true;
                    BoardTree nextboard = null;
                    foreach (var winmax in allBoards.Children)
                    {
                        if (first == true)
                        {
                            maxwin    = winmax.winValue;
                            nextboard = winmax;
                            first     = false;
                        }
                        if (winmax.nextMoveWin == false)
                        {
                            if (winmax.winValue <= maxwin)
                            {
                                maxwin    = winmax.winValue;
                                nextboard = winmax;
                            }
                            if (winmax.winner == -1)
                            {
                                nextboard = winmax;
                                break;
                            }
                        }
                    }
                    currentBoard = nextboard;
                    allBoards    = currentBoard;
                    humanTurn    = true;
                    SwitchPlayer();
                }
            }

            string winningPlayer = currentPlayer == "X" ? "O" : currentPlayer == "O" ? "X" : currentPlayer;

            Console.Clear();
            Console.WriteLine(currentBoard);
            if (currentBoard.winner != 0)
            {
                Console.WriteLine($"Player {winningPlayer} wins!");
            }
            else
            {
                Console.WriteLine("Stalemate");
            }
            Console.ReadLine();


            /*
             * //Game Loop
             * while (!CheckWinner(tickTacToeBoard))
             * {
             *  Console.Clear();
             *  PrintBoard(tickTacToeBoard);
             *  Console.Write($"Player {currentPlayer} Enter Position to Play (1-9):");
             *  string enteredPosition = Console.ReadLine();// Check the user entered 1-9 and if that space is avaialble then set it to X or Y then check if someone won...
             *  int enteredNum;
             *  bool canConvert = int.TryParse(enteredPosition, out enteredNum);
             *  if (canConvert == true)
             *  {
             *      if (enteredNum > 0 && enteredNum < 10)
             *      {
             *          //Print the board after every turn and swap between X and Y player alternating
             *          int row = (enteredNum - 1) / 3;
             *          int column = (enteredNum - (row * 3)) - 1;
             *          if (tickTacToeBoard[row, column] != "X" && tickTacToeBoard[row, column] != "O")
             *          {
             *              tickTacToeBoard[row, column] = currentPlayer;
             *              if (currentPlayer == "X")
             *              {
             *                  currentPlayer = "O";
             *              }
             *              else if (currentPlayer == "O")
             *              {
             *                  currentPlayer = "X";
             *              }
             *              //PrintBoard(tickTacToeBoard);
             *          }
             *      }
             *  }
             * }
             */
        }