2015-07-12 41 views
0

我正在處理的代碼的一些小結是幾個命令行遊戲,它們繼承了大多數命令行遊戲使用的方法和屬性,即板,配置菜單,check_for_winner ,遊戲循環等。我沒有提示用戶使用獲取輸入空間,而是創建了棋盤和菜單以與箭頭鍵交互,並在當前選定的選項上顯示高亮顯示。與其重寫所有這些循環來收集箭頭鍵輸入而不需要按下返回鍵,我決定有一個父級遊戲類,它將在遊戲循環中運行其子類的方法。下面是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. 撫玩再次,如果沒有返回到遊戲選擇

它以我寫它的方式工作,但我覺得必須有更好的方式來構造遊戲循環而不檢查方法是否已定義。另外,繼承是實現遊戲循環的好方法,還是有更好的方法,比如將哈希中的鍵映射到子類的方法。

任何和所有的幫助表示讚賞,謝謝大家提前。

回答

1

您可以定義這些實例方法一樣display_main_menu和超move,與空的實現,通過這樣做,所有的子類保證的廣告有這些方法,但默認情況下什麼都不做,所以你並不需要檢查這些方法的存在。子類可以覆蓋這些方法來提供自己的功能。