(精品)五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文_第1頁(yè)
(精品)五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文_第2頁(yè)
(精品)五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文_第3頁(yè)
(精品)五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文_第4頁(yè)
(精品)五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、畢業(yè)論文(設(shè)計(jì))題 目 五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)所在院(系)數(shù)學(xué)與科學(xué)學(xué)院專(zhuān)業(yè)班級(jí) 信息與計(jì)算科學(xué)1101班指導(dǎo)教師拓守恒完成地點(diǎn)陜西理工學(xué)院2015年5月18日五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)作者:王勇(陜理工學(xué)院數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院信息與計(jì)算科學(xué)專(zhuān)業(yè)1101 班,陜西漢中 723000 )指導(dǎo)教師:拓守恒 摘要 五子棋是起源于我國(guó)古代的黑白棋種之一,是一種簡(jiǎn)單的娛樂(lè)性較強(qiáng)的大眾游戲,深受廣大玩家的喜愛(ài),但同時(shí)作為比賽,五子棋游戲還有著深?yuàn)W的技巧。本系統(tǒng)的實(shí)現(xiàn)采用了 C語(yǔ)言的模塊化的程序設(shè)計(jì)方式,用 Visual C+ 6.0軟件來(lái)實(shí)現(xiàn)程序的編譯運(yùn)行。實(shí)現(xiàn)黑 白兩方分別落子,通過(guò)棋盤(pán)上方的棋盤(pán)動(dòng)態(tài)信息提

2、示,輪流落子,本系統(tǒng)中游戲的每一個(gè)功能在程序中都是一個(gè)相 對(duì)獨(dú)立的模塊,比如,棋盤(pán)模塊,棋子模塊,選擇游戲模式模塊,悔棋模塊等等在程序中都是獨(dú)立的,但它們之間 通過(guò)邏輯關(guān)系的鏈接又構(gòu)成了一個(gè)可以使游戲正常運(yùn)行的程序。為實(shí)現(xiàn)游戲的雙人對(duì)戰(zhàn)模式和人機(jī)對(duì)戰(zhàn)模式,并使得游戲盡量的簡(jiǎn)單化,本系統(tǒng)需要達(dá)成以下目標(biāo):設(shè)計(jì)一個(gè)簡(jiǎn)潔的游戲初始界面; 制定合法規(guī)則,使游戲能公正的進(jìn)行,并且可以斷定勝; 支持人機(jī)對(duì)戰(zhàn)模式,可以是電腦通過(guò)人工智能和合法規(guī)則選出最優(yōu)落子位置; 可以悔棋,在玩家落子落錯(cuò)位置時(shí),可按下悔棋鍵進(jìn)行悔棋。 關(guān)鍵詞 五子棋,游戲設(shè)計(jì),C 語(yǔ)言,雙人對(duì)戰(zhàn),人機(jī)對(duì)戰(zhàn),人工智能Designer and

3、 implementation of gobang gameAuthor: wangyong(Grade11,Class 1, Major in Information and computing science, Mathematics and computer scienceDept.Tutor: Tuo shouhengAbstract: Gobang is one of the black and white kind of originated in ancient China, is a simple and entertaining stronger mass games, lo

4、ved by the majority of players, but at the same time as the game, gobang game with profound skills.The implementation of this system has adopted C of modular program design method, using Visual C + + 6.0 software to realize the program compiler running. Implementation of black and white two parties

5、move later, respectively, by the board at the top of the dynamic message board, take turns to move later, this game in the system each function in the program is a relatively independent modules, such as, the board module, pawn module, select game mode module, back module and so on in the program ar

6、e independent, but the link through the logical relationship between them and form a can make the normal operation of the game program.In order to realize the double mode and man-machine game mode, and make the game as far as possible the simplification, the system needs to achieve the following goa

7、ls: design a simple game of initial interfaccethe legal rules, can make the game fair, and you can call; support the man-machine mode, can be a computer by artificial intelligence and legal rules to select the optimal move later; can take back, fall in the players move later fault location, can pres

8、s the back button to back.Key words : gobang, Game design, The C Programming Language , Double against, The man-machine against, Artificial intelligence (AI)1. 緒論5. 詳細(xì)設(shè)計(jì)6. 總結(jié) 致謝 23231.1 引言 11.2 研究的背景及意義11.2.1 研究背景11.2.2 研究意義11.3 基本目標(biāo)及主要內(nèi)容12. 系統(tǒng)開(kāi)發(fā)環(huán)境的介紹及選擇2.1 C 語(yǔ)言 12.2 開(kāi)發(fā)及運(yùn)行環(huán)境23. 需求分析3.1 總體需求分析23.2 可行

9、性分析23.2.1 技術(shù)可行性分析 23.2.2 經(jīng)濟(jì)可行性分析 23.2.3 操作可行性分析 23.3 功能分析 24. 概要設(shè)計(jì)4.1 五子棋特點(diǎn)與規(guī)則24.2 流程圖 34.3 雙人模式 44.4 人機(jī)模式 44.5 智能算法 44.6 悔棋流程 54.7 輸贏判斷 55.1 畫(huà)出游戲界面55.2 畫(huà)出棋子 75.3 設(shè)置棋局規(guī)則85.3.1 落子規(guī)則95.3.2 悔棋規(guī)則105.3.3 輸贏規(guī)則105.4 實(shí)現(xiàn)雙人對(duì)戰(zhàn)105.5 悔棋功能 105.6 判斷輸贏 135.7 退出游戲 155.8 實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)155.8.1 先手設(shè)置界面155.8.2 電腦智能落子165.8.3 可以悔棋

