一、游戏规则

将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(小哼和小哈手中牌的牌面只有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桌上已经没有牌了");}

三、完整代码如下

#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

纸牌游戏——小猫钓鱼相关推荐

  1. 啊哈算法之纸牌游戏小猫钓鱼

    简述 本算法摘选自啊哈磊所著的<啊哈!算法>第二章第三节的题目--纸牌游戏小猫钓鱼.文中代码使用C语言编写,但是仔细看了一遍发现原书中有个细节是错误的,也就是说按照算法题目意思,原书中作者 ...

  2. 算法学习 2.3纸牌游戏——小猫钓鱼

    这是一章对前面的队列,栈的操作进行运用的一个实例.玩家A和玩家B玩纸牌游戏小猫钓鱼,游戏规则如下: 一副纸牌,平均分成两份,每人拿一份(这里就用数字代替了). 玩家A先拿出一张纸牌放在桌子上,玩家B再 ...

  3. 《啊哈算法》纸牌游戏---小猫钓鱼

    扑克游戏: 将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张放在桌上,就这样两人交替出牌. 出牌时,若某人打出的牌与桌面上的某张牌面相同,即将两张 ...

  4. 纸牌游戏-----小猫钓鱼

    游戏规则 将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放桌上,然后小哈也拿出来手中的第一张扑克牌,并放在小哼刚打出来的扑克牌上边,就像这样两人交替出牌.出牌时,如果某人打出的牌与 ...

  5. 纸牌游戏新版小猫钓鱼设计制作

    新版纸牌游戏<小猫钓鱼>设计制作 此游戏设计是我新创制的简单的卡牌游戏.属于儿童益智类游戏,适用于儿童的认知教育. 游戏规则很简单:找配对的牌消去. 游戏设置2个玩家对玩,鱼池置牌21张, ...

  6. java钓鱼_java实现纸牌游戏之小猫钓鱼算法

    星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然 ...

  7. 栈,队列(纸牌游戏,小猫钓鱼)

    文章目录 队列:FIFO 实现顺序队列: 1.顺序循环队基本操作 2.链队 栈 1. 顺序栈 栈的元素 初始化操作 入栈操作 判断顺序栈是否为空 栈的长度 出栈 清空一个栈 销毁顺序栈 2.链式栈 应 ...

  8. 小猫钓鱼(纸牌游戏)

    星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然 ...

  9. 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 ...

最新文章

  1. 8.使用for循环和while循环遍历文件
  2. 1、SpringBoot整合JPA
  3. suoi46 最大和和 (线段树)
  4. python中property方法有用_python中@property和property函数常见使用方法示例
  5. Java笔记(二)抽象类,接口,完全解耦,多重继承,内部类,静态类,匿名内部类
  6. 在CDH sandbox中安装并测试livy
  7. CCF201709-5 除法(100分)【树状数组+线段树】
  8. Lecture 1:强化学习简介
  9. python爬取酷狗音乐歌词_python爬虫教程:爬取酷狗音乐
  10. 【智能制造】服装企业数字化转型之路
  11. Java中swing修改左上角的图标
  12. html鼠标悬停多个效果,33个jQuery与CSS3实现的绚丽鼠标悬停效果
  13. matlab将数据集分成训练集和测试集,Matlab实现 把数据集X分割成训练集和测试集...
  14. matlab去eog,使用ICA去除32通道脑电数据中的眼电
  15. JavaEE中的依赖性——依赖性注入
  16. java 通过onvif抓取海康摄像头图片
  17. win7电脑变身WiFi热点,让手机、笔记本共享上网
  18. @ConfigurationProperties(prefix = )异常报错解决方案:
  19. 四道Java基础题 你能对几道?
  20. Echarts实现多个Y轴,2个以上不同计量单位的折线图数据横向对比

热门文章

  1. Hibernate 关联映射 之 多对多 关联(一)
  2. getHibernateTemplate()与getSession()的区别
  3. 构建、测试和部署驱动程序
  4. UVA 11292 The Dragon of 贪心
  5. 深入Java虚拟机:Class文件实例解析
  6. golang中的strings.Compare
  7. Flutter入门进阶之旅(九)StatelessWidget StatefullWidget
  8. 记录一次阿里架构师全程手写Spring MVC
  9. H3C 交换机升级说明
  10. 利用HttpRequester进行接口测试