2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  畢業(yè)設計說明書</b></p><p> 學生姓名學 號</p><p> 學院 計算機科學與技術學院</p><p> 專 業(yè)軟件工程</p><p> 題 目基于MFC的</p><p> 對戰(zhàn)象棋設計與實現(xiàn)</p><p><b

2、>  畢業(yè)論文獨創(chuàng)性聲明</b></p><p><b>  本人鄭重聲明:</b></p><p>  本論文是我個人在導師指導下進行的研究工作及取得的研究成果。本論文除引文外所有實驗、數(shù)據(jù)和有關材料均是真實的。盡我所知,除了文中特別加以標注和致謝的地方外,論文中不包含其他人已經(jīng)發(fā)表或撰寫過的研究成果。其他同志對本研究所做的任何貢獻均已在論文中作了

3、明確的說明并表示了謝意。</p><p>  作者簽名: </p><p>  日 期: </p><p>  摘 要:中國象棋是我國歷史悠久的智力對戰(zhàn)游戲,發(fā)展至今已有數(shù)千年的歷史,是中華民族智慧的結(jié)晶。然而,傳統(tǒng)象棋存在著棋盤單一、棋子收拾繁瑣、下棋場地單一、無法及時找到對弈玩家?guī)状蟊锥?。隨著計算機技術的發(fā)展

4、,電子版象棋游戲的誕生,很好的解決了這些問題。</p><p>  本設計正是開發(fā)這樣一款電子象棋游戲,它采用MFC文檔視圖體系結(jié)構和Visual C++開發(fā)工具,實現(xiàn)了具有背景棋盤和棋子種類的變換,走棋,悔棋,還原和網(wǎng)絡對弈功能。本設計還進行了畫面閃爍消除,視覺效果更加人性化,且鼠標操作,簡單易用,無須安裝,即開即用。 </p><p>  關鍵詞:中國象棋,MFC文檔視圖,V

5、isual C++,網(wǎng)絡對弈,消除閃爍,即開即用</p><p>  Abstract:Chinese Chess is our long history of intellectual battle game, the development has several thousand years of history, is the crystallization of the wisdom of the Ch

6、inese nation. However, the traditional chess there is a single board, the pieces pack cumbersome, chess venues single, not been able to find several major drawbacks of the chess players. With the development of computer

7、technology, the electronic version of the birth of a chess game, a good solution to these problems.</p><p>  The design is the development of an electronic chess game, which uses MFC document view architectu

8、re and Visual C + + development tools, background board and pieces kind of transformation, playing chess, undo, restore, and network chess function. This design also flickering eliminate, visual effects, more human, mous

9、e operation, easy to use, no need to install.</p><p>  Keywords:Chinese chess, MFC document view, Visual C++, network game, eliminate flicker, instant available</p><p><b>  目 錄</b>

10、</p><p><b>  1 緒論4</b></p><p>  1.1 課題背景4</p><p>  1.2 象棋簡介4</p><p>  1.3 MFC及相關技術4</p><p><b>  2 概要設計4</b></p>&l

11、t;p>  2.1 設計思路分析4</p><p>  2.2 主要功能4</p><p>  2.3 軟件信息4</p><p>  2.4 流程圖4</p><p>  3 程序詳細設計說明4</p><p>  3.1 界面設計4</p><p>  3.2

12、 數(shù)據(jù)結(jié)構4</p><p>  3.3 棋子走法4</p><p>  3.3.1 車4</p><p>  3.3.2 馬4</p><p>  3.3.3 相(象)4</p><p>  3.3.4 仕(士)4</p><p>  3.3.5 帥(將)4</

13、p><p>  3.3.6 炮(砲)4</p><p>  3.3.7 兵(卒)4</p><p><b>  3.4 功能4</b></p><p>  3.4.1 走棋4</p><p>  3.4.2 悔棋4</p><p>  3.4.3 還原4

14、</p><p>  3.4.4 認輸4</p><p>  3.4.5 擺棋4</p><p><b>  3.5 網(wǎng)絡4</b></p><p>  3.6 關鍵技術4</p><p>  3.6.1 遮罩技術4</p><p>  3.6.2 雙緩沖

15、技術4</p><p>  4 總結(jié)和進一步的研究工作4</p><p><b>  結(jié)束語4</b></p><p><b>  參 考 文 獻4</b></p><p><b>  致 謝4</b></p><p><b> 

16、 1 緒論</b></p><p><b>  1.1 課題背景</b></p><p>  隨著時代的進步,電子技術日新月異的發(fā)展,單純的戶外實體游戲已經(jīng)無法滿足人們的需求,于是電子游戲誕生了,它創(chuàng)造出的虛擬游戲環(huán)境,幫助人們擺脫實體的束縛,更增添了游戲的趣味性。計算機的發(fā)明,無疑使電子游戲又多了一個新的載體,帶動其不斷地創(chuàng)新、發(fā)展。電腦游戲行業(yè)經(jīng)過

17、二十余年的發(fā)展,已成為與音樂、影視等并駕齊驅(qū)的全球最重要娛樂行業(yè)之一。</p><p>  時下,與角色扮演類、即時戰(zhàn)略類游戲相比,棋牌類游戲這種上手快、游戲時間短的傳統(tǒng)游戲方式,仍在廣大群眾中占有舉足輕重的地位。其中方便、快捷、操作簡單的棋類游戲,更是占主要位置。</p><p>  作為中華民族悠久文化的代表之一,中國象棋不僅源遠流長,而且基礎廣泛,作為一項智力運動,中國象棋開始走向世

