예제 #1
0
파일: King.cs 프로젝트: Rutakamekiar/Chess
 public King(GameObject figure, Vector2 coords, FigColor color)
     : base(figure, coords, color)
 {
     r1 = Gameplay.keyValuePairs[0, (int)coords.y] as Rook;
     r2 = Gameplay.keyValuePairs[7, (int)coords.y] as Rook;
 }
예제 #2
0
파일: Queen.cs 프로젝트: Rutakamekiar/Chess
 public Queen(GameObject figure, Vector2 coords, FigColor color)
     : base(figure, coords, color)
 {
 }
예제 #3
0
 public Figure(GameObject figure, Vector2 coords, FigColor color)
 {
     this.color = color;
     go         = SpawnFigure(figure, coords);
 }
예제 #4
0
 public Bishop(GameObject figure, Vector2 coords, FigColor color)
     : base(figure, coords, color)
 {
 }
예제 #5
0
 public Knight(GameObject figure, Vector2 coords, FigColor color)
     : base(figure, coords, color)
 {
 }
예제 #6
0
    private void Update()
    {
        //левый клик мыши
        if (Input.GetMouseButtonDown(0))
        {
            //координаты клика
            Vector2 clickWorldPos
                = Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
            //перевод клика в локальные координаты!!!!!
            Vector2 clickLocalPos = GameObject.Find("Game")
                                    .transform.InverseTransformPoint(clickWorldPos);
            //выравнивание clickLocalPos
            clickLocalPos.y = Convert.ToInt32(clickLocalPos.y);
            clickLocalPos.x = Convert.ToInt32(clickLocalPos.x);
            //если нет активной фигуры
            if (!figActivation)
            {
                //находим клетку на доске с координатами клика
                Figure clickedFigure = GetFigureByCoords(clickLocalPos);
                //проверяем содержит ли данная клетка фигуру
                if (clickedFigure is Figure)
                {
                    //проверяем на поочередность фигуры
                    if (clickedFigure.color == nowTurn)
                    {
                        activeFigure = clickedFigure;
                        //записываем в лист возможные хода данной фигуры
                        canMovesList = Aa(activeFigure, ReturnKingByColor(nowTurn));
                        //вывод возможных ходов
                        ShowPossibleMoves(canMovesList);
                        //если данной фигурой можно походить--активация фигуры
                        if (canMovesList.Count != 0)
                        {
                            //делаем выбраную фигуру активной
                            Vector3 thisPosVector = new Vector3(activeFigure.FigCoords.x, activeFigure.FigCoords.y, 1);
                            print(thisPosVector);
                            Instantiate(showThisPos,
                                        GameObject.Find("Game").transform.TransformPoint(thisPosVector),
                                        Quaternion.identity);
                            figActivation = true;
                        }
                    }
                }
            }
            //если активная фигура есть
            else
            {
                //деактивация фигуры при повторном нажатии на неё
                if (clickLocalPos == activeFigure.FigCoords)
                {
                    //очистка списка с возможными ходами
                    canMovesList.Clear();
                    figActivation = false;
                    foreach (GameObject obj in GameObject.FindGameObjectsWithTag("showMoves"))
                    {
                        Destroy(obj);
                    }
                }
                //проверяет есть ли в списке возможных ходов выбранная клетка
                if (canMovesList.Contains(clickLocalPos))
                {
                    //если на выбранной клетке есть вражеская фигура, уничтожить её
                    if (GetFigureByCoords(clickLocalPos) is Figure)
                    {
                        Destroy(GetFigureByCoords(clickLocalPos).go);
                    }
                    if (activeFigure is King)
                    {
                        if ((activeFigure as King).Castling(clickLocalPos))
                        {
                            int  diff        = (int)clickLocalPos.x - (int)activeFigure.FigCoords.x;
                            Rook castledRook = diff > 0 ?
                                               (activeFigure as King).r2 : (activeFigure as King).r1;
                            int rookPos = diff > 0 ?
                                          (int)clickLocalPos.x - 1 : (int)clickLocalPos.x + 1;
                            //обновляем матрицу
                            keyValuePairs[(int)castledRook.FigCoords.x,
                                          (int)castledRook.FigCoords.y] = null;
                            castledRook.FigCoords = new Vector2(rookPos, castledRook.FigCoords.y);
                            keyValuePairs[(int)castledRook.FigCoords.x,
                                          (int)castledRook.FigCoords.y] = castledRook;
                        }
                        (activeFigure as King).canCastling = false;
                    }
                    if (activeFigure is Rook)
                    {
                        (activeFigure as Rook).canCastling = false;
                    }

                    //обновляем матрицу
                    keyValuePairs[(int)clickLocalPos.x, (int)clickLocalPos.y] = activeFigure;
                    keyValuePairs[(int)activeFigure.FigCoords.x,
                                  (int)activeFigure.FigCoords.y] = null;
                    //меняем координаты выбраной фигуры
                    activeFigure.FigCoords = clickLocalPos;
                    if (activeFigure is Pawn && (activeFigure.FigCoords.y == 7 || activeFigure.FigCoords.y == 0))
                    {
                        Destroy(activeFigure.go);

                        keyValuePairs[(int)activeFigure.FigCoords.x, (int)activeFigure.FigCoords.y] =
                            new Queen(queenW, activeFigure.FigCoords, activeFigure.color);
                    }
                    //деативируем фигуру
                    figActivation = false;
                    //удаление возможных ходов
                    foreach (GameObject obj in GameObject.FindGameObjectsWithTag("showMoves"))
                    {
                        Destroy(obj);
                    }
                    //проверка на шах
                    CheckCheck(whiteKing);
                    CheckCheck(blackKing);
                    if (CheckCheckMate(whiteKing))
                    {
                        winnerText.text = "Black win";
                        winPanel.SetActive(true);
                    }
                    else if (CheckCheckMate(blackKing))
                    {
                        winnerText.text = "White win";
                        winPanel.SetActive(true);
                    }
                    //смена очередности фигур
                    if (nowTurn == FigColor.White)
                    {
                        nowTurn          = FigColor.Black;
                        nowTurnText.text = "Black Turn";
                    }
                    else
                    {
                        nowTurn          = FigColor.White;
                        nowTurnText.text = "White Turn";
                    }
                    //очистка списка с возможными ходами
                    canMovesList.Clear();
                }
            }
        }
    }
예제 #7
0
 private King ReturnKingByColor(FigColor color)
 {
     return(color == FigColor.White ? whiteKing : blackKing);
 }