c - 连接四张支票赢家
问题描述
所以要改变我的问题。它拒绝承认连续有四个二。它识别出连续有四个 1,但这发生在四个 2 之后。为什么会这样?
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
or 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
正确的方法是使用逻辑与。
if (a == b && a == c && a == d)
所有三个比较都需要评估 totrue
才能使整个语句成为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;
}
推荐阅读
- angular - 如何全局模拟 Jasmine 的 Angular 服务
- spring-boot - @ExceptionHandler 捕获的异常不会被 MetricsWebFilter 记录
- mysql - 通过集群重启使用 Persistent Volume 持久化 MySQL pod 的数据
- c# - 如何将数据从 Windows 发送到 HID 键盘?
- node.js - 如何在 Tizen 设备上安装 NodeJS?
- java - 没有从 join() 方法中得到 InterruptedException
- reactjs - 如何解决 JSX 中的 if/else 语句?
- android - Flutter NetworkImage 无法从 url 加载 HEIC 图像
- python - 如何仅在需要时使用 anaconda python(在 linux 中)
- python - Python矩阵乘法:稀疏乘密集