遼寧工業(yè)大學(xué)c語言程序設(shè)計魏雪新 10140101_第1頁
遼寧工業(yè)大學(xué)c語言程序設(shè)計魏雪新 10140101_第2頁
遼寧工業(yè)大學(xué)c語言程序設(shè)計魏雪新 10140101_第3頁
遼寧工業(yè)大學(xué)c語言程序設(shè)計魏雪新 10140101_第4頁
遼寧工業(yè)大學(xué)c語言程序設(shè)計魏雪新 10140101_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PAGE 遼 寧 工 業(yè) 大 學(xué) 課 程 設(shè) 計 說 明 書(論 文)遼 寧 工 業(yè) 大 學(xué) C語言程序設(shè)計 課程設(shè)計(論文)題目: 黑白棋 院(系): 軟件學(xué)院 專業(yè)班級: 電子商務(wù)101班 學(xué) 號: 101401013 學(xué)生姓名: 魏雪新 指導(dǎo)教師: 丁寶柱 教師職稱: 助 教 起止時間:2010.12.20至2010.12.31 課程設(shè)計(報告)任務(wù)及評語院(系):軟件學(xué)院 教研室:軟件教研窒學(xué) 號101401013學(xué)生姓名魏雪新專業(yè)班級電子商務(wù)101班程序設(shè)計(報告)題目黑白棋程序設(shè)計(報告)任務(wù)程序設(shè)計的任務(wù)與要求:(1)掌握C語言編程的基礎(chǔ)知識。(2)較熟練地編寫C語言應(yīng)用程序。(

2、3)了解C語言的常用標(biāo)準(zhǔn)函數(shù)、編程技巧、異常處理。(5)聯(lián)系已學(xué)過的內(nèi)容,鞏固所學(xué)的理論,增強獨立工作能力。(6)通過設(shè)計主要使學(xué)生有一個獨立編寫程序的過程,對理論學(xué)習(xí)及動手能力都有一個很大的提高。(7)通過本次設(shè)計,進一步培養(yǎng)學(xué)生熱愛專業(yè)的思想,同時對本專業(yè)綜合素質(zhì)的提高起一個積極的推動作用。課程設(shè)計過程中,要嚴(yán)格遵守實踐環(huán)節(jié)的時間安排,聽從指導(dǎo)教師的指導(dǎo)。正確地完成上述內(nèi)容,記錄實習(xí)日記,規(guī)范完整地撰寫出課程設(shè)計報告。指導(dǎo)教師評語及成績成績: 指導(dǎo)教師簽字: 2011 年 1 月 4 日遼 寧 工 業(yè) 大 學(xué) 課 程 設(shè) 計 說 明 書(論 文)PAGE 18目 錄 TOC o 1-3 h

3、 z u HYPERLINK l _Toc280891726第1章 課程設(shè)計的目的與要求 PAGEREF _Toc280891726 h 1 HYPERLINK l _Toc2808917271.1 課程設(shè)計目的 PAGEREF _Toc280891727 h 1 HYPERLINK l _Toc2808917281.2 課程設(shè)計的實驗環(huán)境 PAGEREF _Toc280891728 h 1 HYPERLINK l _Toc2808917291.3 課程設(shè)計的預(yù)備知識 PAGEREF _Toc280891729 h 1 HYPERLINK l _Toc2808917301.4 課程設(shè)計要求 P

4、AGEREF _Toc280891730 h 1 HYPERLINK l _Toc280891731第2章 課程設(shè)計內(nèi)容 PAGEREF _Toc280891731 h 2 HYPERLINK l _Toc2808917322.1程序功能介紹 PAGEREF _Toc280891732 h 2 HYPERLINK l _Toc2808917332.2程序整體設(shè)計說明 PAGEREF _Toc280891733 h 2 HYPERLINK l _Toc2808917342.2.1設(shè)計思路 PAGEREF _Toc280891734 h 2 HYPERLINK l _Toc2808917352.2

