Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 public void RemovePawn()
 {
     _state    = TileStateEnum.Empty;
     Pawn.Fill = Brushes.Transparent;
 }
Esempio n. 4
0
 public void PutWhite()
 {
     _state    = TileStateEnum.White;
     Pawn.Fill = Brushes.White;
 }
Esempio n. 5
0
 public void PutBlack()
 {
     _state    = TileStateEnum.Black;
     Pawn.Fill = Brushes.Black;
 }
Esempio n. 6
0
        public Tile()
        {
            InitializeComponent();

            _state = TileStateEnum.Empty;
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        public static int PlacePawn(TileStateEnum[][] board, TileStateEnum pawnColor, int x, int y)
        {
            board[x][y] = pawnColor;

            return(FlipPawns(board, pawnColor, x, y));
        }
Esempio n. 9
0
        //[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());
        }
Esempio n. 10
0
        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;
        }