Я работаю над своей второй программой ruby и буквально застрял на последней вещи, стоящей между мной и законченной программой.Моя задача - написать метод «Камень, бумага, ножницы», который возвращает победившего игрока.Для этого требуется игровой аргумент в виде [["Dave", "S"], ["Dan", "R"]], где "S" и "R" - это "Ножницы" и "Скала".соответственно.Затем он определяет победителя и возвращает массив, содержащий стратегию выигрыша.Также выдает ошибки, если игра неправильной длины или стратегии == или не находятся в диапазоне.
class WrongNumberOfPlayersError < StandardError ; end
class NoSuchStrategyError < StandardError ; end
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
#Hash of whose Keys are the strategies and values are the players
playr = {(game[0].slice(1).downcase) => game[0],
(game[1].slice(1).downcase) => game[1]} #This fits on the above line in IRB
#Collect Strategies in array for comparison
stgys = playr.keys
#raise NoSuchStrategyError unless players give strategies in range, no duplicates
raise NoSuchStrategyError unless (stgys.select { |s| s.match /[prs]/ }.size == 2)
#determine Winner
case stgys.to_s
when /p/ && /r/
playr["p"]
when /p/ && /s/
playr["s"]
when /s/ && /r/
playr["r"]
end
end
Это работает, как я ожидаю, проверяя стратегии на соответствие регулярным выражениям и возвращая победителя.За исключением последнего случая, когда при встрече всегда возвращается ноль.Если я вызываю player ["r"] под любым другим, когда это удается, и он возвращает нужного игрока в "/ p / && / r /".Если я изменю порядок, он все равно не будет работать, поэтому я знаю, что это не имеет отношения к его позиции.Регулярное выражение / r / вычисляет, когда это должно произойти, если я сделаю отдельный вызов сопоставления вне оператора case.Поэтому я считаю, что я сузил это до того, что связано с тем, как / s / и / r / связаны, но в остальном я в тупике.Также приветствуется любая помощь с DRYness, спасибо за помощь!