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<stdio.h>
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("计算机获胜");
}
}