将子类方法添加到父级游戏循环

时间:2015-07-12 17:43:45

标签: ruby inheritance

我正在处理的代码的一些摘要是几个命令行游戏,它继承自游戏类,提供大多数命令行游戏使用的方法和属性,即棋盘,配置菜单,check_for_winner,游戏循环等。提示用户使用gets输入空格,我创建了板和菜单以与箭头键交互并在当前所选选项上显示突出显示。我没有要求重写所有这些循环来收集箭头键输入而不需要按下返回键,我决定让一个父游戏类在游戏循环中运行它们的子类的方法。以下是我正在使用的game_loop代码

def game_loop
    display_main_menu if defined? display_main_menu
    begin
        space = @board.interact {|char| @quit = true if char == 'q'}
        move(space) if defined? move
    end until @quit || @winner != nil || (end_game if defined? end_game)
    print %x{clear}
    game_summary if defined? game_summary
    puts "Play Again? y/n".center(80)
    restart if defined? restart
    game_loop if get_char == 'y'
end

我的问题是,有没有更好的方法来编写游戏循环方法而不是调用我希望子类具有的方法。我希望游戏循环具有游戏的基本结构,因此在伪代码中它将是

  1. 显示调整游戏规则的主菜单
  2. 一旦用户选择“玩游戏”选项,让玩家移动
  3. 重复步骤2,直到找到胜利者或没有更多动作
  4. 显示游戏摘要,即每位玩家获胜,失败和抽奖计数
  5. 要求再次播放,如果没有返回游戏选择
  6. 它按照我编写的方式工作,但我觉得必须有一种更好的方法来构建游戏循环而不检查方法是否已定义。另外,继承是实现游戏循环的好方法,还是有更好的方法,比如将哈希中的键映射到子类的方法。

    感谢所有的帮助,谢谢大家。

1 个答案:

答案 0 :(得分:1)

您可以在超类中定义那些实例方法,如display_main_menumove,使用空实现,通过这样做,所有子类都保证拥有这些方法,但默认情况下什么都不做,所以你不需要检查这些方法的存在。子类可以覆盖这些方法以提供自己的功能。