• 沒有找到結果。

在本章中,將介紹 iOS 六子棋遊戲程式的實作情況及遇到的問題,在 4.1 到 4.3 節中將按照不同模組分別描述之。

4.1 GUI 模組

在本次 iOS 六子棋程式中,GUI 模組的實作使得使用者介面較流暢,

以下使用圖 18 至圖 22 作為範例說明。

圖 18. 在棋盤上點擊(tap)下子

如圖 18 所示,使用者在棋盤中央點擊(tap)一下,當使用者手指離開螢 幕時,即開始下子流程:計算使用者觸碰點靠近的棋點,檢查下子於該棋 點是否為合法步,確認是合法步則開始移動棋子的動畫,將黑棋從右下角

26

移動到該棋點;若是白方下子回合,則由左上角開始移動白子。某方下子 回合結束時,另一方的棋碗和名牌會變亮,提示輪該方下子,如圖中黑方 下子前,黑方的棋碗和名牌是亮的;黑方下完第一手後,換成白方的棋碗 和名牌變亮。另外,目前剛完成的該手棋子的中央會有小點(若是黑子標示 白點,若是白子則標示黑點),提示使用者剛剛下的棋子位置。

圖 19. 滑動(swipe)顯示選項表

在圖 19 中顯示使用者可以藉由滑動(swipe)手勢拉動顯示選項表,選 項表上有「離開」、「重玩」、「悔棋」、「設定」、「儲存」按鈕,以下說明各 按鈕功能。

 離開:關閉正在進行的遊戲畫面,回到主頁面顯示。

 重玩:關閉正在進行的遊戲畫面,初始遊戲資訊後再重新載入新局遊 戲畫面。

27

 悔棋:若在按下悔棋時,某方已完成下子,即黑方的第一手已經下了 一子或之後某一方已下完兩子,則移除上一手下的子(除了黑方第一手 是移除一子外,其餘都移除兩子)。但當某一方尚未結束其下子回合,

即某方在要下兩子的回合中只放了一子,則只移除該子。

 設定:按下設定鈕時,系統會跳出設定視窗,使用者可開啟或取消提 示線功能和音效,如下方圖 20 所示。

圖 20. 設定視窗

 儲存:將目前棋譜用字串表示存入資料庫,若棋盤上尚未有子則此按 鈕顯示為灰色,按下後無作用。

28

圖 21. 使用雙指 pinch out 放大棋盤

圖 22. 拖曳(drag)觸碰點以移動十字輔助線

在圖 21 中,使用者用雙指 pinch out 將棋盤畫面放大。而圖 22 中,使

29

用者按住螢幕中棋盤一段時間(tap and hold),畫面上出現白色輔助線,拖 曳觸碰點可移動輔助線確認下子位置。

由於不同的 iOS 裝置有不同的顯示器規格,目前市面上 iOS 行動裝置 中最常見的是 iPhone 及 iPad。在本實作中,為了符合螢幕限制,會偵測目 前裝置是 iPhone 或是 iPad 來調整合適的畫面物件尺寸,如圖 23 所示。

(a) (b)

圖 23. (a) iPhone 模擬器畫面 (b) iPad 模擬器畫面

4.2 AI 程式之支援

在本次實作中,移植了由本實驗室開發的 AI 程式─NCTU6,由於行 動裝置的計算資源如處理器、記憶體等資源較一般個人電腦弱,所以在移

30

31 大的是 new iPad,其記憶體有約 1 Gigabyte,但和一般個人電腦相較之下 仍較少。

Main thread Secondary thread

Stack size 1024 KB 512 KB

表 5. iOS 預設的線程(thread)堆疊(stack)容量[15]

本程式在需要 AI 運算時,會新增一條線程來計算,以免影響使用者 介面的運作,表 5 則列出 iOS 線程堆疊容量的限制。另外,從幾次實際測 試和網路蒐集的資料[13]發現當一個 iOS 應用程式記憶體使用量達到 20 至 30 Megabytes 時,應用程式可能會崩潰。由以上得知,在 iOS 行動裝置上 執行 AI 計算時,必須謹慎使用記憶體。