5、.2數(shù)據(jù)結(jié)構(gòu)設(shè)計及用法說明 PAGEREF _Toc280891735 h 2 HYPERLINK l _Toc2808917362.2.3程序結(jié)構(gòu)(流程圖) PAGEREF _Toc280891736 h 7 HYPERLINK l _Toc2808917372.2.4各模塊的功能及程序說明 PAGEREF _Toc280891737 h 8 HYPERLINK l _Toc2808917382.2.5程序結(jié)果 PAGEREF _Toc280891738 h 10 HYPERLINK l _Toc2808917392.3程序源代碼及注釋 PAGEREF _Toc280891739 h 11

6、HYPERLINK l _Toc280891740第3章 課程設(shè)計總結(jié) PAGEREF _Toc280891740 h 16 HYPERLINK l _Toc280891741參考資料 PAGEREF _Toc280891741 h 17第1章 課程設(shè)計的目的與要求1.1 課程設(shè)計目的本課程設(shè)計是計算機科學(xué)與技術(shù)專業(yè)重要的實踐性環(huán)節(jié)之一,是在學(xué)生學(xué)習(xí)完程序設(shè)計語言(C)課程后進行的一次全面的綜合練習(xí)。本課程設(shè)計的目的和任務(wù): 1. 鞏固和加深學(xué)生對C語言課程的基本知識的理解和掌握 2. 掌握C語言編程和程序調(diào)試的基本技能 3. 利用C語言進行基本的軟件設(shè)計4. 掌握書寫程序設(shè)計說明文檔的能力5

7、. 提高運用C語言解決實際問題的能力6.了解C語言與函數(shù)的關(guān)系7.掌握一些初等函數(shù)1.2 課程設(shè)計的實驗環(huán)境硬件要求能運行Windows 2000/XP操作系統(tǒng)的微機系統(tǒng)。C語言程序設(shè)計及相應(yīng)的開發(fā)環(huán)境。1.3 課程設(shè)計的預(yù)備知識熟悉C語言及C語言開發(fā)工具。1.4 課程設(shè)計要求1. 分析課程設(shè)計題目的要求2. 寫出詳細(xì)設(shè)計說明3. 編寫程序代碼,調(diào)試程序使其能正確運行4. 設(shè)計完成的軟件要便于操作和使用5. 設(shè)計完成后提交課程設(shè)計報告第2章 課程設(shè)計內(nèi)容2.1程序功能介紹這種棋通常是黑白兩個面。一方執(zhí)白,一方執(zhí)黑,每次在棋盤上走一個子。無論橫豎線或斜線均可。只要兩個同樣顏色的將另一個顏色的夾在

8、中間了,就可以將這個顏色翻過來,最終看哪個要色多,即獲勝。我認(rèn)為勝利的根本是占邊。2.2程序整體設(shè)計說明2.2.1設(shè)計思路首先可以用二維數(shù)組表示棋盤(比方可以是int,元素為“1”表示玩家甲的棋子,“2”表示玩家乙.) ,然后寫一個函數(shù)實現(xiàn)如下功能: 每下一子,就利用下標(biāo)檢測此子周圍8個元素(邊上的沒有這么多,就要通過下標(biāo)的限制了)有沒有相同的,有的話,累計(要考慮分4種情況累計,橫豎斜),并調(diào)用相應(yīng)方向的函數(shù)檢測那些相同的元素,沒有就跳過繼續(xù)。 再寫四個函數(shù)(檢測橫豎斜4個方向的) 最后主函數(shù)完善。2.2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計及用法說明 現(xiàn)在有如圖示的這樣一個棋局,輪到電腦下棋?,F(xiàn)在它發(fā)現(xiàn)有這樣三

