首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby - Player vs Player for Rock,Paper & Scissor游戏

Ruby - Player vs Player for Rock,Paper & Scissor游戏
EN

Stack Overflow用户
提问于 2019-10-29 08:52:00
回答 2查看 191关注 0票数 0

如果我重复了别人之前的要求,请向我道歉。我已经在stackoverflow上看过其他RSP游戏的问题。大多数都是关于播放器与计算机的。也许我需要阅读更多的理论来更好地理解,并修改代码以适应我的目的,即玩家一vs玩家二。

我正在尝试玩家一vs玩家二-石头剪刀和Ruby的纸质游戏。关于下面的代码,我有以下问题。-如何隐藏每个玩家条目?-代码中有如此多的重复,因此违反了DRY原则。我应该如何重构?-类方法是这个游戏的最好方法(最有效)吗?-目前,这个游戏只适用于石头剪刀。如果我想稍后添加lizard spock,我应该如何证明这一点?或者以最有效的方式添加这个?提前感谢!

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-10-29 09:10:02

你问了一个非常固执己见的,开放式的问题。对于Stack Overflow来说,这不是最好的问题。但是,我会试一试。

首先,我会将你的评分代码提取到一个函数中。如下所示:

代码语言:javascript
复制
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”代表另一个玩家。

这些都是你可以用来提升你的游戏的点子!祝你好运,在你完成一些工作后,请随时跟进。

票数 1
EN

Stack Overflow用户

发布于 2019-10-29 19:01:40

您可以通过以下方式来评判获胜者:

代码语言:javascript
复制
choice1, choice2 = (gets.to_i - 1), (gets.to_i - 1)
winner = %w(none player1 player2)[choice2 - choice1 % 3]

让我们测试一下

代码语言:javascript
复制
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"]

以同样的方式,可以简化输出逻辑。

代码语言:javascript
复制
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

play
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58600165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档