C++掷双骰游戏:枚举状态与伪随机数陷阱解析

Leo
Leo
发布时间:2026-10-16 | 7人浏览过
原创

通过C++标准库函数实现经典的Craps(掷双骰)游戏规则,利用枚举变量管理游戏状态机。同时深入探讨批量模拟场景下,因伪随机数种子重置导致的分布异常问题及修正方案。

核心规则与逻辑设计

Casino的Craps游戏机制主要依赖两颗六面骰子的点数总和,逻辑流程如下:

  • 首掷判定:若点数为7或11则直接获胜;若为2、3或12(称为"Craps")则直接失败。
  • 建立目标:若首掷点数为4、5、6、8、9、10,则该数值成为玩家的"目标点数"。
  • 持续博弈:后续投掷中,若再次命中"目标点数"则获胜;若在击中目标前掷出7,则判定失败。

标准实现代码分析

以下示例展示了如何利用 enum 定义清晰的游戏状态(继续、胜利、失败),并结合 srand 与 rand 生成骰子结果。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
unsigned int rollDice();
 
int main() {
    // 自定义枚举类型,用于替代魔法数字
    enum Status {CONTINUE, WON, LOST};
    srand(static_cast<unsigned int>(time(0)));
    unsigned int myPoint = 0;
    Status gameStatus = CONTINUE;
    
    // 首次投掷
    unsigned int sumOfDice = rollDice();
    switch (sumOfDice) {
        case 7:
        case 11:
            gameStatus = WON;
            break;
        case 2:
        case 3:
        case 12:
            gameStatus = LOST;
            break;
        default:
            gameStatus = CONTINUE;
            myPoint = sumOfDice;
            cout << "Point is " << myPoint << endl;
            break;
    };
 
    // 循环直到胜负产生
    while (gameStatus == CONTINUE){
        sumOfDice = rollDice();
        if (sumOfDice == myPoint)
            gameStatus = WON;
        else if (sumOfDice == 7)
            gameStatus = LOST;
    }
    
    // 输出最终结果
    if (gameStatus == WON)
        cout << "Player wins" << endl;
    else
        cout << "Player lose" << endl;
 
}
 
// 辅助函数:生成两颗骰子点数并求和
unsigned int rollDice(){
    unsigned int die1 = 1 + rand() % 6;
    unsigned int die2 = 1 + rand() % 6;
    return die1 + die2;
}
 

常见误区:循环中的伪随机数失效

当尝试通过循环统计大量胜率时,开发者容易犯一个典型错误:将种子初始化 srand(time(0)) 放置在循环体内部。

// 错误示范
for (int i = 0; i < 100000; ++i) {
    srand(static_cast<unsigned int>(time(0))); // 错误操作
    // ... 执行单局游戏逻辑 ...
}

现象与原理排查

由于 time(0) 返回的是以秒为单位的时间戳,而单次游戏逻辑运行速度远快于1秒。这导致在极短时间内(通常不足一秒)进入循环时,每次迭代获取到的种子值完全一致。

  1. 序列锁定:相同的种子会生成完全相同的伪随机数序列。
  2. 全局同步:如果第一轮因为种子原因导致必输,那么第2到10万轮的骰子顺序都与第一轮分毫不差,导致结果也是必输。

在实际测试中,若不加干预,可能会观察到类似 WIN: 0 | LOSE: 100000 这种极端且不符合概率学的数据。

解决方案

正确做法:仅在程序启动的主入口处调用一次 srand(static_cast<unsigned int>(time(0))),确保后续的 rand() 调用能产生真正随机的偏移序列。

注意:本示例仅演示基础算法逻辑,未包含任何投注金额计算或复杂的用户交互界面。

以上就是基于C++实现掷双骰游戏的详细内容,更多关于C++掷双骰游戏的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表