QuantumNova Ответов: 1

Почему этот случай активизируется, когда он не должен этого делать?


Привет, я очень запутался в этом вопросе. ниже приведен мой код, есть два оператора switch, которые активируются в зависимости от установленных тегов для кнопок. Однако при нажатии кнопки, имеющей метки "белый" и "пешка", корпус для "черного" и "пешка" также активируется поверх предполагаемого корпуса по какой-то неизвестной причине. Но при нажатии на кнопку Черной пешки обратного хода не происходит. Я что-то упустил?



Для контекста: шахматная партия. 64 кнопки в шахматной сетке, считая слева направо, снизу вверх, например) нижний левый угол-Блок1, нижний правый - Блок8, верхний левый блок 57. IsEnable имеет значение false, чтобы указать мне, куда части могут пойти в данный момент. при нажатии на белую пешку плитки выше и ниже становятся отключенными. при нажатии на Черную пешку отключается только нижняя плитка

Что я уже пробовал:

private enum ChessPiece
        {
            Pawn = 1,
            Rook = 2,
            Knight = 3,
            Bishop = 4,
            Queen = 5,
            King = 6,
            Black = 16,
            White = 0,
        }

        public void Setpieces()
        {
            Block16.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block15.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block14.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block13.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block12.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block11.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block10.Tag = ChessPiece.White | ChessPiece.Pawn;
            Block9.Tag = ChessPiece.White | ChessPiece.Pawn;

            Block1.Tag = ChessPiece.White | ChessPiece.Rook;
            Block2.Tag = ChessPiece.White | ChessPiece.Knight;
            Block3.Tag = ChessPiece.White | ChessPiece.Bishop;
            Block4.Tag = ChessPiece.White | ChessPiece.Queen;
            Block5.Tag = ChessPiece.White | ChessPiece.King;
            Block6.Tag = ChessPiece.White | ChessPiece.Bishop;
            Block7.Tag = ChessPiece.White | ChessPiece.Knight;
            Block8.Tag = ChessPiece.White | ChessPiece.Rook;

            Block49.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block50.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block51.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block52.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block53.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block54.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block55.Tag = ChessPiece.Black | ChessPiece.Pawn;
            Block56.Tag = ChessPiece.Black | ChessPiece.Pawn;

            Block57.Tag = ChessPiece.Black | ChessPiece.Rook;
            Block58.Tag = ChessPiece.Black | ChessPiece.Knight;
            Block59.Tag = ChessPiece.Black | ChessPiece.Bishop;
            Block60.Tag = ChessPiece.Black | ChessPiece.Queen;
            Block61.Tag = ChessPiece.Black | ChessPiece.King;
            Block62.Tag = ChessPiece.Black | ChessPiece.Bishop;
            Block63.Tag = ChessPiece.Black | ChessPiece.Knight;
            Block64.Tag = ChessPiece.Black | ChessPiece.Rook;

        }


        private void ChessBlock_clicked(object sender, RoutedEventArgs e)
        {
            List<Button> buttons = new List<Button>
            {
                    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
            };

            if (sender is Button btn)
            {

                ChessPiece piece = (ChessPiece)btn.Tag;

                switch (piece & ~ChessPiece.White)
                {
                    case ChessPiece.Pawn:
                        textBox3.Text = "W pawn";
                        int index = buttons.IndexOf(btn);
                        Button destination = buttons[(index + 8) % buttons.Count];
                        destination.Tag += "active";
                        destination.IsEnabled = false;
                        break;

                    // cases for other white pieces
                }

                switch (piece & ~ChessPiece.Black)
                {
                    case ChessPiece.Pawn:
                        textBox3.Text = "B Pawn";
                        int index = buttons.IndexOf(btn);
                        Button destination = buttons[(index - 8) % buttons.Count];
                        destination.Tag += "active";
                        destination.IsEnabled = false;

                        break;

                    // cases for other black pieces
                }
            }

        }

Richard MacCutchan

Вы можете избавиться от всех этих фиксированных меток, используя 2D-массив для платы.

1 Ответов

Рейтинг:
8

Tomas Takac

Вы смешиваете битовые флаги с обычными перечислениями. Также концептуально вы смешиваете части с цветами. Чтобы ваш кейс работал вам нужно извлечь кусок и цвет отдельно от тега:

var tag = (ChessPiece)btn.Tag;
var piece =(tag & (ChessPiece)7); // 7 is fake enum value to mask the lower 3 bits
var color = (tag & ChessPiece.Black); // this will translate to proper enum values as White=0

Но все это довольно банально - вы эксплуатируете благожелательное отношение C# к перечислениям. Я бы предложил вам разделить информацию на две части (кусок и цвет) и иметь объект с двумя свойствами для ее представления. Я предполагаю, что вы можете хранить любой объект в теге.