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
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
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