Exemple #1
0
    private bool IsAMat(ChessMen k)
    {
        var c = GetKing();

        for (var i = 0; i < 8; i++)
        {
            for (var j = 0; j < 8; j++)
            {
                if (c.ChessMove[i, j] == 1 || c.ChessMove[i, j] == 2)
                {
                    if (!CheckKillInMove(c, i, j))
                    {
                        Debug.Log("Король может уйти от шаха " + i + j);
                        return(false);
                    }
                }
            }
        }

        foreach (var cs in AllChess)
        {
            if (cs.White == WhiteTurn)
            {
                if (CheckKillInPos(cs.gameObject, k.X, k.Y))
                {
                    Debug.Log("Фигура может спасти от шаха " + cs.gameObject);
                    return(false);
                }
            }
        }

        return(true);
    }
Exemple #2
0
    private void SetChessCastling(ChessMen c, ChessMen ck, int x, int y)
    {
        if (y == 7 && c.Type == 5 && ck.Type == 1)
        {
            SetChessPos(c, x, 6, false);
            SetChessPos(ck, x, 5, false);
        }
        else if (y == 0 && c.Type == 5 && ck.Type == 1)
        {
            SetChessPos(c, x, 2, false);
            SetChessPos(ck, x, 3, false);
        }
        else if (y == 4 && c.Type == 1 && ck.Type == 5)
        {
            if (c.Y == 0)
            {
                SetChessPos(c, x, 3, false);
                SetChessPos(ck, x, 2, false);
            }
            else if (c.Y == 7)
            {
                SetChessPos(c, x, 5, false);
                SetChessPos(ck, x, 6, false);
            }
        }

        NextMove();
    }
Exemple #3
0
    private void CheckSahAndMat(ChessMen c)
    {
        if (IsASah(c.gameObject))
        {
            Sah = true;
            if (IsAMat(c))
            {
                Turn.text = WhiteTurn ? "Мат белым" : "Мат черным";
                return;
            }

            Turn.text = WhiteTurn ? "Шах белым" : "Шах черным";
        }
    }
Exemple #4
0
 private void SetChessPos(ChessMen @object, int x, int y, bool cs = true)
 {
     @object.Walked++;
     Sx = @object.X = x;
     Sy = @object.Y = y;
     @object.LastStep = Step;
     @object.transform.SetParent(Board[x, y].transform);
     @object.transform.position = Board[x, y].transform.position;
     if (cs)
     {
         NextMove();
         CheckSahAndMat(@object);
         BotMove();
     }
 }
Exemple #5
0
    private int GetBestChess(ChessMen cb)
    {
        var count = 0;

        for (var i = 0; i < 8; i++)
        {
            for (var j = 0; j < 8; j++)
            {
                if (cb.ChessMove[i, j] == 1)
                {
                    count++;
                }
            }
        }

        return(count);
    }
Exemple #6
0
    private bool CheckKillInMove(ChessMen c, int x, int y)
    {
        c.transform.SetParent(Board[x, y].transform);
        foreach (var cs in AllChess)
        {
            if (cs.White == WhiteTurn)
            {
                continue;
            }
            if (CheckKillInPos(cs.gameObject, x, y))
            {
                c.transform.SetParent(Board[c.X, c.Y].transform);
                return(true);
            }
        }

        c.transform.SetParent(Board[c.X, c.Y].transform);
        return(false);
    }
Exemple #7
0
 private void KillChess(ChessMen c)
 {
     AllChess.Remove(c);
     DestroyImmediate(c.gameObject);
 }
