2015-08-05 21 views
8

Per il mio primo progetto Java sto cercando di creare un semplice gioco basato sul testo. Sembra che i tubi o non funzionino e quando provo a inserire qualcosa in dopo non funziona; Devo riavviarlo.I tubi o non funzionano?

public void GameStart() { 
    String playerName = "Player"; 
    String Command = "Choice"; 
     System.out.println("Type Start to start game!"); 
    if(in.nextLine().equals("Start") || in.nextLine().equals("start")) { 
     Help(); 
     print("Type Begin to start game :D"); 
     if(in.nextLine().equals("Begin") || in.nextLine().equals("begin")) { 
      System.out.println("Who are you?"); 

Inizio e Inizio funziona, ma avendo la prima lettera in minuscolo come ho usato || per non. Quando uso quelli devo riavviarlo perché non posso digitare nulla, ma ho chiaramente o pipe che dice di usare uno dei due. Qualcuno ha idea di cosa sta causando questo?

+7

cosa pensi che accada quando chiami 'in.nextLine()'? – njzk2

+0

'in.nextLine()' probabilmente attende ulteriori input. Cercando di salvare l'input in una variabile e controllarne il valore. – MikeTheLiar

+0

Come regola generale, ho trovato utile * mai * apportare modifiche di stato "in linea" con altri calcoli/valutazioni. (Nel tuo caso, le modifiche dello stato sono quando leggi l'input, che fai "in linea" con una condizione booleana.Un altro esempio di incremento, ad esempio, 'i ++'.) Ho sempre trovato più chiaro e più facile da ottenere quando tu tenerli separati. Metti le modifiche di stato prima o dopo altre operazioni, in una dichiarazione separata. Se l'avessi fatto qui, il tuo problema non si sarebbe mai verificato. – jpmc26

risposta

6
String str = in.nextLine(); 
str.equalsIgnoreCase("Start"); 

Verificherà sia il caso inferiore che quello superiore. Non è necessario chiamare il metodo equals() due volte, in modo da ottimizzare il codice e la leggibilità.

Spero che questo risolva il problema.

+0

Grazie a questo ha funzionato! Anche se, per me è uguale a IgnoraCase invece che uguale: P – Melon

+0

Grazie per avermi corretto. Sì, equalsIgnoreCase !! Errore Syntex: P –

+0

@AnkurMahajan Non è un errore di sintassi, sarà "Impossibile trovare il simbolo" errore: p –

3

Conservare l'ingresso dello scanner in una stringa come questa:

userInput = in.nextLine(); 

e poi valutare nelle istruzioni condizionali

16
in.nextLine().equals("Start") || in.nextLine().equals("start") 

Questo sarà eseguito da sinistra a destra, quindi prima in.nextLine().equals("Start") viene eseguito.

Supponiamo di inserire "start". La parte sinistra restituisce false. La valutazione dell'intera espressione continua. Il lato destro è eseguito, in.nextLine().equals("start"). Quindi, legge un'altra riga, aspetta il tuo un altro input. Questo non è quello che vuoi.

Per risolvere questo problema (questa è anche una regola generale): non modificare lo stato nella condizione if. In altre parole: l'espressione nella condizione non dovrebbe avere side effects.

È possibile assegnare il risultato del metodo che cambia lo stato, in.nextLine(), ad un riferimento:

String line = in.nextLine(); 
if (line.equals("Start") || line.equals("start")) 

è anche possibile scrivere la condizione come:

if (line.equalsIgnoreCase("start")) 

o

if (line.toLowerCase().equals("start")) 

Ora, qualsiasi combinazione di casi va bene, anche "START".

Ultimo ma non meno importante: questi || non sono chiamati pipe. Se usi la parola "pipe" nel contesto di programmazione, molte persone penseranno al simbolo Unix pipes, | nella riga di comando.

In Java || è "logica o l'operatore", "logica o". Per distinguere con "binario o", |, che è molto diverso.

+3

'str.toLowerCase(). Equals (" qualcosa ")' assomiglia sempre alla sorella sporca di 'str.equalsIgnoreCase (" qualcosa ")': D. – Tom

+0

Sono d'accordo @ Tom: P –

+2

@Tom Almeno dire "sporco piccolo * fratello *", per timore che qualcuno possa sentirsi offeso ... – Durandal