18、界。為了方便其更好的推廣,并且為了擺脫傳統(tǒng)棋盤、棋子、場地的束縛,網(wǎng)絡版象棋備受青睞,這也是本款象棋游戲開發(fā)的意義所在。相信未來幾年,象棋這一中國國粹在各個領域?qū)⒌靡酝茝V,產(chǎn)生巨大影響。 </p><p><b>  1.2 象棋簡介</b></p><p>  中國象棋歷史悠久?!冻o ? 招魂》中有“蓖蔽象棋,有六簿些;分曹并進,遒相迫些;成梟而牟,呼五白些。”

19、?!墩f苑》載:雍門子周以琴見 孟嘗 君,說:“足下千乘之君也, …… 燕則斗象棋而舞鄭女。”由此可見,遠在戰(zhàn)國時代,象棋已在貴族階層中流行開來了。</p><p>  象棋屬于二人對抗性游戲的一種,暗棋閣也是其中一種傳統(tǒng)玩法,由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動。象棋是我國正式開展的78個體育運動項目之一,為促進該項目在世界范圍內(nèi)的普及和推廣,已將“中國象棋”項目名稱更改為“象棋”。此外,高材質(zhì)的象

20、棋也具有收藏價值,如:高檔木材、玉石等為材料的象棋。更有文人墨客為象棋譜寫了詩篇,使象棋更具有一種文化色彩。</p><p>  1.2.1 象棋棋盤</p><p>  棋子活動的場所,叫作“棋盤”。在長方形的平面上,共有九條平行的豎線和十條平行的橫線,共有九十個交叉點。</p><p>  棋盤兩端的中間,也就是第四條到第六條豎線之間的正方形部位,有斜交叉線“

21、米”字方格的地方,叫作“九宮”,象征著中軍帳,是將和帥的駐扎地。 </p><p>  整個棋盤以“楚河●漢界”分為相等的兩部分。為了比賽記錄和學習棋譜的統(tǒng)一,現(xiàn)在規(guī)則規(guī)定:從右至左的九條豎線,用中文數(shù)字一至九來表示紅方,用阿拉伯數(shù)字1至9來表示黑方。己方的棋子始終使用己方的線路編號,無論棋子是否“過河”。 </p><p>  1.2.2 象棋棋子</p><p&

22、gt;  象棋是一種雙方對弈的競技項目。棋子共有紅黑16個,共32個棋子。</p><p>  棋子種類說明如下表1-1:</p><p><b>  表1-1 棋子種類</b></p><p>  將與帥;士與仕;象與相;卒與兵的功能實際上完全相同,僅是為了區(qū)分黑紅雙方。</p><p>  帥(將)是棋中的首腦,也是

23、戰(zhàn)術核心。它只能在本方九宮之內(nèi)活動,可上下左右沿著橫線或者豎線移動一格。帥與將不能在同一直線上直接對面,否則走方判負。這個也就是判定函數(shù)ShuaiCanTo()實現(xiàn)的功能的依據(jù)。 </p><p>  仕(士)是將(帥)的貼身保鏢,主要任務是防守,它也只能在九宮內(nèi)走動,且只能斜走,不先后左右移動。</p><p>  相(象)的主要作用也是防守,保護自己的帥(將)。它的走法是每次沿對角線走

24、兩格,俗稱“象飛田”。相(象)的活動范圍限于河界以內(nèi)的本方陣地,不能過河,實際是7個特殊棋位,且若它走的田字中央有一個棋子,不管是對方還是本方棋子,都不能走,俗稱“塞象眼”。 </p><p>  車在象棋中威力最猛,只要起始位置和目的位置中間沒有其他棋子,它就可以到達它橫豎線所在的任何地方。俗稱“一車十子寒”。 </p><p>  炮不吃子時,移動走法與車完全一樣。但當吃子時,它和目標

25、棋子中間必須有一個且僅此一個棋子(無論己方或?qū)Ψ狡遄樱?。炮是象棋里面唯一一個可以越子的棋種,威力也很大。 </p><p>  馬是先直后斜,即先直著走一格,然后再斜著走一個對角線,俗稱“馬走日”。馬一個可到周圍八個點,故有“八面威風”之說。但如果在要去的方向的第一步有別的棋子擋住,馬就無法走過去,俗稱“蹩馬腿”和“塞象眼”類似。 </p><p>  兵(卒)不能后退且只能一步一步走,未

26、過河前,只能向前。過河以后,允許左右移動。雖過河后只能一步一步走,但兵(卒)的威力也大大增強,故有“過河的卒子頂半個車”之說。 </p><p>  1.2.3 術語[8]</p><p>  (1) “馬走日字,象飛田.車走直路,炮翻山.士走斜路護將邊.小卒子一去不回還. 車走直路馬踏斜,相飛田子炮打隔,卒子過河了不得。”</p><p> ?。?)“馬后炮”:

27、泛指炮在馬后,以馬限制對方將帥的退路,兼以炮向?qū)Ψ浇袑ⅰ?</p><p> ?。?)“天地炮”:一炮從中路牽制對方中士中象,另一炮從底線牽制對方底士底象。 </p><p> ?。?)“鐵門栓”:以炮鎮(zhèn)中路限制對方士象的活動,兼以車或兵(卒)守著對方的將(帥)門。 </p><p> ?。?)“夾車炮”:車炮或車雙炮前后互相配合的一種戰(zhàn)術。 </p>

