纸牌游戏——小猫钓鱼(栈和队列结合使用)

Hazel ·
更新时间:2024-09-21
· 503 次阅读

题目描述

“ 小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。 q1先拿出手中的第一张扑克牌放在桌上,然后q2也拿出手中的第一张扑克牌, 并放在q1刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

假如游戏开始时,q1手中有6张牌,顺序为241256,q2手中也有6张牌,顺序为313564,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,q1和q2手中牌的牌面只有1~9。

分析:
1.出牌看作出队,将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾 看作入队
2.桌面上的牌看作出栈和入栈
创建队列和栈的结构体

struct queue { int data[100]; int head; int tail; }; struct stack { int data[100]; int top; };

3.判断自己能否赢牌,可以根据桶排序的思想。手中的牌只要0~9,可以使用book[10]来存储,初始化为0;

int book[10]; for(int i=1;i<10;i++) book[i]=0;

4.如果桌面上增加了一张牌面为2的牌,需要将book[2]==1;表示桌面上有牌面为2 的牌。若牌面为2的牌被赢走,book[2]==0。

代码如下

#include using namespace std; struct queue { int data[100]; int head; int tail; }; struct stack { int data[100]; 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 n,t,book[10]; printf("请输入每人手中有几张牌\n"); cin>>n; for(int i=1;i<10;i++) book[i]=0; printf("请输入玩家Q1的牌\n"); for(int i=0;i<n;i++) {//为玩家q1赋值(发牌) scanf("%d",&q1.data[q1.tail]); q1.tail++; } printf("请输入玩家Q2的牌\n"); for(int i=0;i<n;i++) {//为玩家q2赋值(发牌) scanf("%d",&q2.data[q2.tail]); q2.tail++; } while(q1.head<q1.tail&&q2.head<q2.tail)//循坏的条件,两人手中都有牌 { t=q1.data[q1.head];//玩家q1出一张牌 if(book[t]==0)//表示桌面无此牌,无法赢牌 { q1.head++;//将队首的牌出出去; 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;//把收回的牌标记为0,表示桌面现无此牌 q1.data[q1.tail]=s.data[s.top];//入队 q1.tail++; s.top--; //出栈 } book[s.data[s.top]]=0;//收回桌面牌面为t的牌 q1.data[q1.tail]=s.data[s.top]; q1.tail++; s.top--; } if(q1.head==q1.tail)break; t=q2.data[q2.head]; //玩家q2出一张牌 if(book[t]==0) { q2.head++; 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]; s.top--; q2.tail++; } book[s.data[s.top]]=0; q2.data[q2.tail]=s.data[s.top]; q2.tail++; s.top--; } } if(q2.head==q2.tail) { printf("Q1win\n"); printf("手中的牌 "); for(int i=q1.head;i0) { printf("桌上的牌还有"); for(int i=1;i<=s.top;i++) printf("%d",s.data[i]); //输出桌面上的牌 } else printf("桌上无牌"); } else { printf("Q2win\n"); printf("手中的牌 "); for(int i=q2.head;i0) { printf("桌上的牌还有"); for(int i=1;i<=s.top;i++) printf("%d",s.data[i]); } else printf("桌上无牌"); } getchar();getchar(); return 0; }

在这里插入图片描述


作者:小牛犊QAQ



小猫钓鱼 钓鱼 队列

需要 登录 后方可回复, 如果你还没有账号请 注册新账号