https://github.com/1246251747/12/blob/master/66.txt
實 驗 報 告
實驗名稱: 五子棋實驗報告
姓名: 王文政 學 號: 201303011159
班級:計科13-1
學院: 信息學院
五子棋JAVA實驗報告
一、實驗目的和要求
1、能夠用編程語言實現一個簡單的五子棋程序
2、在實際系統中使用、實現人工智能的相關算法
3、進一步加深對人工智能算法的理解
二、五子棋的基本常識與原理
1、五子棋的起源
五子棋,是一種兩人對弈的純策略型棋類游戲,亦稱“串珠”、“連五子”;是中國民間非常熟知的一個古老棋種。相傳,它起源於四千多年前的堯帝時期,比圍棋的歷史還要悠久。亦有傳說,五子棋最初流行於少數民族地區,以后漸漸演變成圍棋並在炎黃子孫后代中遍及開來。
五子棋發展於日本,流行於歐美。容易上手,老少皆宜,而且趣味橫生,引人入勝;不僅能增強思維能力,提高智力,而且富含哲理,有助於修身養性。
傳統五子棋的棋具與圍棋相同,棋子分為黑白兩色,棋盤為19X19,棋子放置於棋盤線交叉點上。兩人對局,各執一色,輪流下一子,先將橫、豎或斜線的5個或5個以上同色棋子連成不間斷的一排者為勝。因為傳統五子棋在落子后不能移動或拿掉,所以也可以用紙和筆來進行游戲。
2、五子棋的基本常識
與任何一種競技棋一樣,五子棋的每一局棋也分為三個階段:開局,中局和殘局。
五子棋的開始階段稱為開局,或稱布局。其開局階段是十分短暫的,大約在七着與十幾着之間。在這一階段的爭奪中,雙方的布局,應對將對以后的勝負起着極為關鍵的作用。在開局階段取得的形勢好壞,主動與被動,先手與后手的優劣程度,往往直接影響中局的戰斗。因此積極處理好開局和開局向中局的過渡十分重要。
五子棋是從一至五,逐漸布子,發展連系,同時運用限制和反限制的智慧,在連子的過程中為自己的棋子爭得相對的主動權和優勢,逐步擴展優勢,或者從劣勢轉化為優勢,擊潰對方的防線,最后連五取勝或抓禁手取勝或迫使對方投子認負。
3、五子棋比賽的相關規定
(1) 職業連珠規則
a. 黑方先下子,白后下,從天元開始相互順序落子。
b. 最先在棋盤橫向、豎向、斜向形成連續的相同色五個棋子的一方為勝。
c. 黑棋禁手判負,白棋無禁手。黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“長連”。即黑棋只能以“四三”取勝。 有關術語解釋請見圖示說明。
d. 如分不出勝負,則定為平局。對局中拔子、中途退場均判為負。
e. 五連與禁手同時形成,判勝。
(2) 比賽中的規定和特例
a. 對局開始前,雙方猜子,大數減小數,單數交換,偶數不換。
b. 白棋第一手(即盤面第二着棋)應在天元為界自己一側布子,主要以示尊重對方,之后雙方可任意行子。
c. 對局中雙方應遵守“職業連珠五子棋規則”,如出現爭議,應由裁判判定。
d. 對局中掉子(棋子掉落在棋盤上)的一方判負。如遇推子或蹭子,以盤面第一落點為准。用手將棋子扶正不算違規。
e. 對局中應禮貌行棋,防止不正常聲音、動作影響對方思考。
f.. 比賽結束后,雙方應將各自棋子放回原處。
g. 對局中如黑方出現禁手,白方應立即指出禁手點,黑方即負。如白方在黑方出現禁手后,又下一步白子,黑棋禁手則不成立了。
h. 比賽對局時間,雙方分別為15分鍾、1小時、2小時、5小時四個等級標准,超時判負。
(3) 特殊規定
職業五子棋雖然對黑棋采取了種種限制,但黑子先行的優勢依然很大。因此,在高段位的職業比賽中,又出現了三種特殊的規定。
a. 指定打法:是指比賽雙方按照約定好的開局進行對弈,由白棋先行。
b. 三手可交換:是指黑棋下盤面第3手棋后,白方在下第四手之前,如感覺黑方棋形不利於己方,可提出交換,即執白棋一方變為執黑棋一方,而黑方不可以不換。
c. 五手兩打法:是指黑棋在下盤面上關鍵的第5手棋時,必須下兩步棋,讓白棋在這兩步棋中拿掉一粒棋子,然后再繼續對弈。一般說來,白棋肯定拿掉對白方不利的一點,而保留對黑方較為不利的那點讓黑方行棋。
三、五子棋的系統設計
1、系統用例模型設計
五子棋系統應該具有選擇玩家先落子還是電腦先落子的功能,應該具有開始游戲和重新開始的功能,當然了,必須具有在玩家指定位置落子的功能。以上描述,用用例圖在圖1中做進一步描述。這部分功能,主要通過界面與系統的交互來實現。
圖1 五子棋系統的玩家用例圖
各個用例,簡單描述如下:
l 選擇電腦先落子:選擇后,在游戲過程中,由電腦執黑子,先落子;玩家執白子,於電腦后落子;
l 選擇玩家先落子:選擇后,在游戲過程中,由玩家執黑子,先落子;電腦執白子,於玩家后落子;
l 落子:原則上說,只要不違反禁手規則,在玩家鼠標點擊最近的落子點落子,但是在本系統中,簡單起見,沒有考慮禁手規則;
l 開始游戲:選擇后,根據設定的電腦還是玩家先落子,開始游戲;
l 重新開始:在游戲途中,可以選擇重新開始,中斷游戲並重新開始游戲。
同時,五子棋系統本身應該具有棋盤繪制、棋勢掃描、棋勢排序、棋勢評估、擇位落子,以及勝負判定的功能,尤其是對於棋勢排序、棋勢評估和擇位落子,這里是體現五子棋系統人工智能(AI)的關鍵之處。以上描述,用用例圖在圖2中進一步描述。
圖2 五子棋系統的系統用例圖
各個用例,簡單描述如下:
l 棋盤繪制:繪制19*19的棋盤及相關按鈕和選項,並負責電腦、玩家落子后棋子的具體繪制;
l 棋勢掃描:掃描目前棋盤上的所有八個方向上的落子情況,獲取整個對弈雙方的棋勢;
l 棋勢排序:對獲取的八個方向的棋勢(實際上下合一,左右合一,左下右上合一,坐上右下合一,為四個方向),進行排序,便於進行棋勢評估;
l 棋勢評估:分別對電腦和玩家的棋勢進行評估,量化棋勢;
l 擇位落子:比較電腦和玩家的棋勢,若有利於玩家,則采取“守、堵”的策略,若有利於電腦,則采取“攻、走”的策略;
l 勝負判定:每次電腦或是玩家落子后,判斷勝負情況,若出現“五子連珠”,則“連珠”一方取勝,另一方失敗,游戲結束。
2、系統界面設計
為了實現玩家的用例所需要的功能,同時又便於使用,五子棋系統的界面設計得比較簡單,如圖3所示。
整體界面為一個19*19的棋盤,在f-06、f-14、j-10、n-06、n-14這五個位置畫了一個小方塊,以提醒玩家棋盤的中央位置,便於把握有利位置落子。
在棋盤的右側是一些控制和提醒選項、按鈕和對弈狀態標簽。
其中,選項有“我是老大我先來”和“讓讓電腦也無妨”兩個。選擇前者,則玩家先落子;選擇后者,則電腦先落子。
按鈕有“人機對戰,快沖啊”和“不行了?那重來吧”兩個。單擊前者,則游戲開始;單擊后者,則中斷游戲,重新開始。
標簽有“就不告訴你是誰贏了”和“就不告訴你這是第幾步”兩個。前者是在游戲分出勝負后,顯示是黑方取勝還是白方取勝;后者是在游戲過程中,不論是電腦落子還是玩家落子,都提示現在是第幾步落子。
圖3 五子棋系統界面
3、系統模塊設計
為了實現五子棋系統本身具有的功能,將系統分為這幾個模塊:五子棋主模塊、棋勢掃描模塊、棋勢排序模塊、棋勢評估模塊以及隨機落子模塊。其中,五子棋主模塊實現棋盤繪制、勝負判定的功能,以及對弈過程中對比雙方棋勢的擇位落子模塊。棋勢掃描模塊、棋勢排序模塊、棋勢評估模塊分別實現棋勢掃描、棋勢排序、棋勢評估的功能;而隨機落子模塊則實現在前兩步棋勢尚未形成時,電腦緊鄰玩家落子位置隨機擇位落子的功能,是用例圖中擇位落子功能的一部分。
對應的,系統一共有五個類,分別對應五個模塊;分別為:五子棋主模塊Gobang類、棋勢掃描StatusScan類、棋勢排序StatusSort類、棋勢評估StatusEvaluation類,以及隨機落子RandomPlay類。類圖如圖4所示。
其中Gobang類中的屬性和方法並沒有完全列出,只列出了主要的屬性和方法;其余類基本列出了所有的屬性和方法。具體細節將在第四部分“五子棋的實現與測試”一節討論,這里不再贅述。
圖4 五子棋系統的類圖
四、五子棋的實現與測試
1、Gobang類的實現
Gobang類是五子棋的核心類,棋盤繪制、棋子落子,響應事件的處理,游戲的控制和模式設置,勝負判定,以及對棋勢掃描、排序、評估等的調用都在這里實現。Gobang類的類圖如圖5所示。
圖5 Gobang類類圖
其中棋盤的繪制,有paint()和init()來實現,棋子落子由setQizi()來實現,響應事件的處理也在這個類中添加監視器並處理,而游戲的控制和設置在Game_start()和Game_rastart()中實現,游戲勝負的判定由Judge()方法和四個判定不同方向上是否五子連珠的Game_win_*()函數來實現。而最為重要的棋勢掃描、排序和評估,則由其屬性scanp、scanc、sort、evaluatep、evaluatec分別調用它們的方法來實現。隨機落子由屬性randomPlay調用其方法實現。
2、StatusScan類的實現
StatusScan類通過掃描目前棋盤上的所有八個方向上的落子情況,獲取整個對弈雙方的棋勢。StatusScan類的類圖如圖6所示。
圖6 StatusScan類類圖
其中三維數組shape為一個20*20*5的數組,用來存儲所獲取的整個對弈雙方的棋勢。當然了,在實際實現中,實例化了兩個StatusScan類的對象scanp和scanc,這兩個對象分別用來存儲玩家的棋勢和電腦的棋勢。而statusScan()方法具體實現從棋盤上獲取整個棋勢的具體過程,參數chesspad存儲棋盤上的詳細落子情況,參數colour決定需要獲取的是黑方的棋勢還是白方的棋勢。具體掃描時,對於棋盤(i, j)處,有上下、左右、左下右上、坐上右下八個方向,但是統計時,將上下、左右、左下右上、左上右下分別合一,則一共有四個結果,分別存儲在shape[i][j][0]、shape[i][j][1]、shape[i][j][2]、shape[i][j][3]中。
3、StatusSort類的實現
StatusSort類對StatusScan類掃描得到的棋勢進行排序,以便於做進一步的棋勢評估。StatusSort類的類圖如圖7所示。
圖7 StatusSort類類圖
其中,StatusSort類只有一個方法statusSort(),參數shape即為StatusScan類掃描獲取的棋勢數據,該方法主要是對shape中的棋勢數據進行排序,使得shape數組滿足以下條件:
排序后的結果仍然存儲在shape數組中。
4、StatusEvaluation類的實現
StatusEvaluate類對StatusSort類排序過的棋勢進行評估,為對弈時電腦擇位落子提供依據。StatusEvaluate類的類圖如圖8所示。
圖8 StatusEvaluate類類圖
其中,StatusEvaluate類也只有一個方法statusEvaluate(),參數shape即為StatusSort類排序后的棋勢,該方法主要是根據棋盤上每一個位置(i, j)的棋勢數據shap[i][j][0]、shap[i][j][1]、shap[i][j][2]以及shap[i][j][3]的取值,計算該位置的棋勢評估值,並保存在shap[i][j][4]中。此外,還要比較每一個位置的棋勢評估值,將最大的評估值記錄在屬性max中,相應的位置坐標記錄在max_x和max_y中。
5、RandomPlay類的實現
RandomPlay類主要是在前兩步,棋勢尚未形成,在玩家落子后,電腦緊鄰玩家落子位置,隨機落子。RandomPlay類的類圖如圖9所示。
圖9 RandomPlay類類圖
其中,方法randomPlay()方法具體實現這一過程,屬性chesspad存儲目前棋盤上的落子情況,參數a、b即為玩家最近一次的落子位置。randomPlay()方法通過檢測隨機數的值,分別在緊鄰玩家落子(a, b)處的正上、正下、正左、正右、左下、右上、左上以及右下八個位置中的一個位置落子,最終選取的電腦落子位置,存儲在屬性x、y之中。
6、五子棋系統的測試
運行系統后,選擇“讓讓電腦也無妨”,單擊“人機對戰,快沖啊”,開始游戲。游戲過程中,能夠正確顯示相關的游戲信息,如圖10所示。
圖10 系統運行截圖
從圖中,可以看到“就不告訴你是誰贏了”標簽顯示的勝負信息“五子連珠白棋贏了”;而“就不告訴你這是第幾步”標簽顯示進度信息“這是第13步”。
五、分析與總結
通過五子棋實驗,從分析、設計、編程、調試,到最后運行成功,自己得到了很多的鍛煉。