Algorithm Gossip (25) Craps 博弈小游戏
前言
This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。
提出问题
25.Algorithm Gossip: Craps 博弈小游戏
说明
一个简单的赌博游戏,游戏规则如下:
玩家掷两个骰子,点数为1到6,如果第一次点数和为7或11,则玩家胜,如果点数和为2、3或12,则玩家输,如果和 为其它点数,则记录第一次的点数和,然后继续掷骰,直至点数和等于第一次掷出的点数和,则玩家胜,如果在这之前掷出了点数和为7,则玩家输。**
解法
规则看来有些复杂,但是其实只要使用switch配合if条件判断来撰写即可,小心不要弄错胜负顺序即可。
分析和解释
代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define WON 0
#define LOST 1
#define CONTINUE 2
int rollDice(){
return (rand()% 6) + (rand()% 6) + 2;
}
int main(void) {
int firstRoll = 1;
int gameStatus = CONTINUE;
int die1,die2,sumOfDice;
int firstPoint = 0;
char c;
srand(time(0));
printf("Craps赌博游戏,按Enter键开始游戏****");
while(1){
getchar();
if(firstRoll) {
sumOfDice = rollDice();
printf("\n玩家掷出点数和:%d\n", sumOfDice);
switch(sumOfDice){
case 7: case 11:
gameStatus = WON;break;
case 2: case 3: case 12:
gameStatus = LOST;break;
default:
firstRoll = 0;
gameStatus = CONTINUE;
firstPoint = sumOfDice;
break;
}
}
else {
sumOfDice = rollDice();
printf("\n玩家掷出点数和:%d\n", sumOfDice);
if(sumOfDice == firstPoint)
gameStatus = WON;
else if(sumOfDice == 7)
gameStatus = LOST;
}
if(gameStatus == CONTINUE)
puts("未分胜负,再掷一次****\n");
else {
if(gameStatus == WON)
puts("玩家胜");
else
puts("玩家输");
printf("再玩一次?");
scanf("%c", &c);
if(c == 'n') {
puts("游戏结束");
break;
}
firstRoll = 1;
}
}
return 0;
}
拓展和关联
这里只是介绍玩法, 并没有给出相应的策略, 类似的博弈游戏非常多有兴趣的都可以了解一下, 例如石子小游戏, 抽牌分堆等
后记
参考书籍
- 《经典算法大全》
- 维基百科