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
0
投稿
猜你喜欢
- 本文实例讲述了Java实现二分查找算法。分享给大家供大家参考。具体如下:1. 前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的
- 最近项目中需要实现定时执行任务,比如定时计算会员的积分、调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍。
- 面试题1:说一下抽象类和接口有哪些区别?正经回答:抽象类和接口的主要区别:从设计层面来说,抽象类是对类的抽象,是一种模板设计;接口是行为的抽
- 如下所示://view重绘时回调view.getViewTreeObserver().addOnDrawListener(new OnDra
- 模板消息文档公众号的类型分为服务号、订阅号和企业号,其中服务号和订阅号比较常见。要想实现公众号推动消息给指定的用户,其类型必须为服务号。推送
- 1.try-catch异常处理说明Java提供try和catch块来处理异常,try块用于包含可能出错的代码。catch块用于处理try块中
- Java数组的定义和使用如果希望保存一组有相同类型的数据,可以使用数组。数组的定义和内存分配Java 中定义数组的语法有两种:
- 前言在使用Java开发接口请求中,我们需要对请求进行进行统一返回值,这时候我们自己封装一个统一的Result返回类,下面就介绍下我用的这种的
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 本文作者:Spring_ZYL文章来源:https://blog.csdn.net/gozhuyinglong版权声明:本文版权归作者所有,
- 一般文本文件我们以日志文件.log文件为例:import java.io.BufferedReader; import java.io.Fi
- MyBatis 通过包含的jdbcType类型BIT FLOAT CHAR &nbs
- 使用mybatis-plus自动生成了5个模块(xml/bean/mapper/service/controller)的代码,这里练习一下m
- java 反射机制:测试实体类以Human为例/** * Project: Day12_for_lxy * Created: Lulu *
- 一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一
- spring-retry是什么?spring-retry是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提
- 最近在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串类似于:z
- 三目条件运算公式为 x?y:z 其中x的运算结果为boolean类型,先计算x的值,若为true,则整个三目运算的结果为表达式y
- 我们使用Jmeter测试同学的网站时,就会出现网站无法访问,403等错误。An error occurred.Sorry, the page
- 1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。字符型注入:黑色部分为拼接