как решить логическую задачу программирования шахматной фигуры? - PullRequest
0 голосов
/ 26 апреля 2020

В настоящее время я строю игру в шахматы, используя 64 кнопки, выступающие в качестве доски, и, как видно из приведенного ниже, я поместил их в список (перечисленный слева направо и снизу вверх. Например, нижний левый угол - Блок1, Справа внизу - Блок8, слева вверху - Блок57, справа вверху - Блок64), при нажатии на шахматную фигуру блоки, в которые она может переместиться, подписываются на событие нажатия «destination_clicked», так что когда одна кнопка из все потенциальные действительные ходы щелкаются, это переместит часть там.

Основная проблема заключается в том, что я полагался на добавление определенного числа к индексу списка, содержащего кнопки, для определения возможных допустимых ходов фигуры (например, добавление 8 к индексу списка кнопок для перемещения пешки вверх). один квадрат в виде кнопок, один квадрат вверх всегда будет на 8 больше, считая слева направо и снизу вверх).

Однако для всех остальных фигур, которые могут перемещаться по диагонали, таких как Рыцарь и Епископ, их нельзя ограничивать как это как если бы они были у края доски, движения не будут действительными (например, рыцарь обычно может использовать индекс + 6 для перемещения вверх на один и влево на два блока, но если на блоке 17 он просто перемещается вправо от шести до блока 23 и использование индекса - 10 для обычного перемещения одного вниз и двух влево вместо этого сдвинет два вниз и семь вправо для блока 7).

Примечание: если возможно, я бы не хотел слишком сильно менять свой базовый код или используйте любые слишком сложные методы, но все же не стесняйтесь вносить любые предложения.

public void Setpieces()
        {

            for (int i = 0; i < buttons.Count; i++)
            {
                buttons[i].Tag = ChessPiece.None;
            }

            Block16.Tag = ChessPiece.WPawn;
            Block15.Tag = ChessPiece.WPawn;
            Block14.Tag = ChessPiece.WPawn;
            Block13.Tag = ChessPiece.WPawn;
            Block12.Tag = ChessPiece.WPawn;
            Block11.Tag = ChessPiece.WPawn;
            Block10.Tag = ChessPiece.WPawn;
            Block9.Tag = ChessPiece.WPawn;

            Block1.Tag = ChessPiece.WRook;
            Block2.Tag = ChessPiece.WKnight;
            Block3.Tag = ChessPiece.WBishop;
            Block4.Tag = ChessPiece.WQueen;
            Block5.Tag = ChessPiece.WKing;
            Block6.Tag = ChessPiece.WBishop;
            Block7.Tag = ChessPiece.WKnight;
            Block8.Tag = ChessPiece.WRook;

            Block49.Tag = ChessPiece.BPawn;
            Block50.Tag = ChessPiece.BPawn;
            Block51.Tag = ChessPiece.BPawn;
            Block52.Tag = ChessPiece.BPawn;
            Block53.Tag = ChessPiece.BPawn;
            Block54.Tag = ChessPiece.BPawn;
            Block55.Tag = ChessPiece.BPawn;
            Block56.Tag = ChessPiece.BPawn;

            Block57.Tag = ChessPiece.BRook;
            Block58.Tag = ChessPiece.BKnight;
            Block59.Tag = ChessPiece.BBishop;
            Block60.Tag = ChessPiece.BQueen;
            Block61.Tag = ChessPiece.BKing;
            Block62.Tag = ChessPiece.BBishop;
            Block63.Tag = ChessPiece.BKnight;
            Block64.Tag = ChessPiece.BRook;

        }

        static List<Button> buttons = new List<Button>();
        public void ListofBlocks()
        {
            Button[] Blocks =
            {
                    Block1, Block2, Block3, Block4, Block5, Block6, Block7, Block8, Block9, Block10,
                    Block11, Block12, Block13, Block14, Block15, Block16, Block17, Block18, Block19, Block20,
                    Block21, Block22, Block23, Block24, Block25, Block26, Block27, Block28, Block29, Block30,
                    Block31, Block32, Block33, Block34, Block35, Block36, Block37, Block38, Block39, Block40,
                    Block41, Block42, Block43, Block44, Block45, Block46, Block47, Block48, Block49, Block50,
                    Block51, Block52, Block53, Block54, Block55, Block56, Block57, Block58, Block59, Block60,
                    Block61, Block62, Block63, Block64
            };

            buttons.AddRange(Blocks);
        }


        private void ChessBlock_clicked(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < buttons.Count; i++)
            {
                buttons[i].Click -= destination_clicked;
            }

            if (sender is Button btn)
            {

                ChessPiece piece = (ChessPiece)btn.Tag;
                Global.SelectedPiece = piece.ToString();

                int index;
                Button destination = null;

                index = buttons.IndexOf(btn);
                Global.SelectedBtn = buttons[(index) % buttons.Count];

                switch (piece)
                {
                    case ChessPiece.WPawn:
                        textBox3.Text = "W pawn";

                        destination = buttons[(index + 8) % buttons.Count];
                        destination.Click += destination_clicked;

                        break;

                    case ChessPiece.WRook:
                        textBox3.Text = "W Rook";
                        break;

                    case ChessPiece.WBishop:
                        textBox3.Text = "W Bishop";
                        break;

                    case ChessPiece.WQueen:
                        textBox3.Text = "W Queen";
                        break;

                    case ChessPiece.WKnight:
                        textBox3.Text = "W Knight";

                        destination = buttons[(index - 17) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index - 15) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index - 10) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index - 6) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index + 6) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index + 10) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index + 15) % buttons.Count];
                        destination.Click += destination_clicked;
                        destination = buttons[(index + 17) % buttons.Count];
                        destination.Click += destination_clicked;

                        break;

                    case ChessPiece.WKing:
                        textBox3.Text = "W King";

                        break;

                    case ChessPiece.BPawn:
                        textBox3.Text = "B Pawn";

                        destination = buttons[(index - 8) % buttons.Count];
                        destination.Click += destination_clicked;

                        break;

                    case ChessPiece.BRook:
                        textBox3.Text = "B Rook";
                        break;

                    case ChessPiece.BBishop:
                        textBox3.Text = "B Bishop";
                        break;

                    case ChessPiece.BQueen:
                        textBox3.Text = "B Queen";
                        break;

                    case ChessPiece.BKnight:
                        textBox3.Text = "B Knight";
                        break;

                    case ChessPiece.BKing:
                        textBox3.Text = "B King";
                        break;
                }

            }

        }

1 Ответ

0 голосов
/ 26 апреля 2020

Рассмотрим обращение к кнопке в соответствии с двумя числами (столбец, строка).

Вы можете написать функцию, которая достаточно легко преобразует строку, столбец в индекс (row * 8 + column).

Таким образом, вы можете проверить, существует ли конкретная строка / столбец или нет. например, рыцарь, который перемещается от 0,0, может перейти к (1,2) или (2,1), но не к (2, -1) или любой другой паре с отрицательным числом. Аналогично, (7,7) не может перейти к (8,6), поскольку столбец «8» не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...