2015-09-19 2 views
0

Итак, когда я запускаю свою программу, примерно каждый раз в 4 раза она просто начнет бесконечно зацикливаться. В других случаях он работает нормально. Обратите внимание, что моя военная игра не является технически абсолютно правильной. Я не совсем уверен, как хранить карты, которые игроки выигрывают в своих отдельных колодах, а затем перетасовывать их обратно, как только у них заканчиваются карты. И мой метод для дуэли, вероятно, не самый лучший. Это очень долго. В настоящее время мне нужно исправить эту проблему с циклом.Бесконечная петля в карточной игре «Война» - Java

О, я также использую только 24 карты, и используются только 5,6,7,8,9 и 10 из каждого костюма.

Главная

import java.util.Random; 
public class Main { 
static Player player1 = new Player("player1"); 
static Player player2 = new Player("player2"); 

static Card[] deck = {new Card("Hearts", 5), new Card("Hearts", 6), new Card("Hearts", 7), new Card("Hearts", 8), new Card("Hearts", 9), new Card("Hearts", 10), 
     new Card("Diamonds", 5), new Card("Diamonds", 6), new Card("Diamonds", 7), new Card("Diamonds", 8), new Card("Diamonds", 9), new Card("Diamonds", 10), 
     new Card("Spades", 5), new Card("Spades", 6), new Card("Spades", 7), new Card("Spades", 8), new Card("Spades", 9), new Card("Spades", 10), 
     new Card("Clubs", 5), new Card("Clubs", 6), new Card("Clubs", 7), new Card("Clubs", 8), new Card("Clubs", 9), new Card("Clubs", 10) 
}; 

public static void main(String args[]){ 
    shuffleArray(deck); 
    dealDeck(); 
    int i=0; 
    while (i<1){ 
     printCard(); 
     if(player1.cards.size()>0 && player2.cards.size()>0){ 
      Duel(); 
     } 
     else{ 
      if(player1.numCards>player2.numCards){ 
       System.out.println("Player 1 has won."); 
       i++; 
      } 
      else if(player2.numCards>player1.numCards){ 
       System.out.println("Player 2 has won."); 
       i++; 
      } 
      duelsWon(); 
      totalCompares(); 
     } 
    } 
} 

private static void shuffleArray(Card[] array) 
{ 
    int index; 
    Card temp; 
    Random random = new Random(); 
    for (int i = array.length - 1; i > 0; i--) 
    { 
     index = random.nextInt(i + 1); 
     temp = array[index]; 
     array[index] = array[i]; 
     array[i] = temp; 
    } 
} 
public static void dealDeck(){ 
    for(int i=0;i<24;i=i+2){ 
     player1.dealCard(deck[i]); 
     player2.dealCard(deck[i+1]); 
    } 
} 
public static void duelsWon(){ 
    System.out.printf("%-20s %-20s\n", player1.name+"'s duels won", player2.name+"'s duels won"); 
    System.out.printf("%-20s %-20s\n", player1.duelsWon, player2.duelsWon); 
} 
public static void totalCompares(){ 
    System.out.printf("%-10s\n", "Total Compares"); 
    System.out.printf("%-10s\n", player1.totalCompares+player2.totalCompares); 
} 
public static void printCard(){ 
    System.out.printf("%-20s %-20s\n", player1.name, player2.name); 
    for(int i = 0;i<24;i++){ 
     System.out.printf("%-20s %-20s\n", player1.getCard(i), player2.getCard(i)); 
    } System.out.println(); 
} 
public static void Duel(){ 
    Card p1 = player1.drawCard(); 
    Card p2 = player2.drawCard(); 
    System.out.println(p1); 
    System.out.println(p2); 
    if(p1.compareTo(p2)>0){ 
     player1.dealCard(p1); 
     player1.dealCard(p2); 
     player1.duelsWon++; 
     player1.totalCompares++; 
    } 
    else if(p2.compareTo(p1)>0){ 
     player2.dealCard(p1); 
     player2.dealCard(p2); 
     player2.duelsWon++; 
     player2.totalCompares++; 
    } 
    else{ 
     if(player1.cards.size()>=3 && player2.cards.size()>3){ 
      int i=0; 
      while(i<1){ 
       Card p1C1 = player1.drawCard(); 
       Card p1C2 = player1.drawCard(); 
       Card p1C3 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       Card p2C2 = player2.drawCard(); 
       Card p2C3 = player2.drawCard(); 
       if(p1C3.compareTo(p2C3)>0){ 
        player1.dealCard(p1); 
        player1.dealCard(p2); 
        player1.dealCard(p1C1); 
        player1.dealCard(p1C2); 
        player1.dealCard(p1C3); 
        player1.dealCard(p2C1); 
        player1.dealCard(p2C2); 
        player1.dealCard(p2C3); 
        player1.duelsWon++; 
        player1.totalCompares++; 
        i++; 
       } 
       else if(p2C3.compareTo(p1C3)>0){ 
        player2.dealCard(p1); 
        player2.dealCard(p2); 
        player2.dealCard(p1C1); 
        player2.dealCard(p1C2); 
        player2.dealCard(p1C3); 
        player2.dealCard(p2C1); 
        player2.dealCard(p2C2); 
        player2.dealCard(p2C3); 
        player2.duelsWon++; 
        player2.totalCompares++; 
        i++; 
       } 
       else{ 
        if(p1C2.compareTo(p2C2)>0){ 
         player1.dealCard(p1); 
         player1.dealCard(p2); 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p1C3); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
         player1.dealCard(p2C3); 
         player1.duelsWon++; 
         player1.totalCompares++; 
         i++; 
        } 
        else if(p2C2.compareTo(p1C2)>0){ 
         player2.dealCard(p1); 
         player2.dealCard(p2); 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p1C3); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
         player2.dealCard(p2C3); 
         player2.duelsWon++; 
         player2.totalCompares++; 
         i++; 
        } 
        else{ 
         if(p1C1.compareTo(p2C1)>0){ 
          player1.dealCard(p1); 
          player1.dealCard(p2); 
          player1.dealCard(p1C1); 
          player1.dealCard(p1C2); 
          player1.dealCard(p1C3); 
          player1.dealCard(p2C1); 
          player1.dealCard(p2C2); 
          player1.dealCard(p2C3); 
          player1.duelsWon++; 
          player1.totalCompares++; 
          i++; 
         } 
         else if(p2C1.compareTo(p1C1)>0){ 
          player2.dealCard(p1); 
          player2.dealCard(p2); 
          player2.dealCard(p1C1); 
          player2.dealCard(p1C2); 
          player2.dealCard(p1C3); 
          player2.dealCard(p2C1); 
          player2.dealCard(p2C2); 
          player2.dealCard(p2C3); 
          player2.duelsWon++; 
          player2.totalCompares++; 
          i++; 
         } 
         else{ 

         } 
        } 
       } 
      } 
     } 
     else{ 
      if(player2.cards.size()==3){ 
       Card p1C1 = player1.drawCard(); 
       Card p1C2 = player1.drawCard(); 
       Card p1C3 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       Card p2C2 = player2.drawCard(); 
       Card p2C3 = player2.drawCard(); 
       if(p1C3.compareTo(p2C3)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p1C2); 
        player1.dealCard(p1C3); 
        player1.dealCard(p2C1); 
        player1.dealCard(p2C2); 
        player1.dealCard(p2C3); 
       } 
       else if(p2C3.compareTo(p2C3)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p1C2); 
        player2.dealCard(p1C3); 
        player2.dealCard(p2C1); 
        player2.dealCard(p2C2); 
        player2.dealCard(p2C3); 
       } 
       else{ 
        if(p1C2.compareTo(p2C2)>0){ 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p1C3); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
         player1.dealCard(p2C3); 
        } 
        else if(p2C2.compareTo(p1C2)>0){ 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p1C3); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
         player2.dealCard(p2C3); 
        } 
        else{ 
         if(p1C1.compareTo(p2C1)>0){ 
          player1.dealCard(p1C1); 
          player1.dealCard(p1C2); 
          player1.dealCard(p1C3); 
          player1.dealCard(p2C1); 
          player1.dealCard(p2C2); 
          player1.dealCard(p2C3); 
         } 
         else if(p2C1.compareTo(p1C1)>0){ 
          player2.dealCard(p1C1); 
          player2.dealCard(p1C2); 
          player2.dealCard(p1C3); 
          player2.dealCard(p2C1); 
          player2.dealCard(p2C2); 
          player2.dealCard(p2C3); 
         } 
         else{ 
          player1.dealCard(p1C1); 
          player1.dealCard(p1C2); 
          player1.dealCard(p1C3); 
          player1.dealCard(p2C1); 
          player1.dealCard(p2C2); 
          player1.dealCard(p2C3); 
         } 
        } 
       } 
      } 
      else if(player1.cards.size()==3){ 
       Card p1C1 = player1.drawCard(); 
       Card p1C2 = player1.drawCard(); 
       Card p1C3 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       Card p2C2 = player2.drawCard(); 
       Card p2C3 = player2.drawCard(); 
       if(p1C3.compareTo(p2C3)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p1C2); 
        player1.dealCard(p1C3); 
        player1.dealCard(p2C1); 
        player1.dealCard(p2C2); 
        player1.dealCard(p2C3); 
       } 
       else if(p2C3.compareTo(p2C3)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p1C2); 
        player2.dealCard(p1C3); 
        player2.dealCard(p2C1); 
        player2.dealCard(p2C2); 
        player2.dealCard(p2C3); 
       } 
       else{ 
        if(p1C2.compareTo(p2C2)>0){ 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p1C3); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
         player1.dealCard(p2C3); 
        } 
        else if(p2C2.compareTo(p1C1)>0){ 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p1C3); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
         player2.dealCard(p2C3); 
        } 
        else{ 
         if(p1C1.compareTo(p2C1)>0){ 
          player1.dealCard(p1C1); 
          player1.dealCard(p1C2); 
          player1.dealCard(p1C3); 
          player1.dealCard(p2C1); 
          player1.dealCard(p2C2); 
          player1.dealCard(p2C3); 
         } 
         else if(p2C1.compareTo(p1C1)>0){ 
          player2.dealCard(p1C1); 
          player2.dealCard(p1C2); 
          player2.dealCard(p1C3); 
          player2.dealCard(p2C1); 
          player2.dealCard(p2C2); 
          player2.dealCard(p2C3); 
         } 
         else{ 
          player2.dealCard(p1C1); 
          player2.dealCard(p1C2); 
          player2.dealCard(p1C3); 
          player2.dealCard(p2C1); 
          player2.dealCard(p2C2); 
          player2.dealCard(p2C3); 
         } 
        } 
       } 
      } 
      else if(player2.cards.size()==2){ 
       Card p1C1 = player1.drawCard(); 
       Card p1C2 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       Card p2C2 = player2.drawCard(); 
       if(p1C2.compareTo(p2C2)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p1C2); 
        player1.dealCard(p2C1); 
        player1.dealCard(p2C2); 
       } 
       else if(p2C2.compareTo(p1C2)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p1C2); 
        player2.dealCard(p2C1); 
        player2.dealCard(p2C2); 
       } 
       else{ 
        if(p1C1.compareTo(p2C1)>0){ 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
        } 
        else if(p2C1.compareTo(p1C1)>0){ 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
        } 
        else{ 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
        } 
       } 
      } 
      else if(player1.cards.size()==2){ 
       Card p1C1 = player1.drawCard(); 
       Card p1C2 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       Card p2C2 = player2.drawCard(); 
       if(p1C2.compareTo(p2C2)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p1C2); 
        player1.dealCard(p2C1); 
        player1.dealCard(p2C2); 
       } 
       else if(p2C2.compareTo(p1C2)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p1C2); 
        player2.dealCard(p2C1); 
        player2.dealCard(p2C2); 
       } 
       else{ 
        if(p1C1.compareTo(p2C1)>0){ 
         player1.dealCard(p1C1); 
         player1.dealCard(p1C2); 
         player1.dealCard(p2C1); 
         player1.dealCard(p2C2); 
        } 
        else if(p2C1.compareTo(p1C1)>0){ 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
        } 
        else{ 
         player2.dealCard(p1C1); 
         player2.dealCard(p1C2); 
         player2.dealCard(p2C1); 
         player2.dealCard(p2C2); 
        } 
       } 
      } 
      else if(player2.cards.size()==1){ 
       Card p1C1 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       if(p1C1.compareTo(p2C1)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p2C1); 
       } 
       else if(p2C1.compareTo(p1C1)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p2C1); 
       } 
       else{ 
        player1.dealCard(p1C1); 
        player1.dealCard(p2C1); 
       } 
      } 
      else if(player1.cards.size()==1){ 
       Card p1C1 = player1.drawCard(); 
       Card p2C1 = player2.drawCard(); 
       if(p1C1.compareTo(p2C1)>0){ 
        player1.dealCard(p1C1); 
        player1.dealCard(p2C1); 
       } 
       else if(p2C1.compareTo(p1C1)>0){ 
        player2.dealCard(p1C1); 
        player2.dealCard(p2C1); 
       } 
       else{ 
        player2.dealCard(p1C1); 
        player2.dealCard(p2C1); 
       } 
      } 
     } 
    } 
} 
} 