9、個地方可以下:e3,c3,c5。這三種下法分別會形成三種局面:A、B、C。如果是人在下棋,就會思考:那一種下法更好呢?比如A被別人占角,B沒什么變化,C占了別人的角。當(dāng)然棋手會選擇下C。電腦也是如此,它會對每一種棋局評一個分,比如它判斷,如果被別人占角,就減80分,相反占別人的角就加80分。那么A=-80分,B=0分,C=80分。電腦會選擇下C。電腦程序?qū)ζ寰衷u分的部分,稱為“估值函數(shù)”(Evaluation Function)。真正的估值函數(shù)當(dāng)然不會這么簡單。它會用到技巧篇提到的如行動力、潛在行動力、余裕手、邊角判斷、穩(wěn)定子等綜合因素來判斷。具體的估值函數(shù),我會在“估值函數(shù)”一節(jié)中詳細(xì)講述。

10、初始棋局(-1)+| | |e3 c3 c5(A) (B) (C) 接下來,如果人就這么判斷。那么它頂多也就是個初學(xué)者。為什么呢?因為它不會推理,碰到對手棄角之類的戰(zhàn)術(shù),如“邊角判斷”中示例的一些情況,就輸?shù)靡凰苛恕.?dāng)然,可以告訴電腦,碰到“邊角判斷”中的幾種情況,就如何如何下。但是,真實的棋局是非常復(fù)雜的,電腦(也包括人腦)幾乎不可能對動態(tài)的棋局給出靜態(tài)的評估。因為實際對局總會出現(xiàn)這樣那樣的情況,是無法預(yù)先估計的。碰到這些情況,人就會向后推幾步,看一看會是怎樣的一個局面。一些棋類大師往往可以推十幾步甚至更深。電腦也是如此。 還是剛才那一幅圖的演化。甲方下棋-乙方下棋-初始棋局+| | |

11、e3 c3 c5+ + +| | | | | | | | | | | | | |f2 f3 f4 f5 f6 c2 d3 e6 f5 b6 c6 d6 e6 f6 +84+36+12 +5 -1+11 -1 +6 +6 +6 +0 -5 +3 +5 電腦在自己下棋以后,把對手的下棋情況也推理出來。然后加以評分。(最下一排是電腦評估的得分)這一次電腦又如何下呢?這時電腦假設(shè)對手是高手。如果電腦下e3,對手就會下對電腦最不利的情況f6。同樣,電腦下c3,對手就會下d3,電腦下c5,對手就會下d6。這三種情況,c5是最不好的(因為c5的下一步d6的得分最低),c3與e3一樣。因此電腦會下c3或者e3