在 NCTU6 程式中,記憶體主要使用在棋型表(pattern table)和搜尋樹 (search tree)的資料結構。其中,較難刪減容量的部分是棋型表,以下將介 紹 NCTU6 中的棋型表和縮減後的查詢方法。

目前正規的六子棋棋盤是 19×19,為了方便查詢一條線(19 個棋點)上 棋型的分數以評估下子位置的好壞,NCTU6 使用棋型表儲存一條線上所

32

33

中,活三的評估值較死二高,因此採用左邊子線查詢出的活三評估值。

用上述的方法和原本直接用完整長度的單線棋型查詢出的評估值會 有些誤差,圖 25 顯示用各種子線長度進行實驗所得出的誤差比例折線圖。

圖 25. 各子線長度的誤差比例折線圖

圖 25 的實驗數據中,在所有的棋型裡去除勝利棋型,使用前述方法 查出的子線攻擊或防守評估值,相較於原本完整單線棋型查詢出的攻擊與 防守的評估值,若兩者相異即是誤差。我們分析子線長度為 10 至 19 的棋 型表誤差值,子線長度愈大則誤差比例愈小,使用前述方法查詢子線長度 為 19 的評估值即與原本完整單線棋型查詢出的評估值完全相同。

34

圖 26. 子線長度為 15 的棋型表查詢誤差範例

而子線長度 15 的棋型表是記憶體容量與誤差比例均可接受的。例如 圖 26 所示,原本完整單線棋型查詢下子在“#”位置的評估值為活一,這是 由於程式中判定下子在該位置對左邊“@@”已形成的死二無意義;但使用 前述方法查詢時,使用左邊長度為 15 的子線查詢出活一,右邊長度為 15 的子線則查詢出死二,死二與活一的強度相當,然我們為了簡化而選擇較 高的死二評估值,因此在此選擇死二為評估值,和原本查詢的評估值有誤 差,但此種誤差的影響不大,實作中採用長度為 15 的棋型表。

使用完整棋型表 使用縮減後的棋型表

記憶體消耗量 約 26.5 Megabytes 約 7.5 Megabytes

每手思考時間 約 58 秒 約 75 秒

表 6. AI 程式棋型表縮減前後的記憶體消耗量與思考時間比較表

如表 6 所示,在等級四 AI 程式執行時,使用縮減後子線長度為 15 的 棋型表和原本完整的棋型表相比,雖然每手思考時間較長,但消耗的記憶 體量減少許多。另外,目前應用程式下載檔案大小約為 8 Megabytes;去除 AI 程式與棋型表的應用程式下載檔則約為 6 Megabytes。

35

4.3 知識庫模組

在本次實作中,我們從網路上名為 Littlegolem[9]的伺服器上蒐集一些 棋譜,並使用 NCTU6 協助找出約 6000 盤有趣的詰棋盤面,再由第二屆交 大六子棋公開賽的冠軍─王智功先生挑選約 530 盤結棋題目匯入資料庫。

目前實作中,詰棋闖關遊戲分成 8 大關,每關有 12 局,前 4 大關每 局的詰棋盤面皆是固定的;後 4 大關中,使用者選擇某局詰棋時,會從 10 個詰棋盤面中隨機挑選一個盤面供使用者解詰棋。在詰棋的資料庫中,8 大關的詰棋盤面與資訊分別存在 8 個 tables 中,前 4 個 tables 各有 12 個詰 棋盤面,後 4 個 tables 各有 120 個盤面。

本實作中也將使用者資訊儲存於資料庫中,包含玩家名稱、是否開啟 畫線及音效功能、詰棋闖關進度、玩家儲存的棋譜資訊。

36

相關文件