C语言取牌游戏

取牌游戏

有54张扑克牌,两个人轮流拿牌,每人每次最少取1张,最多取4张,谁拿最后一张谁输。编写模拟计算机先拿牌且必胜的算法。

分析:
为了保证计算机胜利,因此最后的牌必须是人取到,而且只能剩余1张。通过观察发现,除去最后一张牌,还剩余53张牌。

除去第一次计算机取牌,之后的每次计算机如果要赢得游戏,可以根据人取了多少张牌进行调整,以保证剩余最后一张只能给人取到。

由于人与计算机的取牌数量局限在[1,4],因此人机每次合计取牌可控制为(1+4)=5张。

因此计算机取牌为了保证胜利,N1=(54-1)%5(求余)
之后,计算机根据人出了多少牌进行调整,保证每次人机取牌总数为5。
即:
人取1张,计算机取4张
人取2张,计算机取3张
人取3张,计算机取2张
人取4张,计算机取1张
这样可以保证计算机先拿牌且必胜。

//取牌必胜算法//
#include
int main(){
	int total=54; //剩余牌总数 
	int who; //标记是人还是计算机取牌,0是计算机取,1是人取
	int num; //出牌数,大于等于1且小于等4
	int n0; //计算机先取牌数 
	int N=5; //人机调整范围
	printf("******欢迎参加取牌游戏******\n"); 
	who=0;
	printf("\n标记%d\n",who);
	printf("计算机先取牌\n");
	n0=(54-1)%N; //计算先取牌数 
	printf("计算机取了%d张牌\n",n0);
	total=total-n0;
	printf("现在还剩下%d张牌\n",total);
	while(total>=1)
	{
		who=1;
		printf("\n标记%d\n",who);
		printf("轮到您取牌啦\n");
		scanf("%d",&num);
		while(num<1||num>4||num>total) //限定取牌数量,同时防止取牌数量大于剩余牌数 
		{
			printf("取牌数量不对,请重新取牌\n");
			scanf("%d",&num);
		 } 
		printf("您取了%d张牌\n",num);
		total=total-num;
		printf("现在还剩下%d张牌\n",total); 
		if(total==0) //判断张数是否为0,如果是则可以跳出循环,结束取牌 
		{
			break;
		}
		else{
		who=0;
		printf("\n标记%d\n",who);
		printf("计算机取了%d张牌\n",N-num);
		total=total-N+num;
		printf("现在还剩下%d张牌\n",total);  	
		}	
	 } 
	 if(total==0)
	 {
	 	printf("\n"); 
		 if(who=0)
	 	printf("您获胜!\n");
		 else
		 printf("计算机获胜"); 
	 } 
}


C语言取牌游戏_第1张图片

你可能感兴趣的:(C语言)