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