2017-10-03 1 views
-1

Ich baue ein Hang-Person-App-Spiel. Hier schätzt der Benutzer "b", "a" und "n", was zu einem Gewinn führen würde. Die @word Instanzvariable wird mit einem zufälligen Wort versehen, in diesem Beispiel ist es "Banane".Wie finde ich eindeutige Buchstaben in einer Zeichenfolge in Ruby und passe sie an?

@guesses = Array["b", "a", "n"] 
@word = "banana" 

hier nur ich erlaube innerhalb eindeutigen Buchstaben @guesses

Wie kann ich wissen, ob alle eindeutigen Buchstaben in @Word innerhalb @guesses sind?

Gibt es irgendwelche Methoden vorgefertigte Methoden dafür?

Unten ist mein Code. Ich überprüfe für einen Sieg in meiner letzten Methode, check_win_or_lose def

class HangpersonGame 

# add the necessary class methods, attributes, etc. here 
# to make the tests in spec/hangperson_game_spec.rb pass. 

# Get a word from remote "random word" service 

# def initialize() 
# end 
attr_accessor :word, :guesses, :wrong_guesses 
def initialize(word) 
    @word = word 
    @guesses = ''; 
    @wrong_guesses = ''; 
end 


def guess(letter) 
    # throws an error when letter is empty, not a letter, or nil 
    if letter.nil? || letter.empty? || !(letter =~ /[[:alpha:]]/) 
    raise ArgumentError 
    end 

    # make case insensitive 
    letter.downcase! 

    # check that the "letter" is not empty or null 
    # also check if the letter is already in the guesses and wrong_guesses 
    # instance variable, if so then this is not a valid guess, 
    # return false, if not false then determine if it's a correct or wrong guess. 
    if (@guesses.include?(letter)) || (@wrong_guesses.include?(letter)) 
    false 
    else 
    if @word.include?(letter) 
     @guesses << letter 
    else 
     @wrong_guesses << letter 
    end 
    end 
end #end of guess method 


def word_with_guesses 
    # if @guesses is emtpy, then display '------' 
    # searched on google another way to repeatedly display strings 
    # because using while loop or any other loop gives an error. 
    if guesses.empty? 
    "-"*@word.size 
    else 
    # if @guesses isn't empty, then display to the user all the 
    # correctly guessed letters inside @guesses using .gsub 
    @word.gsub(/[^#{@guesses}]/, "-") 
    end 
end # end of word_with_guesses method 


def check_win_or_lose 
    # check if it's a lose by checking if there are 7 letters in @wrong_guesses 
    if @wrong_guesses.length == 7 
    :lose 
    # check if it's a win 
    elsif ???????? 
    :win 
    # else continue playing: no win or lose 
    else 
    :play 
    end 
end 


# You can test it by running $ bundle exec irb -I. -r app.rb 
# And then in the irb: irb(main):001:0> HangpersonGame.get_random_word 
# => "cooking" <-- some random word 
def self.get_random_word 
    require 'uri' 
    require 'net/http' 
    uri = URI('http://watchout4snakes.com/wo4snakes/Random/RandomWord') 
    Net::HTTP.new('watchout4snakes.com').start { |http| 
    return http.post(uri, "").body 
    } 
end 

end 
+0

A) Es ist "Ruby", kein Akronym. B) Verwenden Sie einfach '['a', 'b', 'c']' beim Definieren von Arrays. Es gibt absolut keine Notwendigkeit für "Array [...]" oder "Array.new" hier. C) Sie müssen sich auch darauf konzentrieren, die Dinge richtig einzumessen, damit die Struktur Ihres Programms deutlicher wird. Das hilft uns, Ihre Absicht besser zu verstehen. – tadman

+0

Es gibt auch [OpenURI] (https://ruby-doc.org/stdlib-2.4.1/libdoc/open-uri/rdoc/OpenURI.html) als Teil der Standardbibliothek, die einfache GET-Anfragen wirklich einfach macht: ' Öffnen ('http: // ...') .lesen'. – tadman

Antwort

0

Ich würde es so schreiben:

@guesses = ["b", "a", "n"] 
@word = "banana" 

#All guesses in @word?: 
p @guesses.all?{|char| @word.include?(char)} #=> true 
# All characters in @word are in @guesses: 
p @word.chars.uniq.all?{|char| @guesses.include?(char)} #=> true 
Verwandte Themen