2016-11-11 6 views
1

Wie würde ich in der elsif sagen grundsätzlich unter „wenn Buchstaben == (ein Brief innerhalb des Arrays enthalten‚letterbank‘) ===> Druckbuchstaben“elsif einem Brief in einem Array

def hide_or_not(an_array, a_guess) 
    an_array.each do |letter| 
     if a_guess == letter 
     print a_guess 
     elsif SOMETHING HERE 
     print letter 
     else 
     print "_" 
     end 
    end 
    end 

unter der Annahme, Die Methode wird a_guess übergeben, das ein Buchstabe in Form einer Zeichenfolge und ein Array einzelner Buchstaben ist. Wenn ein Buchstabe erraten ist, wie es scheint, oder auch ein „_“ gedruckt wird

an_array = ["r", "i", "c", "s", "h", "a", "w"] 
letter_guess = "r" 

dann sorry ich muss ich auch unter der Annahme, jeder Brief speichern erraten so will ich irgendwo einen letterbank inlcude. Ich weiß nicht, ob ich das unter dem moethod tun sollte, oder in sie ... (schon erraten Buchstaben)

letterbank = ["s", "w", "t", "j"] 

so in diesem Fall würde ich die unten will ... Dank drucken!

r___s__w 
+2

'letterbank.include? Buchstabe' – mudasobwa

+0

Hinweis: Zeichenfolgen sind effektiv Zeichenfelder. Buchstabieren von Buchstabenfeldern ist verschwenderisch. – tadman

Antwort

0

Eine Möglichkeit besteht darin, statt eines Arrays einen Hash zu verwenden. Kopieren Sie die Briefbankwerte in einen Hash-Mapping-Brief an 1 (oder wahr), um anzuzeigen, dass der Brief existiert.

def hide_or_not(an_array, a_guess) 
    letterbank = ["r", "s", "w", "t", "j"] 
    letterhash = {} # define a new hash 
    letterbank.each { |c| letterhash[c] = 1 } # copy array values into the hash 

    an_array.each do |letter| 
    if (a_guess == letter) 
     print a_guess 
    elsif letterhash[letter] # check if the letter is in the hash 
     print letter 
    else 
     print "_" 
    end 
end 

Ende

an_array = ["r", "i", "c", "s", "h", "a", "w"] 
hide_or_not(an_array, 'r') 
1

diese Lösung wird eine Zeichenfolge anstelle von Arrays verwendet, aber kann Arrays genauso einfach verwendet werden. (Das Hinzufügen der Zeichen zu einer Zeichenfolge und das Drucken nach Abschluss der Iteration bietet einige zusätzliche Flexibilität beim Drucken, so dass Sie beispielsweise puts verwenden können).

class LetterGuesser # Hangman 
    def initialize(word) 
    @word = word; 
    @guessed_letters = ''; 
    end 

    def guess_letter(letter) 
    @guessed_letters << letter if [email protected]_letters.include?(letter) 
    current_guesses = '' 
    @word.each_char do |char| 
     if guessed_letters.include?(char) 
     current_guesses << letter 
     else 
     current_guesses << '_' 
     end 
    end 
    puts current_guesses 
    end 
end 

game = LetterGuesser.new('test') 
game.guess_letter('e') 
+1

Die Verwendung einer Klasse ist eine gute Möglichkeit, dies zu kapseln. Eine Sache, die hier zu beachten ist, ist, dass viel von diesem Code mit effektiverem Gebrauch von Enumerable und anderen Ruby-Funktionen wie "if", das einen Rückgabewert liefert, um Duplizierung zu reduzieren, erheblich kompakter gemacht werden kann. – tadman

+0

@tadman: thumsbup: Kann es definitiv verkürzen, aber gleichzeitig wollte ich die Antwort im Stil der Frage halten, damit sie es leicht verstehen und wenn nötig anpassen können (z. B. das "elsif" hinzufügen, was ich nicht war) sicher seinen Zweck). – Levsero

1

Die Minimallösung hier ist die bloßen Streicher und String#tr einzusetzen, damit Sie die Substitution zu tun:

hide_or_not('rickshaw', 'r') 
# => "r_______" 

hide_or_not('rickshaw', 'rswtj') 
=> "r___s__w" 

Arrays:

def hide_or_not(word, guesses) 
    word.tr('^' + guesses, '_') 
end 

Wo Sie so sehen diese Arbeit können und Zeichenketten arbeiten oft auf weitgehend die gleiche Weise, wie in:

# Define an empty string 
guesses = '' 

# Append a character to the string 
guesses << 'r'