基于C++實(shí)現(xiàn)擲雙骰游戲的示例代碼
在最流行的博彩游戲中有一種名為“擲雙骰”(craps)的骰子游戲,這種游戲在世界各地的娛樂(lè)場(chǎng)所和大街小巷非常受歡迎。游戲的規(guī)則很簡(jiǎn)單:
玩家擲兩個(gè)骰子。每個(gè)骰子有六面,分別含有1、2、3、4、5和6個(gè)點(diǎn)。擲完骰子后,計(jì)算兩個(gè)朝上的面的點(diǎn)數(shù)之和。
1、如果首次投擲的點(diǎn)數(shù)總和是7或者11,那么玩家贏;
2、如果首次投擲的點(diǎn)數(shù)只和事2、3或者12(稱為"craps"),那么玩家輸(即莊家贏);
3、如果首次投擲的點(diǎn)數(shù)只和事4、5、6、7、8、9或者10,那么這個(gè)和就成為玩家的“目標(biāo)點(diǎn)數(shù)”。要想贏的話,玩家必須連續(xù)的擲骰子直到點(diǎn)數(shù)與這個(gè)目標(biāo)點(diǎn)數(shù)相同為止,即“得到了點(diǎn)數(shù)”。但在得到點(diǎn)數(shù)前,如果擲到的是7,就會(huì)輸?shù)簟?/p>
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; unsigned int rollDice(); int main() { enum Status {CONTINUE, WON, LOST}; //這個(gè)就是自定義一個(gè)變量類型,就類似于int,double這種,即這里的說(shuō)白了就是設(shè)置一個(gè)枚舉類變量類 //而這個(gè)類的關(guān)鍵字就是Status,以這個(gè)類型定義的變量只能取枚舉內(nèi)的幾個(gè)值,而這幾個(gè)值又對(duì)應(yīng)了數(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; }
這個(gè)是我拿來(lái)當(dāng)作筆記的,主要是為了記住這么個(gè)問(wèn)題,當(dāng)我要想循環(huán)的實(shí)現(xiàn)博彩游戲并且統(tǒng)計(jì)輸贏的時(shí)候,會(huì)自然而然的想到在外部套一個(gè)for循環(huán)去執(zhí)行,但是這樣就會(huì)涉及到一個(gè)問(wèn)題,即隨機(jī)數(shù)的生成,按照我最開(kāi)始的理解是隨著循環(huán)的進(jìn)行,給srand提供的seed不同(也就是實(shí)參time(0))就會(huì)在每次循環(huán)都產(chǎn)生不同的隨機(jī)序列。即代碼如下
#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}; //這個(gè)就是自定義一個(gè)變量類型,就類似于int,double這種,即這里的說(shuō)白了就是設(shè)置一個(gè)枚舉類變量類 //而這個(gè)類的關(guān)鍵字就是Status,以這個(gè)類型定義的變量只能取枚舉內(nèi)的幾個(gè)值,而這幾個(gè)值又對(duì)應(yīng)了數(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)計(jì)運(yùn)行結(jié)果是:
WIN: 0
LOSE: 100000
也就是說(shuō)一旦第一次是輸了,那么就一直都是輸?shù)?,為什么?/p>
原因在于程序運(yùn)行太快,而time(0)提供的時(shí)間戳是以秒為單位提供的,而程序1s內(nèi)就執(zhí)行完了,自然就提供的seed是一樣的,那么rand的序列也是一樣,所以就一直是贏或者輸,那么我要是非要它不一直贏或者輸了?可以這樣,將循環(huán)次數(shù)設(shè)置得更大,讓程序1s內(nèi)運(yùn)行不完,不就可以提供不同的時(shí)間戳了?而事實(shí)是這樣也是可行的,如圖,是我設(shè)置1000w次循環(huán)的統(tǒng)計(jì)結(jié)果。
WIN: 8703168
LOSE: 1296832
當(dāng)然,治標(biāo)不治本,這還是沒(méi)有達(dá)到每次循環(huán)都是無(wú)預(yù)測(cè)性的隨機(jī)數(shù),目前還要學(xué)習(xí)其他東西,等我有時(shí)間了再來(lái)思考這個(gè)問(wèn)題~
以上就是基于C++實(shí)現(xiàn)擲雙骰游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++擲雙骰游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳細(xì)對(duì)比C語(yǔ)言中的chmod()函數(shù)和fchmod()函數(shù)
這篇文章主要介紹了C語(yǔ)言中的chmod()函數(shù)和fchmod()函數(shù)的詳細(xì)對(duì)比,兩個(gè)都是用于修改文件權(quán)限但是請(qǐng)注意實(shí)際使用上的差異,需要的朋友可以參考下2015-09-09C語(yǔ)言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C語(yǔ)言中數(shù)組常用的一些排序算法小結(jié)
數(shù)組的排序方法有很多,效率也各不相同,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中數(shù)組常用的一些排序算法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01C語(yǔ)言實(shí)現(xiàn)堆排序的簡(jiǎn)單實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)堆排序的簡(jiǎn)單實(shí)例,講述了堆排序的原理,需要的朋友可以參考下2014-07-07c++元編程模板函數(shù)重載匹配規(guī)則示例詳解
這篇文章主要為大家介紹了c++元編程模板函數(shù)重載匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07簡(jiǎn)單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn)
這篇文章主要介紹了簡(jiǎn)單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn),ConcreteComponent的引用(指針)也可以達(dá)到修飾的功能,需要的朋友可以參考下2016-03-03