Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Function_For Loop_Reversi - Fatal编程技术网

反向游戏–;C程序设计中的移动合法性检查

反向游戏–;C程序设计中的移动合法性检查,c,arrays,function,for-loop,reversi,C,Arrays,Function,For Loop,Reversi,程序初始化电路板后应要求用户配置,然后使用用户配置打印电路板。然后它相应地打印“W”和“B”的可用移动。最后一步是请求使用的移动,如果它与之前打印的可用移动相匹配,则打印移动有效的消息,然后使用有效移动打印最后一次线路板。我的代码在打印配置好的电路板之前工作正常,但之后我在这里得到了一些奇怪的输出。请帮忙,谢谢。 在以下程序中,输入的形式应为:U-未占用,B-被黑色占用,W-被白色占用。以下是输入和预期输出的示例: #包括 #包括 #包括 无效板初始化(字符板[26][26],int n); 无

程序初始化电路板后应要求用户配置,然后使用用户配置打印电路板。然后它相应地打印“W”和“B”的可用移动。最后一步是请求使用的移动,如果它与之前打印的可用移动相匹配,则打印移动有效的消息,然后使用有效移动打印最后一次线路板。我的代码在打印配置好的电路板之前工作正常,但之后我在这里得到了一些奇怪的输出。请帮忙,谢谢。 在以下程序中,输入的形式应为:U-未占用,B-被黑色占用,W-被白色占用。以下是输入和预期输出的示例:

#包括
#包括
#包括
无效板初始化(字符板[26][26],int n);
无效印刷板(字符板[26][26],int n);
无效校验码移动可用(字符板[26][26],整数N,字符颜色);
布尔位置边界(整数N,字符行,字符列);
void printMove(字符板[26][26],int n);
无效检查合法指示(字符板[26][26]、int N、字符行、字符列、字符颜色、int deltaRow、int deltaCol);
bool checkmove(字符板[26][26],int N,字符行,字符列,字符颜色);
内部主(空){
int n;
炭板[26][26];
printf(“输入电路板尺寸:”);
scanf(“%d”和“&n”);
boardInitialize(board,n);
印刷电路板(电路板,n);
checkLegalMovesAvailable(板,n,'W');
checkLegalMovesAvailable(board,n,'B');
printMove(板,n);
返回(退出成功);
}
//初始化电路板的函数
无效板初始化(字符板[26][26],int n){
printf(“”);

对于(int i=0;i好的,这里有一个简单的观察结果。看起来您更改了
checklegalmovasavailable
,因此它现在总是返回
true
,对吗?所以这里有一个问题要问您:这有意义吗?如果是这样,那么它可能根本不应该返回任何内容,它的调用方应该始终将其视为返回
true
。如果不是,那么您可能应该重新考虑您的逻辑,并找出在什么情况下它应该返回
true
而不是
false
。这有意义吗?

好的,这里还有一些解决方案:


(一)在
positionInBounds
中,您正在检查
p是否正确,这里有另一个更改,可以解决几个问题。在搜索可用的移动时,您正在检查棋盘上是否有已经有玩家棋子的方块,然后向各个方向查看是否有该方向的移动。这是返回避免人们通常的做法,这也会导致问题(重复动作)

例如,假设您正在为玩家X寻找移动,棋盘看起来如下:

*OOOX
O
X
我已经用
*
标记了这个有趣的开放位置。正如您所看到的,这个位置是一个双重移动,因为合法捕获存在于同一位置的两个不同方向

您当前的方法将列出此移动两次。它将首先从一个X位置开始查找,然后在遇到第二个X位置时再次查找

我们可以修复这个错误,并解决您的移动顺序问题,通过一个简单的修复程序,实际上可以简化您的程序

目前,你检查棋盘上的每一个方块,看它是否是玩家的颜色。如果是,那么你寻找对手颜色的相邻回合,以一个空方块结束,然后被视为合法移动

相反,你应该反过来:检查棋盘上的每个方块,看它是否是空的。如果是空的,然后寻找对手颜色的相邻回合,以你颜色的方块终止。如果你找到了,则起始方块(空方块)成为你的移动

这一改变实际上非常简单,它解决了两件事:(1)您将不再发现重复的移动(如上面的示例所示),以及(2)移动将按顺序打印


编辑:我应该补充一点,一旦你找到一个移动并打印它,你应该立即移动到下一个空方块。否则,如果你继续朝其他方向看,你可能会发现重复的方块。一个好方法是将其分为两个函数。第一个函数只是在所有方块(行、列)上迭代,然后打电话给第二个检查是否有合法的移动。第二个检查是否有合法的移动。如果找到,它会立即停止查找并返回。

这不是你以前的帖子的副本吗?你只是要不断地发布它,直到有人完全为你完成工作吗?不,我做了一些更改,但仍然无法取消rstand my error@TomKarzesLets从发布的代码开始编译时不干净。强烈建议在编译时启用所有警告,然后修复这些警告。(对于gcc,最低限度使用:
-Wall-Wextra-pedantic
)代码说板是[26][26],但外部链接说板是[4][4]。强烈建议可用移动同时具有起始位置[x1][y1]和结束位置[x2][y2]可能是Ok的副本我要修复checkLigalMovesAvailable,还有其他功能要处理吗?@tomWell,我停在了那一个,但如果你想清楚并修复它,我可能愿意再看一看。我只是更改了代码,也更改了一些函数,如果你现在可以检查的话,@tomNow我正在为黑白ri提供可用的移动ght。我必须按行数增加的顺序打印可用移动,然后按列数增加的顺序打印(对于同一行中的可用移动),我不知道如何执行。在“打印移动”中函数在我获得移动并检查移动是否在线路板维度中后,如何将给定移动与之前打印的可用移动相匹配?
*OOOX
O
X