示例#1
0
        /// <summary>
        /// Makes the move and draws a shape, depending which player made the move
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <param name="value"></param>
        public void MakeMove(int X, int Y, Tile.TileValue value)
        {
            // if the game hasnt been won yet...
            if (Winner == null)
            {
                // who is in turn
                if (PlayerTurn == 0)
                {
                    drawing.DrawCross(Gameboard.getboard()[X, Y].Panel);
                }
                else
                {
                    drawing.DrawCircle(Gameboard.getboard()[X, Y].Panel);
                }

                // set the state of board
                SetBoardState(X, Y, value);

                // switch players
                SwitchPlayerTurn();

                if (AutomaticWinLose)
                {
                    PredictMove();
                }
            }
        }
示例#2
0
 /// <summary>
 /// Set the tile value at [X, Y] to given value
 /// </summary>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <param name="value"></param>
 public void SetBoardState(int x, int y, Tile.TileValue value)
 {
     // check if empty, add value if empty
     if (Board[x, y].Value == Tile.TileValue.NaN)
     {
         Board[x, y].Value = value;
     }
 }
示例#3
0
        /// <summary>
        /// Smart function that returns true
        /// <para> if a winning move is present on the current layout </para>
        /// <para> if a losing move is present on the current layout </para>
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private bool CheckWinningMove(int x, int y, Tile.TileValue value)
        {
            // same code as in the setboardstate function, apart from removed saves
            bool Winner = false;
            int  n      = 3;

            Tile[,] board = Gameboard.getboard();

            if (board[x, y].Value == Tile.TileValue.NaN)
            {
                board[x, y].Value = value;
            }

            for (int i = 0; i < n; i++)
            {
                if (board[x, i].Value != value)
                {
                    break;
                }
                if (i == n - 1)
                {
                    Winner = true;
                }
            }

            for (int i = 0; i < n; i++)
            {
                if (board[i, y].Value != value)
                {
                    break;
                }
                if (i == n - 1)
                {
                    Winner = true;
                }
            }

            if (x == y)
            {
                for (int i = 0; i < n; i++)
                {
                    if (board[i, i].Value != value)
                    {
                        break;
                    }
                    if (i == n - 1)
                    {
                        Winner = true;
                    }
                }
            }

            if (x + y == n - 1)
            {
                for (int i = 0; i < n; i++)
                {
                    if (board[i, (n - 1) - i].Value != value)
                    {
                        break;
                    }
                    if (i == n - 1)
                    {
                        Winner = true;
                    }
                }
            }

            //IMPORTANT!!!! revert changes
            //Because when dealing with a 2D array, the copy is only a "shallow" copy, so whenever you modify the contents of copy
            //it also modifies the contents of original array
            board[x, y].Value = Tile.TileValue.NaN;
            return(Winner);
        }
示例#4
0
        /// <summary>
        /// Set the tile value at [X, Y] to given value
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="value"></param>
        public void SetBoardState(int x, int y, Tile.TileValue value)
        {
            bool Winner = false;
            int  n      = Gameboard.getboard().GetLength(0);

            moveCount++;

            Gameboard.SetBoardState(x, y, value);

            //Game Win-conditions ->

            //check column
            for (int i = 0; i < n; i++)
            {
                if (Gameboard.getboard()[x, i].Value != value)
                {
                    break;
                }

                // if hasn't triggered break so far, means all horizontal tiles have been of same value so far...
                if (i == n - 1)
                {
                    // -> Means we have a WINNER !
                    Winner = true;

                    // Add all current panels to a list
                    List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>();
                    for (int p = 0; p < n; p++)
                    {
                        WinningPanels.Add(Gameboard.getboard()[x, p].Panel);
                    }

                    // send the list as array and draw a line showing what line won
                    drawing.DrawHorizontalLine(WinningPanels.ToArray());
                }
            }

            //check row
            for (int i = 0; i < n; i++)
            {
                if (Gameboard.getboard()[i, y].Value != value)
                {
                    break;
                }
                if (i == n - 1)
                {
                    Winner = true;
                    List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>();
                    for (int p = 0; p < n; p++)
                    {
                        WinningPanels.Add(Gameboard.getboard()[p, y].Panel);
                    }
                    drawing.DrawVerticalLine(WinningPanels.ToArray());
                }
            }

            //check diagonal
            if (x == y)
            {
                for (int i = 0; i < n; i++)
                {
                    if (Gameboard.getboard()[i, i].Value != value)
                    {
                        break;
                    }
                    if (i == n - 1)
                    {
                        Winner = true;
                        List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>();
                        for (int p = 0; p < n; p++)
                        {
                            WinningPanels.Add(Gameboard.getboard()[p, p].Panel);
                        }
                        drawing.DrawDiagonalLine(WinningPanels.ToArray());
                    }
                }
            }

            // check antidiagonal (the other way than regular diagonal)
            if (x + y == n - 1)
            {
                for (int i = 0; i < n; i++)
                {
                    // Thanks to a helper in stackoverflow for the -> [i, (n - 1) - i]
                    if (Gameboard.getboard()[i, (n - 1) - i].Value != value)
                    {
                        break;
                    }
                    if (i == n - 1)
                    {
                        Winner = true;
                        List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>();
                        for (int p = 0; p < n; p++)
                        {
                            WinningPanels.Add(Gameboard.getboard()[p, (n - 1) - p].Panel);
                        }
                        drawing.DrawAntiDiagonalLine(WinningPanels.ToArray());
                    }
                }
            }


            //check draw, if movecount is same as for eg. 3^2 = 9, and winner is not true
            if (moveCount == (Math.Pow(n, 2)) && Winner != true)
            {
                this.Winner = "Draw";
                Over        = true;
            }

            // check if winner is true
            if (Winner == true)
            {
                Over = true;

                // set the winner as the winning tile value
                this.Winner = Players.FirstOrDefault(X => X.PlayerTile == value).PlayerTile.ToString();

                // add 5 experience for the winner, remove 5 from loser
                Players.FirstOrDefault(X => X.PlayerTile == value).AddExperiencePoints(5);
                Players.FirstOrDefault(X => X.PlayerTile != value).AddExperiencePoints(-5);

                SaveGame(Players.FirstOrDefault(X => X.PlayerTile == value).Name, Players.FirstOrDefault(X => X.PlayerTile != value).Name);
            }
        }