C++实现CRAPS骰子游戏逻辑与随机数控制

认真发呆
认真发呆
发布时间:2026-10-16| 8人浏览过
原创

在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;
}
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。