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