如果我重复了别人之前的要求,请向我道歉。我已经在stackoverflow上看过其他RSP游戏的问题。大多数都是关于播放器与计算机的。也许我需要阅读更多的理论来更好地理解,并修改代码以适应我的目的,即玩家一vs玩家二。
我正在尝试玩家一vs玩家二-石头剪刀和Ruby的纸质游戏。关于下面的代码,我有以下问题。-如何隐藏每个玩家条目?-代码中有如此多的重复,因此违反了DRY原则。我应该如何重构?-类方法是这个游戏的最好方法(最有效)吗?-目前,这个游戏只适用于石头剪刀。如果我想稍后添加lizard spock,我应该如何证明这一点?或者以最有效的方式添加这个?提前感谢!
options = ["rock", "scissors", "paper"]
while true
print <<TEXT
1 - rock
2 - scissors
3 - paper
9 - end game
TEXT
puts "Player 1, choose rock(1), scissors(2), paper(3). To end the game, enter 9."
player1_val = gets.to_i
puts "Player 2, choose rock(1), scissors(2), paper(3). To end the game, enter 9."
player2_val = gets.to_i
if player1_val == 9 # I am repeating the same condition for player2. How should I combine?
puts "End"
exit
end
if player2_val == 9
puts "End"
exit
end
player1 = options[player1_val-1]
player2 = options[player2_val-1]
if player1 == player2
puts "Tie, next throw please"
redo
end
if player1 == 1 and player2 == 2
puts "Rock blunts scissors, you win"
elsif player1 == 2 and player2 == 1
puts "Rock blunts scissors, you loose"
elsif player1 == 2 and player2 == 3
puts "Scissors cut paper, you win"
elsif player1 == 3 and player2 == 2
puts "Scissors cut paper, you loose"
elsif player1 == 3 and player2 == 1
puts "Paper covers rock, you win"
elsif player1 == 1 and player2 == 3
puts "Paper covers rock, you loose"
end
end发布于 2019-10-29 09:10:02
你问了一个非常固执己见的,开放式的问题。对于Stack Overflow来说,这不是最好的问题。但是,我会试一试。
首先,我会将你的评分代码提取到一个函数中。如下所示:
def battle(p1, p2)
if p1 == p2
'Tie!'
elsif p1 == 'paper' && p2 = 'rock'
'Paper smothers Rock...Player 1 wins!"
elsif etc..
end 这会让你的主循环变得非常简单,small...which几乎总是一件好事。当您开始为您的代码编写单元测试时,这也将使您的生活变得美好。
至于排除游戏结束测试,可以使用||一次比较几个东西,比如player1_val == 9 || player2_val == 9
我怀疑您的代码将无法按照当前编写的方式工作。试着在debugger...or中逐行运行,更简单地将puts "var is #{var}"放在不同的位置,转储感兴趣的变量的值。任何一种方法都会迅速暴露任何bug,并使修复变得显而易见。
至于用Ruby的方式来做事情,可以考虑在选项数组中使用符号而不是字符串。就像[:paper, :rock, :scissors]一样。避免在你的代码中使用幻数。任何时候在你的代码中有一个文字数字(可能不是1或0 ),你很有可能有一个神奇的数字,并且应该努力使它成为常量、符号或等式。
redo不是常用的Ruby命令。(我必须去查看它,看看它是做什么的!)你已经有了loop...you,不需要重做就能完成你的任务。
除了良好的编码实践之外,我们还可以讨论UX/UI (用户体验/用户界面)。对于这个游戏来说,这是一个很重要的问题……重要的是玩家不能看到对方的输入。对getch做一些研究。也可以考虑给每个玩家半个键盘..."ASD“代表一个玩家的三个选择,"JKL”代表另一个玩家。
这些都是你可以用来提升你的游戏的点子!祝你好运,在你完成一些工作后,请随时跟进。
发布于 2019-10-29 19:01:40
您可以通过以下方式来评判获胜者:
choice1, choice2 = (gets.to_i - 1), (gets.to_i - 1)
winner = %w(none player1 player2)[choice2 - choice1 % 3]让我们测试一下
winner = proc { |choice1, choice2| %w(none player1 player2)[choice2 - choice1 % 3] }
cases = [[0, 0], [0, 1], [0, 2], [1, 2], [2, 0], [2, 1]]
cases.map(&winner) #=> ["none", "player1", "player2", "player1", "player1", "player2"]以同样的方式,可以简化输出逻辑。
HOW_TO_WIN = ['Rock blunts scissors',
'Scissors cut paper',
'Paper covers rock'].freeze
def player(no: num)
# ...
choice = (gets.to_i - 1)
# ...
end
def play
choice1, choice2 = [1, 2].map { |num| player(no: num) }
winner = %w[none player1 player2][choice2 - choice1 % 3]
how_to = HOW_TO_WIN[choice2 - choice1 % 3]
if winner == 'none'
puts 'Tie, next throw please'
else
puts "#{how_to}, #{winner} win"
end
end
playhttps://stackoverflow.com/questions/58600165
复制相似问题