Игрок

import java.util.ArrayList; 
public class Player { 
public ArrayList<Card> cards=new ArrayList<Card>(); 
public int numCards; 
public int topOfDeck; 
public String name; 
public int duelsWon; 
public int totalCompares; 

public Player(String name){ 
    this.name=name; 
    numCards=0; 
    topOfDeck = 0; 
    duelsWon = 0; 
    totalCompares = 0; 
} 
public void dealCard(Card newCard){ 
    cards.add(newCard); 
    numCards++; 
} 

public String getCard(int n){ 
    if(n < cards.size()) { 
     return cards.get(n).toString(); 
    }else{ 
     return "\\"; 
    } 
} 
public Card drawCard(){ 
    Card c = cards.remove(0); 
    topOfDeck++; 
    topOfDeck = topOfDeck % 24; 
    return c; 
} 
} 

Card

public class Card implements Comparable<Card> { 
private String suit; 
private int number; 

public Card(String suit, int number){ 
    this.suit = suit; 
    this.number = number; 
} 

public String getSuit(){ 
    return suit; 
} 
public int getNumber(){ 
    return number; 
} 
@Override 
public int compareTo(Card otherCard){ 
    if (this.number>otherCard.getNumber()){ 
     return 1; 
    }else if(otherCard.getNumber()>this.number){ 
     return -1; 
    }else{ 
     return 0; 
    } 
} 
@Override 
public String toString(){ 
    return number+" of "+suit; 
} 

} 
+0

