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); }
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(); } }
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); }
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); } }
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; } }
private void switchTurn() { m_CurrentPlayer = m_CurrentPlayer == ePiece.White ? ePiece.Black : ePiece.White; if (PlayerTurnChanged != null) { PlayerTurnChanged.Invoke(); } }
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); }
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); }
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); }
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)); }
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); }
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); }
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); }
public GameState(int i_BoardSize, bool i_IsTwoPlayers) { r_Board = new Board(i_BoardSize); r_IsTwoPlayers = i_IsTwoPlayers; m_CurrentPlayer = ePiece.White; }