Ejemplo n.º 1
0
        /// <summary>
        /// специальная функция, которая нужна для рассчета ИИ в отдельном потоке
        /// полностью заведует взаимодействием с ИИ и запускается в отдельном потоке
        /// </summary>
        public void AIRun()
        {
            _AIProcessing = true;
            Move BestMove = AI.Processing(_MainBoard);

            _MainBoard = Board.DoMove(_MainBoard, BestMove);                      //делаем ход

            bool CheckCheck = Board.CheckCheck(_MainBoard, _MainBoard.NextColor); //проверим ход на шах

            if (CheckCheck)
            {
                bool CheckMate = Board.CheckMate(_MainBoard);//проверим ход на мат
                if (CheckMate)
                {
                    VisualBoard.CheckMate(_MainBoard.NextColor);
                    VisualBoard.DrawVisualBoard(this, _MainBoard);//перерисовываем доску
                    return;
                }
            }
            VisualBoard.DrawVisualBoard(this, _MainBoard);                         //перерисовываем доску
            VisualBoard.DrawVisualBoardEnemyMoved(this, _MainBoard, BestMove.XY2); //нарисуем доступные ходы

            _AIProcessing = false;
        }
Ejemplo n.º 2
0
        private void Picture_Click(object sender, EventArgs e)
        {
            if (_AIProcessing == true)
            {
                return;
            }                                    //ИИ обсчитывает свой ход

            Point point   = this.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y));
            int   CursorX = point.X;
            int   CursorY = point.Y;

            Move[] Moves;

            if ((CursorX < 0) | (CursorX > 800) | (CursorY < 0) | (CursorY > 800))
            {
                return;
            }          //пользователь жмет не на доску

            int row      = (int)Math.Floor((double)CursorY / 100);
            int column   = (int)Math.Floor((double)CursorX / 100);
            XY  FigureXY = new XY(row, column);

            if (!_activatedFigure)//игрок еще не тронул фигуру
            {
                Cell Chosen = _MainBoard.BoardArr[row, column];

                if (Chosen == Cell.Empty)
                {
                    return;
                }                                                                   //просто нажал на пустую клетку

                if (_MainBoard.NextColor == Color.White)                            //если ходит белый игрок
                {
                    if ((Chosen == Cell.WhitePawn) | (Chosen == Cell.WhiteKnight) | //если мы выбрали свою фигуру
                        (Chosen == Cell.WhiteBishop) | (Chosen == Cell.WhiteRook) |
                        (Chosen == Cell.WhiteQueen) | (Chosen == Cell.WhiteKing))
                    {
                        XY        kingXY        = _MainBoard.WhiteFigures.King;
                        FiguresXY enemyFigures  = _MainBoard.BlackFigures;
                        Move      enemyLastMove = _MainBoard.LastMove;

                        //найдем все ходы тронутой фигуры:
                        Moves = Board.FindCellMoves(FigureXY, _MainBoard, _MainBoard.NextColor, kingXY, enemyFigures, enemyLastMove);
                        if (Moves.Length == 0)
                        {
                            return;
                        }
                        _activatedFigure = true;                                                           //игрок тронул фигуру
                        _MovingFigureXY  = FigureXY;                                                       //игрок собирается переместить эту фигуру
                        _AvailableMoves  = Moves;
                        VisualBoard.DrawVisualBoardAvailable(this, _MainBoard, _AvailableMoves, FigureXY); //нарисуем доступные ходы
                    }
                }
                else//Если ходит черный игрок
                {
                    #region Черный игрок

                    /*if ((Chosen == Cell.BlackPawn) | (Chosen == Cell.BlackKnight) |//если мы выбрали свою фигуру
                     *   (Chosen == Cell.BlackBishop) | (Chosen == Cell.BlackRook) |
                     *   (Chosen == Cell.BlackQueen) | (Chosen == Cell.BlackKing))
                     * {
                     *  XY kingXY = _MainBoard.BlackFigures.King;
                     *  FiguresXY enemyFigures = _MainBoard.WhiteFigures;
                     *  Move enemyLastMove = _MainBoard.LastMove;
                     *
                     *  //найдем все ходы тронутой фигуры:
                     *  Moves = Board.FindCellMoves(FigureXY, _MainBoard, _MainBoard.NextColor, kingXY, enemyFigures, enemyLastMove);
                     *  if (Moves.Length == 0) { return; }
                     *  _activatedFigure = true;//игрок тронул фигуру
                     *  _MovingFigureXY = FigureXY;//игрок собирается переместить эту фигуру
                     *  _AvailableMoves = Moves;
                     *  VisualBoard.DrawVisualBoardAvailable(this, _MainBoard, _AvailableMoves, FigureXY);//нарисуем доступные ходы
                     * }*/
                    #endregion
                }
            }
            else//игрок уже активировал фигуру
            {
                int  CountFound = _AvailableMoves.Length;// количество доступных ходов
                Move move       = null;

                for (int i = 0; i < CountFound; i++)
                {
                    if ((FigureXY.r == _AvailableMoves[i].XY2.r) && (FigureXY.c == _AvailableMoves[i].XY2.c))
                    {
                        move = _AvailableMoves[i];
                        break;
                    }
                }

                _activatedFigure = false;//сбрасываем тронутую фигуру
                _AvailableMoves  = new Move[0];

                if (move == null)                                  //пользователь нажал на недоступный ход
                {
                    VisualBoard.DrawVisualBoard(this, _MainBoard); //перерисовываем доску
                    return;
                }

                //пользователь нажал на доступный ход
                _MainBoard = Board.DoMove(_MainBoard, move);                          //делаем ход
                bool CheckMate  = false;
                bool CheckCheck = Board.CheckCheck(_MainBoard, _MainBoard.NextColor); //проверим ход на шах
                if (CheckCheck)
                {
                    CheckMate = Board.CheckMate(_MainBoard);//проверим ход на мат
                    if (CheckMate)
                    {
                        VisualBoard.CheckMate(_MainBoard.NextColor);
                        VisualBoard.DrawVisualBoard(this, _MainBoard);//перерисовываем доску
                        return;
                    }
                }

                VisualBoard.DrawVisualBoard(this, _MainBoard);            //перерисовываем доску

                if (!CheckMate)                                           //если мы не поставили мат, то нужно искать ход противника
                {
                    Thread myThread = new Thread(new ThreadStart(AIRun)); //Создаем новый объект потока (Thread)
                    myThread.Start();                                     //запускаем поток
                }
            }
        }
Ejemplo n.º 3
0
 public Form1()
 {
     InitializeComponent();
     VisualBoard.DrawVisualBoard(this, _MainBoard);
 }