10、、退出205.8.4 顯示輸贏205.9 各模塊之間的銜接20參考文獻(xiàn)231. 緒論1.1 引言隨著社會(huì)經(jīng)濟(jì)和科學(xué)技術(shù)的發(fā)展,計(jì)算機(jī)已經(jīng)深入到人們?nèi)粘9ぷ骱蜕畹姆椒矫婷妫鞣N各樣的程序軟件也逐漸進(jìn)入大眾的生活,比如在閑暇時(shí)間的娛樂(lè)生活也開(kāi)始變得被網(wǎng)絡(luò)電子游戲等所充斥。而五子棋則是最受人們歡迎的一款益智類(lèi)棋局游戲,它的簡(jiǎn)單性,娛樂(lè)性,競(jìng)技性注定它是 一款火爆的游戲。1.2 研究的背景及意義1.2.1 研究背景五子棋游戲軟件可以分為兩種:一種是網(wǎng)絡(luò)五子棋游戲軟件,另一種是單機(jī)五子棋游戲軟件。我設(shè)計(jì)的是單機(jī)版的五子棋游戲軟件,這款軟件可以供人們?cè)陂e暇時(shí)間隨時(shí)隨地進(jìn)行娛樂(lè),并提高自己的棋藝,實(shí)用性較

11、強(qiáng)。游戲的行棋順序?yàn)椋汉谙?、白后,黑棋第一子從天元開(kāi)始相互依次落子任一方先在棋盤(pán)上形成橫向或豎向或斜向的連續(xù)的顏色相同的五個(gè)以上( 含五個(gè) ) 棋子則該方為勝。該系統(tǒng)所實(shí)現(xiàn)的功能主要有三大功能:游戲選項(xiàng)、游戲設(shè)置、幫助。1.2.2 研究意義五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種,當(dāng)今社會(huì)在不同的地域?qū)ξ遄悠逡灿胁煌姆Q(chēng)呼其也是一種必須動(dòng)用腦力的益智類(lèi)游戲,所以五子棋可以增強(qiáng)思維能力,提高智力。其中蘊(yùn)含古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易理”哲理,有利于修身養(yǎng)性,它因?yàn)楹?jiǎn)單易學(xué)的特點(diǎn),所以為人民群眾所 喜愛(ài),但作為一項(xiàng)高水平的國(guó)際比賽,它也有深?yuàn)W技巧。1.3 基本目標(biāo)及主要內(nèi)容本系統(tǒng)是根據(jù)傳統(tǒng)五子棋游戲的功

12、能編寫(xiě),實(shí)現(xiàn)了雙人對(duì)戰(zhàn)和人機(jī)對(duì)戰(zhàn)。主要需實(shí)現(xiàn)如下目標(biāo):(1) Visual C+ 6.0 環(huán)境的下的 C語(yǔ)言編程( 2)五子棋棋盤(pán)的設(shè)計(jì)( 3)五子棋棋子的設(shè)計(jì)( 4)黑白雙方輪流落子的實(shí)現(xiàn)( 5)棋局的悔棋功能( 6)棋局進(jìn)行時(shí)的退出功能( 7)勝負(fù)的判定( 8)人工智能算法分析2. 系統(tǒng)開(kāi)發(fā)環(huán)境的介紹及選擇2.1 C 語(yǔ)言C 語(yǔ)言誕生于1972 年的美國(guó),在次之前還有A 語(yǔ)言(其創(chuàng)造設(shè)計(jì)者是一位女性)和B 語(yǔ)言?,F(xiàn)在 C 語(yǔ)言成為了世界上使用最廣泛的,最流行的高級(jí)程序設(shè)計(jì)語(yǔ)言之一。隨著經(jīng)濟(jì)與科技的發(fā)展,微型計(jì)算機(jī)日漸普及,這導(dǎo)致了C 語(yǔ)言的版本的多樣化,出現(xiàn)了一些不一致的語(yǔ)言特點(diǎn)。為了改變

13、這種情況,美國(guó)國(guó)家標(biāo)準(zhǔn)研究所制定推廣了一套ANSI 標(biāo)準(zhǔn),作為現(xiàn)行的 C 語(yǔ)言標(biāo)準(zhǔn)。常用的編譯軟件有Microsoft Visual C+。C 語(yǔ)言繪圖能力強(qiáng),具有很好的可移植性,并具備很強(qiáng)的數(shù)據(jù)處理能力,因此適于編寫(xiě)系統(tǒng)軟件。它是數(shù)值計(jì)算的高級(jí)語(yǔ)言。由文獻(xiàn)1-4 可知。2.2 開(kāi)發(fā)及運(yùn)行環(huán)境編程語(yǔ)言:C 語(yǔ)言操作系統(tǒng):Windows7開(kāi)發(fā)工具:MicrosoftVisual C+6.03. 需求分析3.1 總體需求分析五子棋游戲是一款很符合現(xiàn)代人的休閑特點(diǎn)的益智類(lèi)游戲,其是我國(guó)古代圍棋的的衍生物,本系統(tǒng)主要分為兩部分:雙人人對(duì)戰(zhàn)和人機(jī)對(duì)戰(zhàn)。雙人對(duì)戰(zhàn)模式實(shí)現(xiàn)的功能:選擇雙人對(duì)戰(zhàn),游戲界面,實(shí)現(xiàn)

14、雙人輪流落子,棋盤(pán)動(dòng)態(tài)信息顯示,判斷輸贏,重新開(kāi)始游戲。人機(jī)對(duì)戰(zhàn)模式實(shí)現(xiàn)的功能:選擇人機(jī)對(duì)戰(zhàn),設(shè)置先手,實(shí)現(xiàn)玩家與電腦輪流落子,棋盤(pán)動(dòng)態(tài)信息顯示,判斷輸贏,重新開(kāi)始游戲。3.2 可行性分析3.2.1 技術(shù)可行性分析計(jì)算機(jī)硬件和軟件技術(shù)的飛速發(fā)展,為游戲系統(tǒng)的開(kāi)發(fā)提供了設(shè)備條件。當(dāng)前在網(wǎng)絡(luò)上有許多的五子棋軟件可供參考借鑒,而且我自己也熟練地掌握了C 語(yǔ)言在 Microsoft Visual C+ 6.0 環(huán)境下的基本應(yīng)用,因此本游戲的開(kāi)發(fā)技術(shù)上是完全可行的。3.2.2 經(jīng)濟(jì)可行性分析該游戲適用于所有人群,開(kāi)發(fā)該游戲的費(fèi)用主要包括開(kāi)發(fā)階段的費(fèi)用以及今后的運(yùn)行、維護(hù)費(fèi)用。五子棋游戲簡(jiǎn)單易學(xué),為人民群