Exemple #8
0
    private ChessMen[] GetBestBot()
    {
        var count        = 0;
        var bestChessMen = new ChessMen[2];

        foreach (var blackChess in AllChess)
        {
            if (blackChess.White)
            {
                continue;
            }
            SelectBotChessMen(blackChess.transform.parent.gameObject);

            if (count < GetBestChess(blackChess))
            {
                count           = GetBestChess(blackChess);
                bestChessMen[0] = blackChess;
                Debug.Log("У "
                          + bestChessMen[0]
                          + " ["
                          + bestChessMen[0].X
                          + ","
                          + bestChessMen[0].Y
                          + "] "
                          + count
                          + " Ходов");
            }
        }

        foreach (var blackChess in AllChess)
        {
            if (blackChess.White)
            {
                continue;
            }
            SelectBotChessMen(blackChess.transform.parent.gameObject);

            foreach (var whiteChess in AllChess)
            {
                if (!whiteChess.White)
                {
                    continue;
                }
                if (!CheckKillInPos(blackChess.gameObject, whiteChess.X, whiteChess.Y))
                {
                    continue;
                }
                if (CheckKillInMove(blackChess, whiteChess.X, whiteChess.Y) &&
                    whiteChess.Type < blackChess.Type)
                {
                    continue;
                }

                if (bestChessMen[1] == null)
                {
                    bestChessMen[1] = whiteChess;
                }

                Debug.Log(bestChessMen[0]
                          + " ["
                          + bestChessMen[0].X
                          + ","
                          + bestChessMen[0].Y
                          + "] "
                          + bestChessMen[0].Type
                          + " Убивает "
                          + bestChessMen[1]
                          + " ["
                          + bestChessMen[1].X
                          + ","
                          + bestChessMen[1].Y
                          + "] "
                          + bestChessMen[1].Type);

                if (bestChessMen[1].Type > whiteChess.Type)
                {
                    continue;
                }

                bestChessMen[0] = blackChess;
                bestChessMen[1] = whiteChess;

                Debug.Log(bestChessMen[0]
                          + " ["
                          + bestChessMen[0].X
                          + ","
                          + bestChessMen[0].Y
                          + "] "
                          + bestChessMen[0].Type
                          + " Убивает лучше "
                          + bestChessMen[1]
                          + " ["
                          + bestChessMen[1].X
                          + ","
                          + bestChessMen[1].Y
                          + "] "
                          + bestChessMen[1].Type);
            }
        }

        return(bestChessMen);
    }
