Получить место короля в шахматной игре
Я пишу простую шахматную игру, в которой есть 3 фигуры, король и королева с одной стороны, а с другой стороны только король, король и королева должны спаривать одного короля с меньшим количеством движений. В этом проекте сначала мы должны получить место одного короля из Пользователь, а затем, в соответствии с тем, что делают другие работы, я хочу знать, как я могу получить от пользователя, в каком месте должен остаться король? Я реализовал форму с 64 pictureboxes.i напишу класс для позиций, большое спасибо
отредактирован:
я написал этот код из ответа г-на Джона Скита: какая у него ошибка? потому что он ничего не делает, когда я нажимаю, спасибо
PictureBox[,] pic = new PictureBox[8, 8];
public PictureBox SetKingImage(int x,int y)
{
pic[x,y].Image=Image.FromFile("pic/siyahsah2.JPG");
return pic[x, y];
}
public void GetClickedPicturebox()
{
int x, y;
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
pic[x, y] = new PictureBox();
pic[x, y].Click += (object sender, System.EventArgs e) =>SetKingImage(x, y);
}
}
}
3 ответа
Простейшим подходом было бы попросить пользователя нажать на соответствующую графическую рамку. Вы можете определить, на какой PictureBox был нажат один из трех способов:
- Подпишитесь, используя один и тот же обработчик событий для каждого PictureBox, но используйте тег внутри PictureBox для получения координат
- Подпишитесь, используя один и тот же обработчик событий для каждого PictureBox, но просто используйте ссылку на PictureBox (
sender
) чтобы найти, какой это был и получить координаты соответственно Подпишитесь, используя лямбда-выражение, которое инкапсулирует позицию, например так:
for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y); } }
Одна из проблем, связанных с последним подходом, заключается в том, что отмена подписки на событие с помощью лямбда-выражения является относительно болезненной - и вы, вероятно, захотите отменить подписку на все обработчики событий при нажатии первой кнопки.
Альтернатива - оставить обработчики событий на месте и игнорировать их, когда это не подходящее время:)
Вот идея, вместо того, чтобы возиться с большим количеством PictureBox.
Создайте UserControl с именем ChessBoardControl
, ChessBoardControl
позаботится о рисовании ChessBoard
объекты, которые ему даны.
в ChessBoardControl
Вы можете переопределить OnMouseDown
событие, а затем из координаты мыши, вы можете легко рассчитать, какой квадрат был нажат.
В вашем новом коде у вас есть два for
циклы повторяются по i и j, но в цикле вы всегда назначаете обработчик событий для pic[x,y].
Таким образом, вы только назначаете обработчик для pic[0,0]. х и у никогда не меняются...
Редактировать:
Честно говоря, я не уверен, что понимаю ваш код. Что ты хотел GetClickedPicturebox
сделать? А когда ты это называешь?
Если вы хотели вызвать его, чтобы получить PictureBox, по которому щелкнули, это неправильно, потому что вы присоединяете обработчики событий к новым экземплярам PictureBox, а не к тем, которые находятся в вашей форме.
Если этот метод был задуман как метод инициализации, то, вероятно, он неправильный, потому что вы просто создаете новые экземпляры PictureBox, но не отображаете их в своей форме. Если в вашей форме есть PictureBox, это разные экземпляры, и вы не прикрепили обработчики событий к правильным.