2015-07-16 13 views
14

Sto scrivendo un gioco di impiccato in rubino e volevo usare una dichiarazione del caso per determinare quale parte del corpo collocare in corrispondenza di un numero di ipotesi sbagliate. Ho realizzato questo gioco usando una classe di board che uso per altri giochi come gli scacchi e connect-4 perché ho un metodo che serializza la classe della board permettendomi di salvare e caricare il gioco senza alcun codice aggiuntivo. Per il salvataggio del gioco, avevo bisogno di un modo per determinare il numero di tentativi errati per il boia senza aggiungere variabili extra alla classe della scheda. Per risolvere questo problema ho usato una variabile di istanza sulla classe della scheda chiamata history, che può essere utilizzata per spingere le mosse dal gioco alla cronologia delle schede. Quando la scheda viene serializzata, viene salvata anche la cronologia, che può essere letta dal gioco e utilizzata per determinare le ipotesi errate.L'affermazione del caso di ruby ​​viene meno?

Nel gioco dell'impiccato, ho un metodo chiamato cronologia di lettura (che utilizzo per tutti i giochi poiché risolve il problema di serializzazione descritto sopra). Il metodo read_history è responsabile della lettura delle ipotesi precedenti, della loro visualizzazione e della determinazione del numero di tentativi errati. Questo numero viene quindi passato a un metodo di sospensione che determina quali parti del corpo del boia aggiungere.

def hang(incorrect) 
    case incorrect 
    when 0 
     @hangman = [" ", " ", " "] 
     break 
    when 7 
     @hangman[2][2] = '\\' 
    when 6 
     @hangman[2][0] = '/' 
    when 5 
     @hangman[2][1] = '*' 
    when 4 
     @hangman[1][2] = '\\' 
    when 3 
     @hangman[1][0] = '/' 
    when 2 
     @hangman[1][1] = '|' 
    when 1 
     @hangman[0][1] = 'o' 
    end 
end 

Se dovessi scrivere questo in Java, e un valore di 5 sono stati passati al metodo di cui sopra, sarebbe leggere la dichiarazione fino a quando non ha colpito "quando 5" o in termini java "caso 5:". Si noterà che non c'è un'interruzione nell'istruzione e si sposterà in basso nell'elenco che esegue il codice in "caso 4:" e si ripeterà fino a quando non verrà trovata un'interruzione. Se è stato passato 0, tuttavia, eseguirà il codice, vedrà l'interruzione e non eseguirà e altre istruzioni.

Mi chiedo se Ruby sia in grado di utilizzare le istruzioni case come fa java nel modo in cui passano alla prossima istruzione. Per il mio particolare problema sono consapevole che posso usare un ciclo 0.upto (errato) e gestire i casi in questo modo, ma mi piacerebbe conoscere le somiglianze e le differenze nella dichiarazione del caso usata in ruby ​​rispetto al caso switch utilizzato in java

+0

Il termine che stai cercando è "fall through", come in "questo caso passa al caso successivo". – Kenster

risposta

8

Non passa attraverso.

Ruby just doesn't have the same behavior as Java for this type of statement.

Se si vuole simulare la caduta attraverso un comportamento, si può fare qualcosa di simile:

def hang(incorrect) 
    @hangman = [" ", " ", " "] 
    @hangman[2][2] = '\\' if incorrect > 6 
    @hangman[2][0] = '/' if incorrect > 5 
    @hangman[2][1] = '*' if incorrect > 4 
    @hangman[1][2] = '\\' if incorrect > 3 
    @hangman[1][0] = '/' if incorrect > 2 
    @hangman[1][1] = '|' if incorrect > 1 
    @hangman[0][1] = 'o' if incorrect > 0 

    @hangman 
    end 
+0

Grazie per avermi fatto esattamente quello che stavo cercando –

+0

Le informazioni sui ruby ​​che hai collegato non confermano/disconfermano direttamente se l'affermazione del caso di Ruby cade. – Magne

30

No, istruzione case di Ruby non rientra attraverso come Java. Solo una sezione viene effettivamente eseguita (o altro). Tuttavia, puoi elencare più valori in una singola corrispondenza, ad es. come this site shows.

print "Enter your grade: " 
grade = gets.chomp 
case grade 
when "A", "B" 
    puts 'You pretty smart!' 
when "C", "D" 
    puts 'You pretty dumb!!' 
else 
    puts "You can't even use a computer!" 
end 

È funzionalmente equivalente a un gigante se-else. page on it di Code Academy consiglia di utilizzare le virgole per offrire più opzioni. Ma non puoi ancora eseguire più di un ramo della logica.

+6

Non so perché * questo * non è la risposta accettata. : -/ – jeffdill2

+0

Questa non è la risposta accettata perché non funziona bene per il caso d'uso degli OP. È ancora una buona informazione – richbai90

Problemi correlati