基于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這種,即這里的說白了就是設(shè)置一個枚舉類變量類
//而這個類的關(guān)鍵字就是Status,以這個類型定義的變量只能取枚舉內(nèi)的幾個值,而這幾個值又對應(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;
}
這個是我拿來當(dāng)作筆記的,主要是為了記住這么個問題,當(dāng)我要想循環(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這種,即這里的說白了就是設(shè)置一個枚舉類變量類
//而這個類的關(guān)鍵字就是Status,以這個類型定義的變量只能取枚舉內(nèi)的幾個值,而這幾個值又對應(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)計運行結(jié)果是:
WIN: 0
LOSE: 100000
也就是說一旦第一次是輸了,那么就一直都是輸?shù)?,為什么?/p>
原因在于程序運行太快,而time(0)提供的時間戳是以秒為單位提供的,而程序1s內(nèi)就執(zhí)行完了,自然就提供的seed是一樣的,那么rand的序列也是一樣,所以就一直是贏或者輸,那么我要是非要它不一直贏或者輸了?可以這樣,將循環(huán)次數(shù)設(shè)置得更大,讓程序1s內(nèi)運行不完,不就可以提供不同的時間戳了?而事實是這樣也是可行的,如圖,是我設(shè)置1000w次循環(huán)的統(tǒng)計結(jié)果。
WIN: 8703168
LOSE: 1296832
當(dāng)然,治標不治本,這還是沒有達到每次循環(huán)都是無預(yù)測性的隨機數(shù),目前還要學(xué)習(xí)其他東西,等我有時間了再來思考這個問題~
以上就是基于C++實現(xiàn)擲雙骰游戲的示例代碼的詳細內(nèi)容,更多關(guān)于C++擲雙骰游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下2014-08-08
Ubuntu 環(huán)境下的 C/C++ 編譯與調(diào)試配置方法
本文檔詳細介紹了如何在Ubuntu環(huán)境中使用VSCode進行C/C++的編譯與調(diào)試配置,通過配置`tasks.json`和`launch.json`,實現(xiàn)了統(tǒng)一管理輸出文件、優(yōu)化調(diào)試流程以及跨平臺兼容性,配置了`g++`編譯器和`gdb`調(diào)試器,并使用C/C++插件來提高開發(fā)效率,感興趣的朋友跟隨小編一起看看吧2024-11-11
C++ 中使用lambda代替 unique_ptr 的Deleter的方法
這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下2017-04-04

