溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于C++如何實現(xiàn)擲雙骰游戲

發(fā)布時間:2022-03-18 09:04:56 來源:億速云 閱讀:147 作者:iii 欄目:開發(fā)技術

這篇“基于C++如何實現(xiàn)擲雙骰游戲”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“基于C++如何實現(xiàn)擲雙骰游戲”文章吧。

在最流行的博彩游戲中有一種名為“擲雙骰”(craps)的骰子游戲,這種游戲在世界各地的娛樂場所和大街小巷非常受歡迎。游戲的規(guī)則很簡單:

玩家擲兩個骰子。每個骰子有六面,分別含有1、2、3、4、5和6個點。擲完骰子后,計算兩個朝上的面的點數(shù)之和。

1、如果首次投擲的點數(shù)總和是7或者11,那么玩家贏;

2、如果首次投擲的點數(shù)只和事2、3或者12(稱為"craps"),那么玩家輸(即莊家贏);

3、如果首次投擲的點數(shù)只和事4、5、6、7、8、9或者10,那么這個和就成為玩家的“目標點數(shù)”。要想贏的話,玩家必須連續(xù)的擲骰子直到點數(shù)與這個目標點數(shù)相同為止,即“得到了點數(shù)”。但在得到點數(shù)前,如果擲到的是7,就會輸?shù)簟?/p>

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
unsigned int rollDice();
 
int main() {
    enum Status {CONTINUE, WON, LOST};  //這個就是自定義一個變量類型,就類似于int,double這種,即這里的說白了就是設置一個枚舉類變量類
    //而這個類的關鍵字就是Status,以這個類型定義的變量只能取枚舉內(nèi)的幾個值,而這幾個值又對應了數(shù)字。
    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;
}

這個是我拿來當作筆記的,主要是為了記住這么個問題,當我要想循環(huán)的實現(xiàn)博彩游戲并且統(tǒng)計輸贏的時候,會自然而然的想到在外部套一個for循環(huán)去執(zhí)行,但是這樣就會涉及到一個問題,即隨機數(shù)的生成,按照我最開始的理解是隨著循環(huán)的進行,給srand提供的seed不同(也就是實參time(0))就會在每次循環(huán)都產(chǎn)生不同的隨機序列。即代碼如下

 #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,以這個類型定義的變量只能取枚舉內(nèi)的幾個值,而這幾個值又對應了數(shù)字。
    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;
}

然而統(tǒng)計運行結(jié)果是:

WIN: 0
LOSE: 100000

也就是說一旦第一次是輸了,那么就一直都是輸?shù)?,為什么?/p>

原因在于程序運行太快,而time(0)提供的時間戳是以秒為單位提供的,而程序1s內(nèi)就執(zhí)行完了,自然就提供的seed是一樣的,那么rand的序列也是一樣,所以就一直是贏或者輸,那么我要是非要它不一直贏或者輸了?可以這樣,將循環(huán)次數(shù)設置得更大,讓程序1s內(nèi)運行不完,不就可以提供不同的時間戳了?而事實是這樣也是可行的,如圖,是我設置1000w次循環(huán)的統(tǒng)計結(jié)果。

WIN: 8703168
LOSE: 1296832

以上就是關于“基于C++如何實現(xiàn)擲雙骰游戲”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI