纸牌游戏-小猫钓鱼(队列和栈的基本应用)
来源:互联网 发布:mac连不上手机热点 编辑:程序博客网 时间:2024/05/17 03:50
首先给小哼和小哈发牌,然后按照先小哼后小哈的出牌顺序出牌。出牌时,若某人打出的牌面与桌子上的某张牌面相同,则这个人将两张相同和之间的牌全部取走,并依次放在自己手中牌的末尾。当任意一人手中的牌全部取完时,游戏结束,对手获胜。
分析:
不管小哼还是小哈,他们总共只有两种操作--出牌和赢牌,这就可以很好地用出列和入列模拟,用栈模拟桌子,能够很好地清楚桌子上的牌的情况。
#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;//模拟桌子 int i,t,book[10]={0}; //初始化队列 q1.head=1;q1.tail=1; q2.head=1;q2.tail=1; //初始化栈 s.top=0; //给小哼发牌 for(i=1;i<=6;i++) { scanf("%d",&q1.data[q1.tail]); q1.tail++; } //给小哈发牌 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.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--; } //收下另一张与打出的牌相同的牌,并将它们放到手牌后面 q1.data[q1.tail]=s.data[s.top]; q1.tail++; s.top--; book[t]=0;//此时小哼打出的牌在桌子上的出现次数归零 } if(q1.head==q1.tail) break;//如果小哼打完手中牌,则游戏结束 //小哈出牌阶段 t=q2.data[q2.head];//标记小哈打出的牌 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]; q2.tail++; s.top--; } //小哈收下与打出的牌相同的牌 q2.data[q2.tail]=s.data[s.top]; q2.tail++; s.top--; book[t]=0;//此时小哈打出的牌在桌子上在桌子上的出现次数归零 } } if(q1.head==q1.tail) { printf("小哈win\n小哈当前手中的牌是:"); for(i=q2.head;i<q2.tail;i++) printf(" %d",q2.data[i]);//依次输出小哈手上的牌 printf("\n"); if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌 printf("桌子上没有牌了\n"); else{ printf("桌子上的牌是:"); for(i=1;i<=s.top;i++) printf(" %d",s.data[i]);//依次输出桌子上的牌 printf("\n"); } } else { printf("小哼win\n小哼当前手中的牌是:"); for(i=q1.head;i<q1.tail;i++) printf(" %d",q1.data[i]);//依次输出小哼手上的牌 printf("\n"); if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌 printf("桌子上没有牌了\n"); else{ printf("桌子上的牌是:"); for(i=1;i<=s.top;i++) printf(" %d",s.data[i]);//依次输出桌子上的牌 printf("\n"); } } return 0;}运行结果:
总结:
首先联想这个游戏的过程,然后利用队列和栈进行模拟此过程。代码改了很多次才改对,很多都是逻辑上没有错误,只是一点打错的错误。这点错误看了很久才看出来,这是不应该,所以以后调试代码的时候不要太急,沉下心来慢慢找。
0 0
- 纸牌游戏-小猫钓鱼(队列和栈的基本应用)
- 纸牌游戏-小猫钓鱼
- 纸牌游戏--小猫钓鱼
- 栈和队列的实际应用:小猫钓鱼
- 小猫钓鱼--栈和队列的使用
- 纸牌游戏——小猫钓鱼 栈与队列合用实现
- 纸牌游戏——小猫钓鱼(阿哈!算法)
- [数据结构]纸牌游戏——小猫钓鱼
- 2.3纸牌游戏——小猫钓鱼
- 纸牌游戏——小猫钓鱼
- 纸牌游戏——小猫钓鱼
- 栈与队列,小猫钓鱼
- 啊哈!算法—纸牌游戏—小猫钓鱼
- java实现纸牌游戏-小猫钓鱼算法
- 寒假算法第三编——小猫钓鱼游戏(栈与队列综合问题)
- 算法入门——小猫钓鱼纸牌
- 小猫钓鱼游戏java实现
- 第15周 啊哈算法 队列和栈的实例:纸牌游戏
- 关于Adaboost的一些理解
- LEETCODE--First Unique Character in a String
- javascipt字符串函数
- 1029. Median (25)
- XML学习
- 纸牌游戏-小猫钓鱼(队列和栈的基本应用)
- jquery笔记:css
- 编写程序输入一个n*n的矩阵,求出两条对角线元素值之和
- 1059. C语言竞赛(20)
- vue2.0-组件-文档理解笔记v1.0
- React学习札记
- 蓝桥杯 基础练习02 Java实现
- 一个字节中被置为1的位的个数
- 设计模式-建造模式