纸牌游戏-小猫钓鱼

来源:互联网 发布:ubuntu安装图形界面 编辑:程序博客网 时间:2024/03/29 20:57

    这题是我再一个一篇文章看到的,他用c写的,我该用java来测试一下。一方面熟悉一下集合Queue和Stack,另一方面看一下这个算法。

    题目:假设游戏开始时q1和q2都有6张牌,分别顺序为2 4 1 2 5 6和3 1 3 5 6 4,游戏规则为轮流出牌,当谁出牌与桌子上的目标牌有相同时,则可以收掉与桌面目标牌之间的几张牌,全部放在牌的尾部。但是除了桌面的那张目标牌。当谁手上没有牌时,则对方胜利。

    这个题目可以使用一个栈和两个队列。利用栈的“先进先出的特点”,将桌面上的牌放入栈中,利用队列“先进后出,对头出,队尾进”的特点,将两个人的牌分别用队列存储。同时用一个整形数组判断桌面是否与手上的数一致。

    值得注意的是Java中的Stack是一个类,Queue是一个接口,可以用他的实现类ArrayDeque。具体分析,见代码:

public class Test {
public static void main(String[] args) {
Queue<Integer> q1 = new ArrayDeque<Integer>(); 
Queue<Integer> q2 = new ArrayDeque<Integer>(); 
Stack<Integer> s=new Stack();
Scanner scan=new Scanner(System.in);
int book[]=new int[10];
//初始化队列和栈
//初始化用来标记的数组,用来标记哪些牌已经在桌子上
for(int i=0;i<10;i++){
book[i]=0;
}
//依次向队列q1中插入6个数

for(int i=1;i<=6;i++){
int c=scan.nextInt();
q1.add(c);
}
//依次向队列q2中插入6个数

for(int i=1;i<=6;i++){
int cc=scan.nextInt();
q2.add(cc);
}

int t,p;//t存放打出一张牌,p存放将桌面上的牌放到自己手上
//当队列不为空时
while(!q1.isEmpty() && !q2.isEmpty()){
//q1出一张牌,出队列
t=q1.poll();
//判断这张牌是否能赢牌
if(book[t]==0){//不能银牌
book[t]=1;
//进栈
s.push(t);
}else{//能银牌
//将打出的牌放到末尾
q1.add(t);
//把桌子上的在t之间的牌全部放到q1末尾
/*while(s.peek()!=t){
p=s.pop();
book[p]=0;
q1.add(p);
}*/
while(s.peek()!=t){
p=s.pop();
book[p]=0;
q1.add(p);
}
}

//q2出一张牌,已经出队列了
t=q2.poll();
if(book[t]==0){//不能赢牌
book[t]=1;
s.push(t);
}else{//能赢牌
q2.add(t);
while(s.peek()!=t){
p=s.pop();
book[p]=0;
q2.add(p);
}
}
}

if(q1.isEmpty()){
System.out.println("q2 is win");
System.out.println("q2当前手上的牌是: ");
while(!q2.isEmpty()){
System.out.print(q2.poll()+" ");
}

if(!s.isEmpty()){
System.out.println();
System.out.println("桌上的牌是: ");
while(!s.isEmpty()){
System.out.print(s.pop()+" ");
}
}
}
if(q2.isEmpty()){
System.out.println("q1 is win");
System.out.println("q1当前手上的牌是: ");
while(!q1.isEmpty()){
System.out.print(q1.poll()+" ");
}

if(!s.isEmpty()){
System.out.println();
System.out.println("桌上的牌是: ");
while(!s.isEmpty()){
System.out.print(s.pop()+" ");
}
}
}

}
}

后期大家可以试试将目标牌也收了的情况,我试了一下,不对。没有再去思考了。这题可以给个参考例子,

2 4 1 2 5 6

3 1 3 5 6 4

运行结果;

q1 is win
q1当前手上的牌是: 
5 6 2 3 1 4 6 5 
桌上的牌是: (这个与实际情况相反,可以自己去转换一下)
4 3 1 2 

0 0
原创粉丝点击