12、。用程序化的語言這樣描述: 如上圖所示棋局,設(shè)電腦為白棋,推理深度為2,可以形成如下的樹:(數(shù)字為節(jié)點值)初始棋局-白棋下棋之后-黑棋下棋之后估值初始棋局(-1)+| | |e3(-1) c3(-1) c5(-5)+ + +| | | | | | | | | | | | | |f2 f3 f4 f5 f6 c2 d3 e6 f5 b6 c6 d6 e6 f6 +84+36+12 +5 -1+11 -1 +6 +6 +6 +0 -5 +3 +5 結(jié)果:應(yīng)該下e3或c3具體實現(xiàn)的偽算法類似于經(jīng)典的八皇后問題。還有幾種alpha-beta算法的改進型,最廣泛采用的是NegaScout,(Alexan

13、der Reinefeld發(fā)明),但它和一般的alpha-beta剪枝算法沒有根本的不同。其他的還有PVS和SSS*。下面舉例說明。 還是基于剛才的棋形,假設(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后,也不會賦給根節(jié)點,因為根節(jié)點取最大的值,現(xiàn)在根節(jié)點的值是-1,不會取更小的值。同樣的,搜索d6后,也不用搜索e6、f6了,也就是說,搜索到比-1還小的值之后,就不用搜索了。 在搜

14、索過程中,電腦下棋結(jié)點的當(dāng)前最優(yōu)值被稱為 值(即初始棋局的值),對手下棋結(jié)點的當(dāng)前最優(yōu)值被稱為 值(即例子中C3的值)。在搜索過程中, 值遞增,值遞減,兩者構(gòu)成了一個區(qū)間。這個區(qū)間被稱為窗口,而對手下棋的結(jié)點最終的最優(yōu)值將落在這個窗口中。一旦在電腦下棋的結(jié)點得到其子結(jié)點的返回值大于 值,則發(fā)生剪枝。初始棋局(-1)+| | |e3(-1) c3(-1) c5(-5)+ + +| | | | | | | | | | | | | |f2 f3 f4 f5 f6 c2 d3 e6 f5 b6 c6 d6 e6 f6+84+36+12 +5 -1+11 -1 +6 +6 +6 +0 -5 +3 +5這

15、是一個程序中最重要的部分,如果這個模塊太弱,則就算算法再好也沒有用。這里將要敘述三種不同的估值函數(shù)范例。大多數(shù)的黑白棋程序都可以歸結(jié)于此。 1、棋格表 這種算法的意思是,不同的棋格有不同的值,角的值大而角旁邊的格子值要小。忽視對稱的話,棋盤上有10個不同的位置,每個格子根據(jù)三種可能性賦值:黑棋、白棋和空。更有經(jīng)驗的逼近是在游戲的不同階段對格子賦予不同的值。例如,角在開局階段和中局開始階段比終局階段更重要。 2、基于行動力的估值 這種更久遠(yuǎn)的接近有很強的全局觀,而不像棋格表那樣局部化。觀察表明,許多人類玩者努力獲得最大的行動力(可下棋的數(shù)目)和潛在行動力(臨近對手棋子的空格,見技巧篇)。如果代碼

16、有效率的話,可以很快發(fā)現(xiàn),它們提高棋力很多。和另一種人類的策略一樣,許多基于行動力估值的程序同時還有一些邊角配置的知識,試圖在中盤早期使棋子最少。3、基于模版的估值 正如上面提及的,許多中等力量的程序經(jīng)常合并一些邊角判斷的知識,最大行動力和潛在行動力是全局特性,但是他們可以被切割成局部配置,再加在一起。棋子最少化也是如此。 這導(dǎo)致了以下的概括:在估值函數(shù)中僅用局部配置(模版),通常單獨計算每一行、一列、斜邊和角落的模板,再線性疊加在一起來實現(xiàn)。并且,配置情況的值非常依賴于游戲的不同階段。比如,一條邊有3321種配置情況(38-34)/2+34),每種情況的分值好壞在游戲的不同階段都不相同。分值

17、基于強力玩者和程序的游戲結(jié)果統(tǒng)計,他們存于 HYPERLINK 數(shù)據(jù)庫中,游戲啟動時 HYPERLINK 自動調(diào)入。 常見的有這樣一些模板: 表2.1數(shù)據(jù)表名稱類似區(qū)域配置數(shù)去掉對稱后的配置數(shù)corner5x2a1:e2310=59049(310-35)/2+35 = 29646diag5a5:e135 =243(35 -33)/2+33 = 135diag6a6:f136 =729(36 -33)/2+33 = 378diag7a7:g137 =2187(37 -34)/2+34 = 1134diag8a8:h138 =6561(38 -34)/2+34 = 3321edge2xa1:h1

18、+ b2 + g2310=59049(310-35)/2+35 = 29646hor2a2:h238 =6561(38 -34)/2+34 = 3321hor3a3:h338 =6561(38 -34)/2+34 = 3321hor4a4:h438 =6561(38 -34)/2+34 = 3321trianglea1:a4:d1310=59049(310-35)/2+35 = 296464、估值合并 一般程序的估值基于許多的參數(shù),如行動力、潛在行動力、余裕手、邊角判斷、穩(wěn)定子(見技巧篇)。但是怎么樣將他們合并起來得到一個估值呢?為了提高速度,一般的程序采用線性合并。設(shè)a1,a2,a3,a4為

