您好,登錄后才能下訂單哦!
這篇“基于C++如何實現擲雙骰游戲”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“基于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++如何實現擲雙骰游戲”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。