15、眾喜聞樂(lè)見(jiàn)。該游戲功能強(qiáng)大,界面簡(jiǎn)單,用戶(hù)在使用方面不存在任何障礙。其開(kāi)發(fā)具有很強(qiáng)的經(jīng)濟(jì)性。3.2.3 操作可行性分析本游戲適用于Windows 操作系統(tǒng)之上, 對(duì)于該游戲的推廣使用提供了很好的平臺(tái)。該游戲使用 C 語(yǔ)言編寫(xiě),具有很強(qiáng)的移植性,使其可以運(yùn)行很方便。在操作上主要憑借使用Windows 鍵盤(pán)操作,方便簡(jiǎn)單。使用前只要對(duì)用戶(hù)進(jìn)行簡(jiǎn)單的說(shuō)明即可。3.3 功能分析該款游戲主要是由以下五個(gè)模塊組成:圖 3.1 游戲功能圖4. 概要設(shè)計(jì)4.1 五子棋特點(diǎn)與規(guī)則五子棋是兩方之間進(jìn)行的競(jìng)技活動(dòng),專(zhuān)用棋盤(pán)為15*15,五連子的方向?yàn)闄M、豎、斜;任一方在棋盤(pán)上形成橫向、豎向、斜向的連續(xù)的相同顏色的五

16、個(gè)(含五個(gè)以上)時(shí)即為該方勝利;在棋盤(pán)上以對(duì)局雙方均不可能形成五連為和棋。黑白雙方依次落子,由黑方先下,由于先下一方在局面上占優(yōu),所以五子棋規(guī)則分為禁手和無(wú)禁手兩種。禁手規(guī)則:禁手是針對(duì)先行的黑棋而言,以限制黑棋的先行優(yōu)勢(shì)為目的。對(duì)局中如果黑棋違反禁手規(guī)則將被判負(fù)。以中國(guó)五子棋競(jìng)賽規(guī)則為例,有三三禁手(黑棋一子落下時(shí)同時(shí)形成兩個(gè)或兩個(gè)以上的活三,此子必須為兩個(gè)活三共同的構(gòu)成子)、四四禁手(黑棋一子落下同時(shí)形成兩個(gè)以上的沖四或活四)、長(zhǎng)連禁手(黑棋一子落下形成一個(gè)或一個(gè)以上的長(zhǎng)連)。無(wú)禁手指不對(duì)黑棋的先行優(yōu)勢(shì)做任何限制。本系統(tǒng)采用的是無(wú)禁手規(guī)則。子落下同時(shí)形成兩個(gè)以上O無(wú)禁手指不對(duì)黑棋的先4.2

17、 流程圖游戲開(kāi)始后,運(yùn)行過(guò)程如下圖4.1 所示:圖 4.1 游戲運(yùn)行流程圖當(dāng)系統(tǒng)運(yùn)行后,首先看到的是一個(gè)選擇游戲模式(雙人,人機(jī))的界面,根據(jù)要求選擇后,有兩種情況,第一種是雙人模式,根據(jù)游戲的設(shè)定先黑方落子,然后白方落子,而系統(tǒng)此時(shí)需要更新棋盤(pán)的狀態(tài)和判斷是否產(chǎn)生輸贏,若是產(chǎn)生則游戲結(jié)束,若沒(méi)有產(chǎn)生輸贏,則判斷是否棋盤(pán)已經(jīng)落滿棋子,若已經(jīng)落滿棋子,則判定為和棋,否則另一方落子,如此循環(huán),直到產(chǎn)生輸贏或和棋;另一種是人機(jī)模式,選擇該模式后,會(huì)看到設(shè)置界面,可以選擇誰(shuí)是先手,有兩種選擇電腦先手、玩家先手,若電腦先手則根據(jù)設(shè)定,電腦執(zhí)黑子先下,之后白方落子,此時(shí)因?yàn)檫x擇了電腦先手,所以電腦落子時(shí)優(yōu)

18、先進(jìn)攻,只有在進(jìn)攻的權(quán)值小于防守的權(quán)值時(shí)優(yōu)先防守,(此處涉及到電腦的人工智能,此部分的設(shè)計(jì)概要詳見(jiàn)本章節(jié)的電腦智能落子部分),每當(dāng)棋盤(pán)落子后電腦立即更新棋盤(pán)的具體信息并判斷是否已經(jīng)產(chǎn)生輸贏若是產(chǎn)生則游戲結(jié)束,若沒(méi)有產(chǎn)生輸贏,則判斷是否棋盤(pán)已經(jīng)落滿棋子,若已經(jīng)落滿棋子,則判定為和棋,否則另一方落子,如此循環(huán),直到產(chǎn)生輸贏或和棋,玩家先手,則玩家執(zhí)黑子先落子,然后電腦落白子,此時(shí)電腦落子優(yōu)先防守,其他部分與電腦先手一樣。4.3 雙人模式此模式較為簡(jiǎn)單是后面實(shí)現(xiàn)人機(jī)模式的鋪墊。首先用循環(huán)語(yǔ)句和制表符畫(huà)出整個(gè)棋盤(pán),然后利用繪圖函畫(huà)出棋子,然后制定自己的落子規(guī)則(包含輸贏規(guī)則),并用循環(huán)語(yǔ)句實(shí)現(xiàn)黑白子的