19、參數(shù),則估值s:=n1*a1+n2*a2+n3*a3+n4*a4。其中n1,n2,n3,n4為常數(shù),術(shù)語叫“權(quán)重”(weight),它決定了參數(shù)的重要性,來自于統(tǒng)計值。所的強力程序都采用了開局定式,許多頂級程序的定式大多來自IOS游戲。對于強力的程序而言,他會在每一次對局結(jié)束以后升級定式,因此,對于有自學(xué)習(xí)功能的電腦來說,用上一次擊敗電腦的戰(zhàn)術(shù)對付電腦是不會管用的。另一方面,具有自學(xué)習(xí)功能的電腦的中局棋力也會越來越強,原因是電腦會通過不斷升級估值函數(shù)的權(quán)重來提高棋力。TD(Temporal Difference)就是一個實用的強化學(xué)習(xí) HYPERLINK 技術(shù)。一個應(yīng)用了該 HYPERLINK

20、 技術(shù)的國際象棋程序在國際互聯(lián)網(wǎng)上進行了300多局對局后,其等級分從1650分(一般水平)上漲到了2110分。5、終局 終局是電腦的強項,它的搜索比中局快得多,主要有這樣幾個理由:1.終局的估值函數(shù)很簡單,他只用看雙方誰勝了,估值就等于電腦的棋子減去對手的棋子。而不用判斷行動力、潛在行動力、余裕手、邊角判斷和穩(wěn)定子。2.終局的搜索由于空格越來越少,使得搜索節(jié)點很少。如深度為5的搜索,中盤時葉子節(jié)點平均為10*10*10*10*10=100000,而終局時最大為5*4*3*2*1=120。3.哈希表在終局時效率更高。 因為隨著游戲向終局接近,玩者可下的位置逐漸減少,在終局階段程序可以搜索得更深。

21、這使得他們在終局比人類下得更好??从嬎銠C在終局下棋經(jīng)常感到不可思議,因為雙方都在游戲結(jié)束20步以前知道了游戲的結(jié)果。對計算機而言,終局早在人類玩家中局結(jié)尾時就開始了,離游戲結(jié)束還有20-30步。2.2.3程序結(jié)構(gòu)(流程圖)此流程圖為初始畫棋盤部分圖2.1與人機對戰(zhàn)部分流程圖2.2.4各模塊的功能及程序說明黑白棋程序的整體流程是主函數(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()

22、使用兩個嵌套的while循環(huán)來模擬走棋的過程,外層循環(huán)用來變換棋手,內(nèi)層循環(huán)用來模擬棋手的具體走棋過程,關(guān)鍵是調(diào)用函數(shù)QpChange()來判斷棋盤的變化。按Esc鍵直接退出游戲。除此之外,實現(xiàn)黑白棋游戲的其他函數(shù)包括SetPlayColor()、MoveColor()、DoScore() 、PrintScore()等。函數(shù)SetPlayColor()用來設(shè)置棋子的初始顏色為黑色和白色。函數(shù)MoveColor()完成恢復(fù)棋盤原始狀態(tài)的功能:棋手每走完一步棋后,該函數(shù)恢復(fù)棋盤格子的原始狀態(tài),即如果是從起點出發(fā)就將格子恢復(fù)為紅色,其他情況如果是1,則恢復(fù)白色棋子,是2則恢復(fù)黑色棋子。函數(shù)DoSco

23、re()用來處理棋手所得的分?jǐn)?shù)。函數(shù)PrintScore()完成在不同的位置輸出棋手的成績。函數(shù)PlayWin()輸出最后勝利者的結(jié)果信息。黑白棋游戲的棋盤由8*8個格子組成,每個格子的大小為40*40的屏幕像速。棋盤左上角的坐標(biāo)為(100,100),右下角的坐標(biāo)為(420,420),棋盤左上角格子的中心坐標(biāo)為x=120,y=120.游戲中棋子為半徑15像速的圓,分別填充為黑色和白色。程序采用8*8二維數(shù)組Map來存放對局雙方對弈情況即雙方在棋盤上的對弈棋子。數(shù)組元素Map00在棋盤左上角第一個位置相對應(yīng),數(shù)組元素Map01與棋盤第一行第二個位置相對應(yīng),以此類推。因此,數(shù)組元素Map70對應(yīng)著

