当前位置:编程学习 > JAVA >>

java纸牌游戏程序找不出来哪里错了

编译时,总是不稳定,一会52张,一会36张,44张的。。。。

  题目描述:纸牌游戏War
  玩家:2人
  目标:强迫另一位玩家用完纸牌。
  设置:发一整副纸牌,给每位玩家发26张纸牌。将每位玩家的纸牌面朝下堆叠在一起。
  玩法:在每一局,每位玩家都要翻开他那一堆纸牌中顶部的纸牌。如果某位玩家的等级更高,则他会获得这两张纸牌并把它们添加到他那一堆纸牌的底部。如果出行平局,则通过“战争”来解决:每位玩家从他的那一堆纸牌中出3张面朝下的纸牌和另外一张面朝上的纸牌。如果最后两张纸牌中有一张纸牌的等级较高,则拥有该纸牌的玩家将赢得全部10张纸牌。对后续的平局进行类似的处理,一局下来,最终的获胜者会得到一堆甚至更多的纸牌。
  游戏结束:如果某位玩家无法出牌(甚至在战争中),他就输了。
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class zhipai {

    static LinkedList<Integer> s = new  LinkedList<Integer>(); //链接列表一

static LinkedList<Integer> s1 = new  LinkedList<Integer>();//链接列表二       
        
  
@SuppressWarnings("unused")
public static void main(String[] args) {
       

//1代表A,11代表J,12代表Q,13代表K
        Integer[] zhipai = 
        {1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,
        1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };  
        
        List<Integer> list = Arrays.asList(zhipai);  
    
        //洗牌,发牌
        Collections.shuffle(list);
        
        zhipai = (Integer[]) list.toArray();
        
        for(int i = 0;i<26;i++){
         s.offer((Integer) zhipai[i]);
        }
       
        System.out.println("甲拥有的"+s.size()+"张扑克牌为:");
        for(int i=0;i<26;i++){
         System.out.print(s.poll()+"\t");
        }
       
        for(int i = 26;i<52;i++){
         s1.offer((Integer) zhipai[i]);
        }
        
        System.out.println(); 
        System.out.println("乙拥有的"+s1.size()+"张的扑克牌为:");
        
        for(int i=0;i<26;i++){
        
       System.out.print(s1.poll()+"\t");
        }
       
        for(int i = 0;i<26;i++){
      s.offer((Integer) zhipai[i]);
        }
        for(int i = 26;i<52;i++){
      s1.offer((Integer) zhipai[i]);
        }
     
//开始游戏
       do{
          // 甲出的牌小于乙
        
          if(s.peek()<s1.peek()){
        
              s1.offer(s1.poll());
              s1.offer(s.poll());
         }
          // 甲出的牌大于乙
          else if(s.peek()>s1.peek()){
          
          s.offer(s.poll());
          s.offer(s1.poll());
            }
            
             //相等情况
             else if(s.peek()==s1.peek())
          {
         //在甲只剩4张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
              if ( s.size()==4 ){
                     
                 s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());
                   System.out.println();
                   System.out.println("甲没有牌了");
                         
                
                 }
                  //在乙只剩4张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
                   else   if ( s1.size()==4 ){
                    
                     s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());
                     System.out.println();
                   System.out.println("乙没有牌了");
                 }
                  // 在甲只剩3张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
                   else  if ( s.size()==3 ){

                 s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());
                 System.out.println();
                 System.out.println("甲没有牌了");
                 }
                 // 在乙只剩3张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
                   else if ( s1.size()==3 ){
                    
                     s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());
                     System.out.println();
                   System.out.println("乙没有牌了");
                 }
                 // 在甲只剩2张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
                   else if ( s.size()==2 ){

                 s1.offer(s.poll());s1.offer(s.poll());
                 System.out.println();
                 System.out.println("甲没有牌了");
                 }
                 // 在乙只剩2张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
                   else if ( s1.size()==2 ){
                    
                     s.offer(s1.poll());s.offer(s1.poll());
                     System.out.println();
                   System.out.println("乙没有牌了");
                 }
                 // 在甲只剩1张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
                   else if ( s.size()==1 ){

                 s1.offer(s.poll());
                 System.out.println();
                 System.out.println("甲没有牌了");
                 }
                 // 在乙只剩1张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
                   else if ( s1.size()==1 ){
                     s.offer(s1.poll());
                     System.out.println();
                 System.out.println("乙没有牌了");
                    }  
     
              
                   else{
            int[] a = {s.poll(),s.poll(),s.poll(),s.poll()};
               int[] b = {s1.poll(),s1.poll(),s1.poll(),s1.poll()};          
                
         //第一张牌相等的情况下,甲出的第5张牌小于乙
            if(s.peek()<s1.peek()){
          for(int i = 0 ; i<4;i++){
              s1.offer(b[i]);
             
              
               }
          for(int i = 0 ; i<4;i++){
              
              
                s1.offer(a[i]);
                }
          s1.offer(s1.poll());
          s1.offer(s.poll());
          
             }
         // 第一张牌相等的情况下,甲出的第5张牌大于乙
             else if(s.peek()>s1.peek()){
              for(int i = 0 ; i<4;i++){
               s.offer(a[i]);
              
              
              
               }
              for(int i = 0 ; i<4;i++){
               
               
                s.offer(b[i]);
               
                }
              s.offer(s.poll());
          s.offer(s1.poll());
             }
           
                }
               
                
             }

          }while(!s.isEmpty() && !s1.isEmpty() );//在甲或乙的牌数都不为0的情况下开始游戏
        
        
         //如果甲的牌数为0,则乙赢
        
          
        
         if(s.isEmpty()){
         System.out.println();
 System.out.println("乙赢得胜利,所得"+s1.size()+"张牌为:");
       for(int i=0;i<52;i++){
       System.out.print(s1.poll()+"\t");
       } 
         }
        
        //如果乙的牌数为0,则甲赢
            else if(s1.isEmpty()){
System.out.println();
    System.out.println("甲赢得胜利,所得"+s.size()+"张牌为:");
        for(int i=0;i<52;i++){
           System.out.print(s.poll()+"\t");
          }
}}



