基于ARM的多人對(duì)戰(zhàn)游戲平臺(tái)

對(duì)于單人五子棋游戲,即人機(jī)對(duì)戰(zhàn),只需要一個(gè)應(yīng)用程序。當(dāng)用戶鼠標(biāo)左擊棋盤時(shí),程序先在相應(yīng)位置處畫(huà)棋子,然后執(zhí)行電腦方策略,實(shí)現(xiàn)對(duì)戰(zhàn)。
對(duì)于雙人五子棋游戲,則需要先運(yùn)行一個(gè)服務(wù)器端程序,然后兩個(gè)用戶分別運(yùn)行一個(gè)客戶端程序,并與此服務(wù)器相連。游戲進(jìn)行過(guò)程中,由服務(wù)器執(zhí)行游戲策略,客戶端程序只負(fù)責(zé)采集鼠標(biāo)信息和顯示棋子。我們讓用戶A在游戲平臺(tái)A上運(yùn)行服務(wù)器端程序,緊接著運(yùn)行客戶端程序,并與服務(wù)器建立Socket連接;然后告訴用戶B服務(wù)器的IP地址,讓其在平臺(tái)B上運(yùn)行客戶端程序,并與服務(wù)器建立Socket連接;連接成功后就可以開(kāi)始游戲了。
3.2 單人游戲
建立MFC工程,選擇創(chuàng)建單文檔類型的應(yīng)用程序。添加對(duì)話框資源用于選擇游戲模式,并在View類構(gòu)造函數(shù)中DoModal()。
進(jìn)入單人模式后的程序開(kāi)發(fā)流程如圖5所示。

對(duì)于某些步驟需要作詳細(xì)說(shuō)明:

3)判斷游戲是否結(jié)束
在Doc類中定義私有性質(zhì)的成員變量int state[15][10];,用于記錄棋盤上每一格的狀態(tài):無(wú)棋(值為0)、用戶方棋(值為1)、電腦方棋(值為2),初始值是0。游戲過(guò)程中,某一方落棋后立即給state數(shù)組對(duì)應(yīng)成員賦值,下標(biāo)可由鼠標(biāo)左鍵消息響應(yīng)函數(shù)的CPoint point參數(shù)轉(zhuǎn)換而來(lái)。
對(duì)于棋盤上每一個(gè)坐標(biāo)點(diǎn)(i,j),沿東西、南北、東南西北、東北西南四個(gè)方向掃描五個(gè)沿途點(diǎn)的狀態(tài)值,若發(fā)現(xiàn)五個(gè)相同狀態(tài)相連,則該狀態(tài)(用戶方或電腦方)的棋手獲勝,游戲結(jié)束。
4)電腦方下棋策略
對(duì)于棋盤上每一個(gè)坐標(biāo)點(diǎn)(i,j),掃描它的狀態(tài)值state[i][j],一經(jīng)發(fā)現(xiàn)不為0,就以此點(diǎn)為起點(diǎn),沿東、南、西、北、東南、西南、東北、西北8個(gè)方向搜索5個(gè)棋位。
事先定義針對(duì)每個(gè)點(diǎn)、每個(gè)方向的8個(gè)整型數(shù)組(初始值賦為0):

對(duì)于坐標(biāo)點(diǎn)(i,j),搜索過(guò)程中若遇到具有相同狀態(tài)的點(diǎn)(m,n),則對(duì)應(yīng)方向數(shù)組的[i][j]成員的值增加,遇到不同狀態(tài)點(diǎn)則減小。保存8個(gè)中絕對(duì)值最大的。
上述操作完后,比較所有點(diǎn)存的值,絕對(duì)值最大的說(shuō)明以該點(diǎn)起始的某個(gè)方向己方棋子相連較多,或者對(duì)方棋子相連較多,最適合落子。
3.3 雙人游戲
從游戲開(kāi)始到結(jié)束,客戶端與服務(wù)器的交互過(guò)程如圖6所示。

3.3.1 服務(wù)器端程序
創(chuàng)建基于對(duì)話框的MFC工程。
在App類的BOOL InitInstance()中加載套接字庫(kù):AfxSocketInit();
在Dlg類的BOOL OnInitDialog()中初始化套接字,包括新建和綁定套接字:socket()、bind();
在對(duì)話框上畫(huà)兩個(gè)按鈕控件:“連接用戶”和“開(kāi)始游戲”。
評(píng)論