C++实现CRAPS骰子游戏逻辑与随机数控制
在C++编程中,模拟投骰子游戏是理解条件判断、循环结构及随机数生成的经典案例。本文将解析CRAPS游戏的简化版规则,提供基于标准库的头文件配置、随机数种子设置方法,并详细展示如何通过状态变量追踪游戏进程,确保代码逻辑严密且易于阅读。
游戏逻辑与结果目标
本游戏模拟双人或多人的“老大难”(Craps)骰子规则,核心胜负判定如下:
- 首局决胜:每轮投掷两次骰子,计算点数之和。
- 若和数为7或11,玩家立即获胜(WIN)。 - 若和数为2、3或12,玩家立即失败(LOSE)。 - 持续回合:若首局和数为其他值(4, 5, 6, 8, 9, 10),该数值成为“点数”(
myPoint)。进入循环后:
- 再次掷出等于myPoint的和数,玩家获胜。
- 在达到点数前掷出7,玩家失败。
准备条件:随机数控制
C++中的伪随机数生成依赖于头文件 <cstdlib>(或旧的 <stdlib.h>)。要实现每次运行结果不同且可复现的控制,需理解两个关键函数:
第1步:初始化随机种子 (srand)
目的:重置随机数生成器的起始点,避免程序每次启动都产生相同的随机序列。
入口:void srand(unsigned int seed)
动作:程序开始时提示用户输入一个无符号整数作为 seed,或直接使用当前时间戳。
参数:unsigned int seed。若使用固定值(如1),则每次运行生成的随机数序列相同;若使用动态值(如 time(0) 或用户输入),则序列变化。
完成状态:调用 srand(seed); 后,后续 rand() 调用将基于该种子产生分布均匀的伪随机数。
第2步:获取伪随机数 (rand)
目的:生成范围内的整数。
入口:int rand(void)
动作:返回范围从 0 到 RAND_MAX 的伪随机整数。
技巧:要获得 1-6 的骰子点数,公式为 1 + rand() % 6。rand() % 6 生成 0-5,加 1 后变为 1-6。
真实操作顺序:代码实现
以下代码演示了如何封装 rollDice 函数并结合主逻辑实现游戏循环。使用枚举类型 GameStatus 管理游戏状态。
#include <iostream>
#include <cstdlib>
using namespace std;
// 定义游戏状态枚举
enum GameStatus { WIN, LOSE, PLAYING };
// 声明投骰子函数
int rollDice();
int main() {
int sum, myPoint;
GameStatus status;
unsigned seed;
// 1. 获取随机数种子
cout << "Please enter an unsigned integer: ";
cin >> seed;
srand(seed); // 将种子传递给rand()
// 2. 第一轮投掷
sum = rollDice();
// 3. 判断首局结果
switch (sum) {
case 7:
case 11:
status = WIN;
break;
case 2:
case 3:
case 12:
status = LOSE;
break;
default:
status = PLAYING;
myPoint = sum;
cout << "point is " << myPoint << endl;
break;
}
// 4. 持续投掷直到分出胜负
while (status == PLAYING) {
sum = rollDice();
if (sum == myPoint) {
status = WIN;
} else if (sum == 7) {
status = LOSE;
}
}
// 5. 输出最终结果
if (status == WIN)
cout << "player wins" << endl;
else
cout << "player loses" << endl;
return 0;
}
// 投骰子辅助函数
int rollDice() {
// 生成1-6的随机点数
int die1 = 1 + rand() % 6;
int die2 = 1 + rand() % 6;
int sum = die1 + die2;
cout << "player rolled" << die1 << " + " << die2 << " = " << sum << endl;
return sum;
}本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













