2013-05-09 80 views
-4
for (int i = 0; i < 3; ++i) { 
    for (int k = 0; k < 7; ++k) { 
     for (int h = i; h < 4 + i; ++h) { 
      result = state.getAt(k, h); 
      if (result == 1) { 
       ++firstpl; 
      } 
      if (result == 2) { 
       ++secondpl; 
      } 
      if (firstpl > 0 && secondpl > 0) { 
       break; 
      } 
      //y = k; 
     } 
     if (firstpl == 0 && secondpl == 0) { 
      break; 
     } else if (firstpl > secondpl) { 
      score += firstpl * firstpl; 
      //if(state.getHeightAt(y)-3 < 3) score += 3+firstpl*2; 
     } else { 
      score -= secondpl * secondpl; 
      //if(state.getHeightAt(y)-3 < 3) score -= 3+secondpl*2; 
     } 

     firstpl = 0; 
     secondpl = 0; 
    } 
} 

基本上我有一個7×6的網格。我正在經歷7列,並且每4個連續的塊垂直地看。由於有6個街區向上。每列有3個連續的塊。 State.getAt(k,h)接受x和y並返回一個值。需要幫助減少三重循環以提高效率

+0

爲了幫助提高效率,我們需要了解更多的上下文。例如,這個計算的最終目標是什麼?這將有助於我們提出實現相同目標的替代方法。另外,爲什麼你需要使這個更快?你是否多次爲'state'的不同值調用這段代碼,或者你調用它幾次,但代碼中的一個操作(例如'state.getAt()')是昂貴的?如果是後者,那麼集中精力減少所需的昂貴操作的數量會更好(例如,可能通過記憶方法)。 – Simon 2013-05-09 03:52:07

+0

爲什麼你需要提高這個效率?看起來並不需要太多時間。你測量/分析了它嗎? – 2013-05-09 03:54:44

+0

它在Min_Max函數中調用,所以會被多次調用。我只允許數毫秒來產生分數。確切地說,它在評估功能中。 – user1798750 2013-05-09 03:57:38

回答

0

我不認爲你可以改善這一點,除非你可以找出這個「狀態」的替代表示,允許這個計算增量執行。

而且由於您未能正確解釋狀態或計算的實際含義,因此除了您之外,任何人都很難確定替代方法是否可行。 (並且我不打算試圖從您的代碼中反向設計含義。)


好的。對於Connect4來說,輸贏是一個由4個棋子組成的水平線,垂直線或7x6網格中的對角線。所以你可以做的是將分數狀態表示爲一系列計數器,對應於可以製作獲勝線的每一列,行和對角線。 (7 + 5 + 4 + 4 = 20個=> 20個計數器)然後構造一個從(x,y)位置到通過它的行的索引的靜態映射。在點(x,y)添加檢查器時,查找計數器並將其增加。當你刪除一個檢查...遞減。

我不確定這與你現有的得分功能有什麼關係......但是我不明白這個功能是如何與贏得比賽的戰略相關聯的。無論哪種方式,你可以可能使用上面的方法增量計算分數。

+0

狀態是遊戲Connect 4的棋盤。我正在查看每個插槽以查看是否有連續的1,2連續排列3次。我根據這些數據分配值並總結。 – user1798750 2013-05-09 05:22:28