这是Ruby中的“代码破解”游戏。告诉我我能做得更好!
#!/usr/bin/env ruby
class Sequence
attr_accessor :guess, :code
def initialize
puts "Type the difficulty level you would like: 1, 2, 3, 4, or 5"
begin
@level = gets; @level = @level.to_i
if @level > 6
raise "Error"
end
rescue
puts "Invalid Difficulty"
exit
end
end
def create_code
@code = "#{rand(@level*2)}#{rand(@level*2)}#{rand(@level*2)}#{rand(@level*2)}"
if @level == 5
@code += "#{rand(@level*2)}"
end
if @code.length > 5
puts "Invalid Difficulty!"
exit
end
puts @code
end
def prompt
@retstring = ""
@guess = ""
guesses = 0
while guesses < 4
print "Enter a guess: "
@guess = gets
x = 0
4.times do
if @code[x] == @guess[x]
@retstring += "+"
else
@retstring += "-"
end
puts @retstring
sleep(1)
x += 1
end
puts "Would you like a hint? Type 'hint' to get a hint"
hint = gets
match = hint =~ /(h|H)(i|I)(n|N)\w/
unless match == nil
j = rand(@level*2)
puts "#{j}: #{@code[j]}"
end
guesses += 1
if @retstring == "++++"
puts "Correct!"
break
end
@retstring = ""
end
end
def print_code
print @code
print " was the code\n"
end
end
j = Sequence.new
j.create_code
j.prompt
j.print_code发布于 2012-04-22 19:53:42
有趣的游戏:),和合理的代码。我只有几个建议。
为
if @level > 6
raise "Error"
end和
if @code.length > 5
puts "Invalid Difficulty!"
exit
end您处理第一个使用异常和第二个使用if条件的特殊原因吗?
还可以考虑返回一个错误代码,如果程序可以以非交互的方式使用,将任何错误打印到stderr也会有所帮助。我也会把它修改为
def sexit(code, str)
puts str
exit code
end
def initialize
puts "Type the difficulty level you would like: 1, 2, 3, 4, or 5"
@level = gets.to_i
sexit 1 "Invalid Difficulty" if @level > 6
end
def create_code
code_rows = 4
code_rows += 1 if @level > 4
@code = ''
code_rows.times do
@code += "#{rand(@level*2)}
end你要在这里查一下这个吗?它与其说是用户输入的问题,不如说是断言,并且用户输入在其他地方被验证。
# sexit 2 "Invalid Difficulty" if @code.length > 5
puts @code
end避免幻数,用常量替换4。
def askuser(var)
print var
return gets
end为什么要重新字符串并猜测一个成员变量?你似乎没有在其他地方使用它们。
def prompt
guess = ""这是什么时间循环?而你在里面用了一个时间环?
max_guess.times |guesses|
retstring = ""
guess = askuser "Enter a guess: "你不需要维护x。还有,为什么这里只有4?从上面看,如果级别为5,则添加一个新的单元格。
4.times do |x|最好把它当作三元
retstring += (@code[x] == guess[x] ? "+" : "-")
puts retstring
sleep(1)
end
hint = askuser "Would you like a hint? Type 'hint' to get a hint"你为什么要用单独的火柴?也给J命名一些描述性的东西。为什么\w?你想抓住斯皮洛斯的暗示吗?
if hint =~ /hint/i
j = rand(@level*2)
puts "#{j}: #{@code[j]}"
end就我个人而言,我更喜欢用案例陈述来检查这个问题。还请注意,您可以得到不区分大小写的匹配。
case askuser "Would you like a hint? Type 'hint' to get a hint"
when /hint/i
j = rand(@level*2)
puts "#{j}: #{@code[j]}"
end
if retstring == "++++"
puts "Correct!"
break
end重新字符串最好在循环开始时重置。
end
end对于整个组织,它可能更好地组织为一个小型命令解释器,其中包含提示、级别等特定的命令。
https://codereview.stackexchange.com/questions/11084
复制相似问题