24、棋盤左下角的落子位置,元素Map77對應(yīng)著棋盤右下角位置棋子。程序約定:數(shù)組元素值為1代表黑方,2代表白方,否則說明棋盤上該位置對弈雙方尚未落子。棋手下棋時,棋子每次都在棋盤左上方的初始位置(120,80)出現(xiàn),以供游戲者移動。程序中用變量x、y分別代表當(dāng)前棋子的橫、縱坐標(biāo)(x、y)。用下棋手?jǐn)?shù)t來標(biāo)識對弈棋手,t不能被2整除則代表黑方,能被2整除則代表白方棋手。因此根據(jù)下棋手?jǐn)?shù)t記錄黑、白雙方對弈棋局Map的代碼為:If(t%2=1) /*黑方棋手,則將棋盤數(shù)組中對應(yīng)元素置1*/Map(x-120)/40(y-120)/40=1;Else /*白方棋手,則將棋盤數(shù)組中對應(yīng)元素置2*/Map(

25、x-120)/40(y-120)/40=2;游戲中判斷對弈雙方是否可以在當(dāng)前位置(x,y)落子是實現(xiàn)的關(guān)鍵。落子的判斷條件為:當(dāng)前位置(x ,y)不是初始位置(120,80)。同時在該位置黑、白雙方尚未落子,并且可以翻轉(zhuǎn)對方棋子時,方可在當(dāng)前位置落子。程序首先進行判斷:Y!=80&Map(x-120)/40(y-120)/40!=1&Map(x-120)/40(y-120)/40!=2即當(dāng)前棋子位置不是初始位置,并且雙方均未落子。在滿足上述條件的前提下,通過調(diào)用函數(shù)QpChange()來判斷當(dāng)前下棋位置是否樂意翻轉(zhuǎn)對方棋子,并最終確定此置是否可以落子。函數(shù)QpChange()入口參數(shù)包括落子當(dāng)

26、前的位置坐標(biāo)(x,y),以及下棋手?jǐn)?shù)t。函數(shù)根據(jù)當(dāng)前棋局的情況,即記錄在數(shù)組Map中的游戲雙方對弈的內(nèi)容,以棋手下棋的當(dāng)前位置為中心對棋盤的八個方向進行判斷,決定是否可以使對方棋子翻轉(zhuǎn),同時修改被翻轉(zhuǎn)棋子的顏色,最后將棋盤修改標(biāo)記yes返回。這里以向右的判斷為例,來說明函數(shù)QpChange()的具體實現(xiàn):初始時棋盤修改標(biāo)記yes為0,即為棋子翻轉(zhuǎn)。通過行列坐標(biāo)交換計算當(dāng)前棋子在棋盤數(shù)組Map中的,當(dāng)棋子位于棋盤8列中的前6列時才向右進行判斷;遇到己方棋子或空格時停止,并將位于兩位置間的對方棋子變?yōu)榧悍筋伾钠遄?。若存在被改變顏色的棋子,則置位棋盤修改標(biāo)記yes為1。若無棋子顏色翻轉(zhuǎn),則不做修改

27、,其他7個方向的情況類似。程序通過檢測方向鍵來移動旗子,移動一步后重復(fù)落子條件的判斷,滿足落子條件則落子,然后換對手下棋,若累計嘗試落子次數(shù)超過棋盤上剩余空格的數(shù)量時,當(dāng)前棋手失去一次落子機會,換對手下棋。游戲者分?jǐn)?shù)score的更新通過函數(shù)DoScore()實現(xiàn)。該函數(shù)通過統(tǒng)計保存對弈情況數(shù)組Map的元素值實現(xiàn)對棋手得分的更新。2.2.5程序結(jié)果圖2.2輸入棋圖圖2.3輸入棋起始圖圖2.4黑白棋運行圖2.3程序源代碼及注釋#include graphics.h /*圖形系統(tǒng)頭文件*/#define LEFT 0 x4b00 /*光標(biāo)左鍵值*/#define RIGHT 0 x4d00 /*光標(biāo)