19、輪流下子,如此就實(shí)現(xiàn)了雙人對(duì)戰(zhàn)的目的。4.4 人機(jī)模式本系統(tǒng)中此功能的實(shí)現(xiàn)是在雙人模式已經(jīng)實(shí)現(xiàn)的情況下實(shí)現(xiàn),只是把雙人模式中的其中一個(gè)人換成電腦操作(電腦落子算法參照4.5 智能算法),在每次落子之后,調(diào)用判斷輸贏函數(shù)判斷是否產(chǎn)生輸贏或和棋,如果產(chǎn)生則游戲結(jié)束,如果沒(méi)有產(chǎn)生則繼續(xù)游戲,直到產(chǎn)生輸贏或和棋,或退出游戲?yàn)橹埂?.5 智能算法電腦博弈模仿人類(lèi)下棋,傳統(tǒng)算法使用的是博弈樹(shù)。兩人游戲,甲有很多位置選擇落子,乙也有很多相對(duì)應(yīng)的下法,如果所有的方式列表就構(gòu)成一棵樹(shù),就是搜索樹(shù),也被稱(chēng)為博弈樹(shù)。樹(shù)的根節(jié)點(diǎn)先手的第一步位置,下面的走棋方法構(gòu)成樹(shù)的子節(jié)點(diǎn),直到游戲結(jié)束。此處的五子棋棋盤(pán)是15X15

20、的,搜索空間是一個(gè)巨大的數(shù)字。博弈算法的任務(wù)是在這些呈幾何級(jí)數(shù)上升的子節(jié)點(diǎn)中選出最優(yōu)的節(jié)點(diǎn),從而贏得比賽。整個(gè)算法分為搜索和估值兩部分,估值是評(píng)估所有可能的落子位置的評(píng)價(jià),選擇評(píng)價(jià)最高的位置為最終落子位置。本系統(tǒng)的估值函數(shù)為單點(diǎn)估值函數(shù)。單點(diǎn)估值函數(shù)的基本思想是評(píng)估當(dāng)前的靜態(tài)情況下,遍歷棋盤(pán),對(duì)棋盤(pán)的每個(gè)非空的位置的四個(gè)方向進(jìn)行分析評(píng)估(橫向、豎向、兩條對(duì)角線),統(tǒng)計(jì)每一個(gè)棋型的數(shù)量(連五型、沖四型、活四型、活三型、死三活二型),不同的棋型根據(jù)實(shí)際情況中玩游戲時(shí)的經(jīng)驗(yàn)確定一個(gè)不同的權(quán)重值,最后還有位置分?jǐn)?shù)的加權(quán)(不僅要考慮空點(diǎn)對(duì)自己的價(jià)值,也要考慮其對(duì)對(duì)方的價(jià)值), 如此就獲得了棋盤(pán)上的空點(diǎn)的

21、估值。單點(diǎn)估值函數(shù)只能估計(jì)一個(gè)空點(diǎn)的價(jià)值,對(duì)當(dāng)前的棋局,把所有的空點(diǎn)對(duì)己方的有利程度總和和不利程度總和相關(guān)就可得出全局價(jià)值。由文獻(xiàn)5. 6. 14可知。本系統(tǒng)中設(shè)定了以下幾種棋型和相應(yīng)的權(quán)值:表4.1防守棋型及其相應(yīng)權(quán)值表權(quán)值20000011006000240204.2棋型連五型沖四型活四型活三型死二活二型200024000850125根據(jù)不同棋型的權(quán)值可以計(jì)算出棋盤(pán)的各點(diǎn)的價(jià)值之和,用Vj表示點(diǎn)(i, j)的總價(jià)值,用Aj表布點(diǎn)(i, j)的進(jìn)攻價(jià)值,用 Dij表布點(diǎn)(i, j)的防守價(jià)值,用 dt表不防守優(yōu)先級(jí)數(shù),at表不 進(jìn)攻優(yōu)先級(jí)數(shù),其中防守和進(jìn)攻優(yōu)先級(jí)數(shù)是電腦在比較點(diǎn)( i, j)的

22、進(jìn)攻總價(jià)值和防守總價(jià)值后賦 予的,給總價(jià)值大的類(lèi)型設(shè)定優(yōu)先級(jí)數(shù)為2,而價(jià)值小的則為1。則點(diǎn)(i, j)的進(jìn)攻總價(jià)值為該點(diǎn)的所有進(jìn)攻棋型的和,計(jì)算方法為:;該點(diǎn)的防守總價(jià)值為該點(diǎn)的所有防守棋型的和,計(jì)算方法為:。則該點(diǎn)的總價(jià)值為:。用此方法就可遍歷棋盤(pán)上的所有的空點(diǎn)的總價(jià)值,然后比較所有總價(jià)值的大小,總價(jià)值最大的 點(diǎn)即為對(duì)自己最有利的點(diǎn)。4.6 悔棋流程悔棋是棋局類(lèi)游戲的必須的功能,在游戲時(shí),如果有人悔棋時(shí),立即調(diào)用悔棋功能函數(shù),本系 統(tǒng)中由于棋盤(pán)上的所有的交點(diǎn)都有一個(gè)二維數(shù)組的一組數(shù)據(jù)與之相對(duì)應(yīng),而且每次落子后會(huì)有一個(gè) 二維數(shù)組記錄相應(yīng)的信息(步數(shù),棋子顏色),因此此功能的實(shí)現(xiàn)依靠的是C中的循

