沈桂芳 王海云
(安徽新華學院信息工程學院,安徽 合肥 230088)
基于.NET的五子棋游戲的設計與實現(xiàn)
沈桂芳 王海云
(安徽新華學院信息工程學院,安徽 合肥 230088)
基于對五子棋游戲規(guī)則的分析,設計了該游戲的算法,并選擇Visual Studio 2008作為該軟件的開發(fā)平臺,實現(xiàn)了五子棋的多種對戰(zhàn)模式,既可人與人對戰(zhàn),也可人與電腦對戰(zhàn),更增加了多人對戰(zhàn),多人機對戰(zhàn)功能。還實現(xiàn)了無限步悔棋,自定義棋盤行列數(shù),自動保存殘局的功能。經(jīng)測試,本游戲系統(tǒng)功能齊全,能平穩(wěn)運行,具有較強的使用價值。
五子棋;思考算法;多人對戰(zhàn);人機對戰(zhàn)
五子棋游戲不僅能增強思維能力,提高記憶力,而且富含哲理,有助于修身養(yǎng)性。既有“場”的概念,亦有“點”的連接;是中西文化的交流點,是古今哲理的結晶。
.NET[1]框架是一個多語言組建開發(fā)和執(zhí)行環(huán)境,它提供了一個跨語言的統(tǒng)一編程環(huán)境。從層次結構來看,.NET框架包括三個主要組成部分:(1)公共語言運行時(CLR:Common Language Runtime)、(2)服務框架(Services Framework)和上層的兩類應用模板——傳統(tǒng)的Windows應用程序模板(Win Forms)和基于ASP.NET[1]的面向Web的網(wǎng)絡應用程序模板 (Web Forms和Web Services)[2]。
因此,基于.NET平臺開發(fā)一款五子棋游戲[3]軟件非常有實用價值。
本游戲程序功能分為游戲模塊和設置模塊兩部分。其中,游戲模塊分為棋盤欄和控制欄兩個模塊。棋盤欄主要實現(xiàn)繪制棋盤、棋子和標記;控制欄的功能如圖1所示的功能。
其中,設置模塊的具體功能如圖2所示。
棋盤欄的實現(xiàn)通過圖像繪制實現(xiàn),相對較為簡單。而控制欄,用于實現(xiàn)對游戲流程的控制、棋盤信息的顯示??刂茩谑潜卷椖康年P鍵、也是最有難度的實現(xiàn)環(huán)節(jié)。
在實現(xiàn)控制欄的功能之前,首先需要實現(xiàn)棋盤信息的表示和存儲。
定義了一個棋盤類型如下所示。
使用X[num]和Y[num]記錄第num顆棋子在棋盤中的落棋位置,用player[X[num],Y[num]]標記該棋子為哪個玩家所下,用style[num,,]存儲第num位玩家在棋盤中所有位置的棋型信息。
定義好棋盤的信息之后,需要對棋盤各處的棋子信息進行整理、分析,以便提取出有用的棋型信息,為提供指引,做出有效的落棋決斷。
3.2.1 棋型的定義
對于棋盤中的各處坐標,在落下一些棋子之后,會由于所處的位置不同,在各個位置再落下棋子會達到不同的棋型。對于棋型的定義,大體上有三類:活棋、沖棋、死棋。
活棋,是指同時擁有兩個或兩個以上落棋位置的棋型,且這兩個落棋位置都要求可以達到更大棋型,在被堵住一個之后仍有一個更大棋型位置。如下圖3所示;沖棋,僅有一個更大落棋位置,在被其他玩家堵住后,成為死棋。如下圖4所示。
死棋,即使落棋也無法達到五子相連的棋型。如下圖5所示;其實,上述棋型的定義還并不完全精確,還需要對其進行補充定義,如下圖6所示的棋型:
對于這樣的棋型,看到它們中間有兩個更大棋型落棋位置,但它卻并不屬于活棋,因為當在一處位置放入棋子,其他玩家可在剩下的另一處放入棋子,而此時紅方的棋型為沖3并沒有增大,故對于這樣的棋型,將之定義為沖棋,更為合適。
于是,對于棋型的補充定義是:在棋型周邊的某個位置落入棋子后下一步可達到的最大棋型類型,為當前棋型的類型。如上面的棋型,在落入棋子后可達到?jīng)_4,故當前的棋型為沖3。
如圖7所示的棋型:對于這樣的棋型,當在中間位置放入紅棋后可成為活棋,故為活3,而當在兩邊放入紅棋是為沖棋,故為沖3。那么到底算哪一種棋型呢?這樣的補充定義是否自相矛盾呢?
以最大的棋型為準,為活3;這樣的定義也并不矛盾,當在中間的位置放入棋子它為活4,故該位置在未放入棋子時,為活3位置。而兩邊的位置若放入棋子為沖4,未放入棋子時為沖3位置。
同理,對于1、2、4顆棋子時也分別都有活、沖、死三種棋型[4]。
3.2.2 棋型的表示、存儲和更新
定義棋型是為了能夠根據(jù)棋型,進行更優(yōu)落棋位置的判定。表示的棋型,更優(yōu)棋型應當有更大的權值。
對于更優(yōu)棋型有:相同棋子數(shù)時,活棋>沖棋>死棋。相同棋型時,棋子多的棋型更優(yōu)。具體有,五子>活4>沖4>活3>沖3>活2>沖2>活1>沖1>死棋。
以棋型的棋子數(shù)為十位,以0、1、2分別代表死棋、沖棋、活棋作為個位,構成代表各種棋型的權值50>42>41>32>31>22>21>12>11>0(死棋時棋子數(shù)視作0)。這樣就可以實現(xiàn)各種棋型的表示了。
對于棋型的存儲,從棋子周邊的空位置開始,判斷該空位置周邊,五顆棋子范圍以內(nèi),各玩家的最大棋型,分別存儲到玩家對應棋型數(shù)組style[,,]中。而對于已經(jīng)落入棋子的位置,不再判斷它周邊的棋型。
此時,若在該棋子左邊的空位置處落入棋子可達到活4,故該空位置為活3點。若在該棋子右側落入棋子可達沖4,故該空位置為沖3點。于是在紅棋對應的棋型數(shù)組中,對應于這兩個空位置的棋型位置,分別存入代表棋型的權值32和31。對于該棋子周邊的其它空位置,也進行同樣的判斷和棋型存儲。
由棋型的存儲知道,是從棋子周邊的空位置處開始進行棋型判斷、并存儲到各玩家對應的棋型數(shù)組中的,并且5顆棋子范圍以外的空位置,棋型不受影響?;谶@些,只需在落下新的棋子時,更新該棋子周邊空位置的棋型即可。具體的更新的算法實現(xiàn),這里不做詳細描述,參見棋盤類中棋型更新函數(shù)refreshStyle()。
棋型的一般識別過程如下圖8所示。
若在1處落入棋子,可達到?jīng)_4,則1處為沖3位置;同樣的2處為活。
對于任意一個未下棋子的空位置,都有8個方向,定義從0度到315度,間隔為45度,共8個方向分別為方向1、2……8。
則需從1和5、2和6、3和7、4和8這四組方向分別判斷玩家的最大棋型,該棋型即為玩家在該位置的最大棋型。
對于棋子在棋盤中的前臺繪制過程,定義了putChess()函數(shù)的來實現(xiàn),在繪制棋子之前,先行判斷該位置是否已經(jīng)落有棋子,如果已經(jīng)有棋子,則不再落棋。否則落入棋子,棋盤繪制棋子,后臺存儲棋子。后臺棋子的存儲和棋型刷新是由棋盤類型中的put()實現(xiàn)的。另外,還需判斷該位置是否存在5子連珠。若已構成5子,則提示勝出,退出游戲、重玩或悔棋。
對于游戲勝負的判定,當有一方獲勝時,最后一顆棋子的落棋處,必然存在5子相連的棋型。只需在各棋子落下時,以該棋子為中心位置,判斷該棋子五子相鄰的位置是否存在五子相連即可。若某次落棋后存在則該方獲勝。
在棋型不同時有,五子>活4>沖4>活3>沖3>活2>沖2>活1>沖1>死棋;在棋型相同時,己方棋型的優(yōu)先級大于其他玩家的棋型。本項目獲取更優(yōu)落棋位置,大體上是從最大棋型向最小棋型,依次進行判斷。判優(yōu)流程如下圖9所示。
首先,從棋盤中所有棋型位置中,獲取各玩家的最大棋型。如果當前玩家或者其他玩家的最大棋型大于活3,則直接返回該最大棋型空位置。因為,如果當前玩家棋型大于活3,則為沖4或活4,再落入一顆棋子后可以成棋。若是其他玩家棋型大于活3,則當前玩家應將其堵住,否則其他玩家則會成棋。
其次,如果當前玩家的棋型達到活3,則返回該棋型位置,若是其他玩家的棋型達到活3,則先判斷當前玩家是否存在某條大于活3的成棋路徑,如果存在則返回該成棋路徑的第一顆落子位置。若不存在,則需堵住其他玩家的活3棋型,在堵棋時也存在更優(yōu)堵棋位置的判定。
然后,是沖3棋型的判斷。如果當前玩家達到?jīng)_3,則先判斷當前玩家是否存在大于活3的成棋路徑,如果存在則返回該位置。如果是其他玩家達到?jīng)_3,則要先判斷該玩家是否有大于活3的成棋路徑,如果有,那么當前玩家需在該位置堵棋。否則,繼續(xù)向下判斷。
接著,繼續(xù)對活2棋型進行判斷。在達到活2棋型時,先判斷是否存在某條活3成棋路徑。若存在,則返回該路徑的第一個落棋點,若不存在,則進行小一階活棋位置的判定。
最后,在己方所有相同棋型的落棋位置中,選擇更優(yōu)的落棋位置。對于己方相同棋型位置,根據(jù)各位置玩家棋型的排序數(shù)進行更優(yōu)落棋位置判斷,取最大排序數(shù)位置。
本項目基于.NET開發(fā)平臺,在棋形識別和判優(yōu)算法上提出創(chuàng)新算法并實現(xiàn),各個功能模塊經(jīng)測試運行平穩(wěn)。實現(xiàn)界面如圖10所示。游戲的智能算法仍然有待改進的地方,將在今后進一步優(yōu)化改進。
[1]夏敏捷.Visual Basic.NET程序設計教程[M].北京:清華大學出版社,2014∶28-296.
[2]夏敏捷.Visual C#.NET原理與實務[M].北京:中國電力出版社,2010∶10-315.
[3]坂田吾朗.五子棋弈理例解[M].孫滌非,劉德新,譯.北京:北京體育大學出版社,2002∶25-265.
[4]那威,殷立成.五子棋布局技巧[M].北京:金盾出版社,2011∶45-288.
THE DESIGN AND IMPLEMENTATION OF NET-BASED GOBANG GAMES
SHEN Gui-fang WANG Hai-yun
(School of Information Engineering,Anhui XinHua University,Hefei Anhui 230088)
This paper designs algorithms of gobang based on the analysis of rules of the game.And Visual Studio 2008 is selected as the development platform of the software to achieve various battle modes of gobang,including man-man games and mancomputer games.What is more,functions like multiplayer and many man-machines against mode are added.Also,unlimited undo steps,customizing the number of row and column,and auto-saving of the mess are realized.After testing,the game system is fully functional,and operates smoothly with a strong use value.
gobang;thinking algorithm;multiplayer games;man-machine mode
TP311.1
A
1672-2868(2015)06-0033-06
責任編輯:陳 侃
2015-10-12
國家大學生創(chuàng)新項目(項目編號:201412216024)
沈桂芳(1979-),女,安徽貴池人。安徽新華學院信息工程學院,講師。研究方向:軟件工程、智能計算。