版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 德州學(xué)院信息管理學(xué)院</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 實(shí)習(xí)名稱 自主學(xué)習(xí)能力 </p><p> 設(shè)計(jì)題目 五子棋小游戲 </p><p> 實(shí)習(xí)時(shí)間 2015.04.01--2014.04
2、.30 </p><p> 專業(yè)班級 14級計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 指導(dǎo)老師 </p><p> 教學(xué)單位 </p><p><b> 小組分工情況:</b></p
3、><p> 二〇一四年五月二十五日</p><p><b> 目 錄</b></p><p><b> 1 實(shí)習(xí)目的2</b></p><p><b> 2 需求分析2</b></p><p><b> 3 概要設(shè)計(jì)2</b&
4、gt;</p><p> 3.1 游戲背景2</p><p> 3.2 游戲玩法3</p><p> 3.3 程序需求分析3</p><p> 3.4 開發(fā)平臺3</p><p> 3.5程序流程設(shè)計(jì)4</p><p> 4 棋盤與棋子的生成5</p>&l
5、t;p><b> 4.1引言5</b></p><p> 4.2 程序語句錯(cuò)誤!未定義書簽。</p><p> 5 棋子移動與落子6</p><p><b> 5.1引言6</b></p><p><b> 5.2程序語句6</b></p>
6、<p><b> 6 勝負(fù)判斷16</b></p><p> 6.1引言錯(cuò)誤!未定義書簽。</p><p> 6.2程序設(shè)計(jì)17</p><p><b> 7 調(diào)整改進(jìn)18</b></p><p><b> 7.1引言18</b></p&
7、gt;<p> 7.2程序功能及調(diào)整18</p><p> 7.3總程序語句19</p><p><b> 8 總結(jié)28</b></p><p><b> 參考文獻(xiàn):29</b></p><p> 五子棋小游戲的設(shè)計(jì)與實(shí)現(xiàn)</p><p>&l
8、t;b> 1 實(shí)習(xí)目的</b></p><p> ?。?)熟練的運(yùn)用計(jì)算機(jī)語言,培養(yǎng)了對計(jì)算機(jī)編程的熱愛程度.</p><p> (2)學(xué)會怎樣用c語言做一個(gè)完整的系統(tǒng)。</p><p> (3)掌握c語言的編輯,鏈接,運(yùn)行等環(huán)節(jié)。</p><p> (4)掌握c語言中鏈表的建立,插入,刪除,保存節(jié)點(diǎn)。</p&
9、gt;<p> ?。?)熟練掌握for while do-while循環(huán)語句的使用。</p><p> ?。?)熟練掌握函數(shù)的定義、說明、參數(shù)傳遞及嵌套和遞歸調(diào)用方法。</p><p> (7)提高遇到困難解決困難的能力。</p><p> ?。?)提高書寫代碼的速度與正確率。</p><p> ?。?)獨(dú)立實(shí)踐,將課本上的理
10、論知識和實(shí)際有機(jī)的結(jié)合起來,鍛煉學(xué)生的分析解決實(shí)際問題的能力,提高學(xué)生適應(yīng)實(shí)際,實(shí)踐編程的能力。</p><p><b> 2 需求分析</b></p><p> 目前,隨著計(jì)算機(jī)網(wǎng)絡(luò)的的發(fā)展,PK已經(jīng)成為現(xiàn)在人生活的一部分,人們 以不同的方式通過網(wǎng)絡(luò)來娛樂,休閑。以計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)為核心的現(xiàn)代網(wǎng)絡(luò)技術(shù)已經(jīng)在現(xiàn)實(shí)生活和生產(chǎn)中得到了廣泛的使用,休閑類網(wǎng)絡(luò)游戲集趣
11、味性,娛樂性,互動性和益智性于一體,已經(jīng)成為多數(shù)人群的休閑方式,也為多數(shù)人所喜好。當(dāng)然,為了滿足沒有網(wǎng)絡(luò)同樣能娛樂的要求,許多小游戲做成了單機(jī)和網(wǎng)絡(luò)的雙功能。</p><p><b> 3 概要設(shè)計(jì)</b></p><p><b> 3.1 游戲背景</b></p><p> 五子棋不僅能增強(qiáng)思維能力,提高智力,而且
12、富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問“陰陽易理”;它既有簡單易學(xué)的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p><b> 3.2 游戲玩法</b></p><
13、;p> 五子棋是一種兩人對弈的純策略 型棋類游戲,五子棋棋子分為黑白兩色,棋盤為19×19,棋子放置于棋盤線交叉點(diǎn)上或網(wǎng)格中。兩人對局,各執(zhí)一色,輪流下一子,先將橫、豎或斜線的5個(gè)同色棋子連成不間斷的一排者為勝。</p><p><b> 3.3程序需求分析</b></p><p> 根據(jù)功能需求,將程序分為圖形顯示、玩家控制、勝負(fù)判斷和系統(tǒng)幫助
14、四個(gè)模塊,以下分析各模塊的需求。</p><p> 圖形顯示模塊:程序開始運(yùn)行時(shí),給出歡迎界面;游戲開始后要求生成19×19的棋盤圖像,并在棋盤上方提示 當(dāng)前落子方棋子顏色,游戲進(jìn)行過程中,要求實(shí)時(shí)顯示棋盤上已落下的棋子;分出勝負(fù)后,要求給出游戲結(jié)束畫面。</p><p> 玩家控制模塊:程序開始時(shí),需玩家確定而后開始游戲;游戲過程中,兩個(gè)玩家通過不同的按鍵移動光標(biāo),選擇落子
15、;游戲結(jié)束時(shí),有玩家選擇是否開始新棋局。</p><p> 勝負(fù)判斷模塊:實(shí)時(shí)監(jiān)測棋盤上棋子,一旦某一色棋子出現(xiàn)五子連線,終止游戲程序,彈出該色玩家勝出界面。</p><p> 系統(tǒng)幫助模塊:彈出窗口,窗口中 顯示幫助信息,包括棋子移動與落子按 鍵介紹,獲勝方式等。</p><p> 除以上主要模塊之外,程序中還可以添加其他輔助程序,如中途退出等。程序的關(guān)鍵在
16、于勝負(fù)判斷模塊,該模塊的設(shè)計(jì)直接關(guān)系到程序的運(yùn)行速率和運(yùn)行結(jié)果的正確與否。</p><p><b> 3.4 開發(fā)平臺</b></p><p> 系統(tǒng): Windows 7 旗艦版(64位)</p><p> 處理器: AMD A8-5545M APU with Radeon(tm) HD Graphics 1.70GHz</p&
17、gt;<p> 內(nèi)存: 4.00 GB</p><p> 程序開發(fā)軟件:Microsoft Visual C++ 6.0</p><p> 文檔編寫:Microsoft Word 2010</p><p> 3.5 程序流程設(shè)計(jì)</p><p> 根據(jù)程序需求分析結(jié)果,可以得出程序的總體結(jié)構(gòu)圖如圖1: </p
18、><p> 圖1 程序總體流程圖圖</p><p> 程序總體流程圖如圖2:</p><p> 圖2 程序總體設(shè)計(jì)圖</p><p> 4.棋盤與棋子的生成</p><p><b> 4.1引言</b></p><p> 根據(jù)五子棋的基本規(guī)則,棋盤采用19×
19、;19方格棋盤,棋子為黑白二色圓形棋子;游戲進(jìn)行過程中棋盤始終顯示,落子后棋子在落子處始終顯示;棋盤在程序結(jié)束時(shí)消失,已落下的棋子在 程序結(jié)束時(shí)或開始新游戲是消失。</p><p><b> 4.2程序語句</b></p><p> 棋盤的顯示由游戲開始與結(jié)束部分控制,棋子的顯示與保留由玩家操控部分決定。</p><p> board(
20、) /*畫棋盤*/ </p><p> { setfillstyle(1,6); </p><p> bar(120,50,520,450); </p><p> setfillstyle(1,14); </p><p> bar(540,50,620,150); </p><p> b
21、ar(20,50,100,150); </p><p> for(k=0;k<19;k++) </p><p> {moveto(140+20*k,70);linerel(0,360); </p><p> moveto(140,70+20*k);linerel(360,0); </p><p>&l
22、t;b> } </b></p><p> moveto(240,170); setcolor(5); </p><p> settextstyle(3,0,4); </p><p> outtextxy(50,60,"P1"); </p><p> outtextxy(5
23、60,60,"P2"); </p><p><b> } </b></p><p> white() /*畫白棋*/ </p><p><b> { </b></p><p> setcolor(7); </p><p> setfillst
24、yle(1,7); </p><p> circle(getx(),gety(),9); </p><p> fill(getx(),gety(),7); </p><p><b> } </b></p><p> black() /*畫黑棋*/ </p><p><b>
25、; { </b></p><p> setcolor(0); </p><p> setfillstyle(1,0); </p><p> circle(getx(),gety(),9); </p><p> fill(getx(),gety(),0); </p><p><b>
26、 }</b></p><p><b> 5棋子移動與落子</b></p><p><b> 5.1引言</b></p><p> 棋子的移動與落子有鍵盤上按鍵控制,本程序選取1P按鍵為W、S、A、D和空格鍵,2P按鍵為↑、↓、←、→和回車鍵,分別代表上移、下移、左移、右移光標(biāo)和落子。在光標(biāo)移動的過程中,光
27、標(biāo)按照玩家按鍵移動;在玩家按下落子按鍵后,程序自動調(diào)用棋子顯示子程序和判斷勝負(fù)子程序。1P、2P的落子后,程序會為落子處的數(shù)組元素賦一個(gè)特定值,用于判定勝負(fù)。</p><p><b> 5.2程序語句</b></p><p> void p1move() /*玩家1的移動*/ </p><p><b> {</b&
28、gt;</p><p> switch(bioskey(0))</p><p><b> {</b></p><p> int sum=0;</p><p> case ESC: {closegraph();</p><p> exit(0);}/*如果按鍵為ESC就退出游戲</p
29、><p><b> */</b></p><p> case SP:/*落子*/</p><p> if(a[X][Y]==6)</p><p><b> {</b></p><p><b> p1del();</b></p><
30、;p> p2turn(); </p><p> a[X][Y]=0; </p><p><b> sum++; </b></p><p><b> white();</b></p><p><b> p2move();</b></p><p&
31、gt; if(sum>=5)</p><p><b> win();</b></p><p><b> }</b></p><p> else p1move();</p><p> case A: /*向左移*/ </p><p> if(a[
32、X][Y]==0) </p><p><b> {</b></p><p> if(getx()==140)</p><p> moveto(520,gety()); </p><p> moverel(-20,0);</p><p><b> white();</b&g
33、t;</p><p><b> }</b></p><p> else if(a[X][Y]==1)</p><p><b> { </b></p><p> if(getx()==140) </p><p> moveto(520,gety()); </
34、p><p> black();moverel(-20,0);</p><p><b> white(); </b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b
35、></p><p> if(getx()==140) </p><p> moveto(520,gety());</p><p> moverel(-20,0);</p><p><b> white();</b></p><p><b> }</b><
36、;/p><p><b> p1move();</b></p><p> case D: /*向右移*/</p><p> if(a[X][Y]==0) </p><p><b> {</b></p><p> if(getx()==500)</p>&
37、lt;p> moveto(120,gety());</p><p> moverel(20,0);</p><p><b> white();}</b></p><p> else if(a[X][Y]==1)</p><p><b> { </b></p><
38、p> if(getx()==500)</p><p> moveto(120,gety());</p><p> black();moverel(20,0);</p><p><b> white(); </b></p><p> } </p><p>
39、;<b> else </b></p><p><b> { </b></p><p> if(getx()==500) </p><p> moveto(120,gety()) ;</p><p> moverel(20,0);</p><p><
40、b> white(); </b></p><p><b> } </b></p><p><b> p1move();</b></p><p> case W: /*向上移*/</p><p> if(a[X][Y]==0) </p><p>
41、;<b> {</b></p><p> if(gety()==70)</p><p> moveto(getx(),450);</p><p> moverel(0,-20);</p><p><b> white(); </b></p><p><b>
42、; }</b></p><p> else if(a[X][Y]==1) </p><p><b> { </b></p><p> if(gety()==70)</p><p> moveto(getx(),450);</p><p> black(); <
43、/p><p> moverel(0,-20);</p><p><b> white();</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b>&l
44、t;/p><p> if(gety()==70) </p><p> moveto(getx(),450);</p><p> moverel(0,-20);</p><p><b> white(); </b></p><p><b> } </b></p>
45、;<p><b> p1move();</b></p><p> case S: /*向下移*/ </p><p> if(a[X][Y]==0) </p><p><b> { </b></p><p> if(gety()==430) </p><p
46、> moveto(getx(),50);</p><p> moverel(0,20);</p><p><b> white(); </b></p><p><b> }</b></p><p> else if(a[X][Y]==1)</p><p>&l
47、t;b> { </b></p><p> if(gety()==430)</p><p> moveto(getx(),50);</p><p><b> black(); </b></p><p> moverel(0,20); </p><p><b>
48、 white(); </b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> if(gety()==430)</p><p> movet
49、o(getx(),50); </p><p> moverel(0,20); </p><p><b> white(); </b></p><p><b> } </b></p><p><b> p1move();</b></p><p>&
50、lt;b> default:</b></p><p><b> p1move();</b></p><p><b> }</b></p><p><b> } </b></p><p> void p2move() /*玩家2的移動*/</p
51、><p><b> { </b></p><p> switch(bioskey(0)) /*如果按鍵為ESC就退出游戲*/</p><p><b> {</b></p><p> int sum=0;</p><p> case ESC: {closegraph(
52、); exit(0);}</p><p> case ENTER: /*落子*/</p><p> if(a[X][Y]==6)</p><p><b> {</b></p><p><b> p2del();</b></p><p><b> p1tu
53、rn();</b></p><p> a[X][Y]=1;</p><p><b> sum++; </b></p><p><b> black(); </b></p><p><b> p1move();</b></p><p>
54、 if(sum>=5)</p><p><b> win();</b></p><p><b> }</b></p><p><b> else</b></p><p><b> p2move();</b></p><p
55、> case LEFT: /*向左移*/</p><p> if(a[X][Y]==1)</p><p><b> {</b></p><p> if(getx()==140)</p><p> moveto(520, gety());</p><p> moverel(-20,
56、0);</p><p><b> black();</b></p><p><b> }</b></p><p> else if(a[X][Y]==0)</p><p><b> {</b></p><p> if(getx()==140)&
57、lt;/p><p> moveto(520,gety());</p><p> if(getx()==140)</p><p> moveto(500,gety());</p><p> white(); </p><p> moverel(-20,0);</p><p><b&g
58、t; black();</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(getx()==140)</p><p> movet
59、o(520,gety());</p><p> moverel(-20,0);</p><p><b> black(); </b></p><p><b> }</b></p><p><b> p2move();</b></p><p>
60、case RIGHT: /*向右移*/ </p><p> if(a[X][Y]==1) </p><p><b> {</b></p><p> if(getx()==500)</p><p> moveto(120,gety());</p><p> moverel(20,0); &
61、lt;/p><p><b> black(); </b></p><p><b> }</b></p><p> else if(a[X][Y]==0)</p><p><b> {</b></p><p> if(getx()==500)<
62、/p><p> moveto(120,gety()); </p><p><b> white(); </b></p><p> moverel(20,0);</p><p><b> black(); </b></p><p><b> } </b&
63、gt;</p><p><b> else </b></p><p><b> {</b></p><p> if(getx()==500)</p><p> moveto(120,gety());</p><p> moverel(20,0);</p>
64、<p><b> black();</b></p><p><b> }</b></p><p><b> p2move();</b></p><p> case UP: /*向上移*/</p><p> if(a[X][Y]==1) </p&
65、gt;<p><b> {</b></p><p> if(gety()==70) </p><p> moveto(getx(),450);</p><p> moverel(0,-20);</p><p><b> black(); </b></p><
66、;p><b> }</b></p><p> else if(a[X][Y]==0)</p><p><b> { </b></p><p> if(gety()==70)</p><p> moveto(getx(),450);</p><p><b
67、> white();</b></p><p> moverel(0,-20); </p><p><b> black();</b></p><p><b> }</b></p><p><b> else</b></p><p&
68、gt;<b> {</b></p><p> if(gety()==70)</p><p> moveto(getx(),450);</p><p> moverel(0,-20);</p><p><b> black(); </b></p><p><b&
69、gt; }</b></p><p> p2move(); </p><p> case DOWN: /*向下移*/</p><p> if(a[X][Y]==1)</p><p><b> { </b></p><p> if(gety()==430)</p>
70、<p> moveto(getx(),50);</p><p> moverel(0,20); </p><p><b> black();</b></p><p><b> }</b></p><p> else if(a[X][Y]==0)</p><
71、p><b> { </b></p><p> if(gety()==430)</p><p> moveto(getx(),50);</p><p><b> white();</b></p><p> moverel(0,20); </p><p><
72、;b> black();</b></p><p><b> } </b></p><p><b> else</b></p><p><b> { </b></p><p> if(gety()==430)</p><p>
73、 moveto(getx(),50); </p><p> moverel(0,20); </p><p><b> black();</b></p><p><b> } </b></p><p> p2move(); </p><p> default: p2
74、move();</p><p><b> }</b></p><p><b> }</b></p><p><b> 6勝負(fù)判斷</b></p><p><b> 6.1引言</b></p><p> 勝負(fù)判斷模塊是程序的
75、關(guān)鍵,該模塊的設(shè)計(jì)直接關(guān)系到程序的運(yùn)行速率和運(yùn)行結(jié)果的正確與否。</p><p> 本函數(shù)根據(jù)每次落子的位置,分別向上、下、左、右、左上、左下、右上、右下八個(gè) 方向判斷是否有相同顏色的棋子連成五子,如果成立,游戲就結(jié)束,并顯示提示信息,否則繼續(xù)落子。</p><p> 以下簡析本程序流程:如表1所示,令當(dāng)前落子點(diǎn)坐標(biāo)為(X,Y),表中 i=X-4, j=Y-4,由獲勝條件可以知,通過
76、判斷(X,Y)上、下、左、右、斜上、斜下八個(gè)方向上是否有連續(xù)的5個(gè)子即可得出是否獲勝結(jié)果。在游戲開始時(shí),將棋盤初始化,即將棋盤抽象為一個(gè)19*19的數(shù)組,數(shù)組中每個(gè)元素設(shè)為某一指定初始值(如8)。1P落子時(shí),將數(shù)組內(nèi)相應(yīng)坐標(biāo)處元素賦值為0;2P落子時(shí),將數(shù)組內(nèi)相應(yīng)坐標(biāo)處元素賦值為1。當(dāng)(X,Y) 上、下、左、右、斜上、斜下八個(gè)方向某5個(gè)連續(xù)的子所對應(yīng)的數(shù)組中元素之和等于0時(shí),1P獲勝;當(dāng)(X,Y) 上、下、左、右、斜上、斜下八個(gè)方向某5
77、個(gè)連續(xù)的子所對應(yīng)的數(shù)組中元素之和等于5時(shí),2P獲勝。棋盤上的所有格子都被占滿時(shí),必有181個(gè)1P棋子和180個(gè)2P棋子,此時(shí)對應(yīng)數(shù)組中所有項(xiàng)之和為180,并且游戲過程中對應(yīng)數(shù)組中所有項(xiàng)之和只可能在這種狀況下為180,所以可以用這一條件判斷是否和棋。</p><p><b> 表1 勝負(fù)判斷表</b></p><p> 為減少程序的運(yùn)算,還可以將某些特殊情況排除在外
78、。當(dāng)落子數(shù)不大于8時(shí),既不用判斷勝負(fù),也不用判斷和棋與否,這部分功能在第二章移動與落子程序中實(shí)現(xiàn)。此外,還可以通過對落子次數(shù)的統(tǒng)計(jì)判斷是否滿足和棋條件,從而減少大量運(yùn)算,即當(dāng)判斷177次勝負(fù)后出現(xiàn)和棋。</p><p><b> 6.2程序設(shè)計(jì)</b></p><p> void win() /*判斷輸贏*/ </p><p><b
79、> {</b></p><p> int sum1,sum2,sum3,sum4,sum=1,n,i,j;</p><p> for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2)</p><p><b> { </b></p><p> sum1
80、=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];</p><p> sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4][j+4];</p><p> sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];</p>
81、<p> sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n];</p><p> if(sum1==5||sum2==5||sum3==5||sum4==5)</p><p><b> p2win(); </b></p><p>&l
82、t;b> if</b></p><p> (sum1==0||sum2==0||sum3==0||sum4==0)</p><p> p1win(); } </p><p><b> sum++ </b></p><p> if(sum==177)</p><p>&l
83、t;b> heqi(); </b></p><p><b> }</b></p><p><b> 7調(diào)整改進(jìn)</b></p><p><b> 7.1引言</b></p><p> 前6章分別論述了五子棋C語言程序中的四大主要模塊,但要生成可執(zhí)行的
84、程序,則還需將這些模塊有機(jī)地結(jié)合起來。在結(jié)合的過程中,需要綜合運(yùn) 用函數(shù)調(diào)用、函數(shù)間書序傳遞和全局變量等知識。</p><p> 7.2程序功能及調(diào)整</p><p> 為滿足實(shí)際操作需求,增加程序的兼容性與穩(wěn)定性,在編寫可執(zhí)行程序的過程中,必須對原有各功能模塊進(jìn)行整合并添加或調(diào)整部分功能。</p><p> 為方便玩家使用本程序,在程序中增加了“悔棋”、“認(rèn)
85、輸”和“退出”功能,玩家可以通過在游戲構(gòu)成中輸入相關(guān)指令實(shí)現(xiàn)這些功能,具體語句見附錄。 </p><p> 為增強(qiáng)程序的兼容性和實(shí)用性,在最終的可執(zhí)行程序中還對原有模塊進(jìn)行了其他修改。</p><p> 在調(diào)試的過程中,發(fā)現(xiàn)bios.h 和graphics.h兩個(gè)頭文件只有在Turbo C的編譯環(huán)境下才能順利執(zhí)行,因此,使用bios.h和graphics.h的程序兼容性不高,因此,舍
86、棄使用這兩個(gè)頭文件的圖像顯示模塊,轉(zhuǎn)而使用具有較高兼容性的全屏打印刷新顯示塊。后者雖然在視覺效果上不如前者,然而它可以在任何Windows系統(tǒng)下工作,而這比視覺效果重要得多。 </p><p> 在調(diào)試過程中,發(fā)現(xiàn)每當(dāng)1P在最外圈落子時(shí),系統(tǒng)即可彈出1P獲勝的結(jié)果,這是由于win函數(shù)中是通過對落子點(diǎn)及其周圍的若干點(diǎn)求和來判斷是否獲勝的。當(dāng)1P在最外圈落子時(shí),棋盤外的點(diǎn)被程序當(dāng)做0處理,加上落子時(shí)被賦值為0的一
87、點(diǎn),正好滿足1P獲勝的條件,故而引發(fā)錯(cuò)誤。改進(jìn)方法:將用于判斷輸贏的數(shù)組a由原來的19*19改為21*21,并將第0、20行及第0、20列中所有元素賦值為6;再將被這四組元素包圍的一個(gè)19*19的區(qū)間對應(yīng)到棋盤上的19*19格,即可解決原有問題。 </p><p> 在調(diào)試的過程中,還發(fā)現(xiàn)原有模塊中的按鍵操作過于復(fù)雜,綜合兼容性考慮,舍棄原有的光標(biāo)操作模式,改用輸入坐標(biāo)的操作模式,這樣做從某種程度上降低了程序
88、的可操作性,但提高了程序的可實(shí)現(xiàn)性與兼容性。</p><p><b> 7.3總程序語句</b></p><p> /*函數(shù)、變量定義*/</p><p> #include<stdio.h> </p><p> #include<string.h> </p><p&g
89、t; #include<time.h> </p><p> #include<stdlib.h> </p><p> #define N 19 </p><p> int win(int m, int l); </p><p> void printState(); </p><p>
90、;<b> p1win(); </b></p><p><b> p2win();</b></p><p><b> heqi(); </b></p><p> void help(); </p><p> int i,j,k,size=N; </p>
91、<p> int isBlack=1; </p><p> char state[N][N]; </p><p> int a[N+2][N+2]; </p><p> char x,y,temp[10]; </p><p><b> char c; </b></p><p>
92、 int z; </p><p> /*初始化及指令輸入*/ </p><p> void startGame() </p><p><b> {</b></p><p> int m,n,w; </p><p> for(i=0;i<size;i++)</
93、p><p><b> { </b></p><p> for(j=0;j<size;j++)</p><p><b> { </b></p><p> state[i][j]='_'; </p><p> a[i][j]=6; </p
94、><p><b> } </b></p><p><b> } </b></p><p> printState();</p><p><b> while(1) </b></p><p><b> { </b></p
95、><p> printf("\n\t請%s方下子:",isBlack?"黑":"白");</p><p> fflush(stdin);</p><p> scanf("%s",temp);</p><p> if(!strcmp(strupr(temp),&
96、quot;OUT")) </p><p><b> {</b></p><p> system("cls");</p><p><b> return; </b></p><p><b> } </b></p><p
97、><b> /*悔棋 */</b></p><p> if(!strcmp(temp,"BACK"))</p><p><b> { </b></p><p><b> i=x-'A';</b></p><p><b>
98、; j=y-'A';</b></p><p> state[i][j]='_';</p><p> printState();</p><p> isBlack=!isBlack;</p><p><b> continue;</b></p><p
99、><b> }</b></p><p> if(!strcmp(temp,"LOSE"))</p><p><b> /*認(rèn)輸*/</b></p><p><b> {</b></p><p> printf("\n\t%s方認(rèn)輸,
100、%s方勝!\n\n",isBlack?"黑":"白",isBlack?"白":"黑");</p><p><b> return;</b></p><p><b> }</b></p><p> x=temp[0];
101、 </p><p> y=temp[1];</p><p> /*避免下面相減的數(shù)組越界。*/ </p><p> if(x<'A'||x>'S'||y<'A'||y>'S')</p><p><b> {&
102、lt;/b></p><p> printf("\t輸入有誤,請輸入屬于<A-S>或正確的口令。\n");</p><p><b> continue;</b></p><p><b> } </b></p><p> i=x-'A';
103、 </p><p><b> j=y-'A';</b></p><p> if(state[i][j]!='_')</p><p> { </p><p> printf("\t提示:該位置已經(jīng)有子,請重新指定坐標(biāo)!");</p&
104、gt;<p><b> continue;</b></p><p><b> } </b></p><p> c=isBlack?'1':'2';</p><p> z=isBlack? 0:1;</p><p> state[i][j]=c;
105、</p><p> a[i+1][j+1]=z; </p><p><b> m=i+1;</b></p><p> n=j+1; </p><p> w=win(m,n); </p><p><b> if(!w)</b>
106、</p><p><b> {</b></p><p> printState();</p><p> isBlack=!isBlack;</p><p><b> }</b></p><p><b> else</b></p>
107、<p><b> { </b></p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b><
108、;/p><p><b> /*判斷輸贏*/</b></p><p> int win(int m, int l) </p><p><b> { </b></p><p><b> int </b></p><p> sum1,sum2,su
109、m3,sum4,sum=1,n,i,j,X,Y,w;</p><p><b> w=0; </b></p><p><b> X=m; </b></p><p><b> Y=l; </b></p><p> for(i=X-4,j=Y-4,n=0;i<=X,j
110、<=Y;i++,j++,n-=2) </p><p><b> { </b></p><p> sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];</p><p> sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4]
111、[j+4];</p><p> sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];</p><p> sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n];</p><p> if(sum1==5||sum2==5
112、||sum3==5||sum4==5)</p><p><b> {</b></p><p><b> p2win();</b></p><p><b> w=1;</b></p><p><b> }</b></p><p&g
113、t;<b> if</b></p><p> (sum1==0||sum2==0||sum3==0||sum4==0)</p><p><b> {</b></p><p><b> p1win();</b></p><p><b> w=1;</b&
114、gt;</p><p><b> }</b></p><p><b> }</b></p><p><b> sum1=0;</b></p><p><b> sum2=0;</b></p><p><b> s
115、um3=0;</b></p><p><b> sum4=0;</b></p><p><b> sum++;</b></p><p> if(sum==177)</p><p><b> { </b></p><p>&l
116、t;b> heqi();</b></p><p><b> w=1;</b></p><p><b> }</b></p><p><b> return w;</b></p><p><b> } <
117、/b></p><p><b> /*和棋界面*/</b></p><p> heqi() </p><p><b> { </b></p><p> printf("和棋");</p><
118、p><b> return;</b></p><p><b> } </b></p><p> /*玩家1獲勝界面*/</p><p><b> p1win()</b></p><p><b> { </b>
119、</p><p> printf("玩家1獲勝"); </p><p><b> return; </b></p><p><b> } </b></p><p> /*玩家2獲勝界面*/</p><
120、;p><b> p2win()</b></p><p><b> { </b></p><p> printf("玩家2獲勝"); </p><p><b> return; </b></p><p>
121、<b> }</b></p><p><b> /*幫助*/ </b></p><p> void help()</p><p><b> {</b></p><p> system("cls");</p><p> pr
122、intf("\t本程序采用19*19的游戲格式\n\n");</p><p> printf("\t輸入格子的坐標(biāo)下子: 先橫坐標(biāo)后縱坐標(biāo)。比如輸入:GG\n\n");</p><p> printf("\t輸入out(退回主菜單)、back(悔棋)、lose(認(rèn)輸)\n\n"); </p><p>&
123、lt;b> }</b></p><p><b> /*主函數(shù)*/ </b></p><p> int main() </p><p><b> { </b></p><p> system("color f1");</p><p&
124、gt;<b> while(1)</b></p><p><b> {</b></p><p> printf("\n\t-----C Programming Language課程作業(yè):五子棋-----\n\n");</p><p> printf("\t\t 1.開始游戲\n&q
125、uot;);</p><p> printf("\t\t 2.幫助\n");</p><p> printf("\t\t 3.退出\n");</p><p> printf("\n\t請選擇:");</p><p> L:k=scanf("%d",&a
126、mp;i);</p><p><b> switch(i)</b></p><p><b> {</b></p><p> case 1: startGame(); break; </p><p> case 2: help(); break;</p>
127、<p> case 3: return 0;</p><p> default:printf("\t 無此選項(xiàng)\n");break; </p><p><b> }</b></p><p><b> }</b></p><p><b> }
128、 </b></p><p><b> /*顯示、刷屏*/</b></p><p> void printState() </p><p><b> {</b></p><p> char p='A';</p><p> system(&q
129、uot;cls");</p><p> printf("\t棋盤如下:\n\n");</p><p> printf("\t ");</p><p> for(i=0;i<size;i++)</p><p><b> {</b></p>&l
130、t;p> printf("%c ",p+i);</p><p><b> }</b></p><p> printf("\n\t");</p><p> for(i=0;i<size;i++)</p><p><b> {</b><
131、/p><p> printf("%c ",p+i);</p><p> for(j=0;j<size;j++)</p><p><b> {</b></p><p> printf("%c ",state[i][j]);</p><p><b
132、> }</b></p><p> printf("%c \n\t",p+i);</p><p><b> }</b></p><p> printf(" ");</p><p> for(i=0;i<size;i++)</p>&l
133、t;p><b> {</b></p><p> printf("%c ",p+i);</p><p><b> }</b></p><p> printf("\n"); </p><p><b> }</b></p&
134、gt;<p><b> 8 總結(jié)</b></p><p> C語言課程設(shè)計(jì)時(shí)一次對我們c語言學(xué)習(xí)的綜合檢驗(yàn),它要求我們將所學(xué)的c語言代碼進(jìn)行綜合運(yùn)用,設(shè)計(jì)出一個(gè)簡單的系統(tǒng),這不僅是對我們基礎(chǔ)知識的檢驗(yàn),還考驗(yàn)我們的動手動腦以及團(tuán)隊(duì)協(xié)作能力,在這一年學(xué)習(xí)中要將這些基礎(chǔ)知識掌握已經(jīng)不容易了,在這么短的時(shí)間又要做出一個(gè)系統(tǒng)更是一次重大的挑戰(zhàn),然而只有迎難而上才能收獲成功,做出一個(gè)
135、完整的系統(tǒng)。</p><p> 回顧這次課程設(shè)計(jì),至今我感慨頗多。很多的知識只是停留在基本的應(yīng)用上,當(dāng)需要結(jié)合使用時(shí),往往出現(xiàn)無從入手的情況。在C語言課程設(shè)計(jì)的過程中,讓我深深體會到了這點(diǎn)。一些細(xì)節(jié)的地方?jīng)]有看清楚,或者思考妥當(dāng),就無法讓系統(tǒng)運(yùn)行,而當(dāng)一系列調(diào)試后,程序能夠運(yùn)行。</p><p> 通過對各子程序的設(shè)計(jì)與優(yōu)化,本程序完成了五子棋軟件的主體的設(shè)計(jì)與制作,基本達(dá)到了使用五子
136、棋軟件的核 心要求。然而程序還有一些不足之處,首先,程序在判斷勝負(fù)后無法顯示第五枚棋子,輸入五子連環(huán)的第五個(gè)棋子坐標(biāo)之后直接跳出了重新開始的界面,這是由程序的顯示原理造成的;其次,程序的界面過于簡陋,而且坐標(biāo)輸入操作也不利于玩家使用。</p><p> 對于這次課程設(shè)計(jì)我很不滿意,沒有達(dá)到自己想要的效果,系統(tǒng)中還存在著許多的漏洞,在本次課程設(shè)計(jì)過程中我也發(fā)現(xiàn)了自己的很多缺點(diǎn),比如做事不認(rèn)真,粗心大意,考慮問題不
137、夠全面等。最后,謝謝老師的教導(dǎo)。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 五 子 棋 [EB]. </p><p> http://baike.baidu.com/view/2697.htm.</p><p> [2] C語言制作五子棋[EB]. </p>
138、<p> http://www.vcworld.net/news/200905/022217.html </p><p> [3] C語言五棋源代碼 設(shè)計(jì)報(bào)告[EB]. </p><p> http://wenku.baidu.com/view/e253a2c66137ee06eff91859.html </p><p> [4] C語言五
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋小游戲課程設(shè)計(jì)
- 基于java的五子棋小游戲
- 網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn).doc
- qt網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn)
- java_五子棋小游戲課程設(shè)計(jì)
- 五子棋游戲設(shè)計(jì)報(bào)告
- 基于android的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)---五子棋游戲的實(shí)現(xiàn)
- 五子棋對戰(zhàn)游戲
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)-五子棋小游戲
- 課程設(shè)計(jì)---五子棋游戲的實(shí)現(xiàn).docx
- 基于java的五子棋游戲設(shè)計(jì)
- 五子棋游戲畢業(yè)設(shè)計(jì)
- 基于android的五子棋游戲設(shè)計(jì)
- 五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 基于android平臺的五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)
- java五子棋畢業(yè)設(shè)計(jì)--java五子棋對弈程序的設(shè)計(jì)與實(shí)現(xiàn)
- 基于vc的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)【開題報(bào)告】
- java課程設(shè)計(jì)--五子棋游戲
- 五子棋游戲設(shè)計(jì)畢業(yè)論文
評論
0/150
提交評論