Как сравнить буквы в двух строках Ruby - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в ruby ​​и создаю игру палача. Так далеко у меня есть мой код, сравнивающий слова с правильным словом. Но я хочу сравнить буквы. Таким образом, в основном, если правильное слово является клеем, пользователь вводит G, это будет неправильно, но если пользователь вводит клей, это будет правильно. Мне нужно, чтобы сравнить букву за буквой, как палач.

Возникли проблемы с этим. Я приложил свой код ниже.

secret_word = []
puts "enter a word to be guessed"
secret_word = gets.chomp



guess_letters = []
guess = ""
guess_limit = 3
guess_count = 0
out_of_guesses = false

while guess != secret_word and !out_of_guesses
    if guess_count < guess_limit
    puts "enter your guess: "
    guess = gets.chomp()
    guess_letters << guess
    guess_count +=1
    puts "you have used these letters thus far #{guess_letters.join(", ")}"
else
    out_of_guesses = true
end
end
if out_of_guesses
    puts "you Lose, the word was #{secret_word}"
else
    puts "you win"
end

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Правила игры Палач приведены на его Wiki . Я предположил, что игрок пытается угадать слово теряет, когда все семь частей человека на виселице были нарисованы (голова, шея, левая рука, тело, правая рука, левая нога, правая нога).

Вспомогательные методы

Нарисуйте повешенного

Сначала создайте хеш, который можно использовать для рисования частичного или полного палача:

MAN = [" O\n", " |\n", "\\", "|", "/\n", " |\n/", " \\"].
  map.each_with_object([""]) { |s,arr| arr << (arr.last + s) }.
      each.with_index.with_object({}) { |(s,i),h| h[i] = s }

Ключами являются количество неверных догадок. Например:

puts MAN[2]
 O
 |
puts MAN[6]
 O
 |
\|/
 |
/

Следите за положением букв слова

Затем создайте хэш, ключами которого являются уникальные буквы секретного слова и чьизначения - это массивы индексов расположения ключей в слове.

def construct_unknown(word)
  word.each_char.with_index.with_object({}) { |(c,i),h| (h[c] ||= []) << i }
end

Например,

unknown = construct_unknown("beetle")
  #=> {"b"=>[0], "e"=>[1, 2, 5], "t"=>[3], "l"=>[4]}

Мы также создадим пустой хэш для букв, позиции которых известны:

known = {}

Переместить угаданные буквы из хеша unknown в хеш known

Если угаданная буква является ключом unknownэтот ключ и значение перемещаются в known.

def move_unknown_to_known(letter, unknown, known)
  known.update(letter=>unknown[letter])
  unknown.delete(letter)
end

Например (для unknown и known и выше),

move_unknown_to_known("e", unknown, known)
unknown #=> {"b"=>[0], "t"=>[3], "l"=>[4]} 
known   #=> {"e"=>[1, 2, 5]} 

Проверьте, является ли гадательвыиграл или проиграл

Мы определяем, когда, после угадывания буквы, игрок выиграл или проиграл или должен продолжить:

def win?(word_size, known)
  known.values.flatten.sum == word_size
end

def lose?(wrong_guess_count)
  wrong_guess_count == HANGMAN.size
end

Например,

win?(word.size, known)
  #=> false

lose?(6) #=> false
lose?(7) #=> true

Отображение известных букв

def display_known(word_size, known)
  known.each_with_object('_' * word_size) { |(k,a),s| a.each { |i| s[i] = k } }
end

Например (вспомните word #=> "beetle"),

puts display_known(word.size, known)
_ee__e

Основной метод

МыТеперь вы готовы написать основной метод.

def hangman
  puts "Player 2, please avert your eyes for a moment."
  print "Player 1: enter a secret word with at least two letters: "
  word = gets.chomp.downcase
  unknown = construct_unknown(word)
  known = {}
  wrong_guess_count = 0
  loop do
    puts display_known(word.size, known)
    puts MAN[wrong_guess_count] if wrong_guess_count > 0
    if win?(word.size, known)
      puts "You win! You win! Congratulations!"
      break  
    end
    if lose?(wrong_guess_count)
      puts "Sorry, but you've run out of guesses"
      break
    end 
    print "Player 2: enter a letter or your guess of the word: "
    guess = gets.chomp.downcase
    if guess.size > 1
      if guess == word
        puts word
        puts "You win! You win! Congratulations!"
        break
      else
        puts "Sorry, that's not the word"
        wrong_guess_count += 1
      end
    elsif unknown.key?(guess)
      nbr = unknown[guess].size
      puts nbr == 1 ? "There is 1 #{guess}" : "There are #{nbr} #{guess}'s"
      move_unknown_to_known(guess, unknown, known)                   
    else
      puts "Sorry, the word contains no #{guess}'s"
      wrong_guess_count += 1
    end
  end
end  

Пример

После объяснения правил для двух игроков и аудитории, гостевой хост заканчивает словами, "И не забывайте, когда вы угадываете букву или слово, оно должно быть выражено как вопрос ... один момент ... держите это ... Мне сказали, что нет необходимости формулировать это как вопрос".

Предположим, что слово beetle, а угаданные буквы: 't', 'i', 'a', 'l', 'r', 's', 't', 'u', 'e', 'beetle'.

hangman

Player 2, please avert your eyes for a moment.

Player 1: enter a secret word with at least two letters: beetle
______

Player 2: enter a letter or your guess of the word: t
There is 1 t
___t__

Player 2: enter a letter or your guess of the word: i
Sorry, the word contains no i's
___t__
 O

Player 2: enter a letter or your guess of the word: a
Sorry, the word contains no a's
___t__
 O
 |

Player 2: enter a letter or your guess of the word: l
There is 1 l
___tl_
 O
 |

Player 2: enter a letter or your guess of the word: r
Sorry, the word contains no r's
___tl_
 O
 |
\

Player 2: enter a letter or your guess of the word: s
Sorry, the word contains no s's
___tl_
 O
 |
\|

Player 2: enter a letter or your guess of the word: t
Sorry, the word contains no t's
___tl_
 O
 |
\|/

Player 2: enter a letter or your guess of the word: u
Sorry, the word contains no u's
___tl_
 O
 |
\|/
 |
/

Player 2: enter a letter or your guess of the word: e
There are 3 e's
_eetle
 O
 |
\|/
 |
/

Player 2: enter a letter or your guess of the word: beetle
beetle
You win! You win! Congratulations!
0 голосов
/ 09 октября 2019

Я не уверен, какие правила палача вы используете, но вот черновик, который допускает три неудачные попытки и работает со строчными символами

def guess_word(word, tries)

    if tries < 1
        puts "You are hanged!"
    elsif word.empty?
        puts "You guessed it! You are saved from the gallows!"
    else
        print "Enter character: "
        c = STDIN.getc.downcase
        STDIN.getc # get rid of newline
        if word.index(c).nil?
            puts "Ooops, #{c} was wrong!"
            guess_word(word, tries - 1)
        else
            puts "#{c} was correct!"
            guess_word(word.sub(/["#{c}"]/, ''), tries)
        end
    end

end

if __FILE__ == $0

    TRIES = 3

    print "Enter word to guess: "
    word = gets.chomp

    guess_word(word.downcase, 3)    

end

Это не проверено ..

...