В настоящее время я строю игру в шахматы, используя 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;
}
}
}