Esempio n. 1
0
        //
        // Main move function
        //
        internal void MovePiece(object sender, MouseEventArgs e, bool attack = false)
        {
            isCheck = false;
            //
            // Get vars + Positions
            //
            PictureBox box = (PictureBox)sender;
            TableLayoutPanelCellPosition pos    = playBoard.GetPositionFromControl(box);
            TableLayoutPanelCellPosition selpos = selectedPiece.pos;
            //
            // Passant check before move
            //
            bool ep = false;

            if (box.Name.Contains("DEL") &&
                selectedPiece.pieceRank == Rank.PAWN &&
                pos.Column != selpos.Column)
            {
                ep     = true;
                attack = true;
                playBoard.Controls.Remove
                    (playBoard.GetControlFromPosition
                        (pos.Column, selpos.Row));
            }
            //
            // Move the piece.
            //
            playBoard.Controls.Remove(box);
            playBoard.Controls.Add(selectedPiece.box, pos.Column, pos.Row);
            //
            // Pawn checks
            //
            foreach (ChessPiece pc in Calcs.pieces)
            {
                if (pc.isWhite == selectedPiece.isWhite)
                {
                    pc.PassElig = false;
                }
            }
            if (selectedPiece.pieceRank == Rank.PAWN)
            {
                if (Math.Abs(selpos.Row - pos.Row) == 2)
                {
                    selectedPiece.PassElig = true;
                }
                selectedPiece.canDouble = false;

                if (selectedPiece.CheckPromote())
                {
                    promPiece = selectedPiece;
                    Spr       = selectedPiece.isWhite ? WPr : BPr;
                    foreach (Button b in Spr)
                    {
                        b.Visible = true;
                    }
                    notifBoard.Visible = true;
                }
            }
            //
            // Remove temp boxes
            //
            ClearTempBoxes();
            //
            // Change turn text
            //
            whiteTurn = !whiteTurn;
            if (whiteTurn)
            {
                turnbox.Text = "WHITE";
            }
            else
            {
                turnbox.Text = "BLACK";
            }
            isMoving = false;
            //
            // Get check
            //
            List <ChessPiece> isCheckL = Calcs.CheckCheck(whiteTurn);

            checkingPieces = isCheckL;
            bool isCheckB = isCheckL.Count != 0;

            isCheck = isCheckB;
            //
            // Get CM
            //
            bool ifMoves = Calcs.NMCheck(whiteTurn, isCheckL);

            if (!ifMoves)
            {
                // Game is over
                isOver             = true;
                notifBoard.Visible = true;
                winText.Visible    = true;
                turnbox.Visible    = false;
                turntext.Visible   = false;
                replay.Visible     = true;

                // Find Checkmate/Stalemate
                if (isCheckB)
                {
                    winText.Text = whiteTurn ? "BLACK WINS!" : "WHITE WINS!";
                }
                else
                {
                    winText.Text = "STALEMATE!";
                }
            }

            // Update moves
            string[]      lines    = GetMoveText(attack, selpos, selectedPiece, isCheckB, !ifMoves, ep);
            List <string> boxLines = moves.Lines.ToList();

            if (boxLines.Count != 0)
            {
                string last = boxLines[boxLines.Count - 1];
                if (!last.Contains(' '))
                {
                    last += (' ' + lines[0]);
                    boxLines[boxLines.Count - 1] = last;
                }
                else
                {
                    boxLines = boxLines.Concat(lines).ToList();
                }
                moves.Lines = boxLines.ToArray();
            }
            else
            {
                moves.Lines = lines;
            }

            //
            // Clear selected piece
            //
            selectedPiece = null;
        }