actanble

导航

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;
	}

拓展和关联

这里只是介绍玩法, 并没有给出相应的策略, 类似的博弈游戏非常多有兴趣的都可以了解一下, 例如石子小游戏, 抽牌分堆等

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

posted on 2017-04-14 21:00  白于空  阅读(283)  评论(0编辑  收藏  举报