【游戏中的算法】取火柴游戏算法

原创 2016年06月01日 17:11:48


一、取火柴游戏算法:

取火柴游戏是一个非常简单有趣的小游戏,只要计算好步骤就可以做到常胜将军;

基本规则:总共有n根火柴,每人每次最多能取4根,最少取1根火柴,谁取到最后一根火柴就算输。

关键:当火柴少于等于5根的时候,只要把火柴取为剩下一根就可以保证对方输(这里只给出随机取火柴,最后小于5时取剩余数减1根火柴的代码)。

二、C/C++实现代码:

1、模拟两个人随机取火柴:

/************************/
/* name: match.c 		*/
/* auth: tianmt 		*/
/* desc: Match play		*/
/************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define random(min, max) ((rand()%(max-min+1))+(min))

const char * takeMatch(int num, const char *g1, const char *g2){
	int times = 0, rand_num = 0;
	srand(time(NULL));

	while(num > 0){
		//printf("remian matches: %d\n", num);
		if(1 == num)
			break;
		
		if(num <= 5)
			rand_num = num - 1;
		else
			rand_num = random(1, 4);
		
		//printf("rand: %d\n", rand_num);
		num -= rand_num;
		times++;
	}

	if(1 == times%2)
		return g1;
	else
		return g2;
}

int main(int argc, char **argv){
	if(argc != 2){
		printf("Usage: %s num\n", argv[0]);
		return -1;
	}

	const char gamer1[] = "Tom", gamer2[] = "Jack";
	
	printf("WINNER: %s\n", takeMatch(atoi(argv[1]), gamer1 ,gamer2));
	return 0;
}


运行结果:


2、电脑随机取火柴,用户输入取火柴:

/****************************/
/* name: match_computer.c 	*/
/* auth: tianmt 			*/
/* desc: Match play			*/
/****************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define random(min, max) ((rand()%(max-min+1))+(min))

void takeMatch(int num){
	int take_num = 0, rand_num = 0;
	srand(time(NULL));

	while(1){
		printf("remian matches: %d\n", num);
		printf("YOU take matches:\n");

		scanf("%d", &take_num);

		if(take_num<1 || take_num>4 || take_num>(num-1)){
			printf("take error num, please take again\n");
			continue;
		}

		num -= take_num;

		if(1 == num){
			printf("YOU WIN!\n");
			break;
		}

		if(num <= 5){
			rand_num = num - 1;
			printf("COMPUTER WIN!\n");
			break;
		}
		else
			rand_num = random(1, 4);

		printf("COMPUTER takes %d matches!\n", rand_num);
		num -= rand_num;
	}
}

int main(int argc, char **argv){
	if(argc != 2){
		printf("Usage: %s num\n", argv[0]);
		return -1;
	}
	
	takeMatch(atoi(argv[1]));
	return 0;
}

运行结果:





版权声明:本文为博主原创文章,未经博主允许不得转载。

c++火柴棒问题

题目: 1.火柴棒问题 用火柴棒摆成的0-9间的数字,横向由一根火柴构成,纵向都是由两根火柴构成, 可按如下规则进行变化: 1.数字移动一根火柴棒可变成其它0到9之间合法的数字 2.数字添加一根火柴棒...

C趣味编程]常胜将军(取火柴游戏) 思路

原题是这样的:[常胜将军] 现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将...

取火柴--三峡大学蓝桥杯训练题目

题目: 有n个火柴棍,两个游戏玩家a和b轮流取,规则是第一次取的人最少取1根,最多取 n-1根,随后每人最多只能取对方上一次取的数目的2倍,最少取1根。谁取到最后一根为胜者。试问先取的人是赢还是输。 ...
  • NineL
  • NineL
  • 2016年03月13日 16:53
  • 591

人机取火柴对弈

人机对弈,互取火柴。取最后一根者输。每次至少取一根,最多取4根。如果人先取则人必输。如果机先取,则机器等待人出错。否则人胜。 #include int main() { int pick...

面试常考-数据库(第一范式,第二范式,第三范式)

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中...

网络通信原理和socke通信原理/OSI七层模型

网络通信原理和socke通信原理

hdu 1907 John(取火柴游戏)

尼姆博奕(Nimm Game): 有三堆各有若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。       用(a , b , c)表示某种局势,首先(...
  • LiWen_7
  • LiWen_7
  • 2012年09月03日 16:59
  • 1235

人机对战之取火柴游戏

源码 #include void main() { int a=21, i; cout

hdu 题目1907 Johu (取火柴游戏,取最后一个胜)

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total...

(一)一个简单的取物游戏的算法

博主是一个java菜鸟,偶然间朋友推荐博主找leetcode.com上的算法从简单到难没事就写几个,所以博主决定每一到两天贴出一个自己写的算法code,因为是新手,代码一定显得拙劣,希望能和大神以及编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【游戏中的算法】取火柴游戏算法
举报原因:
原因补充:

(最多只允许输入30个字)