23、環(huán)函數(shù)。4.7 輸贏判斷本模塊功能的實(shí)現(xiàn)依靠的是單點(diǎn)估值函數(shù)的思想,即每次落子之后,遍歷以該點(diǎn)為坐標(biāo)原點(diǎn)以 5為半徑的棋盤(pán)的交點(diǎn),分析原點(diǎn)的四個(gè)方向(橫向、豎向、兩條對(duì)角線),判斷是否有連五型棋 型,若有則產(chǎn)生輸贏,若沒(méi)有則遍歷整個(gè)棋盤(pán),查看是否棋盤(pán)已經(jīng)下滿,若已下滿則判定為和棋, 否則繼續(xù)游戲。5. 詳細(xì)設(shè)計(jì)5.1 畫(huà)出游戲界面本模塊是整個(gè)游戲系統(tǒng)的平臺(tái)性模塊,之后所有的功能都將依附該模塊來(lái)體現(xiàn),主要需實(shí)現(xiàn)棋 盤(pán)的繪制與游戲說(shuō)明。本游戲系統(tǒng)選擇的是15*15的棋盤(pán),利用制表符字符串打印輸出棋盤(pán),并且特別標(biāo)出天元位置,與四方星位。游戲的說(shuō)明主要有棋局動(dòng)態(tài)信息顯示,如何移動(dòng)光標(biāo),如何實(shí)現(xiàn) 落子,

24、如何悔棋以及退出。利用switch()語(yǔ)句,當(dāng)光標(biāo)坐標(biāo)(x, y)中x=0, y=0則畫(huà)出棋盤(pán)的左上角廠,y=14則畫(huà)出棋盤(pán)的右上角; ,0y14時(shí)則出棋盤(pán)的上邊線“丁” ;x=3或x=11時(shí),y=0則畫(huà)出棋盤(pán)的左邊線“卜”,y=3或y=11則畫(huà)出棋盤(pán)上的四方星位“+”,y=14則畫(huà)出棋盤(pán)的右邊線“T ,0y14時(shí)則出棋盤(pán)的交叉點(diǎn) “+” ; x=7, y=7則畫(huà)出棋盤(pán)的天元 “+,0y14時(shí)則出棋盤(pán)的交叉點(diǎn) “+” ; x=14, y=0則畫(huà)出棋盤(pán)的左下角“ l,y=14則畫(huà)出棋盤(pán)的右下角“,0y14時(shí)則出棋盤(pán)的下邊線,;當(dāng)x為0至ij 14的其他的值時(shí),y=0則畫(huà)出棋盤(pán)的左邊線“卜”,y=

25、14則畫(huà)出棋盤(pán)的右邊線“T ”, y為0到14的其他的值時(shí)畫(huà)出棋盤(pán)的交叉點(diǎn)7。棋盤(pán)上的交點(diǎn)稱(chēng)為位點(diǎn)(包括交叉點(diǎn),天元,四方星位,邊界交點(diǎn))。具體實(shí)現(xiàn)如以下程序(僅部分主要代碼):void printnode(NODE chessboard口15, int x, int y) / 打印棋盤(pán)上的一個(gè)點(diǎn) textcolor(CHESSBOARD);if(chessboardxy.step=0) if (x=cursor.x & y=cursor.y) textcolor(CURSOR); / 如果光標(biāo)在這個(gè)點(diǎn),改成光標(biāo)顏色 switch(x) case 0:if(y=0) printf(廠”);左上

26、角else if(y=14) printf( r ); / 右上角 else printf(“ 丁 );上邊線break;case 3:if(y=0) printf(“卜”);/ 左邊線else if(y=3 | y=11) printf( ); / 星位 else if(y=14) printf( T );/ 右邊線else printf( + );交叉點(diǎn)break;case 7:if(y=0) printf(“卜”);/ 左邊線else if(y=7) printf( );/ 星位else if(y=14) printf( T ); 右邊線 else printf( + );交叉點(diǎn)brea

27、k;case 11:if(y=0) printf(“卜”);/ 左邊線else if(y=3 | y=11) printf( ); / 星位 else if(y=14) printf( T ); 右邊線 else printf( + );交叉點(diǎn)break;case 14:if(y=0) printf( L);/ 左下角else if(y=14) printf();/ 右下角 else printf(,);下邊線break;default:if(y=0) printf(“卜”);/ 左邊線else if(y=14) printf( T ); 右邊線 else printf( + );交叉點(diǎn) vo

28、id printchessboard(NODE chessboard15)/ 輸出整個(gè)棋盤(pán)int i,j;char letter口= ABCDEFGHI JKLMNO n; for(i=0;i15;i+)/ 行textcolor(TEXTS); / 改為文本顏色printf(%2d,15-i);/ 打印行坐標(biāo)for(j=0;j15;j+)/ 列printnode(chessboard,i,j); / 打印棋盤(pán)的每一塊textcolor(TEXTS);printf(n); textcolor(TEXTS); printf( %s”,letter); printf(移動(dòng):方向鍵 改為文本顏色打印列

29、坐標(biāo)下棋:ENTERn 悔棋:U退出:F12n);圖5.2人機(jī)對(duì)戰(zhàn)電腦先手初始界面雙人對(duì)戰(zhàn)模式游戲的初始界面與人機(jī)對(duì)戰(zhàn)電腦先手初始界面一樣。圖5.1人機(jī)對(duì)戰(zhàn)玩家先手初始界面5.2畫(huà)出棋子本模塊是在畫(huà)出棋盤(pán)的基礎(chǔ)下實(shí)現(xiàn)的,要求依次輪流畫(huà)出黑白兩種顏色的棋子,且位置必須在 棋盤(pán)的位點(diǎn)之上,并且要求必須先畫(huà)黑棋,位置為棋盤(pán)的天元位。根據(jù)棋盤(pán)上光標(biāo)所在位置來(lái)下棋,如果當(dāng)前光標(biāo)所在位置上有棋子,則不能在此處落子,則需Enter (回車(chē)鍵)落子7。按下鍵盤(pán)上的方向鍵來(lái)移動(dòng)光標(biāo)到?jīng)]有棋子,且有利于局勢(shì)的位置按下 具體實(shí)現(xiàn)如以下程序(僅部分主要代碼):else if(chessboardxy.color=0)

