这是我的代码:
class RockPaperScissors
# Exceptions this class can raise:
class NoSuchStrategyError < StandardError
end
def self.winner(player1, player2)
if ((player1[1] == 'R') && (player2[1] == 'S') ||
(player1[1] == 'S') && (player2[1] == 'P') ||
(player1[1] == 'P') && (player2[1] == 'R'))
return player1
elsif ((player1[1] == 'R') && (player2[1] == 'P') ||
(player1[1] == 'S') && (player2[1] == 'R') ||
(player1[1] == 'P') && (player2[1] == 'S'))
return player2
elsif ((player1[1] == 'R') && (player2[1] == 'R') ||
(player1[1] == 'S') && (player2[1] == 'S') ||
(player1[1] == 'P') && (player2[1] == 'P'))
return player1
end
end
def self.tournament_winner(tournament)
player1 = Array.new
player2 = Array.new
nextround = Array.new
while tournament.length != 1 do
tournament.each_with_index {|item, index|
if (index%2!=0)
player2[0] = item[0]
player2[1] = item[1]
elsif (index%2 ==0)
player1[0] = item[0]
player1[1] = item[1]
else
puts 'bananas'
end
if (index%2!=0)
nextround[(index-1)/2] = winner(player1, player2)
end
}
tournament=nextround
end
return tournament
end
end
RockPaperScissors.tournament_winner([["num1", "R"], ["num2", "P"], ["num3", "P"], ["num4", "R"]])
嗯,最后一行是执行启动。这个代码是一个摇滚,剪纸比赛。它将每个角色及其攻击的数组数组作为输入,并且必须使用冠军及其攻击返回数组。
比赛是num1 vs num2(num2 wins),num3 vs num4(num3 wins)。然后决赛是Num2 vs Num3,在这个稳定队员中赢得阵容中的第一个人(Num2)。
它似乎过于复杂,因为代码必须使用任意数量的字符,只要它们的数字是base2(2,4,8,16个字符......等)。
我的问题是下一步(调试代码,你会看到)。当它改变数组'Player1'或'Player2'的值时,它也会更改数组'nextround'中的值,即使它不在该行中!
这不应该发生!
顺便说一下,我正在学习Ruby,所以这可能是一个非常愚蠢的失败。
答案 0 :(得分:0)
为什么这必须是真的?
“它似乎过于复杂,因为代码必须使用任意数量的字符,只要它们的数字是base2(2,4,8,16个字符......等)。”
相反,将player1和player2作为数组,我会将它们重写为类Player的实例。然后在Player类中编写方法,这样您就可以调用player1.hand
并返回'S' || 'R' || 'P'
通过这种方式,您可以存储玩家对玩家对象的胜利数量,
我会研究更多关于
的内容case / when statements
特殊初始化方法
attrs_accessor(用于跨类访问数据)
模块
我也看到它已经完成,我可能在这方面错了,但通常你不会把类放在类中。