版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 基于VC的五子棋游戲軟件的設(shè)計與開發(fā)</p><p><b> 摘 要</b></p><p> 人工智能是近年來很活躍的研究領(lǐng)域之一,計算機博弈是人工智能研究的一個重要分支,它的研究為人工智能帶來了很多重要的方法和理論,產(chǎn)生了廣泛的社會影響和學術(shù)影響。五子棋本身就是一款益智休閑游戲,規(guī)則簡單。五子棋不僅能增強思維能力,提高智力,而且富含哲
2、理,有助于修身養(yǎng)性。</p><p> 本系統(tǒng)就以五子棋游戲作為研究課題,對五子棋的算法與規(guī)則做了研究,闡述了如何在 Microsoft Visual C++ 下用 API 函數(shù)來開發(fā)Windows下的游戲并給出了具體的實現(xiàn)。本系統(tǒng)以五子棋為例實現(xiàn)的主要功能有棋盤、棋子的輸出、人機對下等。本系統(tǒng)還有和棋、再來一盤、幫助等輔助功能。</p><p> 關(guān)鍵字:五子棋;Microsoft
3、Visual C++; API函數(shù)</p><p> The Design and Exploitation of Gobang Game with VC</p><p><b> Abstract</b></p><p> Artificial intelligence is one of the brisk research area
4、s. The chess game on computer is an important branch of the research on artificial intelligence. The researches on chess game bring plenty of important methods and theories for researching on artificial intelligence, and
5、 cause broad influences on society and academe. Gobang chess game means five pieces on one line, is a sort of game, which is full of wisdom, leisure and benefits, and the rules of it are very simple. </p><p>
6、; This paper focuses on the study of this chess game, and uses the Microsoft Visual C++ to explore the Window’s game. This system mainly uses the function of Visual C++/API to realize the export of chessboard and checke
7、r, and people can play with computer. Moreover, this system has the assistant functions such as “Deuce”、“ Play Again”、“ Help” and so on.</p><p> Key words: Gobang; Microsoft Visual C++; API Function</p&
8、gt;<p><b> 目 錄</b></p><p><b> 論文總頁數(shù):21頁</b></p><p><b> 1引言1</b></p><p> 2開發(fā)工具和應(yīng)用平臺1</p><p> 2.1Microsoft Visual C+
9、+ 的介紹1</p><p> 2.2Windows 編程的特點2</p><p> 3系統(tǒng)需求分析4</p><p> 3.1系統(tǒng)需求4</p><p> 3.2功能需求4</p><p> 3.3系統(tǒng)運行環(huán)境4</p><p> 4五子棋算法分析5<
10、;/p><p> 4.1五子棋的發(fā)展5</p><p> 4.2五子棋的規(guī)則6</p><p> 4.3具體算法分析7</p><p> 4.3.1 棋盤局勢狀態(tài)表示7</p><p> 4.3.2棋盤中下棋的順序表示7</p><p> 4.3.3具體算法7</
11、p><p><b> 5系統(tǒng)流程9</b></p><p> 6系統(tǒng)功能實現(xiàn)10</p><p> 6.1窗口設(shè)計10</p><p> 6.2棋盤設(shè)計11</p><p> 6.3按鈕功能的實現(xiàn)12</p><p> 6.4勝負判斷13&l
12、t;/p><p> 7系統(tǒng)測試與分析14</p><p> 7.1運行結(jié)果14</p><p> 7.2問題的發(fā)現(xiàn)與解決17</p><p><b> 結(jié) 論17</b></p><p><b> 參考文獻17</b></p><
13、;p><b> 致 謝19</b></p><p><b> 聲 明20</b></p><p><b> 附 錄21</b></p><p><b> 引言</b></p><p> 目前網(wǎng)絡(luò)上有很多五子棋子游戲,
14、玩法簡單,娛樂性也很高。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。通過對五子棋的設(shè)計與開發(fā),了解和掌握游戲開發(fā)的原理與方法。讓電腦像人腦一樣思考,一直是人工智能發(fā)展的最終目標。作為一門邊緣學科,它有諸多的研究領(lǐng)域,博弈即為其中之一。博弈的參加者可以是個人、集體、某種生物或機器,他們都力圖用自己的“智力”去擊敗對手。博弈為人工智能提供了一個極好的試驗場所,人工智能中的許多概念和方法都是從博弈程序中提煉出來的,人工智
15、能中大多以下棋為例來研究博弈規(guī)律。本文以五子棋為入口,設(shè)計了一個五子棋人機對弈系統(tǒng),以實現(xiàn)人和計算機的博弈,最終的目的是為了建立一個有具體規(guī)則的五子棋平臺。</p><p> 人機對弈程序的要點,至少應(yīng)具備以下4個部分:(1) 狀態(tài)表示:某種在機器中表示棋局的方法,能夠讓程序知道博弈的狀態(tài)。(2) 走法產(chǎn)生:產(chǎn)生合法走法的規(guī)則,以使博弈公正地進行,并可判斷對手是否亂走。(3)搜索技術(shù):從所有合法的走法中選擇最佳
16、的走法技術(shù)。(4) 對弈界面。</p><p> 本系統(tǒng)主要研究使用 Microsoft Visual C++ 以 Windows 窗體程序?qū)ξ遄悠逵螒蜻M行開發(fā)與設(shè)計,讓大家了解用 Microsoft Visual C++ 開發(fā)WINDOWS 小游戲的過程。</p><p><b> 開發(fā)工具和應(yīng)用平臺</b></p><p> Micr
17、osoft Visual C++ 的介紹</p><p> C 語言是一種高效率的計算機程序設(shè)計語言,而 Visual C++ 則是在它的基礎(chǔ)上開發(fā)出的一套功能強大的程序設(shè)計工具。對于游戲程序,Visual C++ 可以說是最佳的開發(fā)工具。第一, Visual C++ 具有優(yōu)異的運行速度。第二, Visual C++ 可以直接訪問內(nèi)存。</p><p> Visual C++ 自誕生以
18、來,一直是Windows環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一。Visual C++ 不僅是C++ 語言的集成開發(fā)環(huán)境,而且與 Win32 緊密相連,所以,利用Visual C++ 開發(fā)系統(tǒng)可以完成各種各樣的應(yīng)用程序的開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,Visual C++ 強大的調(diào)試功能也為大型復(fù)雜軟件的開發(fā)提供了有效的排錯手段。</p><p> Visual C++ 是一個很好的可視化編程工具,使用
19、 Visual C++ 環(huán)境來開發(fā)基于 Windows 的應(yīng)用程序大大縮短了開發(fā)時間,而且它的界面更友好,便于程序員操作。開發(fā)環(huán)境是程序員同 Visual C++ 的交互界面,通過它程序員可以訪問 C++ 源代碼編輯器、資源編輯器,使用內(nèi)部調(diào)試器,還可以創(chuàng)建項目文件。</p><p> 所謂 API 就是應(yīng)用程序編程接口(Application Programming Interface), Windows A
20、PI 是Windows 系統(tǒng)和Windows 應(yīng)用程序間的標準程序接口。API 為應(yīng)用程序提供系統(tǒng)的各種特殊函數(shù)及數(shù)據(jù)結(jié)構(gòu)定義,Windows 應(yīng)用程序可以利用上千個標準 API 函數(shù)調(diào)用系統(tǒng)功能。在 Visual C++中使用 Windows API 是相當容易的, 只要在項目中設(shè)定所要使用的函數(shù)庫并引用正確的頭文件,就可以使用 Windows API 中的函數(shù)與數(shù)據(jù)類型。</p><p> 根據(jù)Window
21、s API 函數(shù)完成的功能,可將其分為三類。</p><p> ?。?)窗口管理函數(shù):實現(xiàn)窗口函數(shù)的創(chuàng)建、移動和修改功能。</p><p> ?。?)圖形設(shè)備函數(shù)(GDI):實現(xiàn)與設(shè)備無關(guān)的圖形操作功能。</p><p> ?。?)系統(tǒng)服務(wù)函數(shù):實現(xiàn)與操作系統(tǒng)有關(guān)的多種功能。</p><p> 用 Windows API 函數(shù)來編寫應(yīng)用程序
22、的順序結(jié)構(gòu)為:調(diào)用 WinMain 函數(shù)開始執(zhí)行→定義窗口類→初始化窗口類→窗口的實例化→通過消息循環(huán)獲取消息并將消息發(fā)送給消息處理函數(shù)做出相應(yīng)的操作。</p><p> Windows 編程的特點</p><p> 所有的 Windows 程序都具有類似的結(jié)構(gòu)和相同的“外觀”,所以用戶不用花很多的時間來學習新程序的用法。具有這種一致的用戶界面是使用 Windows 內(nèi)部子模序來創(chuàng)建的
23、。所有的菜單、對話框、滾動條等都具有同樣的鍵盤的鼠標接口,Windows 自己處理這項工作,而不是交給應(yīng)用程序完成。Windows 編程有以下幾個特點:</p><p> ?。?)事件驅(qū)動的程序設(shè)計 </p><p> ?。?)消息循環(huán)與輸入 </p><p><b> (3)圖形輸出 </b></p><p> ?。?/p>
24、4)用戶界面對象 </p><p><b> ?。?)資源共享</b></p><p> 編寫一個典型的Windows應(yīng)用程序,一般需要:</p><p> (1)C, CPP源程序文件</p><p> ?。?)H,HPP頭文件 </p><p><b> (3)資源文
25、件</b></p><p> 包含了應(yīng)用程序所使用的全部資源定義,通常以 .RC 為后綴名。資源是應(yīng)用程序所能夠使用的一類預(yù)定義工具中的一個對象,包括:字符串資源、加速鍵表、對話框、菜單、位圖、光標、工具條、圖標、版本信息和用戶自定義資源等。</p><p> Windows 消息機制:Windows 是一個消息驅(qū)動的操作系統(tǒng)。一個消息由一個消息名稱(U
26、INT 類型)和兩個參數(shù)(WPARAM,LPARAM)構(gòu)成。當用戶進行了輸入或者是窗口的狀態(tài)發(fā)生改變時,系統(tǒng)會發(fā)送消息到某一個窗口。例如,當鼠標左鍵單擊之后會有 WM_LBUTTONDOWN 消息發(fā)送。用戶也可以定義自己的消息名稱,也可以利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。一個消息必須由一個窗口接收。在窗口的消息處理函數(shù)中可以對消息進行分析,對自己感興趣的消息進行處理。如果希望在窗口中進行圖形輸出就必須對 WM_PAINT 進行處理。為
27、了應(yīng)付那些沒有被響應(yīng)的消息,Windows 為窗口編寫了默認的窗口消息處理函數(shù),窗口過程將負責處理那些程序中沒有處理的消息。正因為有了這個默認窗口過程,程序員才可以利用 Windows 的窗口進行開發(fā)而不必過多關(guān)注窗口各種消息的處理。提到消息就必須說到窗口句柄,系統(tǒng)通過窗口句柄在整個操作系統(tǒng)中唯一標識一個窗口。發(fā)送消息時必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口消息處理函數(shù),用戶的輸入會被正確的處理。在 W
28、indows 操作系統(tǒng)中維</p><p> 窗口函數(shù)定義了應(yīng)用程序?qū)邮盏降牟煌⒌捻憫?yīng),其中包括了應(yīng)用程序?qū)Ω鞣N可能接收到的消息的處理過程,是消息處理分支控制語句的集合。通常窗口函數(shù)由一個或多個 switch 語句組成。每條 case 語句對應(yīng)一種消息,當應(yīng)用程序接收到一個消息時,相應(yīng)的 case 語句被激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。</p><p> 窗口函數(shù)是應(yīng)用程序處理接收
29、到的消息的函數(shù)。其中包含了應(yīng)用程序?qū)Ω鞣N可能接收到的消息的處理過程。</p><p> 在本系統(tǒng)中一共用到了 WM_PAINT、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_DESTROY四種消息:</p><p> LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)<
30、/p><p> switch(iMessage) </p><p><b> {</b></p><p> case WM_PAINT:</p><p><b> …… ……</b></p><p><b> break;</b>&
31、lt;/p><p> case WM_LBUTTONDOWN:</p><p><b> …… ……</b></p><p> case 、WM_LBUTTONUP:</p><p><b> …… ……</b></p><p> case WM_DESTROY:<
32、;/p><p><b> …… ……</b></p><p> default:</p><p> return(DefWindowProc(hWnd,iMessage,wParam,lParam));</p><p><b> }</b></p><p>
33、WM_LBUTTONDOWN 是在玩家在鼠標單擊左鍵后產(chǎn)生的,這時通過 GetCursorPos(&pt) 函數(shù)來判斷鼠標是否處在落棋的合法點(包括按鈕上),如果是合法的落棋點,就返回棋子狀態(tài)數(shù)據(jù)等參數(shù),這時 WM_PAINT 函數(shù)在收到這些消息后就開始按照得到的參數(shù)來重繪棋盤,用戶在松開鼠標后又產(chǎn)生 WM_LBUTTONUP 消息,電腦在通過選擇最佳落棋點之后,又返回給 WM_PAINT,這樣就產(chǎn)生了消息循環(huán),直到接收到 WM
34、_QUIT 消息才退出程序, PostQuitMessage 函數(shù)的作用就是向應(yīng)用程序發(fā)出 WM_QUIT 消息,請求退出。DefWindowProc 函數(shù)是系統(tǒng)默認的處理過程,以保證所有發(fā)送到該窗口的消息均得以處理。</p><p><b> 系統(tǒng)需求分析</b></p><p><b> 系統(tǒng)需求</b></p><p
35、> 五子棋作為一款休閑益智游戲,它最大的優(yōu)點在于游戲規(guī)則家喻戶曉,簡單,上手快,趣味性強,所以受廣大用戶青睞,在各大提供棋牌類游戲的平臺都可以看到玩五子棋游戲的人很多。休閑益智游戲中等級并不是最重要的追求目標,通過對游戲規(guī)則的熟悉,能很快上手掌握其操作方式,也更適合男女老幼全家共同娛樂,花費時間簡短,速戰(zhàn)速決,在短時間內(nèi)感受到游戲的樂趣,完全享受氣氛輕松活躍的游戲過程。此種娛樂方式既不耽誤時間也能輕松調(diào)劑娛樂,充分適合現(xiàn)代人們的
36、娛樂需求。更主要的是開發(fā)了人的智力,成為年輕一代最流行的游戲,據(jù)統(tǒng)計,五子棋游戲的玩家中,學生占了接近三分之一的比例,對學生的智力健康成長起一定作用,正所謂休閑娛樂兩不誤。</p><p><b> 功能需求</b></p><p> 要求系統(tǒng)界面簡潔,操作方便,把五子棋游戲規(guī)則中最基本的規(guī)則體現(xiàn)出來,比如“和棋”、“重新開局”等。五子棋還有一大特點就是速戰(zhàn)速決,
37、電腦應(yīng)在很短時間內(nèi)就應(yīng)做出判斷,并能提供一定的幫助,違反游戲規(guī)則的時候應(yīng)立即指出。在正規(guī)五子棋比賽中,都設(shè)置了“禁手”這一規(guī)則,但廣大玩家之所以喜愛五子棋游戲,就是因為五子棋游戲規(guī)則簡單,“禁手”這一規(guī)則很復(fù)雜,所以在本系統(tǒng)中,采用“無禁手”的規(guī)則,讓規(guī)則簡單化。</p><p><b> 系統(tǒng)運行環(huán)境 </b></p><p> Win 9X/Win ME/Wi
38、n NT/Win 2000/Win XP/Win 2003/</p><p><b> 五子棋算法分析</b></p><p><b> 五子棋的發(fā)展</b></p><p> 五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR”(Fiv
39、e in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。 </p><p> 五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。它既有簡單易學的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理的結(jié)晶。</p
40、><p> 五子棋起源于古代中國,發(fā)展于日本,風靡于歐洲。對于它與圍棋的關(guān)系有兩種說法,一說早于圍棋,早在“堯造圍棋”之前,民間就已有五子棋游戲;一說源于圍棋,是圍棋發(fā)展的一個分支。在中國的文化里,倍受人們的青睞。古代的五子棋的棋具與圍棋相同,縱橫各十七道。五子棋大約隨圍棋一起在我國南北朝時先后傳入朝鮮、日本等地。據(jù)日本史料文獻介紹,中國古代的五子棋是經(jīng)由高麗(朝鮮),于1688年至1704年的日本元祿時代傳到日本
41、的。到日本明治32年(公元1899年),經(jīng)過公開征名,“連珠”這一名稱才被正式確定下來,取意于“日月如合壁,五星如連珠”。從此,連珠活動經(jīng)過了不斷的改良,主要是規(guī)則的變化(即對執(zhí)黑棋一方的限制),例如,1899年規(guī)定,禁止黑白雙方走“雙三”;1903年規(guī)定,只禁止黑方走“雙三”;1912年規(guī)定,黑方被迫走“雙三”亦算輸;1916年規(guī)定,黑方不許走“長連”;1918年規(guī)定,黑方不許走“四、三、三”;1931年規(guī)定,黑方不許走“雙四”,并規(guī)
42、定將19×19的圍棋盤改為15×15的連珠專用棋盤。本世紀初五子棋傳入歐洲并迅速風靡全歐。通過一系列的變化,使五子棋這一簡單的游戲復(fù)雜化、規(guī)范化,而最終成</p><p> 簡單介紹一下文章中會遇到的一些關(guān)于五子棋最基本的術(shù)語</p><p> (1)先手:進攻的著法,也指對弈雙方執(zhí)黑棋先在棋盤上落子的一方;</p><p> ?。?)四三:
43、指同時具備兩個先手,其中一個四,另一個是活三;</p><p> ?。?)活三(包括連三和跳三):①連三:緊緊相連的同色三子②跳三:中間間隔一子的活三 ;</p><p> ?。?)四四:一子落下同時形成兩個“四”的棋形 ;</p><p> (5)三三:一子落下形成了兩個活三的棋形;</p><p> ?。?)長連:相
44、同顏色的連續(xù)六子或六子以上; </p><p> ?。?)禁手:對局中禁止使用的戰(zhàn)術(shù)或被判為負的行棋手段;</p><p> (8)勝局:對局的一方獲勝,稱為“勝局”。包括:①一方首先在棋盤的直線或橫線或斜線上形成連續(xù)的五子或五子以上(特指白方)。②對方表示認輸。③對方超過比賽規(guī)定的時限。④當黑方禁手形成未能同時形成五連,白方立即指出禁手后,判定為白方勝局。⑤對方遲到超過容許時
45、間。⑥對方嚴重犯規(guī)而被判負; </p><p> ?。?)和棋:不分勝負的對局或雙方同意平局。</p><p><b> 五子棋的規(guī)則</b></p><p> 五子棋游戲的一個特點是先行的一方優(yōu)勢很大,因此在職業(yè)比賽中對黑方做了種種限制,以利公平競爭。五子棋的比賽規(guī)則如下:</p><p> (1)黑棋
46、先手、白棋后手,從天元開始相互順序落子;</p><p> ?。?)最先在棋盤橫向、縱向或斜向形成連續(xù)的同色五個棋子的一方為勝;</p><p> ?。?)黑棋禁手判負、白棋無禁手。黑棋禁手有“三、三”、“四、四”和“長連”,包括“四、三、三”和“四、四、三”。黑棋只能以“四、三”取勝;</p><p> ?。?)如分不出勝負,則到為平局;</p>&
47、lt;p> ?。?)五連與禁手同時形成,判勝;</p><p> ?。?)黑方禁手形成時,白方應(yīng)立即指出。若白方未發(fā)現(xiàn)或發(fā)現(xiàn)后不立即指出,反而繼續(xù)落子,則禁手失效,不再判黑方負。 </p><p> 五子棋是黑白雙方或兩個人之間的競技活動,由于對黑白雙方規(guī)則不同,黑棋必須先行。一般采用猜先的方法來決定誰執(zhí)黑先行,即雙方各抓一種顏色的幾枚棋子,大數(shù)減小數(shù),單數(shù)雙方交換,偶數(shù)不換;黑方
48、在落下關(guān)鍵的第五子即形成五連的同時,如又形成禁手,此時因黑方已經(jīng)成五,而“五”在五子棋中是至高無上的,故禁手失效,黑方勝;所謂黑方形成禁手,是指黑方落下一子同時形成兩個或兩個以上的活三、沖四及長連等。此時白方應(yīng)立即指出,自然而勝。 </p><p> 專業(yè)連珠五子棋雖然對黑棋采取了種種限制,但是黑棋先行的優(yōu)勢依然很大。因此,在高段位的專業(yè)比賽中,又出現(xiàn)了三種特殊的規(guī)定: </p><p>
49、; (1)“指定打法”:指比賽雙方按照約定好的開局進行對弈。例如“斜月局”、“長星局”等。 </p><p> ?。?)“三手可交換”:指黑棋下第二手棋〔盤面第三手棋〕之后,白方如感覺黑方棋形不利于己方,可提出交換,即執(zhí)白棋一方變?yōu)閳?zhí)黑棋一方〔此方法不適用于指定開局打法,而用于隨意開局〕。采用此規(guī)定以后,黑棋就不會再使用諸如“浦月”、“花月”之類的必勝開局了。</p><p> ?。?)
50、“五手兩打”:指黑棋在下盤面上關(guān)鍵的第五手棋時,必須下兩步棋,讓白方在這兩步棋中任選一步,然后再繼續(xù)下。 </p><p> 采用這一系列規(guī)定以后,黑棋先行就再無優(yōu)勢可言。 </p><p><b> 具體算法分析</b></p><p> 4.3.1 棋盤局勢狀態(tài)表示</p><p> 要讓計算機學會下棋,首先
51、就要把下棋問題表示成計算機可理解的形式,即把五子棋問題形式化,存在計算機中,并能讓搜索算法對這些數(shù)據(jù)進行操作。需要在計算機中表示的主要問題有棋盤局勢狀態(tài)及落子的順序等。棋盤表示主要探討的是是什么數(shù)據(jù)結(jié)構(gòu)來表示棋盤上的信息。一般說來,這與具體的棋類知識密切相關(guān)。通常,用來描述棋盤及其上棋子信息的是一個二維數(shù)組。</p><p> 要讓計算機知道棋盤局勢狀態(tài),就是要它記住棋盤中哪個位置有黑子,哪個位置有白子以及哪個
52、位置是空點。因為五子棋的棋盤是15行,15列,因此可以將棋盤狀態(tài)的描述用一個15×15的二維數(shù)組表示。</p><p> 本程序的數(shù)據(jù)將用如下所示的數(shù)據(jù)表示:</p><p> int p[15][15]=</p><p> {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
53、},</p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> {0,0,0,0,0,0,0,0,0,0,
54、0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},<
55、;/p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};</p><p> 其中,(1)棋盤狀態(tài)數(shù)據(jù)由一個15×15的二維數(shù)組表示。(2)用數(shù)字“1”和“2”來表示不同的棋子,黑色
56、棋子用“2”表示,白色棋子用“1”表示。(3)沒有棋子的格子用“0”表示。</p><p> 4.3.2棋盤中下棋的順序表示</p><p> 棋局中下棋的順序也很重要,應(yīng)該是黑白雙方交替下棋。</p><p> 本程序用t來判斷黑白又方下棋順序,t為“0”時由紅方下棋,t為“1”時由黑方下棋,由于五子棋規(guī)則中黑棋先手,所以初始值t=1,即玩家執(zhí)黑先手。每次落
57、棋后,都應(yīng)改變 t 的值,t 在整個對弈過程中都只能為1或者為2,即在任意時刻,都有一方可以落棋,也只能有一方落棋。</p><p><b> 4.3.3具體算法</b></p><p> 電腦要選擇有利于它的最佳下法,就要能判斷哪種形勢對它最有利。但往往對一個形勢的判斷是很難做到準確的,特別是一盤棋剛開始的時候,棋盤的形勢不明朗,即使是專家也不能做出準確的判斷。
58、為了判斷哪種下法最有利,我們往往需要向后面計算幾步,看看在走了幾步棋之后,局面的形勢如何。這被稱為“多算勝”,也就是說,誰看得越深遠,誰就可以獲勝。這種思維方式被用到了計算機上。向后面計算的步數(shù)越多,系統(tǒng)開銷就越大,本系統(tǒng)只向后計算一步,根據(jù)威脅的優(yōu)先級來選擇落棋的最佳點。</p><p> 輪到電腦下棋時,電腦先向棋盤搜索合法的落棋點,即棋盤的空白點。然后再利用下面的算法先擇最佳落棋點。在每個空白點,都有四個
59、方向需要考慮,即—、|、﹨、∕四個方向。以下就用○表示電腦所執(zhí)的黑棋,用□表示玩家所執(zhí)的白棋,用×表示棋盤的空白點。在設(shè)計的時候,盡可能把所有情況全面考慮,設(shè)置為搜索一個最佳落棋點位置的時候,需要保證左右展開后碰壁,之間的空間距離至少要有六格(而不是五子),否則就是死子。</p><p> 算法流程是:順序向下搜索,每次有符合要求的點時,視為最佳落棋點,并在該點落棋,同時將t賦值為1,退出搜索并判斷
60、是否有一方獲勝,然后等待玩家落棋,再重復(fù)這一過程,直到有一方獲勝。</p><p><b> 圖1 算法流程圖</b></p><p> 一,電腦搜索棋盤里紅棋是否有一步獲勝的棋,即在同一條線路上有連續(xù)五個位置上,有四顆為紅棋,另外一顆為空,這時就不用考慮玩家的棋局,直接就可以獲勝。能直接獲勝的棋型有×○○○○×、□○○○○×,還包括
61、通過四三來形成的活四,包括有○○×○○、○○○×○、○×○○○。</p><p> 二,電腦搜索棋盤里黑棋是否有一步獲勝的棋,這時就應(yīng)該讓玩家的“活四”變“死四”,這是紅棋威脅級別最高的,應(yīng)立即做出反應(yīng)。有直接威脅的棋型有□×□□□、×□□□□×、□□□×□、×□□□□×。對于×□□□□×這種棋型,其實
62、玩家已經(jīng)獲勝。</p><p> 三,電腦搜索棋盤里紅棋是否有可形成活四的棋型,進一步?jīng)_四,這時就應(yīng)該主動進攻,這種棋型包括×○○○××、×○○×○×、×○×○○×。這樣的棋只需兩步方可獲勝,威脅級別僅次于上面兩種。</p><p> 四,電腦搜索棋盤里黑棋是否有可形成活四的棋型,若有,就有阻止沖
63、四,讓玩家的“活三”變死三,這時就體現(xiàn)了電腦的防守策略,這種棋型包括:××□□□×、×□×□□×、×□□×□×。其中××□□□×在封堵后還具有威脅性,所以在電腦沒有進攻機會時,也應(yīng)該考慮這樣的棋型的威脅性,因為可以利用這種棋型來造四三來獲勝。</p><p> 五,電腦搜索棋盤里紅棋是否有可形
64、成活三的棋型,這是獲勝的過渡棋,在整個棋局中非常重要,這樣的棋型越多,紅棋造活三的機會就越多,是獲勝的關(guān)鍵。這種棋型包括:××○○××、××○×○×,由于需要三步獲勝,所以優(yōu)先級比較低。</p><p> 表1是獲勝情況分析表,優(yōu)先級是按所需步數(shù)和落棋的順序來決定的,在獲勝所需步數(shù)相同的情況下,電腦所執(zhí)的紅棋優(yōu)先級高于黑棋。<
65、/p><p> 表1 獲勝情況分析表</p><p><b> 系統(tǒng)流程</b></p><p> 五子棋的規(guī)則如下:(1)棋盤:采用15×15的棋盤。(2)下法玩家執(zhí)黑先手,電腦執(zhí)白后手,輪流在棋盤上選擇一個無子的交叉點落子。無子的交叉點又被稱為空點。(3)輸贏判斷:黑、白雙方有一方的5顆棋子在橫、豎或斜方向上連接成一線即為該方贏
66、。(4)對于五子棋可分為禁手和無禁手兩類,本游戲采用無禁手,這樣就對執(zhí)黑方很有力,獲勝的機率非常大??捎?5×15的二維數(shù)表示棋盤內(nèi)各點狀態(tài) (空、白子、黑子) ;</p><p> 五子棋游戲規(guī)則簡單,在每次玩家或電腦落棋后,都要去判斷是否游戲是否分出勝負,如沒有,另一方才能繼續(xù)下棋。一局游戲結(jié)束后,可以選擇再來一盤,這時將棋盤數(shù)據(jù)清空,又開始新的棋局。系統(tǒng)流程如圖2所示。</p>&
67、lt;p><b> 圖2 系統(tǒng)流程圖</b></p><p><b> 系統(tǒng)功能實現(xiàn)</b></p><p><b> 窗口設(shè)計</b></p><p> 根據(jù) Windows API 函數(shù)來編寫應(yīng)用程序的順序結(jié)構(gòu):調(diào)用 WinMain 函數(shù)開始執(zhí)行→定義窗口類→初始化窗口類→窗口的實例
68、化→通過消息循環(huán)獲取消息并將消息發(fā)送給消息處理函數(shù)做出相應(yīng)的操作。</p><p> 我們首先應(yīng)該創(chuàng)建一個窗口,生成一個窗口主要有兩步:定義窗口類和初始化窗口類。</p><p> 首先用 InitWindowsClass 來定義一個窗口類,窗口類事實上是 struct 結(jié)構(gòu)體,內(nèi)部有10個分量,他們是用來于初始化窗口類對象而用的。根據(jù)函數(shù)里聲明的各個參數(shù)來執(zhí)行,它在里面定義了窗口類對
69、象、聲明了窗口的類對象名稱、應(yīng)用程序?qū)嵗浔⑾⑻幚砗瘮?shù)名、光標樣式和窗口背景等,其它的都設(shè)置為初始值。</p><p> 函數(shù)關(guān)鍵語句:BOOL InitWindowsClass(HINSTANCE hInstance)</p><p> { WndClass.hbrBackground=(HBRUSH)(CreateSolidBrush(RGB(240,240,240))); &
70、lt;/p><p> WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);</p><p> WndClass.hInstance=hInstance;</p><p> WndClass.lpfnWndProc=WndProc;</p><p> WndClass.lpszClassName=&quo
71、t;WinFill";</p><p> return RegisterClass(&WndClass);}</p><p> 然后用 InitWindows 函數(shù)來初始化窗口類,在窗口類對象的初始化過程中,我們定義了窗口的一些簡單一般特征,比如背景顏色呀,光標等等。但是在利用 CreateWindow 創(chuàng)建窗口的時候可以設(shè)置更多的細節(jié),比如窗口標題這些。</p
72、><p><b> 函數(shù)主要參數(shù):</b></p><p> hWnd=CreateWindow("WinFill",</p><p><b> "五子棋游戲",</b></p><p> WS_OVERLAPPEDWINDOW,</p
73、><p><b> 0,0,</b></p><p><b> 1024,768,</b></p><p> hInstance);</p><p> 其中,定義窗口類對象名稱為"WinFill",窗口標題為"五子棋游戲",窗口風格為WS_OVERLAPP
74、EDWINDOW,說明此窗口是一個層疊式窗口,含有邊框、標題欄、系統(tǒng)菜單、最大最小化按鈕的窗口。</p><p><b> 棋盤設(shè)計</b></p><p> 程序的實現(xiàn)上,首先完成界面的設(shè)計,在界面的設(shè)計上,使用了二維數(shù)組的棋盤格式,考慮到五子棋的落子后,是不會再次移動的,所以采用劃直線的方法模擬一個棋盤。棋盤大小為560×560,起始坐標為(200,
75、100),每個格子大小為(40,40)。 </p><p> 首先用 GetStockObject 函數(shù)創(chuàng)建一個畫筆和畫刷,用 SelectObject 選擇當前使用的畫筆和畫刷,畫筆的作用是畫棋盤的邊框及格子,畫刷的作用是填充棋盤的背景色,先取畫筆后我們才能用它來畫棋盤。為了增加棋盤的美觀,畫刷顏色選取灰色,與窗口的銀白色分開。</p><p> 然后用 Rectangle 函數(shù)畫一
76、個矩形,就是棋盤的邊框,棋盤的左上角坐標為(200,100),右下角坐標為(760,660)。</p><p> 再畫棋盤的各橫軸及縱軸,在畫每一條直線前,需用 MoveToEx 函數(shù)指定當前畫筆的位置,然后用 LineTo 函數(shù)從指定這點開始畫一條到指定的另外一點的直線。</p><p> 函數(shù)段為:hPen=(HPEN)GetStockObject(BLACK_PEN);</
77、p><p> SelectObject(hDC,hPen);</p><p> hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); </p><p> SelectObject(hDC,hBrush); </p><p> Rectangle(hDC,200,100,760,660); <
78、/p><p> MoveToEx(hDC,200,140,NULL); //第一條橫線</p><p> 在這些都完成了之后,對界面進行最后的完善,通過添加按鈕來使用戶在和電腦對弈的同時,可以從這些按鈕中獲得必要的幫助。</p><p> 本系統(tǒng)一共設(shè)置了四個按鈕:“和棋”、“再來一盤”,“退出”和“幫助”。它們的畫法采用文本框模擬按鈕,先畫一個矩形,在矩形里填
79、充提示信息,用鼠標單擊事件來響應(yīng)各個按鈕。</p><p> 因此綜上所述,在界面的設(shè)計上,主要有兩個模塊,一個是棋盤模塊,一個是按鈕模塊。</p><p><b> 按鈕功能的實現(xiàn)</b></p><p> 本系統(tǒng)一共設(shè)置了四個按鈕:“和棋”、“再來一盤”,“退出”和“幫助”。它們的畫法采用文本框模擬按鈕,先畫一個矩形,在矩形里填充提示
80、信息,用鼠標單擊事件來響應(yīng)各個按鈕。這四個按鈕基本滿足了一般玩家的需求。</p><p> 按鈕的畫法:先在主函數(shù)里面定義四個變量,分別存儲按鈕的標題,然后在棋盤外畫四個矩形,然后在四個矩形里分別顯示按鈕的標題。</p><p><b> 具體實現(xiàn)方法:</b></p><p><b> “退出”按鈕:</b><
81、;/p><p> Rectangle(hDC,770,110,820,135);</p><p> TextOut(hDC,780,115,lpsz1,strlen(lpsz1));</p><p> if(i>770&&i<820&&j>495&&j<520)</p><
82、p> {PostQuitMessage(0);</p><p> return(0);}</p><p> 以上這幾行代碼就實現(xiàn)了退出按鈕按鈕的畫法及實現(xiàn),lpsz1 里存儲的是按鈕標題“退出”,在(770,110)到(820,135)這個區(qū)域畫一按鈕,strlen(lpsz1) 求的是字符串的長度,求出來的值就是文本顯示的長度。當鼠標單擊這個區(qū)域的時候,就產(chǎn)生消息,并執(zhí)行 P
83、ostQuitMessage(0) 這條語句,這條語句的作用是退出應(yīng)用程序。這樣就模擬出了一個退出按鈕,實現(xiàn)了程序的退出。</p><p><b> “再來一盤”按鈕:</b></p><p> Rectangle(hDC,100,325,180,375);</p><p> TextOut(hDC,110,340,lpsz5,strle
84、n(lpsz5));</p><p> if(i>=100&&i<=325&&j>=180&&j<=375) //再來一盤</p><p><b> {</b></p><p> for(m=0;m<=a;m++)</p><p>&
85、lt;b> {c[m]=0;</b></p><p><b> d[m]=0;</b></p><p><b> e[m]=0;</b></p><p><b> f[m]=0;</b></p><p><b> }</b>&l
86、t;/p><p> for(m=0;m<=14;m++)</p><p> for(n=0;n<=14;n++)</p><p> {p[m][n]=0;}</p><p> 在畫法和退出按鈕一樣,都是利用矩形內(nèi)填充文本的方法,在響應(yīng)這個按鈕時有一定條件,就是游戲已經(jīng)分出勝負或者通過和棋結(jié)束了游戲。這時才會產(chǎn)生再來一盤的消息,
87、它會將所有棋盤信息置為初始值,比如將棋盤狀態(tài)函數(shù)P[][]里的數(shù)組全部清空,都賦初值為0,表示下棋棋子數(shù)的 a 也置為0等。</p><p><b> “幫助”按鈕:</b></p><p> Rectangle(hDC,770,110,820,135);</p><p> TextOut(hDC,780,115,lpsz1,strlen
88、(lpsz1));</p><p> if(i>=770&&i<=820&&j>=110&&j<=135)</p><p> {MessageBox(hWnd,"需幫助 請在黑棋下棋時單擊'幫助' \n 一方獲勝后可單擊'退出'退出程序 \n 雙方僵持情況下可'和棋
89、' \n 如有興趣請'再來一盤'","幫助",MB_OK);}</p><p> 畫法和前面的一樣,這里面使用了文本換行,在每行之間用 \n 將需要換行的文字隔開,于是在單擊這個按鈕后,就會看到有多行文字的消息框出現(xiàn)。</p><p><b> 勝負判斷</b></p><p> 在五
90、子棋游戲中,判斷勝負是很重要的一項工作,最先在棋盤橫向、豎向、斜向形成五顆連續(xù)相同顏色的棋子的一方為勝。</p><p> (1)橫向:橫向比較好判斷,縱坐標不變,橫坐標向右遞增,有五顆連續(xù)的相同顏色的棋子即獲勝,所以橫坐標的范圍不必是(0,14),只搜索(0,10)即可。</p><p> ?。?)縱向:與橫向一樣,這時橫坐標不變,縱坐標向下遞增,所以縱坐標的搜索范圍可以縮小到(0,1
91、0)。</p><p> (3)“﹨”向:這時搜索應(yīng)從左上角開始,橫縱坐標同時遞增,橫縱坐標的搜索范圍都是(0,10)。</p><p> (4)“/”向:這時縱坐標是向下遞增,但橫坐標是向左遞減的,所以搜索范圍就不能從左上角(0,0)開始,應(yīng)從(0,4)開始,橫坐標的搜索范圍是(4,14),縱坐標的搜索范圍是(0,10)。</p><p> 下面就以“/”向
92、為例,在程序中具體實現(xiàn)過程:</p><p> for(m=0;m<=10;m++)</p><p> for(n=4;n<=14;n++)</p><p><b> {</b></p><p> if(p[m][n]==1&&p[m+1][n-1]==1&&p[m+
93、2][n-2]==1&&p[m+3][n-3]==1&&p[m+4][n-4]==1&&g==1)</p><p><b> {</b></p><p> MessageBox(hWnd,"黑棋贏","結(jié)束",MB_OK);</p><p><b&
94、gt; g=0;</b></p><p><b> }</b></p><p><b> else </b></p><p> if(p[m][n]==2&&p[m+1][n-1]==2&&p[m+2][n-2]==2&&p[m+3][n-3]==2&am
95、p;&p[m+4][n-4]==2&&g==1)</p><p><b> {</b></p><p> MessageBox(hWnd,"紅棋贏","結(jié)束",MB_OK);</p><p><b> g=0;</b></p><p&
96、gt;<b> }</b></p><p> 一方獲勝后,會彈出消息框,提示一方獲勝游戲結(jié)束,并將 g 置為0,這時游戲就不能再繼續(xù),對下棋、“和棋”等起了屏蔽作用。在 if 語句里面有 g=0 這個條件,是限制游戲結(jié)束后重復(fù)判斷勝負,只要一方獲勝,就不能對棋盤做任何操作,只有對按鈕采取操作有效。</p><p><b> 系統(tǒng)測試與分析</b&
97、gt;</p><p><b> 運行結(jié)果</b></p><p> 本系統(tǒng)在 Visual C++ 6.0 下調(diào)試通過,調(diào)試成功后,打開debug目錄下five.exe,開始運行五子棋游戲。我就從界面、按鈕功能、勝負的判斷幾個方面來測試系統(tǒng)。</p><p> 1 界面:該窗口具有最大化、最小化關(guān)閉按鈕,系統(tǒng)菜單,標題欄,邊框,背景色為
98、銀白色,棋盤大小為15×15,背景為灰色。</p><p><b> 圖3 游戲界面</b></p><p> 2 畫棋子:本系統(tǒng)能夠在棋盤方格的交叉處畫棋子,棋子半徑為10。</p><p><b> 圖4 畫棋子</b></p><p> 3 判斷勝負:當棋盤上“一”、“∣”、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋游戲軟件工程課程設(shè)計
- 五子棋游戲畢業(yè)設(shè)計
- 基于vc的五子棋游戲設(shè)計與實現(xiàn)【畢業(yè)論文】
- 畢業(yè)設(shè)計---基于labview設(shè)計的五子棋游戲
- 畢業(yè)設(shè)計---網(wǎng)絡(luò)五子棋游戲
- 基于vc的五子棋游戲設(shè)計與實現(xiàn)【開題報告】
- 網(wǎng)絡(luò)五子棋游戲畢業(yè)設(shè)計
- 基于vc的五子棋游戲設(shè)計與實現(xiàn)【文獻綜述】
- 計算機畢業(yè)論文---五子棋游戲軟件的設(shè)計與實現(xiàn)
- 畢業(yè)設(shè)計(論文)-五子棋游戲程序設(shè)計與開發(fā)
- 基于vc的五子棋游戲設(shè)計與實現(xiàn)【任務(wù)書】
- 基于java的五子棋游戲設(shè)計
- 人機對弈五子棋游戲畢業(yè)設(shè)計
- 基于vc++的五子棋游戲設(shè)計與實現(xiàn)【開題報告】
- 軟件工程畢業(yè)設(shè)計(論文)-基于android的五子棋游戲設(shè)計
- 基于android的五子棋游戲設(shè)計
- 五子棋畢業(yè)論文-html開發(fā)五子棋的原型設(shè)計
- 五子棋游戲設(shè)計報告
- java五子棋畢業(yè)設(shè)計--java五子棋對弈程序的設(shè)計與實現(xiàn)
- 畢業(yè)設(shè)計(論文)-基于android的五子棋游戲設(shè)計與實現(xiàn)
評論
0/150
提交評論