【发布时间】:2019-10-03 21:27:35
【问题描述】:
我必须将我的程序的一部分隔离为一个玩游戏并在游戏期间跟踪你的输赢的程序。 但是,我的损失变量最多只能增加到 1,但如果我的胜利变量增加,那么它会将损失重置回 0。 同样,一旦我退出 while 循环,它就会再次将损失重置为 0。正常win函数。
我们尝试在 if/else 子句中交换赢和输的递增位置。我们还将所有布尔值更改为仅 0 和 1,当然我已将有问题的代码与程序的其余部分隔离开来。我到处都有打印语句来跟踪变量值。我只是让 if usrWins 在整个 continueGame 中在 true 和 false 之间切换,直到 continueGame 为 false 以进行测试。
#include <stdio.h>
int main() {
int wins = 0; //wins is 0
int losses = 0; //loses is 0
char usrGame; //user yes or no answer
int continueGame = 1; //replay game
int usrWin = 1; //if the user wins a round
while (continueGame){ //until user quits
if (!usrWin){ //increment wins
losses++;
printf("You Losses!\n");
printf("Wins: %d\n",wins);
printf("Losses: %d\n",losses);
}
else{ //increment losses
wins++;
printf("You Win!\n");
printf("Wins: %d\n",wins);
printf("Losses: %d\n",losses);
}
printf("Bool: %d Wins: %d Losses: %d\n",usrWin,wins,losses);
printf("\nPlay again? ");
scanf("%s",&usrGame); //prompt if user wants to continue, adding to wins and losses
printf("\n");
if (usrGame != 'y'){ //if not, end loop
continueGame = 0;
}
else{
if (usrWin){ //change usrWin bool
usrWin = 0;
}
else{
usrWin = 1;
}
}
}
printf("Wins: %d Losses: %d\n",wins,losses); //display results
return 0;
}
预期获胜增加,然后失败,然后获胜等,最终在用户结束游戏时打印出最终值。胜利有效,但损失永远不会超过 1,如果胜利增加或游戏结束,则休息为 0。
输出如下:
你赢了!
胜:1
损失:0
布尔:1 胜:1 负:0
再玩一次?是的
你输了!
胜:1
损失:1
布尔:0 胜:1 负:1
再玩一次?是的
你赢了!
胜:2
损失:0
布尔:1 胜:2 负:0
再玩一次?是的
你输了!
胜:2
损失:1
布尔:0 胜:2 负:1
再玩一次? n
赢:2 输:0
//////////对于我总是有usrWin = 0的情况//////////
你输了!
胜:0
损失:1
布尔:0 胜:0 负:1
再玩一次?是的
你输了!
胜:0
损失:1
布尔:0 胜:0 负:1
再玩一次? n
赢:0 输:0
【问题讨论】:
-
这个完全隔离的代码会导致那个精确的输出?
-
可能是未定义的行为,因为您告诉
scanf您正在接受一个字符串,但您正在传递一个字符?你可能正在破坏记忆。 -
scanf为%siirc 添加了一个空终止符。那个空终止符是0,直接在usrGame之后的内存可能会被终止符覆盖? -
将
usrGame设为char[2]数组可能更有意义(或者可能更大,除非您使用scanf的更安全版本并保持您的scanf 相同。从概念上讲,您拥有用户输入字符,而不是数字。很高兴我能解决这个问题。我在 C 语言中变得生疏了。这需要一些脑力才能发现 XD -
如果您使用的是
char[2],请不要忘记将scanf("%1s", &usrGame)指定为avoid a buffer overflow。
标签: c