30、 / 如果是白棋被選中的白棋 未被選中的黑棋if (x=cursor.x & y=cursor.y) textcolor(SELECTEDWHITE); / else textcolor(WHITECHESS); printf( );else打印棋子 if (x=cursor.x & y=cursor.y) textcolor(SELECTEDBLACK); else textcolor(BLACKCHESS); 被選中的黑棋未被選中的黑棋printf( ); /打印棋子光標(biāo)的移動(dòng)( 實(shí)現(xiàn)在棋盤(pán)上任意位置落子) :bool getmove(NODE chessboard15)/ 獲取光標(biāo)移動(dòng),

31、并響應(yīng)/ 當(dāng)按下悔棋、下子、退出熱鍵時(shí),返回truechar c; for(;) c=getch();if(c=-32)switch(getch()case 72: / 上cursor.x-;if(cursor.x14) cursor.x=14;renew(chessboard,cursor.x-1,cursor.y);renew(chessboard,cursor.x,cursor.y); break;case 75: / 左cursor.y-;if(cursor.y14) cursor.y=14;renew(chessboard,cursor.x,cursor.y-1);renew(che

32、ssboard,cursor.x,cursor.y); break;case 134: / 退出quit=true;return true; else if(c=13 & chessboardcursor.xcursor.y.step=0) return true; / 下子else if(c=U | c=u) / 悔棋regret=true; return true;本模塊實(shí)現(xiàn)的是游戲的規(guī)則,包括落子規(guī)則,悔棋規(guī)則,輸贏規(guī)則。5.3 設(shè)置棋局規(guī)則5.3.1落子規(guī)則本系統(tǒng)的實(shí)現(xiàn)整體上采用的是無(wú)禁手五子棋游戲規(guī)則。落子規(guī)則包括落子位置與落子順序。落子位置其實(shí)是對(duì)第一顆棋子的限定,即第一顆棋子必須

33、落在棋盤(pán)的天元(也就是棋盤(pán)的最中間),而后只規(guī)定了必須落在棋盤(pán)的位點(diǎn)之上,不能落在空白處,而落子順序其實(shí)是從第一次下子開(kāi)始的,且第一顆棋子必須是黑子,之后黑白棋就開(kāi)始輪流落子,直到產(chǎn)生輸贏為止。本系統(tǒng)中涉及到的五子棋的基本棋型有防御棋型和進(jìn)攻棋型兩類(lèi),具體有:連五型,活四型,沖四型,活三型,死三活二型五種,具體如下:圖5.5沖四型(黑棋)1.1.2 悔棋規(guī)則悔棋規(guī)則應(yīng)用于游戲的整個(gè)過(guò)程,在游戲產(chǎn)生輸贏之前的任意時(shí)候,只要玩家按下悔棋熱鍵, 就可進(jìn)行悔棋,且本系統(tǒng)中不限制悔棋步數(shù)。具體實(shí)現(xiàn)見(jiàn)5.5悔棋功能。1.1.3 輸贏規(guī)則本系統(tǒng)的輸贏規(guī)則是基于無(wú)禁手五子棋的輸贏規(guī)則,即對(duì)黑子沒(méi)有任何限制,只

34、要形成連五型 棋子就判定為勝利,當(dāng)棋盤(pán)上無(wú)法落子時(shí)仍然沒(méi)有產(chǎn)生輸贏,則判定為平局。具體實(shí)現(xiàn)見(jiàn)5.6判斷輸贏。5.4 實(shí)現(xiàn)雙人對(duì)戰(zhàn)本模塊實(shí)現(xiàn)的是兩個(gè)人類(lèi)玩家在一臺(tái)電腦上進(jìn)行游戲,本部分不涉及電腦的AI,只需要電腦提供一個(gè)平臺(tái)(顯示器的功能),本部分的實(shí)現(xiàn)較為簡(jiǎn)單,在以上兩個(gè)模塊即畫(huà)出棋盤(pán)模塊和畫(huà)出棋 子模塊功能實(shí)現(xiàn)的基礎(chǔ)上,兩個(gè)玩家就可以自由的進(jìn)行游戲,雙方通過(guò)依次控制電腦鍵盤(pán)上的方向 鍵移動(dòng)光標(biāo)到自己認(rèn)為合理的地方落子。每當(dāng)棋盤(pán)上有棋子落下以后,電腦需立即判斷是否已經(jīng)產(chǎn) 生輸贏,如果沒(méi)有產(chǎn)生輸贏則在棋盤(pán)動(dòng)態(tài)信息顯示處顯示該黑(或白)方下子,如果已經(jīng)產(chǎn)生輸贏 則在盤(pán)動(dòng)態(tài)信息顯示處顯示白(或黑)方

35、勝利!此時(shí)按任意鍵即可重新開(kāi)始游戲。5.5 悔棋功能本模塊的創(chuàng)建是根據(jù)現(xiàn)實(shí)中玩五子棋游戲時(shí)的實(shí)際存在的情況而編寫(xiě)的,當(dāng)玩家下棋后,發(fā)現(xiàn) 不是最佳的位置,或者是棋子沒(méi)有落在自己想要落的位置,發(fā)生偏離,此時(shí)就需要用到本模塊的功 能:悔棋功能。本游戲系統(tǒng)中,悔棋的功能實(shí)現(xiàn)主要是通過(guò)數(shù)組chessboard口15來(lái)完成的,當(dāng)系統(tǒng)接收到悔棋的消息時(shí)調(diào)用悔棋函數(shù)void beback(NODE chessboard15, int step),在雙人模式和人機(jī)模式中悔棋的方式是一樣的,當(dāng)棋盤(pán)上的棋子少于3 個(gè)時(shí),按下悔棋鍵時(shí),由于本系統(tǒng)的默認(rèn)設(shè)置(即第一顆棋子為黑棋,且位置必須在天元位置),所以系統(tǒng)判定此時(shí)

36、想悔棋的是白棋,故而去掉一顆白棋,棋盤(pán)為開(kāi)始游戲的初始界面,即棋盤(pán)上只有天元位置有一顆黑棋,此時(shí)光標(biāo)也回到剛剛白棋的位置。當(dāng)棋子多余3 個(gè)時(shí),按下悔棋鍵后,由于系統(tǒng)無(wú)法判定是白棋想悔棋,還是黑棋想悔棋,故而一次撤銷(xiāo)兩步,即當(dāng)該黑棋落子時(shí),按下了悔棋鍵,會(huì)撤銷(xiāo)兩步,即撤銷(xiāo)了白棋剛剛走的一步和黑棋剛剛走的那一步,光標(biāo)也回到剛剛黑棋的位置。此時(shí)如果是黑棋想悔棋則黑棋重新落子在其他不同于剛剛撤銷(xiāo)的那個(gè)位置,白棋則見(jiàn)招拆招,而如果是白棋想悔棋則黑棋把棋子下在原來(lái)的位置,此時(shí)白棋就可以重新落子在其他的位置,以此來(lái)實(shí)現(xiàn)悔棋8 。本游戲系統(tǒng)中沒(méi)有限制悔棋的步數(shù),可以無(wú)限制悔棋,直到第一步。具體實(shí)現(xiàn)程序如下(僅

37、部分主要代碼):void beback(NODE chessboard15, int step)/ 悔棋int i,j,tempx,tempy;if(step=1) return; /如果才開(kāi)始,直接返回if(step2) / 如果下了多于兩步for(i=0;i15;i+) / 搜索前兩步所下的位置for(j=0;j15;j+)if(chessboardij.step=step-1) / 找到上一步chessboardij.step=0; /清空棋子標(biāo)志renew(chessboard,i,j); / 重繪棋盤(pán)else if(chessboardij.step=step-2) / 找到上兩步c

38、hessboardij.step=0; /清空棋子標(biāo)志tempx=cursor.x; / 記錄光標(biāo)位置tempy=cursor.y;cursor.x=i; /將光標(biāo)回復(fù)到兩步前的位置cursor.y=j;renew(chessboard,i,j); /重繪棋盤(pán)renew(chessboard,tempx,tempy); / 重繪光標(biāo)原本所在處 else if(step=2) / 如果下了一步for(i=0;i15;i+) / 搜索上一步所下的位置for(j=0;j15;j+)if(chessboardij.step=step-1) / 找到上一步chessboardij.step=0; /清空

39、棋子標(biāo)志renew(chessboard,i,j); /重繪棋盤(pán)tempx=cursor.x; /記錄光標(biāo)位置tempy=cursor.y; cursor.x=7; cursor.y=7; /將光標(biāo)移回棋盤(pán)中央renew(chessboard,i,j); /重繪棋盤(pán)renew(chessboard,tempx,tempy); /重繪光標(biāo)原本所在處圖5.8悔棋A告建員:玳樂(lè)五子咀王勇制作.2LI1AB CDEF GH 1 J KL MNO二方向鍵下根:ENTER退出:N2圖5.9悔棋B5.6 判斷輸贏本模塊的功能是每當(dāng)棋子落下后判斷是否已經(jīng)產(chǎn)生輸贏,若已產(chǎn)生則重新開(kāi)始游戲,若沒(méi)有產(chǎn)生則判斷是否已

40、經(jīng)落子225步,如果已經(jīng)225步,則判定為雙方平局,并重新開(kāi)始游戲,如果沒(méi)有達(dá)到225步,則繼續(xù)游戲。本部分功能的實(shí)現(xiàn)主要也是通過(guò)二維數(shù)組chessboard口15,在雙人對(duì)戰(zhàn)和人機(jī)對(duì)戰(zhàn)中都調(diào)用bool inside(int x, int y), int line(NODE chessboard口15, int dirt, int x, int y, intcolor) , bool win(NODE chessboard口15, int x, int y, int color)三個(gè)函數(shù)來(lái)具體的實(shí)現(xiàn)該功能13。具體實(shí)現(xiàn)程序如下(僅部分主要代碼):bool inside(int x, int y

41、)/ 如果不在棋盤(pán)內(nèi)返回false ,否則返回trueif(x14 | y14) return false;return true; int line(NODE chessboard口15, int dirt, int x, int y, int color)/判斷顏色為color的點(diǎn)(x,y),在dirt方向上有多少相連的同色棋子int i;for(i=0;chessboardx+directiondirt0y+directiondirt1.step0 &chessboardx+directiondirt0y+directiondirt1.color=color;i+)x=x+directi

42、ondirt0; y=y+directiondirt1; if(!inside(x,y) return i; return i;bool win(NODE chessboard口15, int x, int y, int color)/判斷是否有人贏棋if(line(chessboard,0,x,y,color)+line(chessboard,1,x,y,color)3) return true;if(line(chessboard,2,x,y,color)+line(chessboard,3,x,y,color)3) return true;if(line(chessboard,4,x,y

43、,color)+line(chessboard,5,x,y,color)3) return true;if(line(chessboard,6,x,y,color)+line(chessboard,7,x,y,color)3) return true;return false;gotoxy(0,0); printf( gotoxy(0,0); printf(產(chǎn)生平局時(shí):如果下了 225步還沒(méi)人贏棋則平局);光標(biāo)回到原點(diǎn)位置平局!);苣理員;歡樂(lè)五子恨 王黃制作321 09 87J KL MNT: ENTERAECDEFGH I:方向鍵:U圖5.10判斷輸贏白棋贏圖5.11判斷輸贏黑棋贏F12)

44、,就可以退出游戲,直接5.7 退出游戲該模塊的功能為,在游戲進(jìn)行的任意時(shí)候,只要按下退出熱鍵(退到游戲的初始界面,但是當(dāng)游戲退出后,再次開(kāi)始游戲時(shí),為新的一局游戲,不能接著上次的繼續(xù)玩,即沒(méi)有設(shè)置保存功能if(quit) return; /8O如果按了退出熱鍵則返回5.8 實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)畫(huà)出棋子模塊、設(shè)置棋局規(guī)則模塊、悔棋功能模塊、該模塊功能的實(shí)現(xiàn)是在實(shí)現(xiàn)畫(huà)出棋盤(pán)模塊、 判斷輸贏模塊而的基礎(chǔ)之上而實(shí)現(xiàn)的。實(shí)現(xiàn)了上述模塊以后,開(kāi)始設(shè)計(jì)并實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)功能。本游戲系統(tǒng)中此模塊主要分為了以下幾 個(gè)功能模塊:1 .設(shè)置先手功能2 .電腦智能落子功能3 .可以悔棋、退出4 .顯示輸贏5.8.1 先手設(shè)置界面

