纸牌游戏——小猫钓鱼
一、游戏规则
将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(小哼和小哈手中牌的牌面只有1~9)
二、题目分析
- 小哼和小哈有两种操作,分别是出牌和赢牌,这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。
- 桌子就是一个栈,每打出一张牌放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
- 枚举桌上的每一张牌,如果某人打出的牌与桌子上的某张牌相同,即可将两张牌以及中间所夹的牌全部取走。
- 综上所述,我们需要两个队列、一个栈来模拟整个游戏。
1,首先我们来创建一个结构体用来实现队列:
struct queue{int data[1000]; //数组data用来存储队列中的元素 int head; //head用来存储队头 int tail; //tail用来存储队尾 };
2,再创建一个结构体用来实现栈:
struct stack{int data[10]; //数组data用来存储栈中的元素 int top; //top用来存储栈顶 };
3,定义两个队列变量q1和q2:
struct queue q1,q2; //q1用来模拟小哼手中的牌,q2用来模拟小哈手中的牌 struct stack s; //栈变量s用来模拟桌上的牌
4,初始化队列和栈:
/*初始化队列q1和q2为空,因为此时两人手中都还没有牌*/ q1.head=1;q1.tail=1; q2.head=1;q2.tail=1; s.top=0; //初始化栈s为空,因为最开始的时候桌上也没有牌
5,读入小哼和小哈最初时手中的牌,分两次读入,每次读入6个数,分别插入q1和q2中:
for(i=1;i<=6;i++){ //先读入6张牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //读入一个数到队尾 q1.tail++; //队尾往后挪一位 }for(i=1;i<=6;i++){ //再读入6张牌,放到小哈手上 scanf("%d",&q2.data[q2.tail]);q2.tail++;}
6,游戏开始,小哼先出牌:
t=q1.data[q1.head]; //小哼先亮出一张牌
7,枚举桌上的每一张牌与t比较(判断桌上的牌与t有没有相同的):
if(flag==0) {q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队 s.top++;s.data[s.top]=t; //再把打出的牌放到桌上,即入栈 }
8,如果flag的值为1就标明小哼可以赢得桌上的牌,所以需要将赢得的牌依次放入小哼的手中:
if(flag==1) //小哼此轮可以赢牌 {q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队 q1.data[q1.tail]=t; //因为此轮可以赢牌,所以紧接着把刚才打出的牌又放到手中牌的末尾 q1.tail++;while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾 {q1.data[q1.tail]=s.data[s.top]; //依次放入队尾 q1.tail++;s.top--; //栈中少了一张牌,所以栈顶要减1 } }
9,至此,小哼出牌的所有阶段就模拟完了(小哈类似)。接下来我们要判断游戏如何结束:即只要两人中有一个人的牌用完了游戏就结束。因此我们需要在模拟两人出牌代码的外面加一个while循环来判断:
while(q1.head<q1.tail && q2.head<q2.tail){ //当队列不为空的时候执行循环
10,输出谁最终赢得了游戏,以及游戏结束后获胜者手中的牌和桌上的牌。(以小哼为例)
if(q2.head==q2.tail)//如果小哼获胜那么小哈手中一定没有牌了(队列q2为空) {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]);}elseprintf("\n桌上已经没有牌了");}
三、完整代码如下
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<stdio.h> struct queue{int data[1000]; //数组data用来存储队列中的元素 int head; //head用来存储队头 int tail; //tail用来存储队尾 }; struct stack{int data[10]; //数组data用来存储栈中的元素 int top; //top用来存储栈顶 };int main() {struct queue q1,q2; //q1用来模拟小哼手中的牌,q2用来模拟小哈手中的牌 struct stack s; //栈变量s用来模拟桌上的牌 int book[10];int i,t;/*初始化队列q1和q2为空,因为此时两人手中都还没有牌*/ q1.head=1;q1.tail=1;q2.head=1;q2.tail=1;s.top=0; //初始化栈s为空,因为最开始的时候桌上也没有牌 for(i=1;i<=9;i++)book[i]=0;for(i=1;i<=6;i++){ //先读入6张牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //读入一个数到队尾 q1.tail++; //队尾往后挪一位 }for(i=1;i<=6;i++){ //再读入6张牌,放到小哈手上 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--; //栈中少了一张牌,所以栈顶要减1 }book[s.data[s.top]]=0;q1.data[q1.tail]=s.data[s.top];q1.tail++;s.top--;}if(q1.head==q1.tail) break;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--;}book[s.data[s.top]]=0;q2.data[q2.tail]=s.data[s.top];q2.tail++;s.top--;}}if(q2.head==q2.tail)//如果小哼获胜那么小哈手中一定没有牌了(队列q2为空) {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]);}elseprintf("\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]);}elseprintf("\n桌上已经没有牌了");} return 0; }
小猫钓鱼
转载于:https://www.cnblogs.com/OctoptusLian/p/6686759.html
纸牌游戏——小猫钓鱼相关推荐
- 啊哈算法之纸牌游戏小猫钓鱼
简述 本算法摘选自啊哈磊所著的<啊哈!算法>第二章第三节的题目--纸牌游戏小猫钓鱼.文中代码使用C语言编写,但是仔细看了一遍发现原书中有个细节是错误的,也就是说按照算法题目意思,原书中作者 ...
- 算法学习 2.3纸牌游戏——小猫钓鱼
这是一章对前面的队列,栈的操作进行运用的一个实例.玩家A和玩家B玩纸牌游戏小猫钓鱼,游戏规则如下: 一副纸牌,平均分成两份,每人拿一份(这里就用数字代替了). 玩家A先拿出一张纸牌放在桌子上,玩家B再 ...
- 《啊哈算法》纸牌游戏---小猫钓鱼
扑克游戏: 将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张放在桌上,就这样两人交替出牌. 出牌时,若某人打出的牌与桌面上的某张牌面相同,即将两张 ...
- 纸牌游戏-----小猫钓鱼
游戏规则 将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放桌上,然后小哈也拿出来手中的第一张扑克牌,并放在小哼刚打出来的扑克牌上边,就像这样两人交替出牌.出牌时,如果某人打出的牌与 ...
- 纸牌游戏新版小猫钓鱼设计制作
新版纸牌游戏<小猫钓鱼>设计制作 此游戏设计是我新创制的简单的卡牌游戏.属于儿童益智类游戏,适用于儿童的认知教育. 游戏规则很简单:找配对的牌消去. 游戏设置2个玩家对玩,鱼池置牌21张, ...
- java钓鱼_java实现纸牌游戏之小猫钓鱼算法
星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然 ...
- 栈,队列(纸牌游戏,小猫钓鱼)
文章目录 队列:FIFO 实现顺序队列: 1.顺序循环队基本操作 2.链队 栈 1. 顺序栈 栈的元素 初始化操作 入栈操作 判断顺序栈是否为空 栈的长度 出栈 清空一个栈 销毁顺序栈 2.链式栈 应 ...
- 小猫钓鱼(纸牌游戏)
星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然 ...
- phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏
phaser.min.js I'm a tabletop game developer, and am continually looking for ways to digitize game ex ...
最新文章
- 8.使用for循环和while循环遍历文件
- 1、SpringBoot整合JPA
- suoi46 最大和和 (线段树)
- python中property方法有用_python中@property和property函数常见使用方法示例
- Java笔记(二)抽象类,接口,完全解耦,多重继承,内部类,静态类,匿名内部类
- 在CDH sandbox中安装并测试livy
- CCF201709-5 除法(100分)【树状数组+线段树】
- Lecture 1:强化学习简介
- python爬取酷狗音乐歌词_python爬虫教程:爬取酷狗音乐
- 【智能制造】服装企业数字化转型之路
- Java中swing修改左上角的图标
- html鼠标悬停多个效果,33个jQuery与CSS3实现的绚丽鼠标悬停效果
- matlab将数据集分成训练集和测试集,Matlab实现 把数据集X分割成训练集和测试集...
- matlab去eog,使用ICA去除32通道脑电数据中的眼电
- JavaEE中的依赖性——依赖性注入
- java 通过onvif抓取海康摄像头图片
- win7电脑变身WiFi热点,让手机、笔记本共享上网
- @ConfigurationProperties(prefix = )异常报错解决方案:
- 四道Java基础题 你能对几道?
- Echarts实现多个Y轴,2个以上不同计量单位的折线图数据横向对比