当前位置:   article > 正文

C++实现博彩游戏

C++实现博彩游戏

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

  1. 玩家掷两个骰子。每个骰子有六面,分别含有123456个点。掷完骰子后,计算两个朝上的面的点数之和。
  2. 1、如果首次投掷的点数总和是7或者11,那么玩家赢;
  3. 2、如果首次投掷的点数只和事23或者12(称为"craps"),那么玩家输(即庄家赢);
  4. 3、如果首次投掷的点数只和事456789或者10,那么这个和就成为玩家的“目标点数”。要想赢的话,玩家必须连续的掷骰子直到点数与这个目标点数相同为止,即“得到了点数”。但在得到点数前,如果掷到的是7,就会输掉。
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. unsigned int rollDice();
  6. int main() {
  7. enum Status {CONTINUE, WON, LOST}; //这个就是自定义一个变量类型,就类似于int,double这种,即这里的说白了就是设置一个枚举类变量类
  8. //而这个类的关键字就是Status,以这个类型定义的变量只能取枚举内的几个值,而这几个值又对应了数字。
  9. srand(static_cast<unsigned int>(time(0)));
  10. unsigned int myPoint = 0;
  11. Status gameStatus = CONTINUE;
  12. unsigned int sumOfDice = rollDice();
  13. switch (sumOfDice) {
  14. case 7:
  15. case 11:
  16. gameStatus = WON;
  17. break;
  18. case 2:
  19. case 3:
  20. case 12:
  21. gameStatus = LOST;
  22. break;
  23. default:
  24. gameStatus = CONTINUE;
  25. myPoint = sumOfDice;
  26. cout << "Point is " << myPoint << endl;
  27. break;
  28. };
  29. while (gameStatus == CONTINUE){
  30. sumOfDice = rollDice();
  31. if (sumOfDice == myPoint)
  32. gameStatus = WON;
  33. else if (sumOfDice == 7)
  34. gameStatus = LOST;
  35. }
  36. if (gameStatus == WON)
  37. cout << "Player wins" << endl;
  38. else
  39. cout << "Player lose" << endl;
  40. }
  41. unsigned int rollDice(){
  42. unsigned int die1 = 1 + rand() % 6;
  43. unsigned int die2 = 1 + rand() % 6;
  44. unsigned int sum = die1 + die2;
  45. cout << "Player rolled: " << die1 << " + " << die2
  46. << " = " << sum << endl;
  47. return sum;
  48. }

这个是我拿来当作笔记的,主要是为了记住这么个问题,当我要想循环的实现博彩游戏并且统计输赢的时候,会自然而然的想到在外部套一个for循环去执行,但是这样就会涉及到一个问题,即随机数的生成,按照我最开始的理解是随着循环的进行,给srand提供的seed不同(也就是实参time(0))就会在每次循环都产生不同的随机序列。即代码如下

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. unsigned int rollDice();
  6. int main() {
  7. int winNum = 0;
  8. int loseNum = 0;
  9. enum Status {CONTINUE, WON, LOST}; //这个就是自定义一个变量类型,就类似于int,double这种,即这里的说白了就是设置一个枚举类变量类
  10. //而这个类的关键字就是Status,以这个类型定义的变量只能取枚举内的几个值,而这几个值又对应了数字。
  11. for (int i = 0; i < 100000; ++i) {
  12. srand(static_cast<unsigned int>(time(0)));
  13. unsigned int myPoint = 0;
  14. Status gameStatus = CONTINUE;
  15. unsigned int sumOfDice = rollDice();
  16. switch (sumOfDice) {
  17. case 7:
  18. case 11:
  19. gameStatus = WON;
  20. break;
  21. case 2:
  22. case 3:
  23. case 12:
  24. gameStatus = LOST;
  25. break;
  26. default:
  27. gameStatus = CONTINUE;
  28. myPoint = sumOfDice;
  29. // cout << "Point is " << myPoint << endl;
  30. break;
  31. };
  32. while (gameStatus == CONTINUE) {
  33. sumOfDice = rollDice();
  34. if (sumOfDice == myPoint)
  35. gameStatus = WON;
  36. else if (sumOfDice == 7)
  37. gameStatus = LOST;
  38. }
  39. if (gameStatus == WON) {
  40. // cout << "Player wins" << endl;
  41. winNum++;
  42. }
  43. else {
  44. // cout << "Player lose" << endl;
  45. loseNum++;
  46. }
  47. }
  48. cout << "WIN: " << winNum << endl;
  49. cout << "LOSE: " << loseNum << endl;
  50. }
  51. unsigned int rollDice(){
  52. unsigned int die1 = 1 + rand() % 6;
  53. unsigned int die2 = 1 + rand() % 6;
  54. unsigned int sum = die1 + die2;
  55. // cout << "Player rolled: " << die1 << " + " << die2
  56. // << " = " << sum << endl;
  57. return sum;
  58. }

然而统计运行结果是:

  1. WIN: 0
  2. LOSE: 100000

也就是说一旦第一次是输了,那么就一直都是输的,为什么?

原因在于程序运行太快,而time(0)提供的时间戳是以秒为单位提供的,而程序1s内就执行完了,自然就提供的seed是一样的,那么rand的序列也是一样,所以就一直是赢或者输,那么我要是非要它不一直赢或者输了?可以这样,将循环次数设置得更大,让程序1s内运行不完,不就可以提供不同的时间戳了?而事实是这样也是可行的,如图,是我设置1000w次循环的统计结果。

  1. WIN: 8703168
  2. LOSE: 1296832

当然,治标不治本,这还是没有达到每次循环都是无预测性的随机数,目前还要学习其他东西,等我有时间了再来思考这个问题~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/806768
推荐阅读
相关标签
  

闽ICP备14008679号