java实现纸牌游戏之小猫钓鱼算法
作者:蝴蝶Maple 发布时间:2021-08-11 22:57:00
标签:java,纸牌游戏,小猫钓鱼
星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。
输入
2 4 1 2 5 6
3 1 3 5 6 4
输出
小哼win
小哼当前手中的牌是 5 6 2 3 1 4 6 5 桌上的牌是 2 1 3 4
这道题目完全考察栈跟队列的应用,桌面上的牌是栈,个人手中的牌是队列。
附上JAVA实现的源码:
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
LinkedList<Integer> a = new LinkedList<Integer>();//A手中的牌
LinkedList<Integer> b = new LinkedList<Integer>();//B手中的牌
Stack<Integer> stack = new Stack<>();//记录桌面上的牌
int[] book = new int[10];//用来标记哪些牌已经在桌上
int n,t,s;
for(int i = 0; i < 10; i++){
book[i] = 0;
}
System.out.println("输入手中牌的个数");
n = scanner.nextInt();
System.out.println("输入A君手中牌的大小");
for(int i = 1; i<=n; i++){
a.addLast(scanner.nextInt());
}
System.out.println("输入B君手中牌的大小");
for(int i = 1; i<=n; i++){
b.addLast(scanner.nextInt());
}
System.out.println("输入完毕开始游戏");
while (!a.isEmpty() && !b.isEmpty()) {//当有人手中没牌游戏结束
t = a.removeFirst();
if (book[t] == 0) {//A没有赢
stack.push(t);//桌面上加一张牌
book[t] = 1;//记录桌面上已经有这张牌了
}else {//A赢了
a.addLast(t);//将打出的牌到到末尾
while (!stack.peek().equals(t)) {//将桌面上的牌按顺序放到A的末尾
s = stack.pop();
a.addLast(s);
book[s] = 0;
}
}
//同上B取出牌
t = b.removeFirst();
if (book[t] == 0) {
stack.push(t);
book[t] = 1;
} else {
b.addLast(t);
while (!stack.peek().equals(t)) {
s = stack.pop();
b.addLast(s);
book[s]= 0;
}
}
}
if (!a.isEmpty()) {//A胜利
System.out.println("A君胜利!A手中的牌是");
while (!a.isEmpty()) {
System.out.print(a.removeFirst()+ " ");
}
System.out.println();
if (!stack.isEmpty()) {//桌面上有牌
System.out.println("桌面上的牌是");
for (Integer x : stack) {
System.out.print(x + " ");
}
} else {
System.out.println("桌面没有牌了");
}
} else {//B胜利
System.out.println("B君胜利!B手中的牌是");
while (!b.isEmpty()) {
System.out.print(b.removeFirst()+ " ");
}
System.out.println();
if (!stack.isEmpty()) {//桌面上有牌
System.out.println("桌面上的牌是");
for (Integer x : stack) {
System.out.print(x + " ");
}
} else {
System.out.println("桌面没有牌了");
}
}
return;//结束
}
}
结果:
输入手中牌的个数
6
输入A君手中牌的大小
2 4 1 2 5 6
输入B君手中牌的大小
3 1 3 5 6 4
输入完毕开始游戏
A君胜利!A手中的牌是
5 6 2 3 1 4 6 5
桌面上的牌是
2 1 3 4
来源:https://blog.csdn.net/qq_24046745/article/details/52723671


猜你喜欢
- 1. 需要准备:apache-maven-3.2.3.zip包 Repository.rar本地仓库
- 概述企业内部一般都有一套单点登录系统(常用的实现有apereo cas),所有的内部系统的登录认证都对接它。本文介绍spring boot的
- 目录@CachePut设置的key值无法与@CacheValue的值匹配缓存注解key的基本数据类型要求必须要统一Spring-Cache
- 在.NET 4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo
- 目录前言Binder的使用模糊进程间调用Binder原理ioctlbinder初始化总结前言Binder是安卓中实现IPC(进程间通信的)常
- using System; using System.IO; using System.Threading; using System.Wi
- finalize方法是什么finalize方法是Object的protected方法,Object的子类们可以覆盖该方法以实现资源清理工作,
- java 中ArrayList与LinkedList性能比较今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 Lin
- 根据狂神的视频做的,然后自己优化了一些bug,比如新生成食物的时候不会生成在蛇的身体上,再新增长身体的时候不会在左上角出现一个绿色的方块以及
- 目录I. 环境配置1. 项目配置2. 数据库表II. 传参类型确定1. 参数类型为整形2. 指定jdbcType3. 传参类型为String
- 格式要求:SU MO TU WE TH FR SA &nb
- 最近的一个接口项目,传的参数要求是json,需要特殊处理一下。重点是这两句话:httpPost.setHeader("Conten
- List接口介绍—ArrayList有序、可重复线程不安全,因为没有synchronized修饰ArrayList源码结论ArrayList
- Spring Cloud Gateway 默认的filter功能和执行顺序有效性Spring Cloud Gateway 2.0.0.REL
- 利用java8流的特性,我们可以实现list中多个元素的 属性求和 并返回。案例:有一个借款待还信息列表,其中每一个借款合同包括:本金、手续
- 在文章中,我们将对输入到机器学习模型中的数据集进行预处理。这里我们将对一个硬币数据集进行预处理,以便以后在监督学习模型中进行训练。在机器学习
- 一、开源项目 Javascript .NET地址: http://javascriptdotnet.codeplex.com/ 它是Goog
- Activity设置全屏和无标题栏,要用到andorid.view.Window和Android.view.WindowManager。 W
- producer是生产者的意思:指生产数据的线程,consumer是消费者的意思:指的是使用数据的线程public class Produc
- .NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using Sys