-1

我正在写一个简单的国际象棋游戏,它有 3 个棋子,一边是国王和王后,一边是国王,国王和王后应该以较少的动作与单独的国王配对。在这个项目中,首先我们应该从用户,然后根据该做其他工作,我想知道我如何从用户那里得到国王应该住在哪个地方?我用 64 个图片框实现了表格。我将为职位写课程,非常感谢

编辑:

我从 Jon Skeet 先生那里写了这段代码回答:它有什么错误?因为当我点击时它没有做任何事情,谢谢

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);


            }
          }
      }
4

3 回答 3

3

最简单的方法是让用户点击相关的图片框。您可以通过以下三种方式之一确定单击了哪个 PictureBox:

  • 为每个 PictureBox 使用相同的事件处理程序订阅,但使用 PictureBox 中的标签来获取坐标
  • 对每个 PictureBox 使用相同的事件处理程序进行订阅,但只需使用对 PictureBox ( sender) 的引用来查找它是哪一个并适当地获取坐标
  • 使用封装位置的 lambda 表达式订阅,如下所示:

    for (int x = 0; x < 8; x++) {
        for (int y = 0; y < 8; y++) {
            pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y);
        }
    }
    

后一种方法的一个问题是,通过 lambda 表达式取消订阅事件相对比较痛苦——而且您可能希望在单击第一个按钮时取消订阅所有事件处理程序。

另一种方法是将事件处理程序留在原处,并在不合适的时候忽略它们:)

于 2010-12-06T07:18:18.583 回答
3

这是一个想法,而不是搞乱很多图片框。

创建一个名为ChessBoardControl. 将ChessBoardControl负责绘制ChessBoard给定的对象。

在 中ChessBoardControl,你可以重写OnMouseDown事件,然后从鼠标的坐标,就可以很容易的计算出点击了哪个方格。

于 2010-12-06T07:54:26.837 回答
1

在您的新代码中,您有两个for循环遍历ij,但在循环中您总是将事件处理程序分配给 pic[x,y]。

所以你只是为 pic[0,0] 分配了一个处理程序。xy永远不会改变...

编辑:
坦率地说,我不确定我是否理解您的代码。你想做GetClickedPicturebox什么?你什么时候打电话?

如果您打算调用它以获取被单击的 PictureBox,这是错误的,因为您将事件处理程序附加到新的 PictureBox 实例,而不是那些在您的 Form 上的实例。

如果这个方法是作为一个初始化方法,那么它可能是错误的,因为你只是在创建新的 PictureBox 实例,但你没有在 Form 上显示它们。如果您的表单上有 PictureBox,它们是不同的实例,并且您没有将事件处理程序附加到正确的实例。

于 2010-12-06T11:44:22.010 回答