C语言课程作业:石头剪刀布游戏代码功能衔接故障排查求助
修复石头剪刀布游戏的模块衔接问题
我来帮你拆解下代码里导致胜负判断和前面模块衔接失败的核心问题,然后一步步修复它:
问题分析
- 变量作用域冲突:
computerChoice函数里定义了局部变量int choice,这直接覆盖了全局的float choice,函数最后返回的是未初始化的全局choice(值随机),而不是电脑实际生成的选择,这是衔接失败的关键。 - 数据类型不合理:用
float存储整数选项(1/2/3),可能会因为浮点精度问题导致胜负判断逻辑出错,改用int更合适。 - 随机数种子初始化错误:
srand(time(0))放在computerChoice函数内,每次调用都会重置种子,短时间内多次调用会导致随机数重复,应该放在main开头只执行一次。 - 依赖全局变量的设计缺陷:
displayWinner依赖全局变量获取用户和电脑的选择,既容易出作用域问题,也不符合模块化编程规范,建议改用参数传递。 - 缺少输入验证:没有检查用户输入是否为1-3的有效数字,非法输入会导致逻辑混乱。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 获取用户输入,返回合法的选项(1/2/3) int playerInput() { int response; printf("=== 石头剪刀布游戏 ===\n"); printf("1. 石头(Rock)\n"); printf("2. 布(Paper)\n"); printf("3. 剪刀(Scissors)\n"); printf("请输入你的选择:"); // 输入验证,确保用户输入1-3的整数 while (scanf("%d", &response) != 1 || response < 1 || response > 3) { // 清除输入缓冲区的无效内容 while (getchar() != '\n'); printf("输入无效,请输入1-3之间的数字:"); } return response; } // 生成电脑的随机选择,返回1/2/3 int computerChoice() { int lower = 1, upper = 3; // 生成1-3的随机数 int choice = (rand() % (upper - lower + 1)) + lower; printf("电脑选择了:%d\n", choice); return choice; } // 通过参数传递用户和电脑的选择,判断并输出胜负结果 void displayWinner(int player, int computer) { printf("\n=== 结果 ===\n"); if (player == computer) { printf("平局!再来一局吧~\n"); } // 玩家获胜的情况:石头赢剪刀,布赢石头,剪刀赢布 else if ((player == 1 && computer == 3) || (player == 2 && computer == 1) || (player == 3 && computer == 2)) { printf("你赢了!🎉\n"); } else { printf("电脑赢了!😢\n"); } } int main(void) { // 初始化随机数种子,只需要执行一次 srand(time(0)); int pinput = playerInput(); int cinput = computerChoice(); displayWinner(pinput, cinput); return 0; }
关键修改说明
- 移除了全局变量,所有数据通过函数返回值和参数传递,彻底解决作用域问题。
- 把
float类型全部改成int,避免精度问题。 - 将
srand(time(0))移到main开头,确保随机数生成正常。 - 给
playerInput添加了输入验证,处理非法输入的情况。 - 简化了
displayWinner的判断逻辑,更清晰易读。
内容的提问来源于stack exchange,提问作者Paula Hirsch Schweizer
相关产品推荐
相关产品推荐

