package com.nxz.blog.otherTest; import java.util.Queue; import java.util.Stack; import java.util.concurrent.LinkedBlockingQueue; public class Test02 { /** * 扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的 * 第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌 * 的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即 * 可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人 * 手中的牌全部出完时,游戏结束,对手获胜 */ private static Queue<Integer> q1 = new LinkedBlockingQueue<Integer>(); private static Queue<Integer> q2 = new LinkedBlockingQueue<Integer>(); private static Stack<Integer> stack = new Stack<>(); /** * 以上规则要求可以使用两个队列来表示每个人手中的牌,一个栈表示桌面上的牌,一个数组来判断时候存在相同的牌 * * @param args */ public static void main(String[] args) { //初始化两个队列,也就是每个人手中的牌 int[] arr1 = new int[]{2, 4, 1, 2, 5, 6}; int[] arr2 = new int[]{3, 1, 3, 5, 6, 4}; for (int i : arr1) { q1.add(i); } for (int i : arr2) { q2.add(i); } //初始化判断桌面上有牌的数组,大小为10,因为本次测试中不同牌的个数为最多为9个 int[] book = new int[10]; //当向桌上扔牌时,就表示向stack中入栈,同时在数组中索引为牌的值的位置加1,表示桌面上已经有这个牌了 //循环扔牌 while (!q1.isEmpty() && !q2.isEmpty()) { //定义一个临时变量,表示当前扔的牌 int temp; //stack弹出的 int t; temp = q1.poll(); if (book[temp] == 0) { stack.push(temp); book[temp] = 1; } else { //表示桌面上已经存在 book[temp] = 0; q1.add(temp); while (!stack.isEmpty() && (t = stack.pop()) > 0) { book[t] = 0; q1.add(t); if (t == temp) { break; } } } if(q1.isEmpty()){ break; } temp = q2.poll(); if (book[temp] == 0) { stack.push(temp); book[temp] = 1; } else { //表示桌面上已经存在 q2.add(temp); book[temp] = 0; while (!stack.isEmpty() && (t = stack.pop()) > 0) { book[t] = 0; q2.add(t); if (t == temp) { break; } } } if(q2.isEmpty()){ break; } System.out.println(); System.out.print("stack:"); stack.stream().forEach(item -> { System.out.print(item); }); } //判断输赢 if(q1.isEmpty()){ System.out.println("第二个人获胜"); Object[] objects = q2.toArray(); for (Object object : objects) { System.out.print(object); } } if(q2.isEmpty()){ System.out.println("第一个胜利"); Object[] objects = q1.toArray(); for (Object object : objects) { System.out.print(object); } } System.out.println(); stack.stream().forEach(item -> { System.out.print(item); }); } }
第二个人获胜 1652341 34562 Process finished with exit code 0