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

一、取火柴游戏算法:

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

  • 基本规则:总共有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;
}

运行结果:
result_1

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

运行结果
result_2


—— 2018-11-29 ——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值