程序无故执行并停止

问题描述:

所以我为我的任务做了一个扑克游戏。
它一切正常(至少我相信如此)。为了简单起见:玩家有100美元的余额,并以他的手为基础赢得或失去金钱。
我做了一个条件,只要游戏的余额高于< 0>,游戏就会一直给玩家一个新手。
然而,在7点或8重新启动,该计划只是表明白色和它保持运行永远不管你输入...程序无故执行并停止

这里是代码,希望你们能帮助,也对不起,如果大部分的代码是法语,我评论的英文方法,帮助您了解:

package pkgtp2; 

import java.util.*; 

public class TP2 { 

static boolean straight; 
static boolean flush; 
static int paires; 
static int gains; 
static int balance = 100; 
static char[] cardsSymbols = new char[5]; 
static String[] cardsValues = new String[5]; 
static int hand[] = new int[5]; 
static boolean pack[] = new boolean[52]; 

public static void menu(int gains) { 
    System.out.println("**************   " + " AUCUNE COMBINAISON = -10$"); 
    System.out.println("*Jeu de Poker*   " + " 1 PAIRE = 0$"); 
    System.out.println("**************   " + " 2 PAIRES = 20$"); 
    System.out.println("       " + " BRELAN <3> = 35$"); 
    System.out.println("       " + " SUITE = 50$"); 
    System.out.println("       " + " FULL = 75$"); 
    System.out.println("       " + " COULEUR = 100$"); 
    System.out.println("       " + " CARRÉ = 150$"); 
    System.out.println("       " + " STRAIGHT FLUSH = 500$"); 
} // The Game Menu showing every possible hand 

public static void drawCards(int[] hand, boolean[] pack) { 

    Random give = new Random(); 

    for (int i = 0; i < hand.length; i++) { 
     do { 
      hand[i] = give.nextInt(52); 
     } while (pack[hand[i]]); 
     pack[hand[i]] = true; 
    } 
} // Gives the user 5 unique random numbers 

public static void cardSymbol(int[] cards, char[] cardssymbols) { 
    char symboles[] = {'♥', '♦', '♣', '♠'}; 
    int numOfSymbol; 
    for (int i = 0; i < cards.length; i++) { 
     numOfSymbol = cards[i]/13; 
     cardsSymbols[i] = symboles[numOfSymbol]; 
    } 

} // Converts the 5 numbers into values 

public static void cardValue(int[] cards, String[] cardsvalues) { 
    String valeurs[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; 
    int numOfValues; 
    for (int i = 0; i < cards.length; i++) { 
     numOfValues = cards[i] % 13; 
     cardsValues[i] = valeurs[numOfValues]; 
    } 
} // Converts the 5 numbers into actual cards values 

public static void printCards(char[] cardsymbols, String[] cardsvalues) { 
    System.out.println("Voici vos cartes : \n"); 
    for (int i = 0; i < hand.length; i++) { 
     System.out.print(cardsymbols[i]); 
     System.out.print(cardsvalues[i] + " "); 
    } 
} // Prints the Cards 

public static void changeCards(int[] cards, boolean[] pack) { 
    Scanner read = new Scanner(System.in); 
    int cardchange = 0; 
    Random give = new Random(); 
    System.out.println(); 

    for (int i = 0; i < 4; i++) { 
     do { 
      System.out.println(" Entrez des chiffres de 1 à 5 correspondant aux cartes que vous désirez changer (vous pouvez changer au plus 4 cartes)" 
        + " \n Si vous voulez conserver vos cartes, entrez 0 "); 
      while (!read.hasNextInt()) { 
       System.out.println("Veuillez entrer un chiffre "); 
       read.next(); 
      } 
      cardchange = read.nextInt(); 
     } while (cardchange < 0 || cardchange > 5); 

     if (cardchange == 0) { 
      i = 5; 
     } else { 
      System.out.print("\nLa carte " + cardchange + " va être changée\n "); 
      do { 
       cards[cardchange - 1] = give.nextInt(52); 
      } while (pack[cards[cardchange - 1]]); 
      pack[cards[cardchange - 1]] = true; 
     } 

     cardSymbol(cards, cardsSymbols); 
     cardValue(cards, cardsValues); 
     printCards(cardsSymbols, cardsValues); 

    } 

} // Lets the user change up to 4 cards, press 0 to not change any card and skip 

public static int checkPairs(char[] cardsSymbols, String[] cardsvalues) { 
    int paires = 0; 
    for (int i = 0; i < cardsvalues.length; i++) { 
     for (int j = i + 1; j < cardsvalues.length; j++) { 
      if (cardsvalues[i].equals(cardsvalues[j])) { 
       paires++; 
      } 
     } 
    } 
    return paires; 
} // Checks if the cards values match so the program can determine if the user has a pair, two pair, three of a kind, full house or quads 

public static boolean checkFlush(char[] cardsSymbols) { 
    boolean flush = false; 
    if (cardsSymbols[0] == cardsSymbols[1] && cardsSymbols[1] == cardsSymbols[2] && cardsSymbols[2] == cardsSymbols[3] && cardsSymbols[3] == cardsSymbols[4]) { 
     flush = true; 
    } 
    return flush; 
} // checks for a flush 

public static boolean checkStraight(String[] cardsvalues) { 
    boolean straight = false; 
    int numOfValues; 
    int[] straightTab = new int[5]; 
    for (int i = 0; i < hand.length; i++) { 
     numOfValues = hand[i] % 13; 
     straightTab[i] = numOfValues; 
    } 
    Arrays.sort(straightTab); 

    if (straightTab[0] + 1 == straightTab[1] && straightTab[1] + 1 == straightTab[2] && straightTab[2] + 1 == straightTab[3] && straightTab[3] + 1 == straightTab[4]) { 
     straight = true; 
    } 
    return straight; 
} // checks for a straight 

public static int combinaisons(int paires, boolean straight, boolean flush) { 
    int gains; 
    if (straight && flush) { 
     System.out.println("Vous avez une Quinte !"); 
     gains = 500; 
    } else if (flush) { 
     System.out.println("Vous avez une Couleur !"); 
     gains = 100; 
    } else if (straight) { 
     System.out.println("Vous avez une Suite !"); 
     gains = 50; 
    } else if (paires == 6) { 
     System.out.println("Vous avez un Carré !"); 
     gains = 150; 
    } else if (paires == 4) { 
     System.out.println("Vous avez un Full !"); 
     gains = 75; 
    } else if (paires == 3) { 
     System.out.println("Vous avez un Brelan !"); 
     gains = 35; 
    } else if (paires == 2) { 
     System.out.println("Vous avez Deux Paires !"); 
     gains = 20; 
    } else if (paires == 1) { 
     System.out.println("Vous avez une Paire !"); 
     gains = 0; 
    } else { 
     System.out.println("Vous n'avez Aucune Combinaison !"); 
     gains = -10; 
    } 
    return gains; 
} // gives the user money based on his hand strength 

public static int profit(int gains) { 
    balance = balance + gains; 
    System.out.println("Vos gains sont de " + gains + " $"); 
    System.out.println("Vous avez donc " + balance + " $"); 
    return gains; 
} // Gives the user his profit and his new balance 

public static void main(String[] args) { 
    do { 
     menu(gains); 
     drawCards(hand, pack); 
     cardSymbol(hand, cardsSymbols); 
     cardValue(hand, cardsValues); 
     printCards(cardsSymbols, cardsValues); 
     changeCards(hand, pack); 
     paires = checkPairs(cardsSymbols, cardsValues); 
     flush = checkFlush(cardsSymbols); 
     straight = checkStraight(cardsValues); 
     gains = combinaisons(paires, straight, flush); 
     profit(gains); 
    }while (balance > 0); 
    }// Here is my problem, the program just stops for a reason ... 

} 
+0

我可以假设你没有任何控制台错误...? –

+0

我不相信我有任何,你可以快速复制/粘贴代码,并自己尝试 – Adriann

+0

对不起,男人。我完全错过了这是Java **而不是Javascript。我的错。 –

drawCards方法,pack[hand[i] = true最终(后10个左右的手)将所有pack[hand[i]true,造成while (pack[hand[i]]);进入无限循环。

pack[hand[i]] = true;更改为 pack[hand[i]] = false;可防止无限循环并允许继续玩游戏。

的一种方法,如通过OP注释中建议的,是每一轮中,可与方法来进行之后的“包”阵列复位:

public static void reset_pack(){ 
    for(int i=0; i<pack.length;i++){ 
     pack[i] = false; 
    } 
} 

和呼叫后的各轮此方法:

... 
profit(gains); 
reset_pack(); 
+0

谢谢,这将工作,但它会使我的代码错误,因为可以生成两次相同的卡...任何想法如何使每个回合后“包”阵列重置? – Adriann

+0

哦好点!感谢您指出这一点,因为我没有测试我的逻辑,并且确实重置“pack”数组将是更好的方法。也许一种重置“pack”数组的方法是可行的。我将编辑我的答案并添加代码以重置阵列。 – davedwards

+0

没关系!我解决了问题,谢谢你的帮助! – Adriann

感谢降档,指出它会造成无限循环。
这是我所需要的补充:

for (int i=0;i<hand.length;i++){ 
pack[hand[i]] = false; 
} 

并称条件“changeCards”方法后,让程序重置“包”数组,你不会需要再为圆形的其余部分。这意味着程序可以在下一轮中再次选择值,因此在尝试8次或9次后不会停止!
谢谢