45、在打開(kāi)本游戲系統(tǒng)之后,選擇人機(jī)對(duì)戰(zhàn)之后利用system(mode con cols=64 lines=24) 窗體函數(shù)設(shè)置窗口大小,然后用 system(color 2b)函數(shù)設(shè)置窗體背景顏色為綠色,然后在窗體中打印 出窗口內(nèi)容,即設(shè)置先手, 1.玩家先手,2.電腦先手和3.返回上級(jí)菜單,當(dāng)從鍵盤(pán)上輸入1,即本局游戲選擇玩家先手,開(kāi)始游戲電腦優(yōu)先防御;當(dāng)從鍵盤(pán)上輸入2,即本局游戲選擇電腦先手,開(kāi)始游戲電腦優(yōu)先進(jìn)攻;當(dāng)從鍵盤(pán)上輸入3,即返回上一層目錄菜單,不進(jìn)行游戲9。具體實(shí)現(xiàn)程序如下(僅部分主要代碼):/*對(duì)手是電腦*/showsubmenu(); /選擇誰(shuí)是先手void showsubmen

46、u()/打印子菜單system(cls);system(mode con cols=48 lines=21); 設(shè)置窗 口 大小system(color 2b);/ printf(nnnprintf(nn1.printf(2.printf(3.printf(n textcolor(TEXTS);設(shè)置窗體背景色設(shè)置先手:n);玩家先手nn) 電腦先手nn); 返回上級(jí)菜單n); 請(qǐng)選擇1-3:);圖5.12設(shè)置先手界面5.8.2 電腦智能落子(1)電腦先手在系統(tǒng)運(yùn)行之后選擇人機(jī)對(duì)戰(zhàn)模式后,選擇電腦先手,開(kāi)始游戲根據(jù)游戲的設(shè)置,電腦第一次 落的黑子在天元位置,且電腦落子時(shí)以進(jìn)攻優(yōu)先。本模塊采用的是

