QuantumNova Ответов: 1

Как я могу ссылаться на источник фонового изображения кнопки и конвертировать его в переменную


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

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

private void ChessBlock_clicked(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            var piece = btn.Background;

            if (piece == "/Assets/WhitePawn.png")
            {
              // patterns
            }
            if (piece == "/Assets/WhiteKnight.png")
            {
               // patterns
            }

        }

1 Ответов

Рейтинг:
11

OriginalGriff

Не.
Вместо этого создайте перечисление:

private enum ChessPiece
    {
    Pawn = 1,
    Rook = 2,
    Knight = 3,
    Bishop = 4,
    Queen = 5,
    King = 6,
    Black = 16,
    White = 0,
    }
и назначьте значение части кнопке.Поле тегов.
Затем вы можете получить тип фрагмента и сравнить его с помощью оператора switch или if, или ...
private void ChessBlock_clicked(object sender, RoutedEventArgs e)
    {
    if (sender is Button btn)
        {
        ChessPiece piece = (ChessPiece)btn.Tag;
        switch (piece & ~ChessPiece.Black)
            {
            case ChessPiece.Pawn:
                // ...
                break;
            case ChessPiece.Rook:
                // ...
                break;
            // ...
            }
И ваш код становится легче читать, и гораздо менее подвержен ошибкам.


QuantumNova

Большое спасибо. Это очень помогло прояснить ситуацию :)

OriginalGriff

Всегда пожалуйста!

QuantumNova

Привет, все шло хорошо, но после некоторого тестирования я обнаружил некоторые проблемы. во-первых, не могли бы вы объяснить, что я поместил бы в тег, как я обнаружил, когда я помещаю числа, такие как 1, 2 и 3, чтобы загнать их в соответствующие части, которые он говорит мне, что я не могу преобразовать из строки в перечисление, во-вторых, не могли бы вы объяснить, что на самом деле делает "if (sender is Button btn)"? и также, как сторона в оба "(кусок &амп; ~фишка.Черный)", когда вы ссылаетесь только на один тип фигуры в футлярах. Извините, что беспокою вас, и большое спасибо.

OriginalGriff

Почему вы вставляете строки в тег? просто введите значение enum!

Button blackKing = new Button();
blackKing.Tag = ChessPiece.Black | ChessPiece.King;

If проверяет, если sender является кнопкой, и если да, то присваивает ее переменной Button, называемой btn.

Значение переключателя простое: ~шахматная доска.Черный инвертирует все биты в Черном значении перечисления и двоичном файле и удаляет все следы цвета из peice (так что вам не нужно проверять наличие черного и белого отдельно)

QuantumNova

хорошо, хорошо, большое спасибо, что вы мне очень помогли :)