Esempio n. 1
0
        private void GetAllBeatMoves(Piece piece, List <BeatedPiece> beatedPieces, int sourceRow, int sourceColumn, int targetRow, int targetColumn, ref List <Move> allMoves, ref int maxBeated)
        {
            if (beatedPieces.Count > maxBeated)
            {
                maxBeated = beatedPieces.Count;
            }
            Piece newPiece = new Piece(targetRow, targetColumn, piece.Color, piece.Size, piece.IsKing);

            if (beatedPieces.Count == maxBeated)
            {
                allMoves.Add(new Move(piece, newPiece, beatedPieces));
            }
            if (CanBeatPiece(newPiece, targetRow - 1, targetColumn - 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(targetRow - 1, targetColumn - 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                if (beatedPieces.Where(p => p.Row == beatedPiece.Row && p.Column == beatedPiece.Column && p.Color == beatedPiece.Color).Count() == 0)
                {
                    List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                    newBeatedPieces.Add(beatedPiece);
                    GetAllBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow - 2, targetColumn - 2, ref allMoves, ref maxBeated);
                }
            }
            if (CanBeatPiece(newPiece, targetRow + 1, targetColumn - 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(targetRow + 1, targetColumn - 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                if (beatedPieces.Where(p => p.Row == beatedPiece.Row && p.Column == beatedPiece.Column && p.Color == beatedPiece.Color).Count() == 0)
                {
                    List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                    newBeatedPieces.Add(beatedPiece);
                    GetAllBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow + 2, targetColumn - 2, ref allMoves, ref maxBeated);
                }
            }
            if (CanBeatPiece(newPiece, targetRow - 1, targetColumn + 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(targetRow - 1, targetColumn + 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                if (beatedPieces.Where(p => p.Row == beatedPiece.Row && p.Column == beatedPiece.Column && p.Color == beatedPiece.Color).Count() == 0)
                {
                    List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                    newBeatedPieces.Add(beatedPiece);
                    GetAllBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow - 2, targetColumn + 2, ref allMoves, ref maxBeated);
                }
            }
            if (CanBeatPiece(newPiece, targetRow + 1, targetColumn + 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(targetRow + 1, targetColumn + 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                if (beatedPieces.Where(p => p.Row == beatedPiece.Row && p.Column == beatedPiece.Column && p.Color == beatedPiece.Color).Count() == 0)
                {
                    List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                    newBeatedPieces.Add(beatedPiece);
                    GetAllBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow + 2, targetColumn + 2, ref allMoves, ref maxBeated);
                }
            }
        }
Esempio n. 2
0
        private void GetAllKingBeatMoves(Piece piece, List <BeatedPiece> beatedPieces, int sourceRow, int sourceColumn, int targetRow, int targetColumn, ref List <Move> allMoves, ref int maxBeated)
        {
            if (beatedPieces.Count > maxBeated)
            {
                maxBeated = beatedPieces.Count;
            }
            Piece newPiece = new Piece(targetRow, targetColumn, piece.Color, piece.Size, piece.IsKing);

            if (beatedPieces.Count == maxBeated)
            {
                allMoves.Add(new Move(piece, newPiece, beatedPieces));
            }
            for (int ind = 1; ind < Size; ind++)
            {
                if (targetRow - sourceRow > 0 && targetColumn - sourceColumn > 0)
                {
                    if (CanMoveToPosition(targetRow + ind, targetColumn + ind, piece.Position))
                    {
                        GetAllKingBeatMoves(piece, new List <BeatedPiece>(beatedPieces), targetRow, targetColumn, targetRow + ind, targetColumn + ind, ref allMoves, ref maxBeated);
                    }
                    else
                    {
                        break;
                    }
                }
                if (targetRow - sourceRow > 0 && targetColumn - sourceColumn < 0)
                {
                    if (CanMoveToPosition(targetRow + ind, targetColumn - ind, piece.Position))
                    {
                        GetAllKingBeatMoves(piece, new List <BeatedPiece>(beatedPieces), targetRow, targetColumn, targetRow + ind, targetColumn - ind, ref allMoves, ref maxBeated);
                    }
                    else
                    {
                        break;
                    }
                }
                if (targetRow - sourceRow < 0 && targetColumn - sourceColumn > 0)
                {
                    if (CanMoveToPosition(targetRow - ind, targetColumn + ind, piece.Position))
                    {
                        GetAllKingBeatMoves(piece, new List <BeatedPiece>(beatedPieces), targetRow, targetColumn, targetRow - ind, targetColumn + ind, ref allMoves, ref maxBeated);
                    }
                    else
                    {
                        break;
                    }
                }
                if (targetRow - sourceRow < 0 && targetColumn - sourceColumn < 0)
                {
                    if (CanMoveToPosition(targetRow - ind, targetColumn - ind, piece.Position))
                    {
                        GetAllKingBeatMoves(piece, new List <BeatedPiece>(beatedPieces), targetRow, targetColumn, targetRow - ind, targetColumn - ind, ref allMoves, ref maxBeated);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            if (!(targetRow - sourceRow > 0 && targetColumn - sourceColumn > 0))
            {
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanBeatPiece(newPiece, targetRow - ind, targetColumn - ind, piece))
                    {
                        BeatedPiece beatedPiece = new BeatedPiece(targetRow - ind, targetColumn - ind, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                        if (beatedPieces.Where(p => p.Position == beatedPiece.Position && p.Color == beatedPiece.Color).Count() == 0)
                        {
                            List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                            newBeatedPieces.Add(beatedPiece);
                            GetAllKingBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow - ind - 1, targetColumn - ind - 1, ref allMoves, ref maxBeated);
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!CanMoveToPosition(targetRow - ind, targetColumn - ind, piece.Position))
                        {
                            break;
                        }
                    }
                }
            }
            if (!(targetRow - sourceRow < 0 && targetColumn - sourceColumn > 0))
            {
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanBeatPiece(newPiece, targetRow + ind, targetColumn - ind, piece))
                    {
                        BeatedPiece beatedPiece = new BeatedPiece(targetRow + ind, targetColumn - ind, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                        if (beatedPieces.Where(p => p.Position == beatedPiece.Position && p.Color == beatedPiece.Color).Count() == 0)
                        {
                            List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                            newBeatedPieces.Add(beatedPiece);
                            GetAllKingBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow + ind + 1, targetColumn - ind - 1, ref allMoves, ref maxBeated);
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!CanMoveToPosition(targetRow + ind, targetColumn - ind, piece.Position))
                        {
                            break;
                        }
                    }
                }
            }
            if (!(targetRow - sourceRow > 0 && targetColumn - sourceColumn < 0))
            {
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanBeatPiece(newPiece, targetRow - ind, targetColumn + ind, piece))
                    {
                        BeatedPiece beatedPiece = new BeatedPiece(targetRow - ind, targetColumn + ind, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                        if (beatedPieces.Where(p => p.Position == beatedPiece.Position && p.Color == beatedPiece.Color).Count() == 0)
                        {
                            List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                            newBeatedPieces.Add(beatedPiece);
                            GetAllKingBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow - ind - 1, targetColumn + ind + 1, ref allMoves, ref maxBeated);
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!CanMoveToPosition(targetRow - ind, targetColumn + ind, piece.Position))
                        {
                            break;
                        }
                    }
                }
            }
            if (!(targetRow - sourceRow < 0 && targetColumn - sourceColumn < 0))
            {
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanBeatPiece(newPiece, targetRow + ind, targetColumn + ind, piece))
                    {
                        BeatedPiece beatedPiece = new BeatedPiece(targetRow + ind, targetColumn + ind, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, targetRow, targetColumn);
                        if (beatedPieces.Where(p => p.Position == beatedPiece.Position && p.Color == beatedPiece.Color).Count() == 0)
                        {
                            List <BeatedPiece> newBeatedPieces = new List <BeatedPiece>(beatedPieces);
                            newBeatedPieces.Add(beatedPiece);
                            GetAllKingBeatMoves(piece, newBeatedPieces, targetRow, targetColumn, targetRow + ind + 1, targetColumn + ind + 1, ref allMoves, ref maxBeated);
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!CanMoveToPosition(targetRow + ind, targetColumn + ind, piece.Position))
                        {
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        private List <Move> GetPawnPossibleMoves(int piecePosition, PieceColor color, ref int maxBeated)
        {
            List <Move> possibleMoves = new List <Move>();
            var         piece         = new Piece(piecePosition, color, Size, false);

            //normalne ruchy do przodu
            if (maxBeated == 0)
            {
                switch (piece.Color)
                {
                case PieceColor.White:
                    if (CanMoveToPosition(piece.Row + 1, piece.Column + 1, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row + 1, piece.Column + 1, PieceColor.White, piece.Size, piece.Row + 1 == Size - 1), null));
                    }
                    if (CanMoveToPosition(piece.Row + 1, piece.Column - 1, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row + 1, piece.Column - 1, PieceColor.White, piece.Size, piece.Row + 1 == Size - 1), null));
                    }
                    break;

                case PieceColor.Black:
                    if (CanMoveToPosition(piece.Row - 1, piece.Column + 1, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row - 1, piece.Column + 1, PieceColor.Black, piece.Size, piece.Row - 1 == 0), null));
                    }
                    if (CanMoveToPosition(piece.Row - 1, piece.Column - 1, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row - 1, piece.Column - 1, PieceColor.Black, piece.Size, piece.Row - 1 == 0), null));
                    }
                    break;
                }
            }
            //próba bicia w czterech różnych kierunkach
            if (CanBeatPiece(piece, piece.Row - 1, piece.Column - 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(piece.Row - 1, piece.Column - 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                GetAllBeatMoves(piece, new List <BeatedPiece>()
                {
                    beatedPiece
                }, piece.Row, piece.Column, piece.Row - 2, piece.Column - 2, ref possibleMoves, ref maxBeated);
            }
            if (CanBeatPiece(piece, piece.Row + 1, piece.Column - 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(piece.Row + 1, piece.Column - 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                GetAllBeatMoves(piece, new List <BeatedPiece>()
                {
                    beatedPiece
                }, piece.Row, piece.Column, piece.Row + 2, piece.Column - 2, ref possibleMoves, ref maxBeated);
            }
            if (CanBeatPiece(piece, piece.Row - 1, piece.Column + 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(piece.Row - 1, piece.Column + 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                GetAllBeatMoves(piece, new List <BeatedPiece>()
                {
                    beatedPiece
                }, piece.Row, piece.Column, piece.Row - 2, piece.Column + 2, ref possibleMoves, ref maxBeated);
            }
            if (CanBeatPiece(piece, piece.Row + 1, piece.Column + 1, piece))
            {
                BeatedPiece beatedPiece = new BeatedPiece(piece.Row + 1, piece.Column + 1, piece.Color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                GetAllBeatMoves(piece, new List <BeatedPiece>()
                {
                    beatedPiece
                }, piece.Row, piece.Column, piece.Row + 2, piece.Column + 2, ref possibleMoves, ref maxBeated);
            }
            return(possibleMoves);
        }
Esempio n. 4
0
        private List <Move> GetKingPossibleMoves(int piecePosition, PieceColor color, ref int maxBeated)
        {
            var         piece         = new Piece(piecePosition, color, Size, true);
            List <Move> possibleMoves = new List <Move>();

            //normalne ruchy w czterech kierunkach aż do napotkania pionka lub końca planszy
            if (maxBeated == 0)
            {
                int pieceRow    = Piece.ToRow(piecePosition, Size);
                int pieceColumn = Piece.ToColumn(piecePosition, Size);

                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanMoveToPosition(pieceRow + ind, pieceColumn + ind, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row + ind, piece.Column + ind, piece.Color, piece.Size, piece.IsKing), null));
                    }
                    else
                    {
                        break;
                    }
                }
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanMoveToPosition(piece.Row + ind, piece.Column - ind, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row + ind, piece.Column - ind, piece.Color, piece.Size, piece.IsKing), null));
                    }
                    else
                    {
                        break;
                    }
                }
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanMoveToPosition(piece.Row - ind, piece.Column + ind, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row - ind, piece.Column + ind, piece.Color, piece.Size, piece.IsKing), null));
                    }
                    else
                    {
                        break;
                    }
                }
                for (int ind = 1; ind < Size; ind++)
                {
                    if (CanMoveToPosition(piece.Row - ind, piece.Column - ind, piecePosition))
                    {
                        possibleMoves.Add(new Move(piece, new Piece(piece.Row - ind, piece.Column - ind, piece.Color, piece.Size, piece.IsKing), null));
                    }
                    else
                    {
                        break;
                    }
                }
            }
            //próba bicia w czterech różnych kierunkach damką
            for (int ind = 1; ind < Size; ind++)
            {
                if (CanBeatPiece(piece, piece.Row - ind, piece.Column - ind, piece))
                {
                    BeatedPiece beatedPiece = new BeatedPiece(piece.Row - ind, piece.Column - ind, color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                    GetAllKingBeatMoves(piece, new List <BeatedPiece>()
                    {
                        beatedPiece
                    }, piece.Row, piece.Column, piece.Row - ind - 1, piece.Column - ind - 1, ref possibleMoves, ref maxBeated);
                }
                else
                {
                    if (!CanMoveToPosition(piece.Row - ind, piece.Column - ind, piecePosition))
                    {
                        break;
                    }
                }
            }
            for (int ind = 1; ind < Size; ind++)
            {
                if (CanBeatPiece(piece, piece.Row + ind, piece.Column - ind, piece))
                {
                    BeatedPiece beatedPiece = new BeatedPiece(piece.Row + ind, piece.Column - ind, color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                    GetAllKingBeatMoves(piece, new List <BeatedPiece>()
                    {
                        beatedPiece
                    }, piece.Row, piece.Column, piece.Row + ind + 1, piece.Column - ind - 1, ref possibleMoves, ref maxBeated);
                }
                else
                {
                    if (!CanMoveToPosition(piece.Row + ind, piece.Column - ind, piecePosition))
                    {
                        break;
                    }
                }
            }
            for (int ind = 1; ind < Size; ind++)
            {
                if (CanBeatPiece(piece, piece.Row - ind, piece.Column + ind, piece))
                {
                    BeatedPiece beatedPiece = new BeatedPiece(piece.Row - ind, piece.Column + ind, color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                    GetAllKingBeatMoves(piece, new List <BeatedPiece>()
                    {
                        beatedPiece
                    }, piece.Row, piece.Column, piece.Row - ind - 1, piece.Column + ind + 1, ref possibleMoves, ref maxBeated);
                }
                else
                {
                    if (!CanMoveToPosition(piece.Row - ind, piece.Column + ind, piecePosition))
                    {
                        break;
                    }
                }
            }
            for (int ind = 1; ind < Size; ind++)
            {
                if (CanBeatPiece(piece, piece.Row + ind, piece.Column + ind, piece))
                {
                    BeatedPiece beatedPiece = new BeatedPiece(piece.Row + ind, piece.Column + ind, color == PieceColor.White ? PieceColor.Black : PieceColor.White, false, piece.Row, piece.Column);
                    GetAllKingBeatMoves(piece, new List <BeatedPiece>()
                    {
                        beatedPiece
                    }, piece.Row, piece.Column, piece.Row + ind + 1, piece.Column + ind + 1, ref possibleMoves, ref maxBeated);
                }
                else
                {
                    if (!CanMoveToPosition(piece.Row + ind, piece.Column + ind, piecePosition))
                    {
                        break;
                    }
                }
            }
            return(possibleMoves);
        }