28、<p> ?。?)“炮碾丹沙”:車炮在底線成將, 從而殺去障礙 (主要是士象)成殺勢。 </p><p> ?。?)“車炮抽殺”:泛指炮在車后時,一面跳炮吃子,一面露車叫將,令對方顧此失彼的一種戰(zhàn)術。 </p><p> ?。?)“海底撈月”:車炮或車兵在對方底線逼使對方將帥離開中路的一種戰(zhàn)術。 </p><p> ?。?)“兩頭蛇”:把三路兵和七路兵挺

29、起的陣式。 </p><p>  1.3 MFC及相關技術</p><p>  MFC:微軟基礎類(Microsoft Foundation Classes),C++是一種應用程序框架,隨微軟Visual C++開發(fā)工具一起發(fā)布。該類庫提供一組通用的可重用的類庫供開發(fā)人員使用,大部分類均從CObject 直接或間接派生,只有少部分類例外。</p><p>  MF

30、C應用程序的總體結(jié)構通常由開發(fā)人員從MFC類派生的幾個類和一個CWinApp類對象(應用程序?qū)ο螅┙M成。MFC 提供了MFC AppWizard 自動生成框架。</p><p>  Windows 應用程序中,MFC 的主包含文件為"Afxwin.h"。</p><p>  此外MFC的部分類為MFC/ATL 通用,可以在Win32 應用程序中單獨包含并使用這些類。&l

31、t;/p><p>  1.3.1 單文檔程序</p><p>  1.應用類及全局對象(CChess_mApp)</p><p>  應用類封裝了Windows應用的初始化,運行以及終止的全過程。對于每一個基于框架的應用,它必須有一個且只能有一個派生于CWinApp的類對象。這個對象是全局對象,因此它在創(chuàng)建任何窗口前首先被構造。類CWinApp提供了幾個關鍵的可重載的

32、虛成員函數(shù),他們是InitInstance,Run,ExitInstance以及OnIdle等。而且,在程序中可以隨時調(diào)用全局函數(shù)AfxGetApp,以便獲得CWinApp類對象的指針。</p><p>  2.文檔類(CChess_mDoc)</p><p>  文檔類實際上是一種數(shù)據(jù)結(jié)構,該類實現(xiàn)了對這種結(jié)構的封裝以利于管理,通常,它不但包含應用中所需的數(shù)據(jù),而且也包含了處理這些數(shù)據(jù)的

33、方法,另外,文檔類還可以為應用提供與其存儲的數(shù)據(jù)相關的服務。</p><p>  3.視圖類(CChess_mView)</p><p>  該類占有框架窗口的客戶區(qū),主要負責顯示文檔數(shù)據(jù),也為文檔對象和用戶之間提供了用以交互的可視接口,另外,也完成了與文檔打印相關的操作,通常,一般的繪制操作都是在該類中完成,因此有時也稱視圖類窗口為“繪制窗口”。</p><p>

34、  4.框架類(CMainFrame)</p><p>  框架類表示應用程序的主框架窗口,其主要作用是響應標準的窗口消息,不過,它通常先將消息按照一定的次序傳遞給視圖類以及文檔類等其他命令處理類,另外,它還為視圖類提供可視化的邊框,同時也包括標題欄,一些標準的窗口組件等。</p><p>  5.“關于”對話框類(CAboutDlg)</p><p>  該類封裝

35、了用于顯示軟件版本,版權等相關信息的“關于”對話框,通常不需要對它進行任何的編程。而只需要使用對話框資源編輯器對對話框模板進行簡單的編輯即可。</p><p>  1.3.2 GDI繪圖</p><p>  GDI是Graphics Device Interface的縮寫,含義是圖形設備接口,它的主要任務是負責系統(tǒng)與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。</

36、p><p>  在Windows操作系統(tǒng)下,絕大多數(shù)具備圖形的的應用程序都離不開GDI,他們利用GDI所提供的眾多函數(shù)可以方便地在屏幕,打印機及其他輸出設備上輸出圖形、文本等。GDI的出現(xiàn)時程序員無需關心硬件設備及設備驅(qū)動,就可以將應用程序的輸出轉(zhuǎn)化為硬件設備上的輸出。這實現(xiàn)了程序開發(fā)者與硬件設備的隔離,大大方便了開發(fā)工作。</p><p>  想要在屏幕或者其他輸出設備上輸出圖形或者文字,就

37、必須先獲得一個稱為設備描述表(DC:Device Context)的對象的句柄,以它為參考,調(diào)用各種GDI函數(shù)來實現(xiàn)各種文字或圖形的輸出。</p><p>  設備描述表是GDI內(nèi)部保存數(shù)據(jù)的一種數(shù)據(jù)結(jié)構,此結(jié)構中的屬性內(nèi)容與特定的輸出設備(顯示器、打印機等)相關,屬性定義了GDI函數(shù)的工作細節(jié)。屬性包括文字的顏色及x坐標和y坐標映射到窗體顯示區(qū)域的方式等。</p><p>  一旦獲得設

