2015-11-03 64 views
17

我發現這個工作液:是否有可能檢查井字遊戲的使用jGraphT遊戲的中獎條件?

private int[] winningPatterns = { 0b111000000, 0b000111000, 0b000000111, // rows 
     0b100100100, 0b010010010, 0b001001001, // cols 
     0b100010001, 0b001010100 // diagonals 
}; 

/** Returns true if thePlayer wins */ 
private boolean hasWon(int thePlayer) { 
    int pattern = 0b000000000; // 9-bit pattern for the 9 cells 
    for (int row = 0; row < 3; ++row) { 
     for (int col = 0; col < 3; ++col) { 
      if (cells[row][col].content == thePlayer) { 
       pattern |= (1 << (row * 3 + col)); 
      } 
     } 
    } 
    for (int winningPattern : winningPatterns) { 
     if ((pattern & winningPattern) == winningPattern) 
      return true; 
    } 
    return false; 
} 

,但我想知道是否有使用圖形邏輯更優雅的解決方案。

更新:我也在考慮用我的知識在3×3板的不同和更大的變種,我相信這種方法並不能很好地擴展美觀。

例如:https://en.wikipedia.org/wiki/Teeko

+4

這似乎很多優雅 - 你還有更多尋找? –

+0

我想投資更多的圖表設置,然後能夠簡單地調用myGraph.isItWon() –

+0

這種方法很好,可以擴展到64個單元格(即8x8)板很容易 –

回答

2

爲25 25板,我認爲你有方法是可行的,但一些改進辦法如下。

  1. 創建模式在用戶添加件,因爲那將只需要花費要經過winningPatterns陣列的時間。

  2. 爲了提高第二部分,你可以嘗試更有效地存儲。以可以同時檢查多個參數的方式存儲winningPatterns。 例如,如果第一位置是0,那麼它可以從winningPatterns而不是僅僅一個除去的3種可能性(111 000 000 100 100 100 100 010 001)。

  3. 你可以通過檢查具有最高的概率爲它是正確的位置提高了平均情況。例如,玩家可以通過將棋子放在中間位置而獲得4種方式,因此請檢查該順序。

  4. 如果您存儲在一個單獨的陣列,其中p1Tiles和p2Tiles玩家位置。然後,這可能會大大增加平均情況,因爲他們大多數時間董事會將相當空白。在棋盤重置之前,它只會完成1場比賽。

  5. 你實際上並不需要檢查玩家贏得的所有部分,只需檢查當前用戶所在位置是否贏得勝利即可。因此,使用這種方法,即使電路板的大小爲99..999乘以99..999,您也只需檢查最壞情況下的其他12個點。 (12因爲當前插槽PLUS周圍的所有插槽,如果有兩個相同的顏色旁邊,所以你將不得不看看下面的插槽)