Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在国际象棋比赛中获得国王的地位_C#_Winforms_Chess - Fatal编程技术网

C# 在国际象棋比赛中获得国王的地位

C# 在国际象棋比赛中获得国王的地位,c#,winforms,chess,C#,Winforms,Chess,我正在写一个简单的国际象棋游戏,有3个棋子,一边是国王和王后,另一边是国王,国王和王后应该单独交配,动作更少。在这个项目中,首先我们应该从用户那里得到单独国王的位置,然后根据这个位置做其他工作,我想知道如何才能从用户那里得到king应该呆在哪里?我用64个图片框实现了表单。我将为职位编写类,非常感谢 编辑: 我从Jon Skeet先生那里写了这段代码回答: 它有什么错误?因为当我点击时它什么都不做,谢谢 PictureBox[,] pic = new PictureBox[8, 8]; pub

我正在写一个简单的国际象棋游戏,有3个棋子,一边是国王和王后,另一边是国王,国王和王后应该单独交配,动作更少。在这个项目中,首先我们应该从用户那里得到单独国王的位置,然后根据这个位置做其他工作,我想知道如何才能从用户那里得到king应该呆在哪里?我用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);


            }
          }
      }
PictureBox[,]pic=新的PictureBox[8,8];
公共图片框设置图像(整数x,整数y)
{
pic[x,y].Image=Image.FromFile(“pic/siyahsah2.JPG”);
返回pic[x,y];
}
公共无效GetClickedPicturebox()
{  
int x,y;

对于(x=0;x而言,最简单的方法是要求用户单击相关图片框。您可以通过以下三种方式之一确定单击了哪个图片框:

  • 对每个PictureBox使用相同的事件处理程序进行订阅,但使用PictureBox中的标记获取坐标
  • 对每个PictureBox使用相同的事件处理程序进行订阅,但只需使用对PictureBox(
    发送方
    )的引用即可找到它是哪一个,并获得相应的坐标
  • 使用封装位置的lambda表达式进行订阅,如下所示:

    for (int x = 0; x < 8; x++) {
        for (int y = 0; y < 8; y++) {
            pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y);
        }
    }
    
    for(int x=0;x<8;x++){
    对于(int y=0;y<8;y++){
    图片框[x,y]。单击+=(发送方,参数)=>设置位置(x,y);
    }
    }
    
后一种方法的一个问题是,通过lambda表达式取消订阅一个事件相对来说比较痛苦,而且您可能希望在单击第一个按钮时取消订阅所有事件处理程序


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

这里有一个想法,而不是将大量图片框弄乱

创建名为
ChessBoardControl
的用户控件。
ChessBoardControl
将负责绘制给定的
ChessBoard
对象


棋盘控件
中,您可以覆盖
OnMouseDown
事件,然后从鼠标坐标,您可以轻松计算单击了哪个方块。

在新代码中,您有两个
用于迭代i和j的
循环,但在循环中,您总是将事件处理程序分配给pic[x,y]

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

编辑:
坦白地说,我不确定我是否理解你的代码。你想让
GetClickedPicturebox
做什么?你什么时候调用它

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


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

您是否在征求有关这些实例的建议允许用户在棋盘上选择位置的UI备选方案(例如:在典型的国际象棋字母数字约定中输入行列,单击网格,将king图像拖放到网格上…)或者,这是关于验证国王移动的有效性,而不是相反部分的位置?是的,我要求用户提供UI替代方案,以允许用户拍摄一个位置,我认为点击相关图片框是一个好方法。我完全同意你的看法,这是一个更好的设计,并钦佩你的坚持。希望有一次,you和其他人也将成功说服arash。@arash:您给出的代码甚至不会编译,因为您是从两行方法的第一行返回的。还不清楚您是否调用过getclickedpicturebox。此外,如果您遵循.NET命名约定,它将帮助您的代码读得更清楚。@Jon Skeet:我换了返程地点,我不明白你评论的第二部分,也很清楚是否……,你能多了解我一些吗?thanks@arash:您的方法名称“getclickedpicturebox”和“setkingposition”通常写为“getclickedpicturebox”和“setkingposition”-这样可以更容易地看到分词的位置。谢谢,我做到了。现在你认为这段代码中还有什么错误是它不起作用的?thanks@arash:您还没有显示整个程序。您在哪里调用GetClickedPictureBox?