2014年2月4日 星期二

JavaFX Reversi

黑白棋 (Reversi) 又名反棋,據說是由英格蘭的Lewis Waterman與John W. Mollett於19世紀末時所發明的。黑白棋與五子棋、圍棋類似,同屬策略性的棋盤遊戲,棋盤是以8×8等比例見方的64個方格所組成。在遊戲開始時,會在棋盤中央放置黑白棋子各兩顆,玩家可任意選擇黑棋或白棋,如下圖所示:
其規則是每下一棋子必須將對方的棋子包圍,而被包圍的棋子則調換成玩家己方的棋子,此動作稱為Flip,如下圖所示,一列中原僅有黑白各一棋子,當玩家於白棋右方下一黑棋時,兩黑棋由於包圍住白棋,符合遊戲規則,因此玩家可將對方的白棋移除,換成玩家的黑棋: 
依據此規則,雙方依序下棋並調換對方的棋子,直到無法再下或棋子填滿棋盤為止,而以棋盤上數目較多棋子的一方為勝方。除了上述規則之外,另需遵守以下規則:
  • 若所下的位置並沒有包圍任何對方棋子時,屬無效。
  • 若包圍的範圍中含有空格,亦屬無效。
  • 若沒有任何空格可下時,則由對方繼續。
  • 包圍的方向可為上、下、左、右、左斜及右斜等方向。
以下為黑白棋的致勝策略,首先將棋盤定義如下圖所示,其中A、B、C、X稱為A Square、B Square、C Square與X Square,而中間16格的部份則稱為Sweet Sixteen:
其致勝策略如下:
  • 儘可能佔領棋盤中的四個角落,由於角落並不會腹背受敵,當佔領角落時,更容易包圍對方的棋子,但對方的棋子則無法包圍角落的棋子,因此角落為雙方必爭之地。
  • 千萬不可下在X Square上,因為如此便讓對方有機會佔領棋盤的角落。同理,以棋盤四邊而言,亦千萬不要下在C Square上。
  • 若棋子需下在棋盤四邊時,則A Square的位置比B Square好,而C Square則為最差。
  • 儘可能停留在Sweet Sixteen的區域中,以避免對方有機會佔領角落。
  • 儘可能建立由角落所組成的對角線,此對角線稱為Main Diagonal。
  • 儘可能避免翻動對方太多的棋子,遊戲中贏多不見得好,最後贏才算是贏,此乃以退為進的策略,稱為Evaporation Strategy。
上述遊戲規則與致勝策略,以程式而言,則是定義每一棋格的加權比重,稱為Weight,藉此分析下棋的可能位置。以黑白棋而言,在遊戲開始時,會先將棋盤中央放置黑白棋子各兩顆,此四顆棋格並不需任何策略運用,因此可以將其比重設為最小,例如0。棋盤的四個角落,為致勝的關鍵,因此將其比重定為最高,例如8。X Square與C Square容易讓對方有機會佔領角落,為失敗的關鍵,因此將其比重設為最低,分別為1與2。而以棋盤四邊而言A Square比B Square佳,因此可得到如下圖所示之結果:
除了加權比重之外,由於可在遊戲時,任選黑白一方為玩家的棋子顏色,因此在遊戲之初,必須依玩家所下的第一顆棋子位置決定雙方棋子顏色,黑白雙方在遊戲開始時,所有可能下的位置,如下圖所示,其中B代表黑棋、W代表白棋:
若以二維陣列而言,假設分別以gridx與gridy代表水平與垂直位置,則分別由0到7,例如左上角的位置為 (0, 0)、右下角為 (7, 7),因此上圖的可能位置則分別依序如下圖所示依此可決定雙方棋子的顏色:
最後當棋子填滿棋盤或無法再下時,則依棋子的多寡決定勝負。

JavaFX Reversi如下所示。

Example: Link

© Chia-Hui Huang


沒有留言:

張貼留言