// TODO Auto-generated method stub

        
}  




java --------------------编程问答-------------------- 这是错误的错误的
而再次编译时又是正确的结果 --------------------编程问答-------------------- 对楼主的代码进行了一下改造,发现是这里少考虑了一种因素。。

else {
int[] a = { s.poll(), s.poll(), s.poll(), s.poll() };
int[] b = { s1.poll(), s1.poll(), s1.poll(), s1.poll() };
// 第一张牌相等的情况下,甲出的第5张牌小于乙
if (s.peek() < s1.peek()) {
System.out.println("甲出的第5张牌小于乙");
for (int i = 0; i < 4; i++) {
s1.offer(b[i]);
}
for (int i = 0; i < 4; i++) {
s1.offer(a[i]);
}
s1.offer(s1.poll());
s1.offer(s.poll());

if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 第一张牌相等的情况下,甲出的第5张牌大于乙
else if (s.peek() > s1.peek()) {
System.out.println("甲出的第5张牌大于乙");
for (int i = 0; i < 4; i++) {
s.offer(a[i]);
}
for (int i = 0; i < 4; i++) {
s.offer(b[i]);
}
s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
else{
System.out.println("第五张相等");
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
--------------------编程问答-------------------- 就是我五张相等的情况楼主没有考虑。。。
而每次总数为44张的时候,都会 打印出  第五章张相等。
部分结果:
甲出的第5张牌小于乙
甲出的第5张牌大于乙
甲出的第5张牌小于乙
甲出的第5张牌小于乙
甲出的第5张牌小于乙
甲出的第5张牌大于乙
甲出的第5张牌小于乙
甲出的第5张牌大于乙
第五张相等
有问题


我添加的输出语句,每个有问题的那一条语句那里我都添加了断点,这样就不用往下继续跑了。

package com;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Test {

static LinkedList<Integer> s = new LinkedList<Integer>(); // 链接列表一

static LinkedList<Integer> s1 = new LinkedList<Integer>();// 链接列表二

@SuppressWarnings("unused")
public static void main(String[] args) {

// 1代表A,11代表J,12代表Q,13代表K
Integer[] zhipai = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9,
9, 10, 10, 11, 11, 12, 12, 13, 13, 1, 1, 2, 2, 3, 3, 4, 4, 5,
5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 };

List<Integer> list = Arrays.asList(zhipai);

// 洗牌,发牌
Collections.shuffle(list);

zhipai = (Integer[]) list.toArray();

for (int i = 0; i < 26; i++) {
s.offer((Integer) zhipai[i]);
}

System.out.println("甲拥有的" + s.size() + "张扑克牌为:");
for (int i = 0; i < 26; i++) {
System.out.print(s.poll() + "\t");
}

for (int i = 26; i < 52; i++) {
s1.offer((Integer) zhipai[i]);
}

System.out.println();
System.out.println("乙拥有的" + s1.size() + "张的扑克牌为:");

for (int i = 0; i < 26; i++) {

System.out.print(s1.poll() + "\t");
}

for (int i = 0; i < 26; i++) {
s.offer((Integer) zhipai[i]);
}
for (int i = 26; i < 52; i++) {
s1.offer((Integer) zhipai[i]);
}

// 开始游戏
do {
// 甲出的牌小于乙
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}

if (s.peek() < s1.peek()) {

s1.offer(s1.poll());
s1.offer(s.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}

// 甲出的牌大于乙
else if (s.peek() > s1.peek()) {

s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}


// 相等情况
else if (s.peek() == s1.peek()) {
// 在甲只剩4张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
if (s.size() == 4) {

s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}

}
// 在乙只剩4张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 4) {

s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩3张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 3) {

s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩3张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 3) {

s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩2张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 2) {

s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩2张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 2) {

s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩1张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 1) {

s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩1张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 1) {
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}

else {
int[] a = { s.poll(), s.poll(), s.poll(), s.poll() };
int[] b = { s1.poll(), s1.poll(), s1.poll(), s1.poll() };
// 第一张牌相等的情况下,甲出的第5张牌小于乙
if (s.peek() < s1.peek()) {
System.out.println("甲出的第5张牌小于乙");
for (int i = 0; i < 4; i++) {
s1.offer(b[i]);
}
for (int i = 0; i < 4; i++) {
s1.offer(a[i]);
}
s1.offer(s1.poll());
s1.offer(s.poll());

if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 第一张牌相等的情况下,甲出的第5张牌大于乙
else if (s.peek() > s1.peek()) {
System.out.println("甲出的第5张牌大于乙");
for (int i = 0; i < 4; i++) {
s.offer(a[i]);
}
for (int i = 0; i < 4; i++) {
s.offer(b[i]);
}
s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
else{
System.out.println("第五张相等");
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}

}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}

} while (!s.isEmpty() && !s1.isEmpty());// 在甲或乙的牌数都不为0的情况下开始游戏

// 如果甲的牌数为0,则乙赢

if (s.isEmpty()) {
System.out.println();
System.out.println("乙赢得胜利,所得" + s1.size() + "张牌为:");
for (int i = 0; i < 52; i++) {
System.out.print(s1.poll() + "\t");
}
}

// 如果乙的牌数为0,则甲赢
else if (s1.isEmpty()) {
System.out.println();
System.out.println("甲赢得胜利,所得" + s.size() + "张牌为:");
for (int i = 0; i < 52; i++) {
System.out.print(s.poll() + "\t");
}
}
}
}

补充:Java ,  Eclipse
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,