在国际象棋比赛中获得国王的位置

时间:2010-12-06 07:11:41

标签: c# winforms chess

我正在写一个简单的国际象棋比赛,其中包括3个棋子,一个国王和一个王后,另一个只是一个国王,国王和王后应该单独交配国王,少动作。在这个项目中,首先我们应该取得来自用户的单独的国王,然后根据其他的工作,我想知道我怎样才能从用户那里得到哪个地方应该留下来?我用64个pictureboxes实现形式。我将写职位,非常感谢

编辑:

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


            }
          }
      }

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:3)

这是一个想法,而不是搞乱大量的PictureBoxes。

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

ChessBoardControl中,您可以覆盖OnMouseDown事件,然后从鼠标坐标中轻松计算点击了哪个方格。

答案 2 :(得分:1)

在新代码中,您有两个for循环遍历 i j ,但在循环中,您总是为pic分配一个事件处理程序[ X,Y]。

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

修改
坦率地说,我不确定我理解你的代码。您希望GetClickedPicturebox做什么?你什么时候打电话给它?

如果你打算调用它来获取被点击的PictureBox,那就错了,因为你将事件处理程序附加到新的PictureBox实例,而不是表单上的那些实例。

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