मैं एक्लिप्स में एक ब्लैक जैक प्रोग्राम लिखने की कोशिश कर रहा हूं और जब एक ऐस कार्यक्रम होता है तो मुझे एक मुद्दा मिलता है। मैंने उपयोगकर्ता से पूछा कि क्या वे चाहते हैं कि ऐस 1 या 11 के लायक हो। यह ऐसा करता है, लेकिन जब मैं एक मूल्य में टाइप करता हूं, तो यह एक त्रुटि संदेश देता है

"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 का मान देता है। कोड का वह भाग यहां दिया गया है

अद्यतन: यह ऐस का मान उपयोगकर्ता के कुल में जोड़ता है। लेकिन ऐस से निपटा जाने के बाद और उपयोगकर्ता एक मूल्य चुनता है, कोई फर्क नहीं पड़ता कि कुल क्या है, यह उपयोगकर्ताओं को बंद कर देता है और डीलर के पास जाता है। यह कैसे सही हो सकता है? इसके अलावा एक और समस्या जो मेरे पास है, वह यह है कि जब यूजर दूसरे कार्ड को नहीं चाहता है, तो वह डीलर के पास जाता है और ठीक काम करता है, लेकिन फिर उपयोगकर्ता से यह पूछने पर कि क्या वे फिर से खेलना चाहते हैं, तो यह एक अनन्त लूप में चला जाता है और फेंकना शुरू कर देता है। यादृच्छिक कार्ड। मैं इस मुद्दे को भी कैसे ठीक कर सकता हूं?

    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();

}

}

0
Thomas Taylor 25 नवम्बर 2015, 08:16

2 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि क्योंकि आप ऐस मान प्राप्त करने के लिए kbd.nextInt() का उपयोग कर रहे हैं, इसलिए एक नई पंक्ति वर्ण बफ़र में छोड़ दिया गया है, इसलिए जब लूप kbd.nextLine() के चारों ओर चला जाता है, तो नई लाइन वर्ण लौटाता है, न कि वाई जिसके कारण हो सकता है more.charAt(0) के साथ एक समस्या आपको नई लाइन वर्ण से छुटकारा पाने के लिए अतिरिक्त kbd.nextLine(); जोड़ना पड़ सकता है। इलियट फ्रिस्क ने बताया कि अगर आपको नियंत्रण कथन में स्ट्रिंग खाली है तो आपको जांचना चाहिए।

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();

आप अगली लाइन का उपयोग भी कर सकते हैं () और इसे पार्स करने के लिए int कि नई लाइन वर्ण समस्या से बचेंगे।

aceValue = Integer.parseInt(kbd.nextLine());
1
Yan 25 नवम्बर 2015, 05:55

मैं नहीं बता सकता कि कौन सी लाइन आपके कोड की लाइन 72 है, लेकिन मैं आपको बता सकता हूं कि यह इस बात पर आधारित है कि आपने हमें क्या दिया है जो किसी भी तरह आपके more या next वेरिएबल खाली हो रहे हैं। तार (यानी "")। यदि आप 0-लंबाई String के लिए charAt(0) कोशिश करते हैं, तो आपको StringIndexOutOfBoundsException मिलेगा।

1
Ken Slade 25 नवम्बर 2015, 05:27