28、右鍵值*/#define DOWN 0 x5000 /*光標(biāo)下鍵值*/#define UP 0 x4800 /*光標(biāo)上鍵值*/#define ESC 0 x011b /* ESC鍵值*/#define ENTER 0 x1c0d /* 回車鍵值*/int a88=0,key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/char playone3,playtwo3;/*兩個人的得分轉(zhuǎn)換成字符串輸出*/void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/void DrawQp(void);/*畫棋盤函數(shù)*/void SetPlayColor(int x);/*設(shè)

29、置棋子第一次的顏色*/void MoveColor(int x,int y);/*恢復(fù)原來棋盤狀態(tài)*/int QpChange(int x,int y,int z);/*判斷棋盤的變化*/void DoScore(void);/*處理分?jǐn)?shù)*/void PrintScore(int n);/*輸出成績*/void playWin(void);/*輸出勝利者信息*/*主函數(shù)*/void main(void) int gd=DETECT,gr; initgraph(&gd,&gr,c:tc); /*初始化圖形系統(tǒng)*/ DrawQp();/*畫棋盤*/ playtoplay();/*人人對戰(zhàn)*/ ge

30、tch(); closegraph();/*關(guān)閉圖形系統(tǒng)*/void DrawQp()/*畫棋盤*/ int i,j; score1=score2=0;/*棋手一開始得分都為0*/ setbkcolor(BLUE); for(i=100;i120)/*左方向鍵*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x-=40; fillellipse(x,y,15,15); else if(key=RIGHT&x80)/*右方向鍵*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayC

31、olor(t); x+=40; fillellipse(x,y,15,15); else if(key=UP&y120)/*上方向鍵*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y-=40; fillellipse(x,y,15,15); else if(key=DOWN&y400)/*下方向鍵*/ MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y+=40; fillellipse(x,y,15,15); t=t%2+1; /*一方走后,改變棋子顏色即輪

32、對方走*/ cc=0; /*計數(shù)值恢復(fù)為0*/ /*endwhile*/void SetPlayColor(int t)/*設(shè)置棋子顏色*/ if(t%2=1) setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/void MoveColor(int x,int y)/*走了一步后恢復(fù)原來格子的狀態(tài)*/ if(y100)/*如果是從起點出發(fā)就恢復(fù)藍色*/ setfillstyle(SOLID_FILL,BLUE); else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍色棋盤*/ swi

33、tch(a(x-120)/40(y-120)/40) case 1: setfillstyle(SOLID_FILL,15);break; /*白色*/ case 2: setfillstyle(SOLID_FILL,8);break; /*黑色*/ default: setfillstyle(SOLID_FILL,BLUE); /*藍色*/ 第3章 課程設(shè)計總結(jié)通過本次C程序課程設(shè)計,我覺得對計算機的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)的作用及C語言的使用都有了更深入的了解。尤其是C語言的進步讓我深刻感受到任何所學(xué)的知識都需要實踐,沒有實踐就無法真正這些知識以及掌握它們,使其成為自己的知識。同時也對自己提高很大:克服了的偷懶的毛病,這在我以后的學(xué)習(xí)和工作中的心理定位與調(diào)節(jié)有很大的幫助。我感受到了編程是一項非常煩瑣周密的活動,他不但需要一個人周密的思考問題的能力,處理問題的能力,還需要有足夠的耐心和嚴(yán)謹(jǐn)治學(xué)的作風(fēng),來不得半點馬虎。本次我通過課程設(shè)計學(xué)會了團體合作也初步學(xué)會了論文設(shè)計的基本方法,學(xué)會了怎樣去借鑒別人的方法和經(jīng)驗,知道如何去查找資料和整合處理這些資料的能力,這為以后的大學(xué)畢業(yè)設(shè)計論文打下了一個初步的基礎(chǔ)使我收益最大的是享受到了一種成功的喜悅,在這

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論