1. 项目概述
这个C语言实现的剪刀石头布小游戏,是我在学习基础编程时做的一个经典练习项目。它虽然简单,但包含了随机数生成、循环控制、条件判断等编程核心概念,非常适合初学者练手。游戏规则采用三局两胜制,玩家通过输入数字选择出拳(0剪刀、1石头、2布),电脑则随机出拳,先赢两局者获胜。
注意:原代码中存在几个关键bug需要修复,比如随机数种子重复初始化、胜负判断逻辑不完整等问题,我们会在后续详细分析并给出修正方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心代码解析
2.1 随机数生成机制
电脑的出拳是通过随机数生成的,这里使用了C标准库的rand()函数:
c复制srand((unsigned int)time(NULL)); // 初始化随机数种子
AI = rand() % 3; // 生成0-2的随机数
常见问题:
- 原代码将srand()放在循环内,导致短时间内生成的随机数相同(因为time(NULL)返回秒级时间戳)
- rand()%3虽然简单,但存在轻微的概率偏差(不是严格的1/3)
修正方案:
c复制// 正确的随机数使用方式(放在main函数开头,只初始化一次)
srand((unsigned int)time(NULL));
// 在循环内直接使用
AI = rand() % 3;
2.2 游戏主循环结构
游戏采用while循环控制流程,直到某一方赢得两局:
c复制while (playerCon < 2 && AICon < 2) {
// 获取玩家输入
printf("请玩家出拳:");
scanf(" %d", &player);
// 电脑出拳
AI = rand() % 3;
// 胜负判断
// ...
}
循环条件playerCon < 2 && AICon < 2确保游戏在任一方达到2胜时立即结束。
3. 胜负判断逻辑优化
3.1 原始判断逻辑分析
原代码的判断逻辑存在以下问题:
- 只处理了玩家出剪刀(0)的情况
- 平局判断放在中间,影响其他条件判断
- 缺少输入合法性检查
3.2 完整的胜负矩阵
石头剪刀布的胜负关系可以用以下矩阵表示:
