初学C语言自创骰子对战游戏 do-while循环未按预期终止求助
骰子对战程序的问题修复
你两次代码跑不对的核心原因
- 第一次写的循环持续条件逻辑错误
你当前的do-while循环退出判断是while((lifeJoel>0) || (lifeGohan>0)),意思是只要任意一方还有剩余血量,循环就会一直运行。这和你要的“任意一方血量到0就立刻终止战斗”完全相反:哪怕Joel已经被打剩-15血,只要Gohan还剩1滴血,循环就会继续扣血;只有两边血量都跌到0以下时,循环才会退出,完全不符合预期。 - 第二次写的KO变量逻辑颠倒,还存在未初始化的隐患
你声明的KO变量没有给初始赋值,栈内存里存的是之前残留的随机垃圾值,会直接导致程序出现不可控的随机运行结果。而且你后续的判断逻辑是:只要有人血量≤0,就给KO赋值为0,再搭配循环条件while(KO==0)——等于说触发KO判定的时候,循环反而会继续运行,和你想的“KO触发就停”完全反过来。加上如果前面几轮对战没人把对方打空血,KO一直保持垃圾值,程序甚至会直接崩溃。
核心逻辑要记牢:do-while括号里写的是循环需要继续运行的前提条件,不是触发停止的条件。要实现“任意一方血≤0就停”,本质就是“只有双方血都大于0的时候,才继续开下一轮对战”。
可直接运行的修复参考代码
另外新手写C的时候一定要注意:所有局部变量定义时最好直接给初始值,不然随机内存值带来的玄学bug很难排查;rand和srand对应的函数头文件是stdlib.h,之前漏加的话在新编译器下会直接报警告。
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { int attackJoel, attackGohan; // 定义时直接初始化血量,避免漏赋值 int lifeJoel = 20, lifeGohan = 20; time_t t; srand(time(&t)); printf("初始状态 Joel 血量: %d\tGohan 血量: %d\n", lifeJoel, lifeGohan); do { // 生成双方骰子随机攻击值(1-6点) attackJoel = (rand() % 6) + 1; attackGohan = (rand() % 6) + 1; // 扣血计算 lifeJoel = lifeJoel - attackGohan; lifeGohan = lifeGohan - attackJoel; printf("本轮结算 Joel 血量: %d (受到攻击%d点)\tGohan 血量: %d (受到攻击%d点)\n", lifeJoel, attackGohan, lifeGohan, attackJoel); // 循环继续的前提:双方血量都大于0,只要有一方≤0就立刻退出 } while (lifeJoel > 0 && lifeGohan > 0); // 循环退出后加个结算提示,更符合游戏逻辑 if(lifeJoel <= 0 && lifeGohan <=0) { printf("\n本轮对战结果:双方同归于尽\n"); } else if(lifeJoel <=0) { printf("\n本轮对战结果:Gohan 获胜,Joel 被击败\n"); } else { printf("\n本轮对战结果:Joel 获胜,Gohan 被击败\n"); } return 0; }
新手容易踩的细节提醒
- 逻辑运算符别搞混:用
&&的时候,只有两边条件都成立整体才为真;用||的时候,只要任意一边条件成立整体就为真。第一次写的代码就是把循环条件里的&&错写成了||,直接导致循环逻辑彻底反向。 - 别用无返回值的main函数写法,现在C标准要求main函数要有int类型的返回值,老的直接写
main()的写法虽然部分编译器兼容,但不是规范写法,换个编译环境可能就跑不通。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