38、備描述表的句柄,系統(tǒng)就是使用默認的屬性值填充設備描述表結(jié)構。</p><p>  如果有必要,可以使用一些GDI函數(shù)獲得和改變設備描述表中的屬性值。</p><p>  繪圖結(jié)束后必須釋放設備描述表句柄。</p><p>  GDI函數(shù)大致可分類為:</p><p>  設備上下文函數(shù)(如GetDC、CreateDC、DeleteDC)、 畫

39、線函數(shù)(如LineTo、Polyline、Arc)、填充畫圖函數(shù)(如Ellipse、FillRect、Pie)、畫圖屬性函數(shù)(如SetBkColor、SetBkMode、SetTextColor)、文本、字體函數(shù)(如TextOut、GetFontData)、位圖函數(shù)(如SetPixel、BitBlt、StretchBlt)、坐標函數(shù)(如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen)、映射函數(shù)(如

40、SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函數(shù)(如PlayMetaFile、SetWinMetaFileBits)、區(qū)域函數(shù)(如FillRgn、FrameRgn、InvertRgn)、路徑函數(shù)(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函數(shù)(如SelectClipRgn、SelectClipPath)等。</p><p> 

41、 1.3.3 消息機制</p><p>  MFC傳輸?shù)南⒂腥N類型:命令消息,控件通知和窗口消息。</p><p>  命令消息一般與用戶請求有關,當用戶單擊一個菜單項時,命令消息產(chǎn)生,并發(fā)送給能處理這個消息的類對象(如編輯文本等)。</p><p>  控件消息在某些重要事件發(fā)送時,由控件窗口發(fā)送給父窗體處理,如打開一個對話框。</p><

42、;p>  窗口消息(Window Message)一般與窗口的內(nèi)部運作有關,如創(chuàng)建窗口消息W M PA I N T和繪制窗口W M C R E AT E等。通常,消息是從系統(tǒng)發(fā)送到窗口,或從窗口發(fā)送到窗口。每個窗口使用窗口進程來處理發(fā)送給它的消息。系統(tǒng)或應用程序有兩種傳輸消息的方法:發(fā)送消息或寄送消息。</p><p>  鼠標和鍵盤消息一般是寄送消息,而所有其他消息通常都是發(fā)送消息。發(fā)送消息時,直接調(diào)用窗

43、口的窗口進程,通信是即時的,直到窗口進程為調(diào)用函數(shù)返回一個結(jié)果時,應用程序才能繼續(xù)。寄送消息時,把消息發(fā)送到擁有那個窗口的應用程序的消息隊列中。當應用程序空閑時,它會搜索消息隊列,并處理優(yōu)先級較高的消息,然后從隊列中刪除它,并把處理結(jié)果發(fā)送給既定窗口。所以通信可能延遲。在消息隊列中,寄送的消息接受特殊的鼠標和鍵盤處理。通常,應該盡量發(fā)送一個消息,除非想把動作延遲到所有鼠標和鍵盤消息被處理之后。</p><p>&

44、lt;b>  2 概要設計</b></p><p>  2.1 設計思路分析</p><p>  本程序采用MVC模式,將棋子信息與顯示分離,統(tǒng)一由control控制。棋盤用9*10的數(shù)組map存儲(0~13表示各個棋子,14表為空),存儲用于判斷當前位置為何棋子或者空。32個棋子由一個統(tǒng)一的棋子型CChess數(shù)組存儲,統(tǒng)一管理顯示。每個棋子包含了自身的type,na

45、me,及其在棋盤中的位置x,y。</p><p>  棋子走法是利用鼠標的消息處理函數(shù),獲得棋子種類,當前坐標和下一步坐標,共五個信息,再利用規(guī)定的CanGoTo()函數(shù)判斷能否到達。若能到達,則把當前棋子的坐標改為下一步坐標,并把棋盤中當前位置的map改為空,即表示無棋子。如果下一步坐標的位置上有棋子,則將該棋子的type改為15,這樣繪圖時就不會顯示該棋子的位圖。</p><p>  

46、因為棋子位圖周圍有白色邊框,通過“遮罩技術”可以消除邊框,實現(xiàn)棋子透明覆在棋盤上,更具美感。</p><p>  利用“內(nèi)存DC雙緩沖技術”消除閃爍,將棋盤和棋子信息一次性顯示,并實現(xiàn)棋子黏在鼠標上,動態(tài)移動。</p><p>  網(wǎng)絡部分,繼承MFC中的CAsyncSocket和CSocket進行開發(fā)。Socket編程分為兩種:面向連接協(xié)議網(wǎng)絡通信編程和面向無連接的網(wǎng)絡通信編程。本設計采

47、用連接協(xié)議的Socket編程模型,保證網(wǎng)絡上傳輸?shù)臄?shù)據(jù)及時、正確的到達。</p><p><b>  2.2 主要功能</b></p><p>  通過計算機的鼠標鍵盤操作操作界面,必須按照象棋的規(guī)則進行對弈,如果在對弈過程中,一方出招錯誤,電腦會予以簡單提示,并無視錯誤操作。對弈過程中只能按照電腦預訂順序,即紅先黑后的順序依次出招,指導一方勝出,電腦顯示哪方勝出為

48、止。 </p><p>  可以采用鼠標操作進行對弈;</p><p>  可以實現(xiàn)走棋、悔棋、還原、認輸功能;</p><p>  可以滿足兩人局域網(wǎng)內(nèi)對弈;</p><p>  可以在任意時間重新開始游戲;</p><p>  可以進行簡單錯誤判斷,并直接返回到前一步棋子狀態(tài);</p><p