Вы смогли определить, какой цикл вызывает бесконечный цикл? Например, вы пытались добавить отладку 'System.out.print (" loop1 ")' в любую из циклов? По крайней мере, у нас есть идея, какой из циклов вы застреваете, поскольку мы будем регистрировать цикл проблем. – MKreegs

+0

У меня нет, но я попробую следующее. Я собираюсь уйти, но когда я вернусь, я сделаю это. Благодарю. – Aero

+0

Попробуйте указать [MCVE (минимальный, полный и проверенный пример)] (http://stackoverflow.com/help/mcve). –

ответ

0

Не уверен, что это проблема, но вам нужно иметь еще филиал в вашей, если/иначе, если ветвящиеся охватывают все возможности. Существует вероятность того, что оба игрока имеют одинаковое количество карт.

while (i<1){ 
      printCard(); 
      if(player1.cards.size()>0 && player2.cards.size()>0){ 
       Duel(); 
      } 
      else{ 
       if(player1.numCards>player2.numCards){ 
        System.out.println("Player 1 has won."); 
        i++; 
       } 
       else if(player2.numCards>player1.numCards){ 
        System.out.println("Player 2 has won."); 
        i++; 
       }else{ 
        break; 
        // or put i++; 
       } 
       duelsWon(); 
       totalCompares(); 
      } 
     } 
+0

Это не устранило проблему, но я этого не заметил. Спасибо, я добавил его. – Aero

+0

это не единственное место - убедитесь, что вы обрабатываете все случаи повсюду. это очень сложный код с тоннами if-else, подумайте о том, как упростить это ... вы найдете ошибки более легко таким образом –

Смежные вопросы