第三章 框架設計
3.2 棋譜編輯器框架之設計
3.2.1 遊戲模組(Game Module)
在遊戲模組中,我們採用 MVC 設計模式來開發。
MVC(Model-View-Controller),中文翻譯為模型、視圖、控制器,
是一種在軟體工程中使用的軟體架構模式[19][20],其概念如圖 7。在 MVC 中,主體邏輯與使用者介面被分開,使發展者能獨立地發展、測試、及 維護各自的部分。
圖 7:MVC 概念圖
模型即為主體邏輯。以棋譜編輯器為例,用來儲存棋譜的資料結構,
以及那些用來修改此資料結構的子程序等,就是模型的一部分。
視圖是用來顯示主體邏輯,也就是模型,應該是什麼樣子。同樣以棋 譜編輯器為例,當前盤面該如何顯示就是視圖該做的。
控制器負責將使用者介面的控制單元與模型及視圖中的子程序對應 起來。舉例來說,當使用者介面中的「存檔」按鈕被按下時,控制器會 去呼叫負責存檔的子程序。
圖 8:遊戲模組結構圖
遊戲模組包含模型與視圖。模型包含一個一般化的樹與序列化功能,
而視圖包含三個小視圖,棋盤視圖、樹視圖以及分頁視窗。另外之所以
(MFC)做開發,而 MFC 內並沒有一個顯而易見的控制器類別,控制器 四散在模型與視圖類別內的訊息映射表內,故我們在此不多述。
3.2.1.1 模型(Model)
模型內有兩個最主要的組件,棋譜樹的本體與序列化功能。如上所述,
我們將一些可能不同的地方以多型的方式來留給發展者去定義。而另外 有提供一些方便的基本功能,如樹的遍歷等等給發展者使用。
在主體資料模型中,會需要一個資料結構來儲存棋譜,一般的棋譜只 有一條路徑,但我們需要能看任何搜尋過程中訪問的點,而能夠處理這 種需求的資料結構即為多元樹。我們希望整個樹結構能夠被所有遊戲類 型使用,所以我們將樹定義得盡量一般化,並將多元樹轉成二元樹。
圖 9:棋譜樹概念圖
棋譜樹是由很多的節點所構成,其中節點會有連向其他節點的連結,
其結構會在下一段更仔細的描述。另外,我們還提供了一個工具方便發 展者來做樹的遍歷,叫做 NodePointer。
圖 10:節點資料結構圖
在節點的資料結構內,包含了ㄧ些基本的資料結構來儲存一個棋步,
如座標、顏色、棋子的類型等等,另外還有各個方向的連結用來維持樹 的結構。連結有兩類,垂直向的與水平向的,如圖 10。垂直向的連結用 來依棋步手順來訪問樹,水平連結則用以拜訪當下的盤面的其他走法。
而對棋步節點來說當然只有垂直的連結。此外,我們也限制了該連結的 可視範圍,發展者不會碰到這些連結,這樣也能降低發展者開發時的負 擔。
圖 11:NodePointer 概念圖
通常樹與節點的結構對發展者來說是不重要的,所以我們提供一個像 STL 的 Iterator 的機制來讓發展者使用,叫做 NodePointer,如圖 11。使 用者可以不用自己改連結,而是利用 NodePointer 來在樹結構上進行移動、
賦值、結構改變等等行為。
最後是序列化功能,我們使用 Smart Game Format 來儲存棋譜。SGF 是一種用來儲存棋譜的一般化檔案格式。在序列化時會不一樣的地方是 如何解釋一個棋步,因此我們提供能進行序列化功能的基本類別,而將 棋步解釋留給發展者。
3.2.1.2 視圖(View)
視圖是用來顯示當前盤面的狀態,它包含三個子視圖元件:
棋盤視圖,用來顯示當前盤面。
樹視圖,用來顯示樹的樣子。
分頁視窗,一個可以方便發展者掛上更多附加功能,像註解視窗的工 具。
各種子視圖也被抽象出一個基底類別,若有需要,發展者可以覆寫他 們來給予新的定義。
其中棋盤視圖的複雜度是高於樹視圖與標籤視窗的,因為它負責繪出 各種棋盤與一些其他的輔助顯示。若是六子棋,則其棋盤視圖要負責繪 出圍棋棋盤、棋子,還要顯示盤面上的活四等等。若是象棋則要畫象棋 棋盤與棋子。
樹視圖負責顯示棋譜樹的樣子,它用類似檔案瀏覽器顯示資料夾下有 什麼檔案的方式,來顯示棋譜樹,讓使用者可以展開或收起一個節點。
以六子棋為例,其樹視圖需要在節點顯示棋子位置;象棋則是要顯示棋 步描述,如圖 12。
圖 12:樹視圖範例圖
分頁視窗提供了一個能夠簡單的加入其他附加功能的介面。過去想要 在編輯器內加入一頁新的功能需要知道很多分頁操作的細節,而現在可
目前基本的分頁視窗包含有:
註解視窗(Comment Window)。顯示節點的註解。
主控台視窗(Console Window)。顯示偵錯資訊。
快速輸入輸出視窗(QuickIO Window)。快速地合併一串棋步進入樹 內。