49、>  可以進行背景棋盤和棋子種類的變換;</p><p>  可以實現(xiàn)自由設置棋譜(怪棋);</p><p>  可以實現(xiàn)棋子黏在鼠標上移動,增加美感</p><p><b>  2.3 軟件信息</b></p><p>  軟件名稱:基于MFC的局域網(wǎng)內(nèi)對戰(zhàn)象棋設計與實現(xiàn)</p><p>

50、;  開發(fā)平臺:Microsoft Visual C++ 6.0</p><p><b>  用戶:象棋愛好者</b></p><p>  本設計在各個方面均具有可行性,方便易用,無需安裝即可使用</p><p><b>  2.4 流程圖</b></p><p> ?。?)游戲交互圖,如圖2-1

51、所示</p><p>  圖2-1 游戲交互圖</p><p><b>  (2)程序流程圖</b></p><p>  首先,選擇是否建立主機,否則為客戶機。若建立主機,則建立一個端口,用于和客戶機的交互連接,然后等待知道有客戶機連上。客戶機建立,則選擇主機的ip地址和端口。游戲雙方先后點擊開始,開始游戲。紅方、黑方在到自己狀態(tài)時,可以移動自

52、己的棋子,悔棋,還原,認輸?shù)鹊?。走棋,點擊鼠標左鍵選中棋子,移動,放到想到達的地方,系統(tǒng)調(diào)用CanGoTo函數(shù),判斷是否可到,若可到,則棋子放到目的地,否則返回棋子原來的地方能夠。走棋成功后,發(fā)送消息給對方,對方接收消息后,進行相應的操作。進行若干步之后,若帥或者將被吃掉,則判定勝負。</p><p>  具體流程,見圖2-2程序流程圖。</p><p><b>  圖2-2程序

53、流程圖</b></p><p>  3 程序詳細設計說明</p><p><b>  3.1 界面設計</b></p><p>  本程序界面簡單明了,包括棋盤顯示,listbox,開始、悔棋、還原、認輸四個按鈕,還有用于聊天的edit和發(fā)送按鈕。菜單欄包括文件,控制,背景,幫助。</p><p>  其

54、中l(wèi)istbox 是記錄每步棋子走棋的信息和聊天信息,也是實現(xiàn)悔棋功能的一個重要存儲器。它是一個棧,可以記錄,刪除,提取每步棋子的信息?;谄宀僮骺梢詮闹械玫较鄳臄?shù)據(jù)來實現(xiàn)悔棋功能。文件內(nèi)有新游戲、擺棋操作,控制內(nèi)有悔棋、還原、認輸操作,背景內(nèi)有棋盤和棋子的切換操作。</p><p>  主界面,如圖3-1所示</p><p><b>  圖3-1 主界面</b>&l

55、t;/p><p>  3.1.1 棋盤、棋子的位圖載入與切換</p><p>  (1)棋盤、棋子的位圖載入</p><p>  本設計實現(xiàn)了棋盤和棋子的自由無限制轉(zhuǎn)換,采用了外部圖片載入的方式,加載的位圖,棋盤棋子一起加載,沒有自己繁瑣的自繪棋盤棋子過程。</p><p>  本設計有6種棋盤,3種棋子可以搭配。若程序在開始時就全部加載,會浪

56、費大量內(nèi)存,因為游戲過程中只需要一副棋盤棋子,且不利于更多棋盤和棋子種類的更新,也不利于后期維護。故本程序采用外部圖片載入的方式,載入棋盤棋子,每次切換調(diào)用SetBoardandPiece(CString strBoard , CString strPiece)重新對棋盤棋子的位圖進行賦值。</p><p>  strBoard,strPiece代表棋盤,棋子的存放文件夾相對物理地址。</p>&l

