Exemplo n.º 1
0
        private static Move getPossibleMoveAtPos(Board i_Board, int i_X, int i_Y, ePiece i_Piece)
        {
            Move             move       = null;
            List <Direction> directions = new List <Direction>();
            int moveValue = 1;

            if (i_Board[i_X, i_Y] == ePiece.None)
            {
                for (int xDirection = -1; xDirection <= 1; xDirection++)
                {
                    for (int yDirection = -1; yDirection <= 1; yDirection++)
                    {
                        if (isOppositePiece(i_Board, i_X + xDirection, i_Y + yDirection, i_Piece) &&
                            endWithMyPiece(i_Board, i_X + xDirection, i_Y + yDirection, xDirection, yDirection, i_Piece, ref moveValue))
                        {
                            directions.Add(new Direction(xDirection, yDirection));
                        }
                    }
                }
            }

            if (directions.Count > 0)
            {
                move = new Move(i_X, i_Y, directions, moveValue);
            }

            return(move);
        }
Exemplo n.º 2
0
        private void displayGameOverMessage()
        {
            string messageBody;
            ePiece winner = r_GameState.GetWinner();

            if (winner == ePiece.None)
            {
                messageBody = string.Format("Draw!! ({0}/{1}) ({2}/{3}){4}Would you like another round?", r_GameBoard.BlackPoints, r_GameBoard.WhitePoints, r_GameState.BlackTotalWins, r_GameState.WhiteTotalWins, Environment.NewLine);
            }
            else
            {
                messageBody = string.Format("{5} Won!! ({0}/{1}) ({2}/{3}){4}Would you like another round?", r_GameBoard.BlackPoints, r_GameBoard.WhitePoints, r_GameState.BlackTotalWins, r_GameState.WhiteTotalWins, Environment.NewLine, winner);
            }

            DialogResult dialogResult = MessageBox.Show(messageBody, "Othello", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

            if (dialogResult == DialogResult.Yes)
            {
                r_GameState.InitForNewGame();
            }
            else if (dialogResult == DialogResult.No)
            {
                Close();
            }
        }
Exemplo n.º 3
0
        private void setPiece(int i_X, int i_Y, ePiece i_Piece)
        {
            switch (i_Piece)
            {
            case ePiece.Black:
                if (r_GameMatrix[i_X, i_Y] == ePiece.White)
                {
                    m_WhitePoints--;
                }

                m_BlackPoints++;
                break;

            case ePiece.White:
                if (r_GameMatrix[i_X, i_Y] == ePiece.Black)
                {
                    m_BlackPoints--;
                }

                m_WhitePoints++;
                break;
            }

            r_GameMatrix[i_X, i_Y] = i_Piece;
            OnBoardChanged(i_X, i_Y);
        }
Exemplo n.º 4
0
 public static void ExcecuteMove(Board i_Board, Move i_NextMove, ePiece i_CurrentPlayerPiece)
 {
     i_Board[i_NextMove.X, i_NextMove.Y] = i_CurrentPlayerPiece;
     foreach (Direction direction in i_NextMove.Directions)
     {
         turnPieces(i_Board, i_NextMove.X + direction.X, i_NextMove.Y + direction.Y, direction.X, direction.Y, i_CurrentPlayerPiece);
     }
 }
Exemplo n.º 5
0
 private static void turnPieces(Board i_Board, int i_X, int i_Y, int i_XDirection, int i_YDirection, ePiece i_CurrentPlayerPiece)
 {
     while (i_Board[i_X, i_Y] != i_CurrentPlayerPiece)
     {
         i_Board[i_X, i_Y] = i_CurrentPlayerPiece;
         i_X += i_XDirection;
         i_Y += i_YDirection;
     }
 }
Exemplo n.º 6
0
        private void switchTurn()
        {
            m_CurrentPlayer = m_CurrentPlayer == ePiece.White ? ePiece.Black : ePiece.White;

            if (PlayerTurnChanged != null)
            {
                PlayerTurnChanged.Invoke();
            }
        }
Exemplo n.º 7
0
        public static Move FindBestMove(List <Move> i_PossibleMoves, ePiece i_Piece, Board i_Board, int i_Depth)
        {
            int? bestMoveValue = null;
            Move bestMove      = null;

            foreach (Move move in i_PossibleMoves)
            {
                int currentMoveValue = recursiveMove(move, i_Piece, i_Board, i_Depth);
                if (bestMoveValue == null || currentMoveValue > bestMoveValue)
                {
                    bestMove      = move;
                    bestMoveValue = currentMoveValue;
                }
            }

            return(bestMove);
        }
Exemplo n.º 8
0
        private static int myPoints(Board i_Board, ePiece i_Piece)
        {
            int points = 0;

            switch (i_Piece)
            {
            case ePiece.Black:
                points = i_Board.BlackPoints;
                break;

            case ePiece.White:
                points = i_Board.WhitePoints;
                break;
            }

            return(points);
        }
Exemplo n.º 9
0
        public static List <Move> GetPossibleMoves(Board i_Board, ePiece i_Piece)
        {
            List <Move> possibleMoves = new List <Move>();

            for (int x = 0; x < i_Board.Size; x++)
            {
                for (int y = 0; y < i_Board.Size; y++)
                {
                    Move move = getPossibleMoveAtPos(i_Board, x, y, i_Piece);
                    if (move != null)
                    {
                        possibleMoves.Add(move);
                    }
                }
            }

            return(possibleMoves);
        }
Exemplo n.º 10
0
        private static int recursiveMove(Move i_Move, ePiece i_Piece, Board i_Board, int i_Depth)
        {
            Board newBoard = i_Board.GetCopy();

            GameLogic.ExcecuteMove(newBoard, i_Move, i_Piece);
            ePiece oppositePiece = GameLogic.GetOppositePiece(i_Piece);

            if (i_Depth != 0)
            {
                List <Move> newPossibleMoves = GameLogic.GetPossibleMoves(newBoard, oppositePiece);
                Move        bestMove         = FindBestMove(newPossibleMoves, oppositePiece, newBoard, i_Depth - 1);
                if (bestMove != null)
                {
                    GameLogic.ExcecuteMove(newBoard, bestMove, oppositePiece);
                }
            }

            return(myPoints(newBoard, i_Piece) - myPoints(newBoard, oppositePiece));
        }
Exemplo n.º 11
0
        private static bool isOppositePiece(Board i_Board, int i_X, int i_Y, ePiece i_Piece)
        {
            bool isOpposite = true;

            if (!i_Board.IsInBounds(i_X, i_Y))
            {
                isOpposite = false;
            }
            else if (i_Board[i_X, i_Y] == ePiece.None)
            {
                isOpposite = false;
            }
            else if (i_Board[i_X, i_Y] == i_Piece)
            {
                isOpposite = false;
            }

            return(isOpposite);
        }
Exemplo n.º 12
0
        public static ePiece GetOppositePiece(ePiece i_Piece)
        {
            ePiece oppositePiece;

            switch (i_Piece)
            {
            case ePiece.Black:
                oppositePiece = ePiece.White;
                break;

            case ePiece.White:
                oppositePiece = ePiece.Black;
                break;

            default:
                oppositePiece = ePiece.None;
                break;
            }

            return(oppositePiece);
        }
Exemplo n.º 13
0
        private static bool endWithMyPiece(Board i_Board, int i_X, int i_Y, int i_XDirection, int i_YDirection, ePiece i_Piece, ref int io_Value)
        {
            bool hasEncounteredMyPiece = false;
            int  flippedPieces         = 0;

            while (i_Board.IsInBounds(i_X, i_Y))
            {
                if (i_Board[i_X, i_Y] == ePiece.None)
                {
                    break;
                }

                if (i_Board[i_X, i_Y] == i_Piece)
                {
                    hasEncounteredMyPiece = true;
                    io_Value += flippedPieces;
                    break;
                }

                i_X += i_XDirection;
                i_Y += i_YDirection;
                flippedPieces++;
            }

            return(hasEncounteredMyPiece);
        }
Exemplo n.º 14
0
 public GameState(int i_BoardSize, bool i_IsTwoPlayers)
 {
     r_Board         = new Board(i_BoardSize);
     r_IsTwoPlayers  = i_IsTwoPlayers;
     m_CurrentPlayer = ePiece.White;
 }