版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> ---------- 大 學(xué)</p><p> C語(yǔ)言程序設(shè)計(jì) 課程設(shè)計(jì)(論文)</p><p> 題目: 黑白棋 </p><p> 院(系): </p><p> 專業(yè)班級(jí):
2、 </p><p> 學(xué) 號(hào): </p><p> 學(xué)生姓名: </p><p> 指導(dǎo)教師: </p><p> 教師職稱: </p>
3、;<p> 起止時(shí)間: </p><p> 課程設(shè)計(jì)(報(bào)告)任務(wù)及評(píng)語(yǔ)</p><p> 院(系): 教研室:</p><p><b> 目 錄</b></p><p> 第1章 課
4、程設(shè)計(jì)的目的與要求1</p><p> 1.1 課程設(shè)計(jì)目的1</p><p> 1.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境1</p><p> 1.3 課程設(shè)計(jì)的預(yù)備知識(shí)1</p><p> 1.4 課程設(shè)計(jì)要求1</p><p> 第2章 課程設(shè)計(jì)內(nèi)容2</p><p> 2.1程
5、序功能介紹2</p><p> 2.2程序整體設(shè)計(jì)說(shuō)明2</p><p> 2.2.1設(shè)計(jì)思路2</p><p> 2.2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及用法說(shuō)明2</p><p> 2.2.3程序結(jié)構(gòu)(流程圖)7</p><p> 2.2.4各模塊的功能及程序說(shuō)明8</p><p>
6、 2.2.5程序結(jié)果10</p><p> 2.3程序源代碼及注釋11</p><p> 第3章 課程設(shè)計(jì)總結(jié)16</p><p> 參考資料…………………………………………………………………………………… 17</p><p> 第1章 課程設(shè)計(jì)的目的與要求</p><p> 1.1 課程設(shè)計(jì)目的
7、</p><p> 本課程設(shè)計(jì)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)重要的實(shí)踐性環(huán)節(jié)之一,是在學(xué)生學(xué)習(xí)完《程序設(shè)計(jì)語(yǔ)言(C)》課程后進(jìn)行的一次全面的綜合練習(xí)。本課程設(shè)計(jì)的目的和任務(wù): </p><p> 1. 鞏固和加深學(xué)生對(duì)C語(yǔ)言課程的基本知識(shí)的理解和掌握 </p><p> 2. 掌握C語(yǔ)言編程和程序調(diào)試的基本技能 </p><p> 3. 利用
8、C語(yǔ)言進(jìn)行基本的軟件設(shè)計(jì)</p><p> 4. 掌握書寫程序設(shè)計(jì)說(shuō)明文檔的能力</p><p> 5. 提高運(yùn)用C語(yǔ)言解決實(shí)際問題的能力</p><p> 6.了解C語(yǔ)言與函數(shù)的關(guān)系</p><p> 7.掌握一些初等函數(shù)</p><p> 1.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境</p><p>
9、; 硬件要求能運(yùn)行Windows 2000/XP操作系統(tǒng)的微機(jī)系統(tǒng)。C語(yǔ)言程序設(shè)計(jì)及相應(yīng)的開發(fā)環(huán)境。</p><p> 1.3 課程設(shè)計(jì)的預(yù)備知識(shí)</p><p> 熟悉C語(yǔ)言及C語(yǔ)言開發(fā)工具。</p><p> 1.4 課程設(shè)計(jì)要求</p><p> 1. 分析課程設(shè)計(jì)題目的要求2. 寫出詳細(xì)設(shè)計(jì)說(shuō)明3. 編寫程序代碼,調(diào)試程
10、序使其能正確運(yùn)行4. 設(shè)計(jì)完成的軟件要便于操作和使用5. 設(shè)計(jì)完成后提交課程設(shè)計(jì)報(bào)告</p><p> 第2章 課程設(shè)計(jì)內(nèi)容</p><p><b> 2.1程序功能介紹</b></p><p> 這種棋通常是黑白兩個(gè)面。一方執(zhí)白,一方執(zhí)黑,每次在棋盤上走一個(gè)子。無(wú)論橫豎線或斜線均可。只要兩個(gè)同樣顏色的將另一個(gè)顏色的夾在中間了,就
11、可以將這個(gè)顏色翻過(guò)來(lái),最終看哪個(gè)要色多,即獲勝。我認(rèn)為勝利的根本是占邊。</p><p> 2.2程序整體設(shè)計(jì)說(shuō)明</p><p><b> 2.2.1設(shè)計(jì)思路</b></p><p> 首先可以用二維數(shù)組表示棋盤(比方可以是int[][],元素為“1”表示玩家甲的棋子,“2”表示玩家乙...) ,然后寫一個(gè)函數(shù)實(shí)現(xiàn)如下功能: 每下一子
12、,就利用下標(biāo)檢測(cè)此子周圍8個(gè)元素(邊上的沒有這么多,就要通過(guò)下標(biāo)的限制了)有沒有相同的,有的話,累計(jì)(要考慮分4種情況累計(jì),橫豎斜),并調(diào)用相應(yīng)方向的函數(shù)檢測(cè)那些相同的元素,沒有就跳過(guò)繼續(xù)。 再寫四個(gè)函數(shù)(檢測(cè)橫豎斜4個(gè)方向的) 最后主函數(shù)完善。</p><p> 2.2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及用法說(shuō)明 </p><p> 現(xiàn)在有如圖示的這樣一個(gè)棋局,輪到電腦下棋。現(xiàn)在它發(fā)現(xiàn)有這樣三個(gè)地方可
13、以下:e3,c3,c5。這三種下法分別會(huì)形成三種局面:A、B、C。如果是人在下棋,就會(huì)思考:那一種下法更好呢?比如A被別人占角,B沒什么變化,C占了別人的角。當(dāng)然棋手會(huì)選擇下C。電腦也是如此,它會(huì)對(duì)每一種棋局評(píng)一個(gè)分,比如它判斷,如果被別人占角,就減80分,相反占別人的角就加80分。那么A=-80分,B=0分,C=80分。電腦會(huì)選擇下C。電腦程序?qū)ζ寰衷u(píng)分的部分,稱為“估值函數(shù)”(Evaluation Function)。真正的估值函數(shù)
14、當(dāng)然不會(huì)這么簡(jiǎn)單。它會(huì)用到技巧篇提到的如行動(dòng)力、潛在行動(dòng)力、余裕手、邊角判斷、穩(wěn)定子等綜合因素來(lái)判斷。具體的估值函數(shù),我會(huì)在“估值函數(shù)”一節(jié)中詳細(xì)講述。</p><p><b> 初始棋局(-1)</b></p><p> ------------------+------------------</p><p> |
15、60; | |</p><p> e3
16、 c3 c5</p><p> (A)
17、160; (B) (C) </p><p> 接下來(lái),如果人就這么判斷。那么它頂多也就是個(gè)初學(xué)者。為什么呢?因?yàn)樗粫?huì)推理,碰到對(duì)手棄角之類的戰(zhàn)術(shù),如“邊角判斷”中示例的一些情況,就輸?shù)靡凰苛?。?dāng)然,可以告
18、訴電腦,碰到“邊角判斷”中的幾種情況,就如何如何下。但是,真實(shí)的棋局是非常復(fù)雜的,電腦(也包括人腦)幾乎不可能對(duì)動(dòng)態(tài)的棋局給出靜態(tài)的評(píng)估。因?yàn)閷?shí)際對(duì)局總會(huì)出現(xiàn)這樣那樣的情況,是無(wú)法預(yù)先估計(jì)的。碰到這些情況,人就會(huì)向后推幾步,看一看會(huì)是怎樣的一個(gè)局面。一些棋類大師往往可以推十幾步甚至更深。電腦也是如此。 </p><p> 還是剛才那一幅圖的演化。</p><p><b> 甲
19、方下棋</b></p><p><b> -</b></p><p><b> 乙方下棋</b></p><p><b> -</b></p><p><b> 初始棋局</b></p><p> ------
20、------------+------------------</p><p> | |
21、; |</p><p> e3 c3 c5</p&g
22、t;<p> -----+----- ----+---- -----+-----</p><p> | | | | | | | | |
23、; | | | | |</p><p> f2 f3 f4 f5 f6 c2 d3 e6 f5 b6 c6 d6 e6 f6 </p><p> +84+36+12 +5 -1
24、0; +11 -1 +6 +6 +6 +0 -5 +3 +5 </p><p> 電腦在自己下棋以后,把對(duì)手的下棋情況也推理出來(lái)。然后加以評(píng)分。(最下一排是電腦評(píng)估的得分)這一次電腦又如何下呢?這時(shí)電腦假設(shè)對(duì)手是高手。如果電腦下e3,對(duì)手就會(huì)下對(duì)電腦最不利的情況f6。同樣,電腦下c3,對(duì)手就會(huì)下d3,電腦下c5,對(duì)手就會(huì)下d6。這三種情況,c5是最不好的
25、(因?yàn)閏5的下一步d6的得分最低),c3與e3一樣。因此電腦會(huì)下c3或者e3。用程序化的語(yǔ)言這樣描述: </p><p> 如上圖所示棋局,設(shè)電腦為白棋,推理深度為2,可以形成如下的樹:(數(shù)字為節(jié)點(diǎn)值)</p><p><b> 初始棋局</b></p><p><b> -</b></p><p
26、><b> 白棋下棋之后</b></p><p><b> -</b></p><p><b> 黑棋下棋之后</b></p><p><b> 估值</b></p><p><b> 初始棋局(-1)</b><
27、/p><p> ------------------+------------------</p><p> | |
28、0; |</p><p> e3(-1) c3(-1) c5(-5)</p>
29、;<p> -----+----- ----+---- -----+-----</p><p> | | | | | | | | |
30、 | | | | |</p><p> f2 f3 f4 f5 f6 c2 d3 e6 f5 b6 c6 d6 e6 f6 </p><p> +84+36+12 +5 -1
31、; +11 -1 +6 +6 +6 +0 -5 +3 +5 </p><p> 結(jié)果:應(yīng)該下e3或c3</p><p> 具體實(shí)現(xiàn)的偽算法類似于經(jīng)典的八皇后問題。</p><p> 還有幾種alpha-beta算法的改進(jìn)型,最廣泛采用的是NegaScout,(Alexander Reinefeld發(fā)明)
32、,但它和一般的alpha-beta剪枝算法沒有根本的不同。其他的還有PVS和SSS*。下面舉例說(shuō)明。 </p><p> 還是基于剛才的棋形,假設(shè)先搜索e3-f2 f3 f4 f5 f6、再c3-c2 d3 e6 f5、再c5-b6 c6 d6 e6 f6,即從左至右的順序的深度優(yōu)先搜索。則搜索到d3分枝之后,就不用搜索e6和f5了。因?yàn)槿绻酉聛?lái)的值比d3大,就不會(huì)賦值給c3,如果比d3小,賦值給c3后,也不
33、會(huì)賦給根節(jié)點(diǎn),因?yàn)楦?jié)點(diǎn)取最大的值,現(xiàn)在根節(jié)點(diǎn)的值是-1,不會(huì)取更小的值。同樣的,搜索d6后,也不用搜索e6、f6了,也就是說(shuō),搜索到比-1還小的值之后,就不用搜索了。 </p><p> 在搜索過(guò)程中,電腦下棋結(jié)點(diǎn)的當(dāng)前最優(yōu)值被稱為α 值(即初始棋局的值),對(duì)手下棋結(jié)點(diǎn)的當(dāng)前最優(yōu)值被稱為 β值(即例子中C3的值)。在搜索過(guò)程中,α 值遞增,β值遞減,兩者構(gòu)成了一個(gè)區(qū)間。這個(gè)區(qū)間被稱為窗口,而對(duì)手下棋的結(jié)點(diǎn)最終
34、的最優(yōu)值將落在這個(gè)窗口中。一旦在電腦下棋的結(jié)點(diǎn)得到其子結(jié)點(diǎn)的返回值大于β 值,則發(fā)生剪枝。</p><p><b> 初始棋局(-1)</b></p><p> ------------------+------------------</p><p> |
35、0; | |</p><p> e3(-1)
36、60; c3(-1) c5(-5)</p><p> -----+----- ----+---- -----+-----</p><p>
37、 | | | | | | | | | | | | | |</p><p> f2 f3 f4 f5 f6 c2 d3 e6 f5
38、160; b6 c6 d6 e6 f6</p><p> +84+36+12 +5 -1 +11 -1 +6 +6 +6 +0 -5 +3 +5</p><p> 這是一個(gè)程序中最重要的部分,如果這個(gè)模塊太弱,則就算算法再好也沒有用。這里將要敘述三種不同的估值函數(shù)范例。
39、大多數(shù)的黑白棋程序都可以歸結(jié)于此。 </p><p><b> 1、棋格表 </b></p><p> 這種算法的意思是,不同的棋格有不同的值,角的值大而角旁邊的格子值要小。忽視對(duì)稱的話,棋盤上有10個(gè)不同的位置,每個(gè)格子根據(jù)三種可能性賦值:黑棋、白棋和空。更有經(jīng)驗(yàn)的逼近是在游戲的不同階段對(duì)格子賦予不同的值。例如,角在開局階段和中局開始階段比終局階段更重要。 &l
40、t;/p><p> 2、基于行動(dòng)力的估值 </p><p> 這種更久遠(yuǎn)的接近有很強(qiáng)的全局觀,而不像棋格表那樣局部化。觀察表明,許多人類玩者努力獲得最大的行動(dòng)力(可下棋的數(shù)目)和潛在行動(dòng)力(臨近對(duì)手棋子的空格,見技巧篇)。如果代碼有效率的話,可以很快發(fā)現(xiàn),它們提高棋力很多。和另一種人類的策略一樣,許多基于行動(dòng)力估值的程序同時(shí)還有一些邊角配置的知識(shí),試圖在中盤早期使棋子最少。</p&g
41、t;<p> 3、基于模版的估值 </p><p> 正如上面提及的,許多中等力量的程序經(jīng)常合并一些邊角判斷的知識(shí),最大行動(dòng)力和潛在行動(dòng)力是全局特性,但是他們可以被切割成局部配置,再加在一起。棋子最少化也是如此。 這導(dǎo)致了以下的概括:在估值函數(shù)中僅用局部配置(模版),通常單獨(dú)計(jì)算每一行、一列、斜邊和角落的模板,再線性疊加在一起來(lái)實(shí)現(xiàn)。并且,配置情況的值非常依賴于游戲的不同階段。比如,一條邊有33
42、21種配置情況((3^8-3^4)/2+3^4),每種情況的分值好壞在游戲的不同階段都不相同。分值基于強(qiáng)力玩者和程序的游戲結(jié)果統(tǒng)計(jì),他們存于數(shù)據(jù)庫(kù)中,游戲啟動(dòng)時(shí)自動(dòng)調(diào)入。 </p><p> 常見的有這樣一些模板: </p><p><b> 表2.1數(shù)據(jù)表</b></p><p><b> 4、估值合并</b>&l
43、t;/p><p> 一般程序的估值基于許多的參數(shù),如行動(dòng)力、潛在行動(dòng)力、余裕手、邊角判斷、穩(wěn)定子(見技巧篇)。但是怎么樣將他們合并起來(lái)得到一個(gè)估值呢?為了提高速度,一般的程序采用線性合并。設(shè)a1,a2,a3,a4為參數(shù),則估值s:=n1*a1+n2*a2+n3*a3+n4*a4。其中n1,n2,n3,n4為常數(shù),術(shù)語(yǔ)叫“權(quán)重”(weight),它決定了參數(shù)的重要性,來(lái)自于統(tǒng)計(jì)值。</p><p&
44、gt; 所的強(qiáng)力程序都采用了開局定式,許多頂級(jí)程序的定式大多來(lái)自IOS游戲。對(duì)于強(qiáng)力的程序而言,他會(huì)在每一次對(duì)局結(jié)束以后升級(jí)定式,因此,對(duì)于有自學(xué)習(xí)功能的電腦來(lái)說(shuō),用上一次擊敗電腦的戰(zhàn)術(shù)對(duì)付電腦是不會(huì)管用的。另一方面,具有自學(xué)習(xí)功能的電腦的中局棋力也會(huì)越來(lái)越強(qiáng),原因是電腦會(huì)通過(guò)不斷升級(jí)估值函數(shù)的權(quán)重來(lái)提高棋力。TD(Temporal Difference)就是一個(gè)實(shí)用的強(qiáng)化學(xué)習(xí)技術(shù)。一個(gè)應(yīng)用了該技術(shù)的國(guó)際象棋程序在國(guó)際互聯(lián)網(wǎng)上進(jìn)行了3
45、00多局對(duì)局后,其等級(jí)分從1650分(一般水平)上漲到了2110分。</p><p><b> 5、終局</b></p><p> 終局是電腦的強(qiáng)項(xiàng),它的搜索比中局快得多,主要有這樣幾個(gè)理由:</p><p> 1.終局的估值函數(shù)很簡(jiǎn)單,他只用看雙方誰(shuí)勝了,估值就等于電腦的棋子減去對(duì)手的棋子。而不用判斷行動(dòng)力、潛在行動(dòng)力、余裕手、邊角判斷
46、和穩(wěn)定子。</p><p> 2.終局的搜索由于空格越來(lái)越少,使得搜索節(jié)點(diǎn)很少。如深度為5的搜索,中盤時(shí)葉子節(jié)點(diǎn)平均為10*10*10*10*10=100000,而終局時(shí)最大為5*4*3*2*1=120。</p><p> 3.哈希表在終局時(shí)效率更高。</p><p> 因?yàn)殡S著游戲向終局接近,玩者可下的位置逐漸減少,在終局階段程序可以搜索得更深。這使得他們?cè)?/p>
47、終局比人類下得更好。看計(jì)算機(jī)在終局下棋經(jīng)常感到不可思議,因?yàn)殡p方都在游戲結(jié)束20步以前知道了游戲的結(jié)果。對(duì)計(jì)算機(jī)而言,終局早在人類玩家中局結(jié)尾時(shí)就開始了,離游戲結(jié)束還有20-30步。</p><p> 2.2.3程序結(jié)構(gòu)(流程圖)</p><p> 此流程圖為初始畫棋盤部分</p><p> 圖2.1與人機(jī)對(duì)戰(zhàn)部分流程圖</p><p>
48、; 2.2.4各模塊的功能及程序說(shuō)明</p><p> 黑白棋程序的整體流程是主函數(shù)main()通過(guò)調(diào)用圖形系統(tǒng)初始化函數(shù)initgraph()、棋盤繪制函數(shù)DrawQp()、對(duì)戰(zhàn)函數(shù)Playtoplay()以及關(guān)閉圖形系統(tǒng)函數(shù)closegraph()來(lái)實(shí)現(xiàn)游戲程序。函數(shù)DrawQp()繪制棋盤并進(jìn)行游戲狀態(tài)初始化。對(duì)戰(zhàn)函數(shù)playtoplay()使用兩個(gè)嵌套的while循環(huán)來(lái)模擬走棋的過(guò)程,外層循環(huán)用來(lái)變換
49、棋手,內(nèi)層循環(huán)用來(lái)模擬棋手的具體走棋過(guò)程,關(guān)鍵是調(diào)用函數(shù)QpChange()來(lái)判斷棋盤的變化。按Esc鍵直接退出游戲。</p><p> 除此之外,實(shí)現(xiàn)黑白棋游戲的其他函數(shù)包括SetPlayColor()、MoveColor()、DoScore() 、PrintScore()等。函數(shù)SetPlayColor()用來(lái)設(shè)置棋子的初始顏色為黑色和白色。函數(shù)MoveColor()完成恢復(fù)棋盤原始狀態(tài)的功能:棋手每走完一
50、步棋后,該函數(shù)恢復(fù)棋盤格子的原始狀態(tài),即如果是從起點(diǎn)出發(fā)就將格子恢復(fù)為紅色,其他情況如果是1,則恢復(fù)白色棋子,是2則恢復(fù)黑色棋子。函數(shù)DoScore()用來(lái)處理棋手所得的分?jǐn)?shù)。函數(shù)PrintScore()完成在不同的位置輸出棋手的成績(jī)。函數(shù)PlayWin()輸出最后勝利者的結(jié)果信息。</p><p> 黑白棋游戲的棋盤由8*8個(gè)格子組成,每個(gè)格子的大小為40*40的屏幕像速。棋盤左上角的坐標(biāo)為(100,100)
51、,右下角的坐標(biāo)為(420,420),棋盤左上角格子的中心坐標(biāo)為x=120,y=120.游戲中棋子為半徑15像速的圓,分別填充為黑色和白色。</p><p> 程序采用8*8二維數(shù)組Map來(lái)存放對(duì)局雙方對(duì)弈情況——即雙方在棋盤上的對(duì)弈棋子。</p><p> 數(shù)組元素Map[0][0]在棋盤左上角第一個(gè)位置相對(duì)應(yīng),數(shù)組元素Map[0][1]與棋盤第一行第二個(gè)位置相對(duì)應(yīng),以此類推。因此,數(shù)
52、組元素Map[7][0]對(duì)應(yīng)著棋盤左下角的落子位置,元素Map[7][7]對(duì)應(yīng)著棋盤右下角位置棋子。程序約定:數(shù)組元素值為1代表黑方,2代表白方,否則說(shuō)明棋盤上該位置對(duì)弈雙方尚未落子。棋手下棋時(shí),棋子每次都在棋盤左上方的初始位置(120,80)出現(xiàn),以供游戲者移動(dòng)。</p><p> 程序中用變量x、y分別代表當(dāng)前棋子的橫、縱坐標(biāo)(x、y)。用下棋手?jǐn)?shù)t來(lái)標(biāo)識(shí)對(duì)弈棋手,t不能被2整除則代表黑方,能被2整除則代表
53、白方棋手。因此根據(jù)下棋手?jǐn)?shù)t記錄黑、白雙方對(duì)弈棋局Map的代碼為:</p><p> If(t%2==1) /*黑方棋手,則將棋盤數(shù)組中對(duì)應(yīng)元素置1*/</p><p> Map[(x-120)/40][(y-120)/40]=1;</p><p> Else /*白方棋手,則將棋盤數(shù)組中對(duì)應(yīng)元素置2*/</p><p&
54、gt; Map[(x-120)/40][(y-120)/40]=2;</p><p> 游戲中判斷對(duì)弈雙方是否可以在當(dāng)前位置(x,y)落子是實(shí)現(xiàn)的關(guān)鍵。落子的判斷條件為:當(dāng)前位置(x ,y)不是初始位置(120,80)。同時(shí)在該位置黑、白雙方尚未落子,并且可以翻轉(zhuǎn)對(duì)方棋子時(shí),方可在當(dāng)前位置落子。程序首先進(jìn)行判斷:</p><p> Y!=80&&Map[(x-120)
55、/40][(y-120)/40]!=1&&Map[(x-120)/40][(y-120)/40]!=2</p><p> 即當(dāng)前棋子位置不是初始位置,并且雙方均未落子。</p><p> 在滿足上述條件的前提下,通過(guò)調(diào)用函數(shù)QpChange()來(lái)判斷當(dāng)前下棋位置是否樂意翻轉(zhuǎn)對(duì)方棋子,并最終確定此置是否可以落子。函數(shù)QpChange()入口參數(shù)包括落子當(dāng)前的位置坐標(biāo)(x,
56、y),以及下棋手?jǐn)?shù)t。函數(shù)根據(jù)當(dāng)前棋局的情況,即記錄在數(shù)組Map中的游戲雙方對(duì)弈的內(nèi)容,以棋手下棋的當(dāng)前位置為中心對(duì)棋盤的八個(gè)方向進(jìn)行判斷,決定是否可以使對(duì)方棋子翻轉(zhuǎn),同時(shí)修改被翻轉(zhuǎn)棋子的顏色,最后將棋盤修改標(biāo)記yes返回。</p><p> 這里以向右的判斷為例,來(lái)說(shuō)明函數(shù)QpChange()的具體實(shí)現(xiàn):初始時(shí)棋盤修改標(biāo)記yes為0,即為棋子翻轉(zhuǎn)。通過(guò)行列坐標(biāo)交換計(jì)算當(dāng)前棋子在棋盤數(shù)組Map中的,當(dāng)棋子位于棋
57、盤8列中的前6列時(shí)才向右進(jìn)行判斷;遇到己方棋子或空格時(shí)停止,并將位于兩位置間的對(duì)方棋子變?yōu)榧悍筋伾钠遄?。若存在被改變顏色的棋子,則置位棋盤修改標(biāo)記yes為1。若無(wú)棋子顏色翻轉(zhuǎn),則不做修改,其他7個(gè)方向的情況類似。</p><p> 程序通過(guò)檢測(cè)方向鍵來(lái)移動(dòng)旗子,移動(dòng)一步后重復(fù)落子條件的判斷,滿足落子條件則落子,然后換對(duì)手下棋,若累計(jì)嘗試落子次數(shù)超過(guò)棋盤上剩余空格的數(shù)量時(shí),當(dāng)前棋手失去一次落子機(jī)會(huì),換對(duì)手下棋。
58、</p><p> 游戲者分?jǐn)?shù)score的更新通過(guò)函數(shù)DoScore()實(shí)現(xiàn)。該函數(shù)通過(guò)統(tǒng)計(jì)保存對(duì)弈情況數(shù)組Map的元素值實(shí)現(xiàn)對(duì)棋手得分的更新。</p><p><b> 2.2.5程序結(jié)果</b></p><p><b> 圖2.2輸入棋圖</b></p><p> 圖2.3輸入棋起始圖&
59、lt;/p><p> 圖2.4黑白棋運(yùn)行圖</p><p> 2.3程序源代碼及注釋</p><p> #include "graphics.h" /*圖形系統(tǒng)頭文件*/</p><p> #define LEFT 0x4b00 /*光標(biāo)左鍵值*/</p><p> #define RIG
60、HT 0x4d00 /*光標(biāo)右鍵值*/</p><p> #define DOWN 0x5000 /*光標(biāo)下鍵值*/</p><p> #define UP 0x4800 /*光標(biāo)上鍵值*/</p><p> #define ESC 0x011b /* ESC鍵值*/</p><p> #define ENTER 0x1c0d /*
61、回車鍵值*/</p><p> int a[8][8]={0},key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/</p><p> char playone[3],playtwo[3];/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/</p><p> void playtoplay(void);/*人人對(duì)戰(zhàn)函數(shù)*/</p>&l
62、t;p> void DrawQp(void);/*畫棋盤函數(shù)*/</p><p> void SetPlayColor(int x);/*設(shè)置棋子第一次的顏色*/</p><p> void MoveColor(int x,int y);/*恢復(fù)原來(lái)棋盤狀態(tài)*/</p><p> int QpChange(int x,int y,int z);/*判斷
63、棋盤的變化*/</p><p> void DoScore(void);/*處理分?jǐn)?shù)*/</p><p> void PrintScore(int n);/*輸出成績(jī)*/</p><p> void playWin(void);/*輸出勝利者信息*/</p><p> /******主函數(shù)*********/</p>&
64、lt;p> void main(void)</p><p><b> {</b></p><p> int gd=DETECT,gr;</p><p> initgraph(&gd,&gr,"c:\\tc"); /*初始化圖形系統(tǒng)*/</p><p> DrawQp()
65、;/*畫棋盤*/</p><p> playtoplay();/*人人對(duì)戰(zhàn)*/</p><p><b> getch();</b></p><p> closegraph();/*關(guān)閉圖形系統(tǒng)*/</p><p><b> }</b></p><p> void D
66、rawQp()/*畫棋盤*/</p><p><b> {</b></p><p><b> int i,j;</b></p><p> score1=score2=0;/*棋手一開始得分都為0*/</p><p> setbkcolor(BLUE);</p><p>
67、; for(i=100;i<=420;i+=40)</p><p><b> {</b></p><p> line(100,i,420,i);/*畫水平線*/</p><p> line(i,100,i,420); /*畫垂直線*/</p><p><b> }</b></p
68、><p> setcolor(0);/*取消圓周圍的一圈東西*/</p><p> setfillstyle(SOLID_FILL,15);/*白色實(shí)體填充模式*/</p><p> fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/</p><p> setfillstyle(SOLID_FILL,8)
69、; /*黑色實(shí)體填充模式*/</p><p> fillellipse(500,300,15,15);</p><p> a[3][3]=a[4][4]=1;/*初始兩個(gè)黑棋*/</p><p> a[3][4]=a[4][3]=2;/*初始兩個(gè)白棋*/</p><p> score1=score2=2; /*有棋后改變分?jǐn)?shù)*/<
70、;/p><p> DoScore();/*輸出開始分?jǐn)?shù)*/</p><p><b> }</b></p><p> void playtoplay()/*人人對(duì)戰(zhàn)*/</p><p><b> {</b></p><p> int x,y,t=1,i,j,cc=0;&l
71、t;/p><p> while(1)/*換棋手走棋*/</p><p><b> {</b></p><p> x=120,y=80;/*每次棋子一開始出來(lái)的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/</p><p> while(1) /*具體一個(gè)棋手走棋的過(guò)程*/</p><p><b>
72、 {</b></p><p> PrintScore(1);/*輸出棋手1的成績(jī)*/</p><p> PrintScore(2);/*輸出棋手2的成績(jī)*/</p><p> SetPlayColor(t);/*t變量是用來(lái)判斷棋手所執(zhí)棋子的顏色*/</p><p> fillellipse(x,y,15,15);<
73、;/p><p> key=bioskey(0);/*接收按鍵*/</p><p> if(key==ESC)/*跳出游戲*/</p><p><b> break;</b></p><p><b> else</b></p><p> if(key==ENTER)/*如
74、果按鍵確定就可以跳出循環(huán)*/</p><p><b> {</b></p><p> if(y!=80&&a[(x-120)/40][(y-120)/40]!=1</p><p> &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/</p><p&
75、gt;<b> {</b></p><p> if(t%2==1)/*如果是棋手1移動(dòng)*/</p><p> a[(x-120)/40][(y-120)/40]=1;</p><p> else/*否則棋手2移動(dòng)*/</p><p> a[(x-120)/40][(y-120)/40]=2</p>
76、<p> DoScore();/*分?jǐn)?shù)的改變*/</p><p> break;/*棋盤變化了,則輪對(duì)方走棋*/</p><p><b> }</b></p><p> else/*已經(jīng)有棋子就繼續(xù)按鍵*/</p><p><b> continue;</b></p>
77、;<p><b> }</b></p><p> else /*四個(gè)方向按鍵的判斷*/</p><p> if(key==LEFT&&x>120)/*左方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);&l
78、t;/p><p> fillellipse(x,y,15,15);</p><p> SetPlayColor(t);</p><p><b> x-=40;</b></p><p> fillellipse(x,y,15,15);</p><p><b> }</b>
79、</p><p><b> else</b></p><p> if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);</p>&
80、lt;p> fillellipse(x,y,15,15);</p><p> SetPlayColor(t);</p><p><b> x+=40;</b></p><p> fillellipse(x,y,15,15);</p><p><b> }</b></p>
81、<p><b> else</b></p><p> if(key==UP&&y>120)/*上方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);</p><p> fillellipse(x,y,15,15
82、);</p><p> SetPlayColor(t);</p><p><b> y-=40;</b></p><p> fillellipse(x,y,15,15);</p><p><b> }</b></p><p><b> else</b
83、></p><p> if(key==DOWN&&y<400)/*下方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);</p><p> fillellipse(x,y,15,15);</p><p> SetP
84、layColor(t);</p><p><b> y+=40;</b></p><p> fillellipse(x,y,15,15);</p><p> t=t%2+1; /*一方走后,改變棋子顏色即輪對(duì)方走*/</p><p> cc=0; /*計(jì)數(shù)值恢復(fù)為0*/</p><p>
85、 } /*endwhile*/</p><p><b> }</b></p><p> void SetPlayColor(int t)/*設(shè)置棋子顏色*/</p><p><b> {</b></p><p> if(t%2==1)</p><p> setfi
86、llstyle(SOLID_FILL,15);/*白色*/</p><p><b> else</b></p><p> setfillstyle(SOLID_FILL,8);/*灰色*/</p><p><b> }</b></p><p> void MoveColor(int x,in
87、t y)/*走了一步后恢復(fù)原來(lái)格子的狀態(tài)*/</p><p><b> {</b></p><p> if(y<100)/*如果是從起點(diǎn)出發(fā)就恢復(fù)藍(lán)色*/</p><p> setfillstyle(SOLID_FILL,BLUE);</p><p> else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色
88、棋子,或恢復(fù)藍(lán)色棋盤*/</p><p> switch(a[(x-120)/40][(y-120)/40])</p><p><b> {</b></p><p><b> case 1:</b></p><p> setfillstyle(SOLID_FILL,15);break; /*
89、白色*/</p><p><b> case 2:</b></p><p> setfillstyle(SOLID_FILL,8);break; /*黑色*/</p><p><b> default:</b></p><p> setfillstyle(SOLID_FILL,BLUE);
90、/*藍(lán)色*/</p><p><b> }</b></p><p><b> }</b></p><p> 第3章 課程設(shè)計(jì)總結(jié)</p><p> 通過(guò)本次C程序課程設(shè)計(jì),我覺得對(duì)計(jì)算機(jī)的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)的作用及C語(yǔ)言的使用都有了更深入的了解。尤其是C語(yǔ)言的進(jìn)步讓我深刻感受到任何所學(xué)的知識(shí)都需
91、要實(shí)踐,沒有實(shí)踐就無(wú)法真正這些知識(shí)以及掌握它們,使其成為自己的知識(shí)。</p><p> 同時(shí)也對(duì)自己提高很大:克服了的偷懶的毛病,這在我以后的學(xué)習(xí)和工作中的心理定位與調(diào)節(jié)有很大的幫助。我感受到了編程是一項(xiàng)非常煩瑣周密的活動(dòng),他不但需要一個(gè)人周密的思考問題的能力,處理問題的能力,還需要有足夠的耐心和嚴(yán)謹(jǐn)治學(xué)的作風(fēng),來(lái)不得半點(diǎn)馬虎。</p><p> 本次我通過(guò)課程設(shè)計(jì)學(xué)會(huì)了團(tuán)體合作也初步
92、學(xué)會(huì)了論文設(shè)計(jì)的基本方法,學(xué)會(huì)了怎樣去借鑒別人的方法和經(jīng)驗(yàn),知道如何去查找資料和整合處理這些資料的能力,這為以后的大學(xué)畢業(yè)設(shè)計(jì)論文打下了一個(gè)初步的基礎(chǔ)使我收益最大的是享受到了一種成功的喜悅,在這兩個(gè)星期之中從開始的確定論文題目,然后是上網(wǎng)和上圖書館查找資料,編寫C語(yǔ)言原程序,然后是進(jìn)行編譯,這個(gè)環(huán)節(jié)是一個(gè)非常痛苦和艱難的,常常會(huì)因?yàn)橐恍↑c(diǎn)的錯(cuò)誤而在編譯失敗與再次修改的漫漫循環(huán)之路中,但失敗的越多,對(duì)人的考驗(yàn)就越多,在編譯運(yùn)行成功之后的享
93、受成功的喜悅也就越多,另外在調(diào)試程序的過(guò)程中不斷的思考和運(yùn)用已經(jīng)學(xué)到的知識(shí),這對(duì)于自己是有很大的提高的。 </p><p> 這個(gè)黑白棋游戲原程序的最大特點(diǎn)是采用了在主函數(shù)中調(diào)用子函數(shù)思想,每一種功能都是用子函數(shù)
94、的辦法來(lái)進(jìn)行處理,簡(jiǎn)潔,清晰,方便,不容易出現(xiàn)錯(cuò)誤。 在輸入錯(cuò)誤時(shí)本來(lái)想用一種警告的鈴聲來(lái)提醒用戶,由于所學(xué)的知識(shí)不多,自己的編程經(jīng)驗(yàn)不足,按現(xiàn)有的知識(shí)水平有些東西暫時(shí)還無(wú)法解決,還有待于在以后的學(xué)習(xí)中不斷提高和改進(jìn)!</p><p> 通過(guò)這次我了解C語(yǔ)言的重要性,我而且也學(xué)會(huì)了C語(yǔ)言與函數(shù)是緊密相關(guān)的,所以我今后一定會(huì)好好學(xué)習(xí)C語(yǔ)言。能夠在社會(huì)和生活中起到實(shí)際重用,同時(shí)也讓我明白了科技的深?yuàn)W與奇妙。<
95、/p><p><b> 參考資料</b></p><p> [1] 蔡先華 《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》.2001年版.北京. 高等教育出版社.2001.240頁(yè)</p><p> [2] 何光明,楊靜宇.《C語(yǔ)言程序設(shè)計(jì)與應(yīng)用開發(fā)》.第2版.北京:清華大學(xué)出版社,2006:237頁(yè)</p><p> [3] 譚浩強(qiáng).
96、《 C 語(yǔ)言程序設(shè)計(jì)》.99年版.北京:清華大學(xué)出版社,1999:249頁(yè)</p><p> [4] 廖雷.《C語(yǔ)言程序設(shè)計(jì)》.第2版.北京:高等教育出版社,2006:347頁(yè)</p><p> [5]張強(qiáng)華. 《 C 語(yǔ)言程序設(shè)計(jì)》.00年版.北京:人民郵電出版社,2001:359頁(yè)</p><p> [6]徐新華. 《 C 語(yǔ)言程序設(shè)計(jì)教程》.第一版.北京
97、: 清華大學(xué)出版社,1999:168頁(yè)</p><p> [7] 賈學(xué)斌,宋海民.《C語(yǔ)言程序設(shè)計(jì)》.06年版.北京:中國(guó)鐵道出版社,2007:306頁(yè)</p><p> [8]徐建民. 《 C 語(yǔ)言程序設(shè)計(jì)》.2002年版.北京:電子工業(yè)出版社,2002:275頁(yè)</p><p> [9]李大友. 《 C 語(yǔ)言程序設(shè)計(jì)》.1999年版. 北京. 清華大學(xué)出版
98、社.1999:326頁(yè)</p><p> [10] 方少卿. 《C語(yǔ)言程序設(shè)計(jì)》. 2007年版.北京. 中國(guó)鐵道出版社.2007.216頁(yè)</p><p> [11]劉 燕. 《 C 語(yǔ)言程序設(shè)計(jì)》.2008年版.北京. 中國(guó)鐵道出版社.2008:304頁(yè)</p><p> [12] 趙海廷.《C語(yǔ)言程序設(shè)計(jì)》.04年版.北京:人民郵電出版社,2005:30
99、9頁(yè)</p><p> [13] 畢萬(wàn)新. 《 C 語(yǔ)言程序設(shè)計(jì)》.2005年版.大連. 大連理工大學(xué)出版社.2005:169頁(yè)</p><p> [14] 譚浩強(qiáng). 《 C語(yǔ)言程序設(shè)計(jì)》. (第二版).北京.清華大學(xué)出版社.2007.314頁(yè)</p><p> [15] 吳文虎. 《 程序設(shè)計(jì)基礎(chǔ)》.2003年版.北京. 清華大學(xué)出版社.2003.129頁(yè)&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c語(yǔ)言課程設(shè)計(jì)---黑白棋游戲
- c語(yǔ)言課程設(shè)計(jì)--黑白棋游戲
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--黑白棋
- 黑白棋游戲課程設(shè)計(jì)
- vb黑白棋游戲課程設(shè)計(jì)報(bào)告
- 黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 嵌入式wince課程設(shè)計(jì)報(bào)告(黑白棋)
- 黑白棋畢業(yè)論文---黑白棋游戲設(shè)計(jì)與開發(fā)(含外文翻譯)
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)(論文)-迷宮
- 黑白棋游戲畢業(yè)設(shè)計(jì)
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---黑白棋
- 黑白棋游戲畢業(yè)論文
- c課程設(shè)計(jì)報(bào)告-- c語(yǔ)言程序設(shè)計(jì)
- 黑白棋游戲設(shè)計(jì)與開發(fā)畢業(yè)論文
- 《c語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)(論文)-貪吃蛇
- 《c++語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- 《c語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)推箱子
評(píng)論
0/150
提交評(píng)論