57、t;p>  HBITMAP CChess_mView::LoadFileBmp(CString filePath)</p><p><b>  {</b></p><p>  Return(HBITMAP)LoadImage(AfxGetInstanceHandle(),filePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);<

58、;/p><p><b>  }</b></p><p>  void CChess_mView::SetBoardandPiece(CString strBoard, CString strPiece )</p><p><b>  {</b></p><p>  //0紅兵 1紅袍 2紅車 3紅馬 4

59、紅相 5紅士 6紅帥 7黑兵8 黑袍 9黑車10黑馬11黑象12黑士13黑將 大于13不是棋子</p><p>  ChessList[13] = LoadFileBmp(strPiece + "BK.BMP");</p><p>  ChessList[12] = LoadFileBmp(strPiece + "BA.BMP");</p>

60、;<p>  ChessList[11] = LoadFileBmp(strPiece + "BB.BMP");</p><p>  ChessList[10] = LoadFileBmp(strPiece + "BN.BMP");</p><p>  ChessList[9] = LoadFileBmp(strPiece + &quo

61、t;BR.BMP");</p><p>  ChessList[8] = LoadFileBmp(strPiece + "BC.BMP");</p><p>  ChessList[7] = LoadFileBmp(strPiece + "BP.BMP");</p><p>  ChessList[6] = Load

62、FileBmp(strPiece + "RK.BMP");</p><p>  ChessList[5] = LoadFileBmp(strPiece + "RA.BMP");</p><p>  ChessList[4] = LoadFileBmp(strPiece + "RB.BMP");</p><p&g

63、t;  ChessList[3] = LoadFileBmp(strPiece + "RN.BMP");</p><p>  ChessList[2] = LoadFileBmp(strPiece + "RR.BMP");</p><p>  ChessList[1] = LoadFileBmp(strPiece + "RC.BMP&quo

64、t;);</p><p>  ChessList[0] = LoadFileBmp(strPiece + "RP.BMP");</p><p>  ChessList[14] = LoadFileBmp(strPiece + "SEL.BMP");//光標位圖</p><p>  ChessList[15] = LoadFil

65、eBmp(strBoard); </p><p>  ChessList[16] = LoadFileBmp(strPiece + "mask.bmp"); //用于遮罩技術(見關鍵技術)</p><p><b>  }</b></p><p> ?。?)棋盤、棋子的切換</p><p

66、>  當點擊菜單欄背景的棋盤或者棋子,可以選擇不同的棋盤和棋子。減少玩家的視覺審美疲勞。每按一個按鈕,其實是改變了存放棋盤或棋子的函數(shù)SetBoardandPiece(CString strBoard , CString strPiece)中的strBoard 或strPiece,即棋譜棋子的存放文件夾相對物理地址,完成了棋盤棋子的種類切換,并用Invalidate(FALSE)及時更新顯示。</p><p&g

67、t;  例如點擊棋盤的水滴棋盤</p><p>  void CChess_mView::OnDrop() </p><p><b>  {</b></p><p>  m_strBoard = "res\\images\\drops.bmp";</p><p>  SetBoardandPiece(

68、"res\\images\\drops.bmp",m_strPiece);</p><p>  Invalidate(FALSE);</p><p><b>  }</b></p><p>  運行圖,如圖3-1所示:</p><p>  圖3-2 棋盤、棋子的切換</p><p&

69、gt;  3.1.2 光標生成</p><p>  雙方局域網(wǎng)內(nèi)對戰(zhàn),消息傳遞過來,執(zhí)行操作了,但是我不能馬上知道對方動了哪個棋子;可能已經(jīng)動了,但是我不知道,浪費時間。</p><p>  光標的生成,可以起到提醒對方我已經(jīng)走過棋了,也利于在我方還沒有出招之前始終知道對方的上一步是怎么走的,只有在我方出招之后對方的操作痕跡才可能被銷毀,這樣的設計增強了棋譜的可讀性,也減輕了玩家的記憶負

70、擔。</p><p>  光標在棋盤載入的時候就一起載入了ChessList[14] = LoadFileBmp(strPiece + "SEL.BMP");</p><p>  在選中棋子時,即鼠標左鍵按下后,鼠標move的時候就把光標位圖貼到選中子的周圍,鼠標up再把位圖貼到up的位置上。</p><p>  具體代碼見鼠標的消息處理函數(shù),O

71、nLButtonDown(),OnMouseMove(),OnLButtonUp()</p><p>  運行結(jié)果,如圖3-2所示:</p><p><b>  圖3-3 光標生成</b></p><p><b>  3.2 數(shù)據(jù)結(jié)構</b></p><p>  本設計主要包含CChess,CCh

72、ess_mView,Cmanager,CNet,CNetControl四個類。</p><p>  CNet,CNetControl兩個類用于網(wǎng)絡部分,后面網(wǎng)絡功能部分再詳解。</p><p> ?。?)CChess類是棋子類,存儲了棋子的相關屬性信息。</p><p>  class CChess </p><p><b>  

73、{</b></p><p><b>  public:</b></p><p>  int type;//0紅兵 1紅袍 2紅車 3紅馬 4紅相 5紅士 6紅帥 7黑兵8 黑袍 9黑車10黑馬11黑象12黑士13黑將 大于13不是棋子</p><p>  CString name;</p><p><b

74、>  int x;</b></p><p><b>  int y;</b></p><p><b>  };</b></p><p>  Type即棋子的類別用于判定屬于哪種棋子。name棋子的名字,例如“炮”。x,y是棋子在邏輯坐標軸上的坐標。</p><p> ?。?)Cma

75、nager類是棋子控制類,是游戲內(nèi)核。</p><p>  class CManager </p><p><b>  {</b></p><p><b>  public:</b></p><p>  CChess nChessinfo[32];//記錄32個棋子的信息</p>&

76、lt;p>  int map[9][10];//記錄棋盤上的信息</p><p>  int PlayerAc;//用來判斷是哪個棋手</p><p>  void InitData();//數(shù)據(jù)初始化</p><p>  int m_State;// 游戲狀態(tài) -1、游戲等待中,等待開始 0、游戲中 紅方走棋 1、游戲中 黑方走棋</p>

77、<p>  int top; //記錄游戲步數(shù)</p><p>  int Marry[500][8]; //記錄 前一個的標號,type,x,y 后一個的標號,type,x,y 共八個信息</p><p>  int MarryTop; //記錄游戲步數(shù),為了還原時能夠判斷</p><p>  int count;//記錄listb

78、ox的步數(shù) 包括游戲步奏和聊天記錄</p><p><b>  public:</b></p><p>  int Search(int x,int y);//找是第幾顆棋子 共32顆(0~31),若不存在棋子,返回32</p><p>  bool CanGoTo(int Old_Point_x,int Old_Point_y,int Now

79、_Point_x,int Now_Point_y,int chesstype);//判斷棋子能否到達,是每個棋子的走法判斷</p><p>  bool ShuaiCanGoTo(int Old_Point_x,int Old_Point_y,int Now_Point_x,int Now_Point_y,int chesstype); //是關于將帥問題的能否到達判斷,將帥不共線 </p><

