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

说明: 这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。

分析:我们先来分析一下这个游戏有哪几种操作。小哼有两种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈的操作和小哼是一样的。而桌子就是一个栈,每打出一张牌放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。那如何解决赢牌的问题呢?赢牌的规则是:如果某人打出的牌与桌上的某张牌相同,即可将两张牌以及中间所夹的牌全部取走。那如何知道桌上已经有哪些牌了呢?最简单的方法就是枚举桌上的每一张牌,当然也有更好的办法我们待会再说。OK, 小结一下,我们需要两个队列、一个栈来模拟整个游戏。

#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 book[10]={0};int i,t;//初始化队列q1.head =0;q1.tail =0;q2.head =0;q2.tail =0;//初始化栈s.top =0;    //依次向队列中插入6个数//小哼手上的6张拍for(i=0;i<6;i++){scanf("%d",&q1.data [q1.tail ]);q1.tail ++;} //小哈手上的6张牌for(i=0;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) //表明桌上没有牌面为t的牌{//小哼此轮没有赢牌q1.head ++; //小哼已经打出一张牌,所以要把打出的牌出队 s.top ++;s.data [s.top ]=t; //再把打出的牌放到桌上,即入栈 book[t]=1; //标记桌上现在已经有牌面t的牌 }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 } }t=q2.data [q2.head ]; //小哈出一张牌//判断小哈当前打出的牌是否能够赢牌if(book[t]==0){//小哈此轮没有赢牌q2.head ++; //小哈已经打出一张牌,所以要把打出的牌出队 s.top ++; s.data [s.top ]=t; //再把打出的牌放到桌上,即入栈 book[t]=1; //标记桌上现在已经有的牌面t的牌 }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 --; //栈中少了一张牌,所以栈要减1 } } }if(q2.head ==q2.tail ){printf("小哼win\n");printf("小哼当前手中的牌是");for(i=q1.head ;i<=q1.tail ;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 ;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;
}

输入:

请输入小哼手上的6张牌:2 4 1 2 5 6
请输入小哈手上的6张牌:3 1 3 5 6 4

输出:

小哼WIN!
小哼手里的牌是:5 6 2 3 1 4 6 5
桌上的牌是:2 1 3 4

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

  1. 【C++】小猫钓鱼纸牌游戏--C++实现

    小猫钓鱼问题: 描述:初始,两个人各有n张牌(牌面0-10),顺序固定,只能按顺序出牌.然后,两个人轮流在桌面上以接龙的方式出牌,当某个人放置的牌在桌面上已经出现时,他收起相同牌面及其中间的牌作为自己 ...

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

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

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

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

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

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

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

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

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

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

  7. js算法之旅:用队列和栈计算出扑克玩:拖板车(小猫钓鱼) 游戏的结果

    队列是什么 存储数据的方式,先进先出.后进后出,例如排队买票 栈是什么 存储数据的方式,先进后出.后进先出,例如手枪上膛了,先打出得永远是最后上进去那发子弹 游戏规则 星期天小哼和小哈约在一起玩桌游, ...

  8. 牛客网java编程题小猫钓鱼,纸牌

    在这篇文章中,我将重新创造卡牌游戏<炉石传说>卡组制作工具的卡牌排名算法 什么是<炉石传说> 炉石传说-一个虚拟纸牌游戏 对于那些不知道的人来说,<炉石传说>是一款 ...

  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. 用Vue框架和后台请求的时候传递的参数的方式
  2. Asp.Net编码模型
  3. UIButton 按钮控件-IOS开发 (实例)
  4. JavaScript label语句
  5. python如何获取鼠标点击图片的像素点坐标
  6. (转) android so 文件存私密数据,且防止 so文件未知应用盗用
  7. linux内存管理_浅谈Linux内存管理
  8. BasicGames Python 源码解析 01 AceyDucey
  9. UVa 1347 旅行
  10. 数组02 - 零基础入门学习C语言24
  11. 甜甜用计算机1050除以一个数,上册四年级数学期末试卷带答案
  12. iOS进阶之TCP代理鉴权过程
  13. Java中OutOfMemoryError(内存溢出)的情况及解决办法
  14. DelphiXE10.4安卓编程初学者心得
  15. DSP 程序远程升级 / Bootloader设计指南(六)—— 9大关键点
  16. Sentaurus入门(3):sde
  17. 信道编码与matlab仿真 刘东华,【网安学术】交织技术对信道编码的性能影响研究...
  18. 2022蓝桥杯——砍竹子
  19. 新浪邮箱服务器设置,免费的新浪邮箱设置outlook怎么设置?
  20. dnx sdk版本dnx-clr-win-x86.1.0.0-beta5无法安装

热门文章

  1. C51单片机的省电模式
  2. android手机如何群发信息
  3. Python基础——pandas.errors.ParserError: Error tokenizing data. C error: Expected 2 fields
  4. Cocos2dx使用ios内支付IAP具体流程-白白
  5. 任务四十三:多功能相册之拼图布局
  6. matlab 后台运行,MATLAB在后台运行的方法
  7. jQuery Treegrid自定义表头(全网独家)附带源码
  8. oracle metadata .getcolumns,通过DatabaseMetaData从Oracle中获取字段的注释
  9. Python中bisect的使用方法
  10. ios--iTunes同步应用失败