首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码破解游戏

密码破解游戏
EN

Code Review用户
提问于 2012-04-22 18:59:30
回答 1查看 217关注 0票数 3

这是Ruby中的“代码破解”游戏。告诉我我能做得更好!

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

回答 1

Code Review用户

发布于 2012-04-22 19:53:42

有趣的游戏:),和合理的代码。我只有几个建议。

代码语言:javascript
复制
      if @level > 6
        raise "Error"
      end

代码语言:javascript
复制
    if @code.length > 5
      puts "Invalid Difficulty!"
      exit
    end

您处理第一个使用异常和第二个使用if条件的特殊原因吗?

还可以考虑返回一个错误代码,如果程序可以以非交互的方式使用,将任何错误打印到stderr也会有所帮助。我也会把它修改为

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

你要在这里查一下这个吗?它与其说是用户输入的问题,不如说是断言,并且用户输入在其他地方被验证。

代码语言:javascript
复制
    # sexit 2 "Invalid Difficulty" if @code.length > 5

    puts @code
  end

避免幻数,用常量替换4。

代码语言:javascript
复制
  def askuser(var)
      print var
      return gets
  end

为什么要重新字符串并猜测一个成员变量?你似乎没有在其他地方使用它们。

代码语言:javascript
复制
  def prompt
    guess = ""

这是什么时间循环?而你在里面用了一个时间环?

代码语言:javascript
复制
    max_guess.times |guesses|
      retstring = ""
      guess = askuser "Enter a guess: "

你不需要维护x。还有,为什么这里只有4?从上面看,如果级别为5,则添加一个新的单元格。

代码语言:javascript
复制
      4.times do |x|

最好把它当作三元

代码语言:javascript
复制
        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?你想抓住斯皮洛斯的暗示吗?

代码语言:javascript
复制
      if hint =~ /hint/i
        j = rand(@level*2)
        puts "#{j}: #{@code[j]}"
      end

就我个人而言,我更喜欢用案例陈述来检查这个问题。还请注意,您可以得到不区分大小写的匹配。

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

重新字符串最好在循环开始时重置。

代码语言:javascript
复制
    end
  end

对于整个组织,它可能更好地组织为一个小型命令解释器,其中包含提示、级别等特定的命令。

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

https://codereview.stackexchange.com/questions/11084

复制
相关文章

相似问题

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