如何解决连接四项检查获胜者
所以要更改我的问题。它拒绝承认连续有四个二。它认识到连续有四个,但发生在四个二之后。为什么会这样?
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 1 1 1 1 0 0
1 2 2 2 2 0 0
int checkFour(int a,int b,int c,int d){
if (a == b == c == d){
return 1;
}
else{
return 0;
}
return 0;
}
//check for the horizontal win
int checkHorizontal(){
for(int i=0; i < rows; i++){
for(int j=0; j < column - 3; j++){
if ((board[i][j] != 0) && (board[i][j+1] != 0) && (board[i][j+2]!= 0) && (board[i][j+3] != 0)){
if (checkFour(board[i][j],board[i][j+1],board[i][j+2],board[i][j+3]) == 1){
printf("Game Over\n");
exit(0);
}
}
}
}
}
我在做什么错了?
解决方法
if (a == b == c == d){
无法按照您的想法工作。 C中的比较结果是布尔值0
或1
。假设==
运算符具有从左到右的关联性,则您的语句可以重写为:
if ((((a == b) == c) == d)
当它们全部为1
时,这似乎可以给出正确的结果。这是因为最终将值(1)与比较操作的结果(也就是(1))进行比较。
(((a == b) == c) == d) a == b -> 1
((1 == c) == d) 1 == c -> 1
(1 == d) 1 == d -> 1
正确的方法是使用逻辑AND。
if (a == b && a == c && a == d)
所有三个比较都需要计算为true
,整个语句才能为true
。
请注意,还有其他有效的组合。例如:
if (a == b && b == c && c == d)
顺便说一句,您可以将整个功能缩短为
int checkFour(int a,int b,int c,int d){
return a == b && b == c && c == d;
}
,
问题是您误解了C的机制。如果abcd的所有值都等于if (a == b == c == d)
,那么代码return 1
就不会被接受。因为C是从左到右计算(相同的优先级),所以它将首先计算a == b
,结果为1或0,然后将该结果与c
进行比较,第二个结果也是1或0,最后取第二个结果与d
进行比较,最后得出结果。
正确的代码是这样的:
if ((a == b) && (d == c) && (b == c))
return 1;
else
return 0;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。