80、;p><b>  };</b></p><p> ?。?)CChess_mView 類是程序的顯示類,也包含少部分的棋子控制操作功能和很多消息響應函數(shù),由于篇幅問題沒有全部顯示。</p><p>  class CChess_mView : public CView</p><p><b>  {</b></p

81、><p>  protected:CChess_mView();</p><p>  DECLARE_DYNCREATE(CChess_mView)</p><p>  // Attributes</p><p><b>  public:</b></p><p>  CChess_mDoc* Ge

82、tDocument();</p><p>  CNetControl *m_pControl; //網(wǎng)絡控制顯示</p><p>  int choosed;//記錄前一個棋子是第幾個棋子</p><p>  int OldType;//記錄前一個棋子的類型</p><p>  int OldX;//記錄前一個棋子的橫坐標</p

83、><p>  int OldY;//記錄前一個棋子的縱坐標</p><p><b>  ///用于右鍵功能</b></p><p>  int Rchoosed;//記錄當前一個棋子是第幾個棋子 </p><p>  int ROldX;//記錄前一個棋子的橫坐標</p><p>  int

84、 ROldY;//記錄前一個棋子的縱坐標</p><p><b>  //變量定義</b></p><p>  HBITMAP ChessList[17];//位圖數(shù)組</p><p>  CString m_strPiece;//棋子根目錄</p><p>  CString m_strBoard;//棋盤根目錄

85、</p><p>  int m_nBoardIndex,m_nPieceIndex; //背景設置選擇</p><p>  //定義畫圖用CDC</p><p>  CDC Background;//背景句柄</p><p>  CDC ChessAll; //最終刷新句柄</p><p>  CDC Buffe

86、r;//緩沖句柄 用于雙緩沖</p><p>  CListBox m_listbox; //用于記錄每步棋子走棋的信息和聊天信息</p><p>  CButton m_ok; //開始按鈕</p><p>  CButton m_goback; //悔棋按鈕</p><p>  CButton m_huanyuan; //還原按鈕<

87、/p><p>  CButton m_renshu; //認輸按鈕</p><p>  CButton m_send;//聊天發(fā)送按鈕</p><p>  CEdit m_edit;//用于聊天的edit</p><p>  int down_move;//用于鼠標按下時的控制</p><p>  int move_up;

88、 //用于鼠標彈上時的控制</p><p>  int goback_huanyuan; //用于只有在有悔棋額情況下才能還原的控制</p><p>  // Operations</p><p><b>  public:</b></p><p>  void OnOk();//開始</p><p&

89、gt;  void OnGoBack();//悔棋</p><p>  void OnHuanYuan();//還原</p><p>  void OnRenShu();//認輸</p><p>  void OnSend();//發(fā)送聊天信息</p><p><b>  //函數(shù)定義</b></p>&l

90、t;p>  void InitData();//初始化</p><p>  void NewGame();//新游戲</p><p>  void TextOutTop();//提示現(xiàn)在出牌</p><p>  void PrintAll(); //把界面存儲于buffer中</p><p>  void P

91、rintAllMsg(); //用于網(wǎng)絡刷新和整體刷新</p><p>  void PrintAllDMsg();//用于網(wǎng)絡動棋子的時候整體刷新</p><p>  HBITMAP LoadFileBmp(CString filePath); //載入位圖</p><p>  void SetBoardandPiece(CString strBoard,CStr

92、ing strPiece);//給棋盤棋子賦值</p><p>  // Overrides</p><p>  // ClassWizard generated virtual function overrides</p><p>  //{{AFX_VIRTUAL(CChess_mView)</p><p><b>  publ

93、ic:</b></p><p>  virtual void OnDraw(CDC* pDC); // overridden to draw this view</p><p>  virtual BOOL PreCreateWindow(CREATESTRUCT& cs);</p><p>  protected:</p>&l

94、t;p>  virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);</p><p>  virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);</p><p>  virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);&

95、lt;/p><p>  //}}AFX_VIRTUAL</p><p>  // Implementation</p><p><b>  public:</b></p><p>  virtual ~CChess_mView();</p><p>  #ifdef _DEBUG</p>

96、<p>  virtual void AssertValid() const;</p><p>  virtual void Dump(CDumpContext& dc) const;</p><p><b>  #endif</b></p><p>  protected:</p><p>  //