Exemple #9
0
    public byte[,] PossibleMove()
    {
        IsACastling = false;
        ChessMove   = new byte[8, 8];
        var chess = new ChessMen[2];

        switch (Type)
        {
        case 0:     // Пешка
        {
            if (White)
            {
                if (X != 0 && Y != 0)    // Вперед влево
                {
                    chess[0] = OnBoard.Instance.Board[X - 1, Y - 1].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X, Y - 1].GetComponentInChildren <ChessMen>();
                    if (chess[0] != null && White != chess[0].White)
                    {
                        ChessMove[X - 1, Y - 1] = 2;
                    }
                    else if (chess[1] != null &&
                             White != chess[1].White &&
                             chess[1].Walked == 1 &&
                             OnBoard.Instance.Step == chess[1].LastStep + 1)
                    {
                        ChessMove[X - 1, Y - 1] = 2;
                    }
                }

                if (X != 0 && Y != 7)    // Вперед вправо
                {
                    chess[0] = OnBoard.Instance.Board[X - 1, Y + 1].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X, Y + 1].GetComponentInChildren <ChessMen>();
                    if (chess[0] != null && White != chess[0].White)
                    {
                        ChessMove[X - 1, Y + 1] = 2;
                    }
                    else if (chess[1] != null &&
                             White != chess[1].White &&
                             chess[1].Walked == 1 &&
                             OnBoard.Instance.Step == chess[1].LastStep + 1)
                    {
                        ChessMove[X - 1, Y + 1] = 2;
                    }
                }

                if (X != 0 && X != 6)    //Вперед
                {
                    chess[0] = OnBoard.Instance.Board[X - 1, Y].GetComponentInChildren <ChessMen>();
                    if (chess[0] == null)
                    {
                        ChessMove[X - 1, Y] = 1;
                    }
                }
                else if (X == 6)    //Первый ход, два хода вперед
                {
                    chess[0] = OnBoard.Instance.Board[X - 1, Y].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X - 2, Y].GetComponentInChildren <ChessMen>();
                    if (chess[0] == null)
                    {
                        ChessMove[X - 1, Y] = 1;
                    }
                    if (chess[0] == null && chess[1] == null)
                    {
                        ChessMove[X - 2, Y] = 1;
                    }
                }
            }
            else
            {
                if (X != 7 && Y != 0)    // Вперед влево
                {
                    chess[0] = OnBoard.Instance.Board[X + 1, Y - 1].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X, Y - 1].GetComponentInChildren <ChessMen>();
                    if (chess[0] != null && White != chess[0].White)
                    {
                        ChessMove[X + 1, Y - 1] = 2;
                    }
                    else if (chess[1] != null &&
                             White != chess[1].White &&
                             chess[1].Walked == 1 &&
                             OnBoard.Instance.Step == chess[1].LastStep + 1)
                    {
                        ChessMove[X + 1, Y - 1] = 2;
                    }
                }

                if (X != 7 && Y != 7)    // Вперед вправо
                {
                    chess[0] = OnBoard.Instance.Board[X + 1, Y + 1].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X, Y + 1].GetComponentInChildren <ChessMen>();
                    if (chess[0] != null && White != chess[0].White)
                    {
                        ChessMove[X + 1, Y + 1] = 2;
                    }
                    else if (chess[1] != null &&
                             White != chess[1].White &&
                             chess[1].Walked == 1 &&
                             OnBoard.Instance.Step == chess[1].LastStep + 1)
                    {
                        ChessMove[X + 1, Y + 1] = 2;
                    }
                }

                if (X != 7 && X != 1)    //Вперед
                {
                    chess[0] = OnBoard.Instance.Board[X + 1, Y].GetComponentInChildren <ChessMen>();
                    if (chess[0] == null)
                    {
                        ChessMove[X + 1, Y] = 1;
                    }
                }
                else if (X == 1)    //Первый ход, два хода вперед
                {
                    chess[0] = OnBoard.Instance.Board[X + 1, Y].GetComponentInChildren <ChessMen>();
                    chess[1] = OnBoard.Instance.Board[X + 2, Y].GetComponentInChildren <ChessMen>();
                    if (chess[0] == null)
                    {
                        ChessMove[X + 1, Y] = 1;
                    }
                    if (chess[0] == null && chess[1] == null)
                    {
                        ChessMove[X + 2, Y] = 1;
                    }
                }
            }

            break;
        }

        case 1:                             //Ладья
        {
            for (var i = Y + 1; i < 8; i++) //Право
            {
                chess[0] = OnBoard.Instance.Board[X, i].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, i] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[X, i] = 2;
                    }
                    else
                    {
                        if (chess[0].Walked == 0 && chess[0].Type == 5)
                        {
                            ChessMove[X, i] = 1;
                            IsACastling     = true;
                        }
                    }

                    break;
                }
            }

            for (var i = Y - 1; i >= 0; i--)    //Лево
            {
                chess[0] = OnBoard.Instance.Board[X, i].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, i] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[X, i] = 2;
                    }
                    else
                    {
                        if (chess[0].Walked == 0 && chess[0].Type == 5)
                        {
                            ChessMove[X, i] = 1;
                            IsACastling     = true;
                        }
                    }

                    break;
                }
            }

            for (var i = X - 1; i >= 0; i--)    //Верх
            {
                chess[0] = OnBoard.Instance.Board[i, Y].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, Y] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[i, Y] = 2;
                    }
                    break;
                }
            }

            for (var i = X + 1; i < 8; i++)    //Низ
            {
                chess[0] = OnBoard.Instance.Board[i, Y].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, Y] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[i, Y] = 2;
                    }
                    break;
                }
            }

            break;
        }

        case 2:     //Конь
        {
            //верх право 1
            KnightChessMove(X - 1, Y + 2, ref ChessMove);

            //Верх право 2
            KnightChessMove(X - 2, Y + 1, ref ChessMove);

            //Верх лево 1
            KnightChessMove(X - 2, Y - 1, ref ChessMove);

            //Верх лево 2
            KnightChessMove(X - 1, Y - 2, ref ChessMove);

            //низ право 1
            KnightChessMove(X + 2, Y + 1, ref ChessMove);

            //Низ право 2
            KnightChessMove(X + 1, Y + 2, ref ChessMove);

            //низ лево 1
            KnightChessMove(X + 1, Y - 2, ref ChessMove);

            //Низ лево 2
            KnightChessMove(X + 2, Y - 1, ref ChessMove);

            break;
        }

        case 3:                                                       //Слон
        {
            for (int i = X - 1, j = Y + 1; i >= 0 && j < 8; i--, j++) //Вперед вправо
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X - 1, j = Y - 1; i >= 0 && j >= 0; i--, j--)    //Вперед влево
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X + 1, j = Y + 1; i < 8 && j < 8; i++, j++)    //Вниз вправо
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X + 1, j = Y - 1; i < 8 && j >= 0; i++, j--)    //Вниз влево
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            break;
        }

        case 4:                             //Королева
        {
            for (var i = Y + 1; i < 8; i++) //Право
            {
                chess[0] = OnBoard.Instance.Board[X, i].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, i] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[X, i] = 2;
                    }
                    break;
                }
            }

            for (var i = Y - 1; i >= 0; i--)    //Лево
            {
                chess[0] = OnBoard.Instance.Board[X, i].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, i] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[X, i] = 2;
                    }
                    break;
                }
            }

            for (var i = X - 1; i >= 0; i--)    //Верх
            {
                chess[0] = OnBoard.Instance.Board[i, Y].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, Y] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[i, Y] = 2;
                    }
                    break;
                }
            }

            for (var i = X + 1; i < 8; i++)    //Низ
            {
                chess[0] = OnBoard.Instance.Board[i, Y].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, Y] = 1;
                }
                else
                {
                    if (chess[0].White != White)
                    {
                        ChessMove[i, Y] = 2;
                    }
                    break;
                }
            }

            for (int i = X - 1, j = Y + 1; i >= 0 && j < 8; i--, j++)    //Вперед вправо
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X - 1, j = Y - 1; i >= 0 && j >= 0; i--, j--)    //Вперед влево
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X + 1, j = Y + 1; i < 8 && j < 8; i++, j++)    //Вниз вправо
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            for (int i = X + 1, j = Y - 1; i < 8 && j >= 0; i++, j--)    //Вниз влево
            {
                chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[i, j] = 1;
                }
                else
                {
                    if (White != chess[0].White)
                    {
                        ChessMove[i, j] = 2;
                    }
                    break;
                }
            }

            break;
        }

        case 5:     //Король
        {
            //Низ
            int i, j;
            i = X + 1;
            j = Y - 1;
            if (X != 7)
            {
                for (var k = 0; k < 3; k++)
                {
                    if (j >= 0 && j < 8)
                    {
                        chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                        if (chess[0] == null)
                        {
                            ChessMove[i, j] = 1;
                        }
                        else if (White != chess[0].White)
                        {
                            ChessMove[i, j] = 2;
                        }
                    }

                    j++;
                }
            }

            //Верх
            i = X - 1;
            j = Y - 1;
            if (X != 0)
            {
                for (var k = 0; k < 3; k++)
                {
                    if (j >= 0 && j < 8)
                    {
                        chess[0] = OnBoard.Instance.Board[i, j].GetComponentInChildren <ChessMen>();
                        if (chess[0] == null)
                        {
                            ChessMove[i, j] = 1;
                        }
                        else if (White != chess[0].White)
                        {
                            ChessMove[i, j] = 2;
                        }
                    }

                    j++;
                }
            }

            //Лево
            if (Y != 0)
            {
                chess[0] = OnBoard.Instance.Board[X, Y - 1].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, Y - 1] = 1;
                    if ((X == 0 || X == 7) && Y == 4 && Walked == 0)
                    {
                        var c  = OnBoard.Instance.Board[X, Y - 2].GetComponentInChildren <ChessMen>();
                        var c1 = OnBoard.Instance.Board[X, Y - 3].GetComponentInChildren <ChessMen>();
                        chess[0] = OnBoard.Instance.Board[X, Y - 4].GetComponentInChildren <ChessMen>();
                        if (c == null &&
                            c1 == null &&
                            chess[0] != null &&
                            White == chess[0].White &&
                            chess[0].Walked == 0 &&
                            chess[0].Type == 1)
                        {
                            ChessMove[X, Y - 4] = 1;
                            IsACastling         = true;
                        }
                    }
                }
                else if (White != chess[0].White)
                {
                    ChessMove[X, Y - 1] = 2;
                }
            }

            //Право
            if (Y != 7)
            {
                chess[0] = OnBoard.Instance.Board[X, Y + 1].GetComponentInChildren <ChessMen>();
                if (chess[0] == null)
                {
                    ChessMove[X, Y + 1] = 1;
                    if ((X == 0 || X == 7) && Y == 4 && Walked == 0)
                    {
                        var c = OnBoard.Instance.Board[X, Y + 2].GetComponentInChildren <ChessMen>();
                        chess[0] = OnBoard.Instance.Board[X, Y + 3].GetComponentInChildren <ChessMen>();
                        if (c == null &&
                            chess[0] != null &&
                            White == chess[0].White &&
                            chess[0].Walked == 0 &&
                            chess[0].Type == 1)
                        {
                            ChessMove[X, Y + 3] = 1;
                            IsACastling         = true;
                        }
                    }
                }
                else if (White != chess[0].White)
                {
                    ChessMove[X, Y + 1] = 2;
                }
            }

            break;
        }
        }

        return(ChessMove);
    }
Exemple #10
0
    //public byte[,] ChessMovePrevious = new byte[8, 8];
    //public byte[,] ChessMoveNext = new byte[8, 8];
    // 0 - Хода нет
    // 1 - Есть ход
    // 2 - Может убить

    private void Awake() => Instance = this;