Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-Player vs Player for Rock、Paper&;剪刀游戏_Ruby_Logic_Rubygame - Fatal编程技术网

Ruby-Player vs Player for Rock、Paper&;剪刀游戏

Ruby-Player vs Player for Rock、Paper&;剪刀游戏,ruby,logic,rubygame,Ruby,Logic,Rubygame,如果我重复别人以前问过的问题,请道歉。我已经看过了其他关于stackoverflow的RSP游戏问题。大多数是关于玩家对电脑的。可能我需要阅读更多的理论来更好地理解和修改代码,以适合我的目的,即玩家一对玩家二 我正在尝试玩家一对玩家二-石头剪刀和红宝石纸牌游戏。关于下面的代码,我有以下问题。 -如何隐藏每个玩家条目? -代码中有太多重复,因此违反了DRY原则。我应该如何重构它? -课堂教学法是这个游戏的最佳方式吗(最有效)? -目前,这个游戏只适用于石头剪刀。如果我以后想添加蜥蜴斯波克,我应该如

如果我重复别人以前问过的问题,请道歉。我已经看过了其他关于stackoverflow的RSP游戏问题。大多数是关于玩家对电脑的。可能我需要阅读更多的理论来更好地理解和修改代码,以适合我的目的,即玩家一对玩家二

我正在尝试玩家一对玩家二-石头剪刀和红宝石纸牌游戏。关于下面的代码,我有以下问题。 -如何隐藏每个玩家条目? -代码中有太多重复,因此违反了DRY原则。我应该如何重构它? -课堂教学法是这个游戏的最佳方式吗(最有效)? -目前,这个游戏只适用于石头剪刀。如果我以后想添加蜥蜴斯波克,我应该如何证明这一点?还是以最有效的方式添加? 提前谢谢

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
options=[“石头”、“剪刀”、“布”]
虽然是真的

打印你问了一个非常固执己见的开放式问题。对于堆栈溢出,这不是最好的问题。但是,我要试一试

首先,我将把你的评分代码提取到一个函数中。大概是这样的:

def battle(p1, p2)
  if p1 == p2
    'Tie!'
  elsif p1 == 'paper' && p2 = 'rock'
    'Paper smothers Rock...Player 1 wins!"
  elsif etc..
end 
这将使你的主循环变得非常小…这几乎总是一件好事。当您开始为代码编写单元测试时,这也将使您的生活变得美好

至于学习游戏结束测试,请使用
| |
一次比较几项内容,例如
player1|val==9 | player2|val==9

我怀疑您的代码将无法按当前编写的方式工作。尝试在调试器中逐行运行此命令……或者更简单地说,在不同的位置放置
put“var is#{var}”
,转储感兴趣的变量的值。任何一种方法都会很快暴露任何bug,并使修复变得显而易见

至于Ruby方法,请考虑使用符号而不是字符串来选择数组。类似于

[:纸、石头、剪刀]
。避免在代码中使用幻数。每当代码中有一个文字数字(可能不是1或0)时,很有可能您有一个神奇的数字,应该努力使其成为常数、符号或等式

redo
不是常用的Ruby命令。(我不得不去查看它的功能!)你已经有了一个循环……你不需要重做就能完成任务

除了良好的编码实践之外,我们还可以讨论UX/UI(用户体验/用户界面)。对于这个游戏来说,这是一个大问题……玩家不能看到彼此的输入,这是至关重要的。对
getch
进行一些研究。还要考虑给每个玩家一半的键盘…“ASD”代表一名球员的三个选择,“JKL”代表另一名球员


这些都是你可能会用到的一堆想法!祝你好运,在完成一点工作后,请随时跟进

你问了一个非常固执己见的开放式问题。对于堆栈溢出,这不是最好的问题。但是,我要试一试

首先,我将把你的评分代码提取到一个函数中。大概是这样的:

def battle(p1, p2)
  if p1 == p2
    'Tie!'
  elsif p1 == 'paper' && p2 = 'rock'
    'Paper smothers Rock...Player 1 wins!"
  elsif etc..
end 
这将使你的主循环变得非常小…这几乎总是一件好事。当您开始为代码编写单元测试时,这也将使您的生活变得美好

至于学习游戏结束测试,请使用
| |
一次比较几项内容,例如
player1|val==9 | player2|val==9

我怀疑您的代码将无法按当前编写的方式工作。尝试在调试器中逐行运行此命令……或者更简单地说,在不同的位置放置
put“var is#{var}”
,转储感兴趣的变量的值。任何一种方法都会很快暴露任何bug,并使修复变得显而易见

至于Ruby方法,请考虑使用符号而不是字符串来选择数组。类似于

[:纸、石头、剪刀]
。避免在代码中使用幻数。每当代码中有一个文字数字(可能不是1或0)时,很有可能您有一个神奇的数字,应该努力使其成为常数、符号或等式

redo
不是常用的Ruby命令。(我不得不去查看它的功能!)你已经有了一个循环……你不需要重做就能完成任务

除了良好的编码实践之外,我们还可以讨论UX/UI(用户体验/用户界面)。对于这个游戏来说,这是一个大问题……玩家不能看到彼此的输入,这是至关重要的。对
getch
进行一些研究。还要考虑给每个玩家一半的键盘…“ASD”代表一名球员的三个选择,“JKL”代表另一名球员


这些都是你可能会用到的一堆想法!祝你好运,在完成一点工作后,请随时跟进

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

choice1,choice2=(gets.to_i-1),(gets.to_i-1)
获胜者=%w(无玩家1玩家2)[选择2-选择1%3]
让我们测试一下

winner=proc{choice1,choice2}%w(无玩家1玩家2)[choice2-choice1%3]]
案例=[[0,0],[0,1],[0,2],[1,2],[2,0],[2,1]]
案例.map(&winner)#=>[“无”、“玩家1”、“玩家2”、“玩家1”、“玩家1”、“玩家2”]
同样,可以简化输出逻辑

HOW_-TO_-WIN=[“石头弄钝剪刀”,
“剪刀剪纸”,
“纸盖石头”]。别动
def播放器(编号:num)
# ...
choice=(gets.to_i-1)
# ...
结束
def播放
choice1,choice2=[1,2]。地图{num{player(no:num)}
获胜者=%w[无玩家1玩家2][choice2-choice1%3]
how_to=how_to_WIN[选项2-选项1%3]
如果获胜者==“无”
放上“领带,请下一次扔”
其他的
放入“{how},{winner}赢”
结束
结束
玩

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

choice1,choice2=(gets.to_i-1),(gets.to_i-1)
获胜者=%w(无玩家1玩家2)[选择2-cho