получить место короля в шахматной игре - PullRequest
0 голосов
/ 06 декабря 2010

я пишу простую шахматную игру, в которой есть 3 фигуры, король и королева с одной стороны, а с другой стороны только король, король и королева должны спаривать одного короля с меньшим количеством движений. В этом проекте сначала мы должны получить место Один король от пользователя, а затем, согласно тому, что делают другие работы, я хочу знать, как я могу получить от пользователя, в каком месте должен оставаться король? Я реализовал форму с 64 картинками. Я напишу класс для позиций, большое спасибо

отредактирован:

я написал этот код из ответа мистера Джона Скита: какая ошибка у него? потому что он ничего не делает, когда я нажимаю, спасибо

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 ]

3 голосов
/ 06 декабря 2010

Вот идея, вместо того, чтобы возиться с большим количеством PictureBoxes.

Создайте UserControl с именем ChessBoardControl.ChessBoardControl позаботится о рисовании ChessBoard объектов, которые ему даны.

В ChessBoardControl вы можете переопределить событие OnMouseDown, а затем из координаты мыши вы можетелегко рассчитать, на какой квадрат нажали.

3 голосов
/ 06 декабря 2010

Самый простой подход - попросить пользователя нажать на соответствующую графическую рамку.Вы можете определить, на какой 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);
        }
    }
    

Одна проблема с последним подходом состоит в том, что отписаться от события с помощью лямбда-выражения относительно болезненно - и вы, вероятно, захотите отписаться все обработчики событий при нажатии первой кнопки.

Альтернативой является оставить обработчики событий на месте и игнорировать их, когда это не подходящее время:)

1 голос
/ 06 декабря 2010

В вашем новом коде у вас есть два цикла for, повторяющихся по i и j , но в цикле вы всегда назначаете обработчик событий для pic [x, y] .

То есть вы только назначаете обработчик для pic [0,0]. x и y никогда не меняются ...

Edit:
Честно говоря, я не уверен, что понимаю ваш код. Что вы хотели, чтобы GetClickedPicturebox сделал? А когда ты это называешь?

Если вы хотели вызвать его, чтобы получить щелчок PictureBox, это неправильно, потому что вы присоединяете обработчики событий к новым экземплярам PictureBox, а не к тем, которые есть в вашей форме.

Если этот метод был задуман как метод инициализации, то, вероятно, это неправильно, потому что вы просто создаете новые экземпляры PictureBox, но не отображаете их в своей форме. Если в вашей форме есть PictureBox, это разные экземпляры, и вы не прикрепили обработчики событий к правильным.

...