2013-07-17 41 views
-1

嗨,有人可以向我解釋爲什麼我的注入不在這裏工作?重構ruby代碼注入問題

我在這裏使用注射正確嗎?出於某種原因,一旦這種情況下進場(5日移動通常是在我的遊戲)

def cpu_block_player 
    winning_combinations = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]] 
    executed = 0 
    winning_combinations.each do |combination| 
     result_of_combination = "" 
     result_of_combination = combination.inject("") {|result, element| result + @board[element]} 
     if result_of_combination == "XXe" || result_of_combination == "eXX" || result_of_combination == "XeX" 
     executed += 1 
     puts executed 
     player_move(@current_turn, result_of_combination.index("e"))  
     end 
     break if executed >= 1 
    end 

回答

1

首先,我的代碼獲取無限循環趕上了,這些題型是更適合於Code Review堆棧交易所現場。

然而,這裏有我的想法:看着你的代碼時

我首先想到的是,你只是有一個大課堂。爲了看到面向對象編程的一些真正的優勢,我建議將一些代碼抽取到不同的類中。我絕對可以看到Game課程中的Board課程,只是等待提取。

的一些想法的方法來添加到Board類:

  • to_s - 這將是什麼在此刻你print_board方法,沒有print
  • finished? - 檢查遊戲是否「完成」(即有人贏了)。方法winner也是有意義的。
  • taken? - 之前是否有人已經採取了立場。

您的Game類中的許多代碼將受益於命名。例如,拿這段代碼:

@current_turn == @player_x ? @current_turn = @player_o : @current_turn = @player_x 

這不是超級難弄清楚這段代碼呢,但究竟如何你換誰是當前玩家可能並不重要,要知道在閱讀player_move方法。所有你想知道的是「在這一點上,我們切換球員」。

提取方法和對象不會讓你編寫更少的代碼,但在我看來,它使代碼更清晰。如果你可以給每行代碼一個名字(例如,將它提取到一個方法),那麼弄清楚發生了什麼可能會容易得多。

+0

感謝您的回覆!這裏有很多有用的知識 – JaTo