一、 簡介
本文將細致地介紹用C#來實現游戲Reversi的完整過程。游戲界面如下圖所示。
二、 背景
我最開始寫這個程序是為了作為學習C#和.NET編程的一個練習。Reversi-或Othello一是一個相當有趣且相當流行的游戲,它僅要求幾個基本元素和簡單的游戲規則。所以,它是學習一個新的編程環境的良好選擇。
該程序的第一個版本是一個可玩的游戲,但是缺乏一些計算機平板游戲的常規特性,例如撤消移動的能力。因此,在又學習了.NET編程的一些技巧後,我又對該游戲進行了改進。修改後的游戲在原先的圖形和人工智能方面增加了一些新特性並作了性能上的改進。
三、 使用代碼
你只要編譯源文件並運行結果可執行文件Reversi.exe,即可開始玩這個游戲。使用菜單或工具欄,你可以進行多方面的選擇和設置。你不妨試著在游戲中間縮放窗戶,改變顏色或交換邊界來觀察所發生的情況。
你可能注意,在你退出該游戲時,該程序將創造一文件Reversi.xml。這個文件被使用於保存多方面設置-例如游戲選項,窗戶大小和位置以及進行玩家統計-它們在游戲重新開始時被重載。
四、 幫助文件
本文還提供一個Windows幫助文件,包括完整的源代碼。你可以在文檔的"help files"子目錄找到它。為了使這個幫助文件可應用於該程序,只需簡單地把文件Reversi.chm復制到可執行文件Reversi.exe所在位置即可。當然,沒有它你也可以運行此游戲,但是如果點擊"Help Topics"選項將顯示一個錯誤的話-說明該游戲主程序不能發現幫助文件。
所有用於創建這個幫助文件的源文件包括在那個子目錄下。你可以使用微軟的HTML Help Workshop對之進行編輯並且重新編譯它。
五、 興趣點
相應的源文件已經被很好的注釋過了,讀者可以很容易的看懂。現在讓我們分析一下本游戲中幾個有趣的方面。
(一) 游戲AI
本游戲的一個很有意思的地方是計算游戲玩家的移動,所以值得討論。本游戲使用一標准的"最小最大向前看"算法來確定玩家的最佳移動。Alpha-beta pruning被使用於改進向前搜索的效率。如果你不熟悉"最小最大向前看"算法和/或alpha-beta pruning,你可以用Google搜索來找到大量的相關信息和示例。
當然,在游戲中可能存在的太多的移動順序將導致一個相當費時的向前搜索-要生成所有可能的移動組合需要花太長的時間。這裡的例外是在游戲的結束時-此時僅剩下很少的幾個方格-大約十或二十個。此時,可以進行全部的搜索並且這時可能找到玩家的最佳移動結果。
但是在大多數情況中,向前搜索深度必須被限定到一個數目(這基於游戲的難度設置)。因此,對於每一系列可能的行動和反向移動搜索,必須計算最後的游戲平板以決定哪個玩家最有機會贏得游戲。該計算是通過使用下列標准來計算一個等級:
·輸掉-讓你的對手沒有合法的移動可以迫使他輸掉這一回合,從而使你更有利於能夠在一行中再次(或多次)移動。
·可移動性-這是一種測算-你可以做出多少次合法的行動從而留給你的對手多少次合法的行動。類似於輸掉,其思想是,減少你的對手的選擇,從而最大化你自己的選擇。
·邊界-一個邊界圓盤是鄰近一個空的方格的地方。一般地,擁有大量的邊界圓盤,會給你的對手在隨後的回合中更多的可移動性。相反,擁有較少的邊界圓盤意味著你的對手將在後面有較少的可移動性。這種得分反應了你的邊界圓盤相對於你的對手的邊界圓盤數。
·穩定性-角圓盤是穩定的,它們永不會被翼側包圍。隨著游戲的進展,另外的圓盤也將變為穩定的。這種得分反應了你的穩定圓盤數相對於你的對手的穩定圓盤數。
·得分-這是在平板上你的圓盤數相對於你的對手的圓盤數之差。
不同的權值分別被賦給這裡的每一種得分(這再次依賴於游戲的當前難度設置)。通過每一種標准得分乘以它的相應權值,然後把這些值加在一起,一個平板即被賦予一個等級。一個大的負數等級代表一個平板有利於黑棋,而一個大的正數等級代表一個平板有利於白棋。因此,對於一個可能的移動集合,計算機將為當前選定顏色一方選擇最可能導致最高等級的那個移動。