2015-11-25 2 views
0

Я пытаюсь написать программу черного джек в Eclipse, и у меня возникла проблема, когда программа имеет дело с Ace. Я спросил пользователь, если они хотят, чтобы Туз стоит 1 или 11. Он делает это, но когда я ввожу значение, он выдает сообщение об ошибкеBlack Jack Java

"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(Unknown Source) 
    at PlayBlackJack.main(PlayBlackJack.java:72)" 

Может кто-нибудь помочь с этим? У меня есть отдельный класс, который, если созданная случайная карта является тузом, возвращает значение 11. Вот эта часть кода

Обновление: добавляет значение Ace к общей сумме пользователя. Но после того, как раздался Ace, и пользователь выберет значение, независимо от того, что общего, он останавливает обращение пользователей и переходит к дилеру. Как я могу это исправить? Также у меня возникают другие проблемы. После того, как пользователь говорит «нет», чтобы получить другую карточку, он идет к дилеру и отлично работает, но затем, когда спрашивает пользователя, хотят ли они снова играть, он переходит в бесконечный цикл и начинает бросать из случайных карт. Как я могу исправить эту проблему?

import java.util.Scanner; 

общественного класса PlayBlackJack {

public final static int MAXCARDS=52; 
//declaring the constant maxcards to be 52 
//since there are 52 cards in the deck 
public static void main(String[] args) { 
    Scanner kbd=new Scanner (System.in); 


    String printRules; 
    //check to see if the user wants to see the rules or not 
    String more; 
    //variable used to see if the user would like to play the game 
    String next; 
    //variable used to see if the user would like another card 
    int dealerTotal, userTotal; 
    //keeps track of the user's total and the dealer's total 
    int wins=0, losses=0; 
    //variables used to keep track of the user's wins and losses 
    int card = 0; 

    System.out.println("    Welcome to Black Jack!"); 
    System.out.println("Would you like to see the rules? Type yes or no"); 
    //If yes, rules printed, if no, rules not printed 
    printRules=kbd.nextLine(); 
    printRules=printRules.toUpperCase(); 
    if (printRules.charAt(0)=='Y') 
    { 
     (print rules) 
     System.out.println("Now lets play!\n\n\n"); 

    } 


     System.out.println("Would you like to play a game of Black Jack?"); 
     more=kbd.nextLine(); 
     more=more.toUpperCase(); 

     next="Yes"; 
     while (!more.isEmpty() && more.charAt(0)=='Y') 
     { 
      System.out.println("The game begins with this your first card:"); 
      userTotal=0; 
      dealerTotal=0; 


      while (!next.isEmpty() && next.charAt(0)=='Y') 
      { 
       card=PickACard.findCardValue(); 



       if (card==11) 

       { 
        System.out.println("Would you like the Ace to be a 1 or 11?"); 
        int aceValue=kbd.nextInt(); 

         while (aceValue!=1 && aceValue!=11) 
         { 
          System.out.println("You did not enter a 1 or 11"); 
          aceValue=kbd.nextInt(); 
         } 
        card=aceValue; 

       } 

       userTotal=userTotal+card; 

       System.out.println("You're total is " +userTotal); 


       if (userTotal>21) 
       { 
        System.out.println("Sorry, You lose"); 
        losses++; 
        System.out.println("Would you like to play again?"); 
        next="No"; 
        more=kbd.nextLine(); 
        more=more.toUpperCase(); 

       } 
       else 
       { 
       System.out.println("Would you like another card?"); 
       next=kbd.nextLine(); 
       next=next.toUpperCase(); 
       } 

      } 


      while (dealerTotal<=userTotal && userTotal<21) 
      { 
       System.out.println("Now it's the dealer's turn"); 
       int card1=0; 
      card1=PickACard.findCardValue(); 

      if (card1==11) 
      {  
       int aceValue1; 

         if (dealerTotal+11>21) 
         { 
          aceValue1=1; 
         } 
         else 
         { 
          aceValue1=11; 
         } 
        card1=aceValue1; 

      } 

      dealerTotal=dealerTotal+card1; 
      System.out.println("The dealer's total is "+dealerTotal); 


      if (dealerTotal==userTotal && userTotal<21) 
      { 
       losses++; 
       System.out.println("Sorry, you lose. Would you like to play again?"); 
       more=kbd.nextLine(); 
       more=more.toUpperCase(); 

      } 

      if (dealerTotal>21) 
       { 
        wins++; 
        System.out.println("You Win! Would you like to play again?"); 
        more=kbd.nextLine(); 
        more=more.toUpperCase(); 

       } 
       /*else 
       { 
        losses++; 
        System.out.println("You lose. Would you like to play again?"); 
        more=kbd.nextLine(); 
        more=more.toUpperCase(); 

       }*/ 
      } 


     } 



     System.out.println("You won "+wins+" game(s) and lost "+losses+" game(s)"); 
     kbd.close(); 

}

}

+1

который является строка номер 72 – SpringLearner

+0

Рассмотрим обеспечение [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+0

Как объявляется 'kbd'? –

ответ

1

Я думаю, что потому, что вы используете kbd.nextInt(), чтобы получить значение Ace есть символ новая строка остается в буфере так, когда цикл идет вокруг kbd.nextLine() возвращает символ новой строки, а не Y, которые могут быть причиной проблемы с more.charAt(0) Возможно, вам придется добавить дополнительный kbd.nextLine();, чтобы избавиться от нового символа линии. Также, как указал Эллиот Фриш, вы должны проверить, нет ли строки в инструкции while.

while(!more.isEmpty() && more.charAt(0) == 'y') 
{ 
} 

Я думаю, next.charAt(0) показывает ошибку. Вы можете попытаться сделать kbd.nextLine(); прямо перед тем, как задать вопрос, хотите ли вы еще одну игру, а также проверить, не является ли следующая.

while(!next.isEmpty() && more.charAt(0) == 'y') 
    { 
    } 

Попробуйте

System.out.println("Sorry, You lose"); 
losses++; 
System.out.println("Would you like to play again?"); 
next="No"; 
kbd.nextLine(); // to flush out new line character 
more=kbd.nextLine(); 
more=more.toUpperCase(); 

Вы также можете использовать nextLine() и разобрать его в целое, что позволит избежать новой эмиссии строки символов.

aceValue = Integer.parseInt(kbd.nextLine()); 
+0

Спасибо всем! С вашей помощью я смог исправить программу, и теперь она работает правильно! Спасибо огромное! –

+0

Отлично! Пожалуйста, примите ответ, если он был прав. Счастливое кодирование! – Yan

1

Я не могу сказать, какая линия линия 72 вашего кода, но я могу вам сказать, что это довольно вероятно, на основании того, что вы нам дали, так или иначе либо ваши more, либо next переменные становятся пустыми строками (т. е. «»). Если вы попробуете позвонить по телефону charAt(0) на 0-й номер String, вы получите StringIndexOutOfBoundsException.

+0

Это то, что я получаю, когда программа запускается, и она имеет туз. И, как и 63 и 72, это два оператора while: «Хотите другую карточку? yes Карта Ace of Hearts Вы хотите, чтобы Туз был 1 или 11? Вы суммарно 29 Извините, вы потеряли Вы хотите продолжить играть? Исключение в потоке "основного" java.lang.StringIndexOutOfBoundsException: индекс Струнный вне диапазона: 0 \t в java.lang.String.charAt (Unknown Source) \t в PlayBlackJack.main (PlayBlackJack.java:63) ' –

+0

I Подозреваю, что @Yan на что-то ответил. Похоже, вы можете потреблять читаемые символы из 'kbd', но не потреблять сам символ новой строки. –

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