基于C++实现掷双骰游戏的示例代码

 更新时间:2022年03月17日 16:50:05   作者:LL的小班  
在最流行的博彩游戏中有一种名为“掷双骰”(craps)的骰子游戏,这种游戏在世界各地的娱乐场所和大街小巷非常受欢迎。本文将用C++语言实现这一游戏,需要的可以参考一下

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

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

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

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

3、如果首次投掷的点数只和事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++实现掷双骰游戏的示例代码的详细内容,更多关于C++掷双骰游戏的资料请关注脚本之家其它相关文章!

相关文章

  • C++中fstream,ifstream及ofstream用法浅析

    C++中fstream,ifstream及ofstream用法浅析

    这篇文章主要介绍了C++中fstream,ifstream及ofstream用法,适合C++初学者学习文件流的操作,需要的朋友可以参考下
    2014-08-08
  • C++ assert()函数用法案例详解

    C++ assert()函数用法案例详解

    这篇文章主要介绍了C++ assert()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 使用C语言实现三子棋小游戏

    使用C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了使用C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++深复制和浅复制讲解

    C++深复制和浅复制讲解

    这篇文章主要介绍了C++深复制和浅复制讲解,C++中深复制和浅复制最大的区别在“类包含指针类型的数据成员”时,下面感兴趣的小伙伴和小编一起进入文章了解更多相关内容吧
    2022-03-03
  • C语言开发中的常见错误详解

    C语言开发中的常见错误详解

    这个分栏是对于使用C语言编程过程中可能会出现的一些错误而进行的说明,更多的错误示例将会在后面的内容里进行演示。希望这个分栏的内容可以帮助刚学编程的小白少走一些弯路,以及吸取更多的编码经验
    2022-05-05
  • C++中虚继承时的构造函数示例详解

    C++中虚继承时的构造函数示例详解

    在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数,这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的,所以本文将通过代码示例给大家介绍一下C++虚继承构造函数
    2023-09-09
  • C++ 浅谈emplace_back及使用误区

    C++ 浅谈emplace_back及使用误区

    这篇文章主要介绍了C++ 浅谈emplace_back及使用误区,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • c++定义全局变量详解

    c++定义全局变量详解

    这篇文章主要给大家介绍了C++语言中定义全局变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2021-10-10
  • Ubuntu 环境下的 C/C++ 编译与调试配置方法

    Ubuntu 环境下的 C/C++ 编译与调试配置方法

    本文档详细介绍了如何在Ubuntu环境中使用VSCode进行C/C++的编译与调试配置,通过配置`tasks.json`和`launch.json`,实现了统一管理输出文件、优化调试流程以及跨平台兼容性,配置了`g++`编译器和`gdb`调试器,并使用C/C++插件来提高开发效率,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    这篇文章主要介绍了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以参考下
    2017-04-04

最新评论