public MinMaxPlayer(int boardSize, TileStateEnum playerColor, AIStrategies strategy, int searchDepth = 4) { _currentBoardState = new TileStateEnum[boardSize][]; for (var i = 0; i < _currentBoardState.Length; i++) { _currentBoardState[i] = new TileStateEnum[boardSize]; for (var j = 0; j < _currentBoardState[i].Length; j++) { _currentBoardState[i][j] = TileStateEnum.Empty; } } _playerColor = playerColor; _searchDepth = searchDepth; CurrentStrategy = strategy; }
static TileStateEnum[][] CopyArrayBuiltIn(TileStateEnum[][] source) { var len = source.Length; var dest = new TileStateEnum[len][]; for (var x = 0; x < len; x++) { var inner = source[x]; var ilen = inner.Length; var newer = new TileStateEnum[ilen]; Array.Copy(inner, newer, ilen); dest[x] = newer; } return(dest); }
public void RemovePawn() { _state = TileStateEnum.Empty; Pawn.Fill = Brushes.Transparent; }
public void PutWhite() { _state = TileStateEnum.White; Pawn.Fill = Brushes.White; }
public void PutBlack() { _state = TileStateEnum.Black; Pawn.Fill = Brushes.Black; }
public Tile() { InitializeComponent(); _state = TileStateEnum.Empty; }
private static int FlipPawns(TileStateEnum[][] board, TileStateEnum pawnColor, int pawnX, int pawnY) { var currentPlayerColor = pawnColor; var enemyPlayerColor = currentPlayerColor == TileStateEnum.Black ? Enums.TileStateEnum.White : Enums.TileStateEnum.Black; var capturedPawns = 0; //W if (pawnX - 2 >= 0) { var currentTile = board[pawnX - 1][pawnY]; var curX = pawnX - 1; var curY = pawnY; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX - 1 < 0) { break; } lastX--; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX - 1 < 0) { break; } curX--; currentTile = board[curX][curY]; } } } //E if (pawnX + 2 < board.Length) { var currentTile = board[pawnX + 1][pawnY]; var curX = pawnX + 1; var curY = pawnY; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX + 1 >= board.Length) { break; } lastX++; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX + 1 >= board.Length) { break; } curX++; currentTile = board[curX][curY]; } } } //N if (pawnY - 2 >= 0) { var currentTile = board[pawnX][pawnY - 1]; var curX = pawnX; var curY = pawnY - 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastY - 1 < 0) { break; } lastY--; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curY - 1 < 0) { break; } curY--; currentTile = board[curX][curY]; } } } //S if (pawnY + 2 < board.Length) { var currentTile = board[pawnX][pawnY + 1]; var curX = pawnX; var curY = pawnY + 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastY + 1 >= board.Length) { break; } lastY++; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curY + 1 >= board.Length) { break; } curY++; currentTile = board[curX][curY]; } } } //NW if (pawnX - 2 >= 0 && pawnY - 2 >= 0) { var currentTile = board[pawnX - 1][pawnY - 1]; var curX = pawnX - 1; var curY = pawnY - 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX - 1 < 0 || lastY - 1 < 0) { break; } lastX--; lastY--; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX - 1 < 0 || curY - 1 < 0) { break; } curX--; curY--; currentTile = board[curX][curY]; } } } //NE if (pawnX + 2 < board.Length && pawnY - 2 >= 0) { var currentTile = board[pawnX + 1][pawnY - 1]; var curX = pawnX + 1; var curY = pawnY - 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX + 1 >= board.Length || lastY - 1 < 0) { break; } lastX++; lastY--; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX + 1 >= board.Length || curY - 1 < 0) { break; } curX++; curY--; currentTile = board[curX][curY]; } } } //SE if (pawnX + 2 < board.Length && pawnY + 2 < board.Length) { var currentTile = board[pawnX + 1][pawnY + 1]; var curX = pawnX + 1; var curY = pawnY + 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX + 1 >= board.Length || lastY + 1 >= board.Length) { break; } lastX++; lastY++; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX + 1 >= board.Length || curY + 1 >= board.Length) { break; } curX++; curY++; currentTile = board[curX][curY]; } } } //SW if (pawnX - 2 >= 0 && pawnY + 2 < board.Length) { var currentTile = board[pawnX - 1][pawnY + 1]; var curX = pawnX - 1; var curY = pawnY + 1; var lastTileInSequence = currentTile; var lastX = pawnX; var lastY = pawnY; while (lastTileInSequence == enemyPlayerColor) { if (lastX - 1 < 0 || lastY + 1 >= board.Length) { break; } lastX--; lastY++; lastTileInSequence = board[lastX][lastY]; } if (lastTileInSequence == currentPlayerColor) { while (currentTile == enemyPlayerColor) { board[curX][curY] = currentTile == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; capturedPawns++; if (curX - 1 < 0 || curY + 1 >= board.Length) { break; } curX--; curY++ ; currentTile = board[curX][curY]; } } } return(capturedPawns); }
public static int PlacePawn(TileStateEnum[][] board, TileStateEnum pawnColor, int x, int y) { board[x][y] = pawnColor; return(FlipPawns(board, pawnColor, x, y)); }
//[ThreadStatic] //private static List<PawnLightModel> __possibleMovesCache; //static ReversiHelpers() //{ // __possibleMovesCache = new List<PawnLightModel>(); //} public static PawnLightModel[] GetPossiblePawnPlacements(TileStateEnum[][] gameState, TileStateEnum playerColor) { var enemyPlayerColor = playerColor == TileStateEnum.Black ? TileStateEnum.White : TileStateEnum.Black; var currentPlayerTiles = new List <PawnLightModel>(gameState.Length * gameState.Length); for (var i = 0; i < gameState.Length; i++) { for (var j = 0; j < gameState[i].Length; j++) { if (gameState[i][j] == playerColor) { currentPlayerTiles.Add(new PawnLightModel { State = gameState[i][j], X = i, Y = j }); } } } var possibleMoves = new HashSet <PawnLightModel>(); foreach (var tile in currentPlayerTiles) { //W if (tile.X - 2 >= 0) { var curX = tile.X - 1; var curY = tile.Y; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX >= 0) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX--; if (curX < 0) { break; } currentTile = gameState[curX][curY]; } } //E if (tile.X + 2 < gameState.Length) { var curX = tile.X + 1; var curY = tile.Y; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX < gameState.Length) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX++; if (curX >= gameState.Length) { break; } currentTile = gameState[curX][curY]; } } //N if (tile.Y - 2 >= 0) { var curX = tile.X; var curY = tile.Y - 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curY >= 0) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curY--; if (curY < 0) { break; } currentTile = gameState[curX][curY]; } } //S if (tile.Y + 2 < gameState.Length) { var curX = tile.X; var curY = tile.Y + 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curY < gameState.Length) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curY++; if (curY >= gameState.Length) { break; } currentTile = gameState[curX][curY]; } } //NW if (tile.X - 2 >= 0 && tile.Y - 2 >= 0) { var curX = tile.X - 1; var curY = tile.Y - 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX >= 0 && curY >= 0) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX--; curY--; if (curX < 0 || curY < 0) { break; } currentTile = gameState[curX][curY]; } } //NE if (tile.X + 2 < gameState.Length && tile.Y - 2 >= 0) { var curX = tile.X + 1; var curY = tile.Y - 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX < gameState.Length && curY >= 0) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX++; curY--; if (curX >= gameState.Length || curY < 0) { break; } currentTile = gameState[curX][curY]; } } //SE if (tile.X + 2 < gameState.Length && tile.Y + 2 < gameState.Length) { var curX = tile.X + 1; var curY = tile.Y + 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX < gameState.Length && curY < gameState.Length) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX++; curY++; if (curX >= gameState.Length || curY >= gameState.Length) { break; } currentTile = gameState[curX][curY]; } } //SW if (tile.X - 2 >= 0 && tile.Y + 2 < gameState.Length) { var curX = tile.X - 1; var curY = tile.Y + 1; var currentTile = gameState[curX][curY]; var isTileInBetween = false; while (curX >= 0 && curY < gameState.Length) { if (!isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { break; } if (!isTileInBetween && currentTile == enemyPlayerColor) { isTileInBetween = true; } if (isTileInBetween && currentTile == Enums.TileStateEnum.Empty) { possibleMoves.Add(new PawnLightModel { State = currentTile, X = curX, Y = curY }); break; } if (isTileInBetween && currentTile == playerColor) { break; } curX--; curY++; if (curX < 0 || curY >= gameState.Length) { break; } currentTile = gameState[curX][curY]; } } } foreach (var move in possibleMoves) { move.State = playerColor; } return(possibleMoves.ToArray()); }
internal BoardStateEnum MakeMove(BoardStateEnum bs, ref int rowPicked, ref int colPicked, Tile[,] Board) { BoardStateEnum rbs = bs; if (bs == BoardStateEnum.Normal) { if (State == TileStateEnum.Filled) { State = TileStateEnum.Picked; rowPicked = m_row; colPicked = m_col; rbs = BoardStateEnum.Picked; } } else { switch (State) { case TileStateEnum.Blocked: break; // Not allowed case TileStateEnum.Filled: break; // Not allowed case TileStateEnum.Picked: // Dropping it back { State = TileStateEnum.Filled; rowPicked = -1; colPicked = -1; rbs = BoardStateEnum.Normal; break; } case TileStateEnum.Empty: // We need to check if dropping here is allowed { if ((m_row == rowPicked) && (Math.Abs(m_col - colPicked) == 2) && (Board[m_row, (m_col + colPicked) / 2].State == TileStateEnum.Filled) ) { State = TileStateEnum.Filled; Board[m_row, (m_col + colPicked) / 2].State = TileStateEnum.Empty; } if ((m_col == colPicked) && (Math.Abs(m_row - rowPicked) == 2) && (Board[(m_row + rowPicked) / 2, m_col].State == TileStateEnum.Filled) ) { State = TileStateEnum.Filled; Board[(m_row + rowPicked) / 2, m_col].State = TileStateEnum.Empty; } if (State == TileStateEnum.Filled) { Board[rowPicked, colPicked].State = TileStateEnum.Empty; rowPicked = -1; colPicked = -1; rbs = BoardStateEnum.Normal; } break; } default: // Do nothing break; } } return rbs; }