文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于C++如何实现掷双骰游戏

2023-06-29 12:56

关注

这篇“基于C++如何实现掷双骰游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于C++如何实现掷双骰游戏”文章吧。

在最流行的博彩游戏中有一种名为“掷双骰”(craps)的骰子游戏,这种游戏在世界各地的娱乐场所和大街小巷非常受欢迎。游戏的规则很简单:

玩家掷两个骰子。每个骰子有六面,分别含有1、2、3、4、5和6个点。掷完骰子后,计算两个朝上的面的点数之和。

如果首次投掷的点数总和是7或者11,那么玩家赢;

如果首次投掷的点数只和事2、3或者12(称为"craps"),那么玩家输(即庄家赢);

如果首次投掷的点数只和事4、5、6、7、8、9或者10,那么这个和就成为玩家的“目标点数”。要想赢的话,玩家必须连续的掷骰子直到点数与这个目标点数相同为止,即“得到了点数”。但在得到点数前,如果掷到的是7,就会输掉。

#include <iostream>#include <cstdlib>#include <ctime>using namespace std; unsigned int rollDice(); int main() {    enum Status {CONTINUE, WON, LOST};  //这个就是自定义一个变量类型,就类似于int,double这种,即这里的说白了就是设置一个枚举类变量类    //而这个类的关键字就是Status,以这个类型定义的变量只能取枚举内的几个值,而这几个值又对应了数字。    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;     unsigned int sum = die1 + die2;    cout << "Player rolled: " << die1 << " + " << die2    << " = " << sum << endl;    return sum;}

这个是我拿来当作笔记的,主要是为了记住这么个问题,当我要想循环的实现博彩游戏并且统计输赢的时候,会自然而然的想到在外部套一个for循环去执行,但是这样就会涉及到一个问题,即随机数的生成,按照我最开始的理解是随着循环的进行,给srand提供的seed不同(也就是实参time(0))就会在每次循环都产生不同的随机序列。即代码如下

 #include <iostream>#include <cstdlib>#include <ctime>using namespace std; unsigned int rollDice(); int main() {    int winNum = 0;    int loseNum = 0;    enum Status {CONTINUE, WON, LOST};  //这个就是自定义一个变量类型,就类似于int,double这种,即这里的说白了就是设置一个枚举类变量类    //而这个类的关键字就是Status,以这个类型定义的变量只能取枚举内的几个值,而这几个值又对应了数字。    for (int i = 0; i < 100000; ++i) {        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;            winNum++;        }        else {//            cout << "Player lose" << endl;            loseNum++;        }    }    cout << "WIN: " << winNum << endl;    cout << "LOSE: " << loseNum << endl;} unsigned int rollDice(){    unsigned int die1 = 1 + rand() % 6;    unsigned int die2 = 1 + rand() % 6;     unsigned int sum = die1 + die2;//    cout << "Player rolled: " << die1 << " + " << die2//    << " = " << sum << endl;    return sum;}

然而统计运行结果是:

WIN: 0
LOSE: 100000

也就是说一旦第一次是输了,那么就一直都是输的,为什么?

原因在于程序运行太快,而time(0)提供的时间戳是以秒为单位提供的,而程序1s内就执行完了,自然就提供的seed是一样的,那么rand的序列也是一样,所以就一直是赢或者输,那么我要是非要它不一直赢或者输了?可以这样,将循环次数设置得更大,让程序1s内运行不完,不就可以提供不同的时间戳了?而事实是这样也是可行的,如图,是我设置1000w次循环的统计结果。

WIN: 8703168
LOSE: 1296832

以上就是关于“基于C++如何实现掷双骰游戏”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