جافا - كيف تقوم بتخمين عشوائي بين حرفين؟ [مكرر]

0

هذا السؤال لديه بالفعل إجابة هنا:

أنا مبتدئ تمامًا في Java وأكافح في صنع لعبة ورق بسيطة تختار فيها بين القيم "أحمر" و "أسود". يمكن لأي شخص أن يرى ما هو الخطأ؟

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    if (guess == s)
        System.out.println("Correct");
    else
        System.out.println("Wrong");
} while (guess != s);

3 الاجابة

3
افضل جواب

في Java Strings كائن ، عند مقارنة الكائنات:

== tests for reference equality (whether they are the same object).

.equals() tests for value equality (whether they are logically "equal").

هذا موضح أكثر في كيف أقارن السلاسل في Java؟

من ناحية أخرى ، فإن char هو نوع بيانات بدائي وعلى الأنواع البدائية == اختبارات المساواة في القيمة. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

تحرير - فيما يتعلق بالحالة:

في Java لديك طريقة "equalsIgnoreCase" لمقارنة سلسلتين بغض النظر عن الحالة (أقل أو أعلى) للسلسلة. تُرجع هذه الطريقة القيمة الحقيقية إذا لم تكن الوسيطة خالية وتمثل حالة تجاهل سلسلة متساوية ، أو غير صحيحة.

:مؤلف
1
افضل جواب

لذا ، لديك مشكلتان هنا:

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    //The problem is that you're using reference comparison, but that's not the only issue you 'will have', you're only checking raw input vs upper case 'R' 
    //and 'B' so you 'need' (you can handle this with lower case or alternative, too) to change this to `.toUppercase()`.
    if (guess == s)
        System.out.println("Correct");
    else
        System.out.println("Wrong");
//The same problem is happening here:
} while (guess != s);

رمز جديد:

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    if (guess.toUpperCase().equals(s))
        System.out.println("Correct");
    else
        System.out.println("Wrong");
} while (!guess.toUpperCase().equals(s));}

عند استخدام == ، أنت تقارن المراجع.

لمقارنة النص (نوع السلسلة) ، يجب عليك استخدام .equals() .

يجب عليك أيضًا التأكد من أن الحالة العلوية / السفلية يتم التعامل معها لمنع الأخطاء ، مثل r لا يساوي R .

:مؤلف
-1
افضل جواب

في الأساس ، لا تستخدم == للسلاسل ، وهذا جيد فقط لأنواع البيانات البدائية أو أي شيء ليس كائنًا. لأن ذلك يشير إلى مرجع السلسلة ويقارن ما إذا كانت متساوية (تختبر بشكل أساسي إذا كانت نفس المتغير وليس نفس محتويات السلسلة. في حالة السلاسل التي تريد استخدامها. يساوي () ، عادةً ما أضع عبارة ToUpperCase () هناك كما يلي:

if(guess.toUpperCase().equals(s.toUpperCase()))

للتخلص من حساسية حالة الأحرف لأنه يجعل حياة الجميع أسهل لكني أعلم أن هذا ليس جزءًا من السؤال

tldr: استخدم. يساوي عند مقارنة السلاسل ، وإلا فإنه يشير إلى كائنات السلسلة وليس المحتويات.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام