Получить место короля в шахматной игре

Я пишу простую шахматную игру, в которой есть 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, это разные экземпляры, и вы не прикрепили обработчики событий к правильным.

Другие вопросы по тегам