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