游戏规则:将一副纸牌分成两份,一人一份,然后依次出牌到桌面上,但一人出的牌为桌面上没有的牌时,则下一个人出牌,反之,则出牌人将自己出的牌和桌面上与自己相同的牌之间的所有牌拿回手中并放到最下面,但一人手中牌出完时游戏结束,该人为输。
提示:该题主要考察对 队列 和 栈 的理解和应用,两人手中的牌可以抽象为队列,先进先出;而桌面上的牌可以抽象为栈,先进后出。
#include "stdio.h" //小哼小哈手里的牌,以队列形式表示 struct queue{ int data[1000]; int head; int tail; }; //桌面上的牌以栈的形式表示 struct stack{ int data[10]; int top; }; int main(){ struct queue q1,q2; struct stack s; q1.head=1; q1.tail=1; q2.head=1; q2.tail=1; s.top=0; int i,t; //创建小哼小哈,桌面 int book[10]={0};//记录桌面上的牌,用于判断能否赢牌; printf("请输入小哼的6张牌型\n"); for(int i=1;i<=6;i++){ scanf("%d",&q1.data[q1.tail]);//小哼牌面初始化 q1.tail++; } printf("请输入小哈的6张牌型\n"); for(i=1;i<=6;i++){ scanf("%d",&q2.data[q2.tail]);//小哈牌面初始化 q2.tail++; } while(q1.head<q1.tail&&q2.head<q2.tail) { t=q1.data[q1.head];//小哼打出第一张牌,需判断此张牌能否赢牌 if(book[t]==0)//没有赢牌 { q1.head++; s.top++; s.data[s.top]=t;//把该牌入栈,放到桌面; book[t]=1;//标记该牌,表明桌面已有; }else//可以赢牌 { q1.head++; q1.data[q1.tail]=t;//把打出的牌放回手中 q1.tail++; while(s.data[s.top]!=t)//拿回桌面中可以拿的牌 { book[s.data[s.top]]=0; q1.data[q1.tail]=s.data[s.top]; q1.tail++;s.top--; } } t=q2.data[q2.head];//小哈打出第一张牌,需判断此张牌能否赢牌 if(book[t]==0)//没有赢牌 { q2.head++; s.top++; s.data[s.top]=t;//把该牌入栈,放到桌面; book[t]=1;//标记该牌,表明桌面已有; }else//可以赢牌 { q2.head++; q2.data[q2.tail]=t;//把打出的牌放回手中 q2.tail++; while(s.data[s.top]!=t)//拿回桌面中可以拿的牌 { book[s.data[s.top]]=0; q2.data[q2.tail]=s.data[s.top]; q2.tail++;s.top--; } } }//游戏结束 if(q2.head==q2.tail)//小哼赢了 { printf("小哼win\n"); printf("小哼当前手中的牌是"); for(i=q1.head;i<=q1.tail-1;i++){ printf(" %d",q1.data[i]); } if(s.top>0)//当前桌面还有牌; { printf("\n当前桌面的牌是"); for(i=1;i<=s.top;i++){ printf(" %d",s.data[i]); } }else{ printf("\n桌面没有牌了"); } }else//小哈赢了 { printf("小哈win\n"); printf("小哈当前手中的牌是"); for(i=q2.head;i<=q2.tail-1;i++){ printf(" %d",q2.data[i]); } if(s.top>0)//当前桌面还有牌; { printf("\n当前桌面的牌是"); for(i=1;i<=s.top;i++){ printf(" %d",s.data[i]); } }else{ printf("\n桌面没有牌了"); } } return 0; }