97、{{AFX_MSG(CChess_mView)</p><p>  …………….(省略)</p><p>  //}}AFX_MSG</p><p>  DECLARE_MESSAGE_MAP()</p><p><b>  };</b></p><p><b>  3.3 棋子走法&

98、lt;/b></p><p>  棋子走棋規(guī)則在“1.2.2 象棋棋子”已有介紹,這里不再累述。</p><p>  這里主要介紹各個棋子的程序具體實現(xiàn)。具體見CanGoTo(int Old_Point_x,int Old_Point_y,int Now_Point_x,int Now_Point_y,int chesstype)和ShuaiCanGoTo(int Old_Poin

99、t_x,int Old_Point_y,int Now_Point_x,int Now_Point_y,int chesstype)函數(shù)。</p><p>  首先,不管是什么棋子,都不能吃自己一方的棋子。</p><p>  if (map[Old_Point_x][Old_Point_y]/7==map[Now_Point_x][Now_Point_y]/7)</p>&

100、lt;p>  return false;</p><p><b>  3.3.1 車</b></p><p>  車只要中間沒有棋子阻礙,可以到達它橫豎線所在的任何地方。所以只需判斷始末位置為端點的線段上的棋子個數(shù),即判斷map[][]不為空的個數(shù)。若只有一個,則表示目標位置沒有棋子,可以直達。若有兩個,且目標位置不為空,則表示吃子,可達。</p>

101、<p><b>  //車</b></p><p>  if (9==chesstype||2==chesstype)</p><p><b>  {</b></p><p><b>  //同一行</b></p><p>  if (Old_Point_y==N

102、ow_Point_y)</p><p><b>  {</b></p><p>  int maxcol=(Old_Point_x>Now_Point_x)?Old_Point_x:Now_Point_x;</p><p>  int mincol=(Old_Point_x>Now_Point_x)?Now_Point_x:Old_

103、Point_x;</p><p><b>  int n=0;</b></p><p>  //判斷移動前后位置之間有無其他子</p><p>  for (int i=mincol;i<=maxcol;i++)</p><p><b>  {</b></p><p>

104、  if(14!=map[i][Old_Point_y])</p><p><b>  n++;</b></p><p><b>  }</b></p><p><b>  if(1==n)</b></p><p>  return true;</p><p

105、>  else if((2==n)&&(14!=map[Now_Point_x][Old_Point_y]))</p><p>  return true;</p><p>  else return false;</p><p><b>  }</b></p><p><b>  //同

106、一列</b></p><p><b>  else</b></p><p>  if (Old_Point_x==Now_Point_x)</p><p><b>  {</b></p><p>  int maxrow=(Old_Point_y>Now_Point_y)?Old_

107、Point_y:Now_Point_y;</p><p>  int minrow=(Old_Point_y>Now_Point_y)?Now_Point_y:Old_Point_y;</p><p><b>  int n=0;</b></p><p>  for(int i=minrow;i<=maxrow;i++)</p

108、><p><b>  {</b></p><p>  if(14!=map[Old_Point_x][i])</p><p><b>  n++;</b></p><p><b>  }</b></p><p><b>  if(1==n)<

109、/b></p><p>  return true;</p><p>  else if((2==n)&&(14!=map[Now_Point_x][Now_Point_y]))</p><p>  return true;</p><p>  else return false;</p><p>

110、;<b>  }</b></p><p><b>  }</b></p><p><b>  3.3.2 馬</b></p><p>  馬走日,所以要判斷始末位置的X和Y的差值的乘積是不是2或者-2。若是,則判斷有沒有蹩馬腿,即同側(cè)的第一個位置map[][]必須為空。 </p>&l

111、t;p><b>  //馬</b></p><p>  if (3==chesstype||10==chesstype)</p><p><b>  {</b></p><p>  int row=Now_Point_x-Old_Point_x;</p><p>  int col=Now_P

112、oint_y-Old_Point_y;</p><p><b>  //日字的范圍</b></p><p>  if((2!=row*col)&&(-2!=row*col))</p><p>  return false;</p><p>  //是否有同側(cè)的子堵塞</p><p>

113、;  if (-2==row)</p><p><b>  {</b></p><p>  if (14==map[Old_Point_x-1][Old_Point_y])</p><p>  return true;</p><p><b>  else </b></p><p

114、>  return false;</p><p><b>  }</b></p><p><b>  else</b></p><p>  if (2==row)</p><p><b>  {</b></p><p>  if(14==map[O

115、ld_Point_x+1][Old_Point_y])</p><p>  return true;</p><p><b>  else</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  e

116、lse</b></p><p>  if (-2==col)</p><p><b>  {</b></p><p>  if(14==map[Old_Point_x][Old_Point_y-1])</p><p>  return true;</p><p><b>  

117、else</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  else</b></p><p>  if (2==col)</p><p><b>  {</b><

118、/p><p>  if(14==map[Old_Point_x][Old_Point_y+1])</p><p>  return true;</p><p><b>  else</b></p><p>  return false;</p><p><b>  }</b>&l

119、t;/p><p>  else return false;</p><p><b>  } </b></p><p>  3.3.3 相(象)</p><p>  相和象活動范圍不同,所以要分開判斷。但相(象)的走法判斷和馬類似,都是先判斷差值,來確定田字范圍,再判斷有沒有塞象眼,即田字中間有沒有棋子。</p&g

120、t;<p><b>  //黑象</b></p><p>  if (11==chesstype)</p><p><b>  {</b></p><p>  if((Now_Point_y>=0)&&(Now_Point_y<=4))</p><p>&l

121、t;b>  {</b></p><p>  int row=Now_Point_x-Old_Point_x;</p><p>  int col=Now_Point_y-Old_Point_y;</p><p><b>  //田字范圍</b></p><p>  if ((-2==row)&&

122、amp;(-2==col)&&(14==map[Old_Point_x-1][Old_Point_y-1]))</p><p><b>  {</b></p><p>  return true;</p><p><b>  }</b></p><p><b>  else

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論