47、評(píng)估權(quán)值的方法,當(dāng)電腦落子時(shí),首先調(diào)用進(jìn)攻棋型函數(shù),通過(guò)函數(shù)來(lái)計(jì)算當(dāng) 黑子(電腦落子)落下后,該子所在位置的八個(gè)方向的權(quán)值大大小,若進(jìn)攻值的最大值比較大時(shí), 就在權(quán)值最大的位置落子,然后玩家落子,如此循環(huán),實(shí)現(xiàn)棋局的進(jìn)行,若是進(jìn)攻值的最大值比較 小時(shí),就調(diào)用防守棋型函數(shù),然后計(jì)算棋盤(pán)上的所有位置的防守權(quán)值的大小,然后比較最大進(jìn)攻值 與最大防守值得大小, 在值比較大的位置落子,即為最優(yōu)落子位置, 若是進(jìn)攻值與防守值大小相等,則優(yōu)先進(jìn)攻,即在進(jìn)攻值最大的位置落子。(2)玩家先手在系統(tǒng)運(yùn)行之后選擇人機(jī)對(duì)戰(zhàn)模式后,選擇玩家先手,開(kāi)始游戲根據(jù)游戲的設(shè)置,玩家第一次落的黑子在天元位置,然后電腦以落子時(shí)優(yōu)先

48、防御為準(zhǔn)則立馬響應(yīng)并在棋盤(pán)上落子。本模塊采用的是評(píng)估權(quán)值的方法,當(dāng)電腦落子時(shí),首先調(diào)用防守棋型函數(shù),通過(guò)函數(shù)來(lái)計(jì)算棋盤(pán)上的所有位置的防守權(quán)值的大小,若防守值的最大值比較大時(shí),就在權(quán)值最大的位置落子,然后玩家落子,如此循環(huán),實(shí)現(xiàn)棋局的進(jìn)行,若是防守值的最大值比較小時(shí),就調(diào)用進(jìn)攻棋型函數(shù),然后,然后比較最大進(jìn)攻值與最大防守值的大小,在值比較大的位置落子,即為最優(yōu)落子位置,若是進(jìn)攻值與防守值大小相等,則優(yōu)先防守,即在防守值最大的位置落子8 。具體實(shí)現(xiàn)程序如下(僅部分主要代碼):int attacktrend,defenttrend; /攻擊防御平衡權(quán)值bool macth1(NODE chessbo

49、ard15, int x, int y, int dirt, int kind, int color)/* 匹配在顏色為color 的點(diǎn) (x,y) ,在 dirt 方向上的第kind 種防守棋形,成功返回true ,否則返回false */int k;char c;char *p;p=strchr(qx1kind.qx,x);for(k=0;k=p-qx1kind.qx;k+) x-=directiondirt0;y-=directiondirt1; for(k=0;(unsigned)k0 & chessboardxy.color=color) c=2;else if(chessboardxy.step0) c=1;else c=0; if(c=0 & qx1kind.qxk=x) continue;if(c!=qx1kind.qxk) return(false); return true;int value_qx1(NODE chessboard15, int x, int y, int dirt, int color)/ 計(jì)算顏色為color 的點(diǎn) 8 個(gè)方向上的防守權(quán)值之和int i; for(i=0;iqx1_num;i+)if(mac

溫馨提示

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

評(píng)論

0/150

提交評(píng)論