版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 一、設(shè)計(jì)目的3</b></p><p><b> 二、設(shè)計(jì)要求3</b></p><p> 三、所需儀器設(shè)備3</p><p><b> 四、課題分析3</b>&
2、lt;/p><p> 五、具體設(shè)計(jì)過(guò)程4</p><p> 5.1、設(shè)計(jì)思路4</p><p> 5.2、程序設(shè)計(jì)流程圖4</p><p> 5.3、函數(shù)實(shí)現(xiàn)說(shuō)明7</p><p> 5.4、圖形庫(kù)函數(shù)介紹8</p><p> 5.5、程序源代碼及注釋9</p>
3、<p> 5.6、調(diào)試結(jié)果19</p><p> 六、設(shè)計(jì)心得體會(huì)20</p><p><b> 七、參考文獻(xiàn)21</b></p><p> 《黑白棋游戲》C語(yǔ)言課程設(shè)計(jì)</p><p><b> 一、設(shè)計(jì)目的</b></p><p> 本課程設(shè)
4、計(jì)是計(jì)算機(jī)軟件技術(shù)基礎(chǔ)重要的實(shí)踐性環(huán)節(jié)之一,是在學(xué)生學(xué)習(xí)完《程序設(shè)計(jì)語(yǔ)言(C)》課程后進(jìn)行的一次全面的綜合練習(xí)。本課程設(shè)計(jì)的目的和任務(wù): </p><p> ?。?)鞏固和加深學(xué)生對(duì)C語(yǔ)言課程的基本知識(shí)的理解和掌握;</p><p> ?。?)掌握C語(yǔ)言編程和程序調(diào)試的基本技能; </p><p> ?。?)利用C語(yǔ)言進(jìn)行基本的軟件設(shè)計(jì),掌握軟件設(shè)計(jì)一般方法,了解軟
5、件設(shè)計(jì)的思路;</p><p> ?。?)掌握書(shū)寫(xiě)程序設(shè)計(jì)報(bào)告的能力;</p><p> ?。?)提高運(yùn)用C語(yǔ)言解決實(shí)際問(wèn)題的能力;</p><p> 這個(gè)程序也是對(duì)編程基本功的一個(gè)訓(xùn)練,對(duì)于初學(xué)C語(yǔ)言的人,講分支、循環(huán)、數(shù)組函數(shù)綜合應(yīng)用,而不僅限于編制獨(dú)立的小程序,能夠大大提高變成水平。</p><p><b> 二、設(shè)計(jì)要求
6、</b></p><p> (1)收集資料,全面分析課題,分解問(wèn)題,形成中體編程思路;</p><p> ?。?)深入分析各個(gè)小問(wèn)題,編寫(xiě)個(gè)部分程序模塊;</p><p> (3)對(duì)于設(shè)計(jì)中用到的關(guān)鍵函數(shù),要聯(lián)系實(shí)際 問(wèn)題進(jìn)行具體介紹;</p><p> ?。?)上機(jī)調(diào)試,確保程序能正確運(yùn)行;</p><p
7、> ?。?)設(shè)計(jì)完成后提交課程設(shè)計(jì)報(bào)告;</p><p><b> 三、所需儀器設(shè)備</b></p><p> ?。?)硬件要求能運(yùn)行Windows 2000/XP操作系統(tǒng)的微機(jī)系統(tǒng)。</p><p> ?。?)C語(yǔ)言程序設(shè)計(jì)及相應(yīng)的開(kāi)發(fā)環(huán)境。(本設(shè)計(jì)用的是Turbo C for Windows 集成實(shí)驗(yàn)與學(xué)習(xí)環(huán)境 V6.0)</
8、p><p><b> 四、課題分析</b></p><p> 編寫(xiě)一個(gè)《黑白棋游戲》的C程序,包括以下功能:</p><p> 初始狀態(tài):在一個(gè)8*8的棋盤(pán)中央交叉排放黑白棋子各兩枚,白棋先走。</p><p> (1)每個(gè)棋手下棋時(shí),擺子的位置必須是以自己的棋子能包圍住對(duì)方一個(gè)或多個(gè)棋子,被包圍住的對(duì)方棋子將成為自
9、己的棋子。包圍的方向可以是上下左右以及斜線8個(gè)方向,只要能連成一線即可。</p><p> ?。?)當(dāng)輪到某一個(gè)棋手下子,但是他沒(méi)有可以包圍對(duì)方棋子的位置時(shí),他必須停步,讓對(duì)方走棋,直到他可以走為止。</p><p> ?。?)當(dāng)棋盤(pán)上一方的棋子為0或者下滿(mǎn)64格,游戲結(jié)束,棋子少者輸。</p><p><b> 五、具體設(shè)計(jì)過(guò)程</b>&l
10、t;/p><p><b> 5.1、設(shè)計(jì)思路</b></p><p> 程序界面應(yīng)是一個(gè)二維平面圖,所以數(shù)據(jù)的表示用二維數(shù)組,數(shù)組兩個(gè)下標(biāo)可以表示棋盤(pán)上的位置,數(shù)組元素的值代表棋格中的狀態(tài),共有三種情況,分別是空格、黑棋和白棋。這樣給數(shù)組元素的取值設(shè)定為0、1、2,其中0代表空格,1代表白色棋子,2代表黑色棋子。這樣程序的主要工作是接收棋手按鍵操作,一旦接收到回車(chē)鍵,
11、說(shuō)明棋手?jǐn)[子,先判斷是不是有效位置,也就是能不能包圍住對(duì)方棋子,如果能,便為棋子所在的位置往上下、左右、左上、左下、右上、右下8個(gè)方向?qū)ふ冶话鼑〉乃衅遄樱ū仨毷沁B續(xù)的,中間不能有空格),將這些被包圍住的對(duì)方棋子都變成自己的棋子,然后對(duì)當(dāng)前棋盤(pán)中的黑白棋個(gè)數(shù)進(jìn)行統(tǒng)計(jì)并輸出結(jié)果。如果沒(méi)有這樣的位置可以落子,則停步,讓對(duì)方走棋,重復(fù)上述步驟,直到游戲結(jié)束。如果想提前終止游戲,可以按Esc鍵。 </p><p>
12、 5.2、程序設(shè)計(jì)流程圖</p><p> ?。?)由上述設(shè)計(jì)思路可畫(huà)出程序整體流程圖,如下圖所示:</p><p> 圖1 程序整體流程圖</p><p> ?。?)人人對(duì)戰(zhàn)模塊程序流程圖如下圖所示:</p><p> 圖2 人人對(duì)戰(zhàn)模塊流程圖</p><p> (3) 成績(jī)輸出模塊程序流程圖如下圖所示
13、 </p><p> 圖3 成績(jī)輸出模塊程序流程圖</p><p> 5.3、函數(shù)實(shí)現(xiàn)說(shuō)明</p><p> ?。?)main()主函數(shù)</p><p> 在主函數(shù)中,首先定義使用到的常數(shù)、全局變量、函數(shù)原型說(shuō)明。盤(pán)狀態(tài)用數(shù)組a[8][8],初值為0,表示空格。函數(shù)的實(shí)體部分,開(kāi)始初始化圖形系統(tǒng),然后通過(guò)調(diào)用函數(shù)DrawQp(
14、)先畫(huà)出棋盤(pán),調(diào)用playtoplay()人人對(duì)戰(zhàn)函數(shù)開(kāi)始游戲,一旦游戲結(jié)束后,關(guān)閉圖形系統(tǒng),程序結(jié)束。</p><p> (2)DrawQp()畫(huà)棋盤(pán)函數(shù)</p><p> 背景顏色設(shè)為藍(lán)色,從坐標(biāo)(100,100)開(kāi)始每隔40個(gè)單位用白色畫(huà)一條水平直線,一條垂直線,構(gòu)成棋盤(pán),用循環(huán)語(yǔ)句實(shí)現(xiàn)。函數(shù)setfillstyle()可以設(shè)置填充模式和填充顏色,fillellipse(int
15、x,int y,xradius,int yradius)以x和y為圓心,xradius和yradius為水平和垂直軸畫(huà)一填充橢圓,當(dāng)xradius和yradius相等時(shí),則畫(huà)出的是圓,用它表示棋子。(3)SetPlayColor()設(shè)置棋子的顏色 函數(shù)的參數(shù)為整型變量t,根據(jù)t的值來(lái)設(shè)計(jì)填充棋子的當(dāng)前顏色,值為1代表白棋,值為2代表黑棋。</p><p> (4)MoveColor()恢復(fù)原來(lái)格子的狀
16、態(tài)</p><p> 由于棋手在走棋的時(shí)候,他的棋子總是首先出現(xiàn)在棋盤(pán)的左上角,棋手要通過(guò)移動(dòng)光標(biāo)走到要落子的位置,在經(jīng)過(guò)的路程上顯示當(dāng)前棋子,就會(huì)覆蓋原來(lái)的棋盤(pán)狀態(tài),所以一旦棋子走過(guò)后,就應(yīng)恢復(fù)原來(lái)的狀態(tài),是空格的依然顯示空格,是棋子的就顯示原來(lái)棋子的顏色。因?yàn)槠遄右苿?dòng)過(guò)程并沒(méi)有改變數(shù)組元素的值,所以可以根據(jù)數(shù)組元素的值判定原來(lái)的狀態(tài),如果值是1,就恢復(fù)白色棋子,值是2則恢復(fù)黑色棋子,否則恢復(fù)藍(lán)色空格。<
17、;/p><p> ?。?)、playtoplay()人人對(duì)戰(zhàn)函數(shù) </p><p> 這是游戲進(jìn)行的函數(shù),主要是接收棋手的按鍵消息,其處理過(guò)程如下: </p><p> 1)按Esc鍵程序可以隨時(shí)結(jié)束。 </p><p> 2)按上下左右光標(biāo)鍵,則改變棋子移動(dòng)的坐標(biāo)值。 </p><p> 3)按回車(chē)鍵后判斷: &
18、lt;/p><p> ?、偃缏渥拥奈恢靡呀?jīng)有棋則無(wú)效,繼續(xù)壓鍵。 </p><p> ?、谌缏渥游恢檬强崭?,可以將棋子落入格內(nèi),調(diào)用函數(shù)QpChange()判斷是否引起棋盤(pán)的變化,函數(shù)值為1有變化,為0沒(méi)變化。如果棋盤(pán)有變化,說(shuō)明將包圍的對(duì)方棋子吃掉,統(tǒng)計(jì)當(dāng)前分?jǐn)?shù),如果棋盤(pán)沒(méi)有變化,則說(shuō)明落子的位置無(wú)法包圍對(duì)方的棋子也視為無(wú)效棋,可以繼續(xù)尋找合適的位置,但開(kāi)始統(tǒng)計(jì)其落子次數(shù),一旦嘗試次數(shù)超過(guò)當(dāng)
19、前棋盤(pán)的空格數(shù),則說(shuō)明他無(wú)棋可走,則放棄此步,讓對(duì)方下棋。 </p><p> ?、廴绻遄幼兓?,格子已占滿(mǎn)64格或一方棋子為0,則游戲結(jié)束,顯示勝利方信息。按任意鍵程序結(jié)束。 </p><p> ?、苤貜?fù)上述步驟,直到游戲結(jié)束。(6)、QpChange()判斷棋盤(pán)變化當(dāng)棋手按回車(chē)鍵落子后,就要分別往8個(gè)方向判斷是否包圍住對(duì)方棋子,如果是,則改變棋盤(pán),也就是棋盤(pán)上黑白棋子的個(gè)數(shù)要發(fā)生變
20、化。如果所有方向都判斷過(guò),并且沒(méi)有引起棋盤(pán)的變化,則棋盤(pán)變化標(biāo)志值yes為0,返回yes,結(jié)束本函數(shù)。(7)、DoScore()處理分?jǐn)?shù) 根據(jù)當(dāng)前數(shù)組元素的值判斷分?jǐn)?shù),也就是各方棋子的個(gè)數(shù),如果數(shù)組元素值為1,白棋棋子數(shù)累加;如果數(shù)組元素值為2,則黑棋棋子數(shù)累加。(8)、PrintScore()輸出成績(jī) 利用設(shè)置實(shí)體填充模式填充矩形條清除掉前次的成績(jī),再利用sprintf()函數(shù)將整數(shù)轉(zhuǎn)換為字符串的形式,再利用outte
21、xtxy()函數(shù)將成績(jī)輸出。(9)、playWin()輸出勝利者結(jié)果 根據(jù)分?jǐn)?shù)值score1和score2的大小得出下棋的結(jié)果,輸出贏者信息。如果是白方勝就輸出“white win!”,黑方勝就輸出“black win!”,平局就輸出“you all win!”。</p><p> 5.4、圖形庫(kù)函數(shù)介紹</p><p> 圖形庫(kù)<graphics.h> 是TC里面
22、的圖形庫(kù),分為:像素函數(shù)、直線和線型函數(shù)、多邊形函數(shù)、填充函數(shù)等。在本程序中主要應(yīng)用到了以下功能函數(shù):</p><p> ?。?)、line() 畫(huà)線函數(shù)</p><p> 功能: 函數(shù)line()使用當(dāng)前繪圖色、線型及線寬,在給定的兩點(diǎn)間畫(huà)一直線。 </p><p> 函數(shù)原型: void line(int startx,int starty,int endx
23、,int endy); </p><p> 說(shuō)明: 參數(shù)startx,starty為起點(diǎn)坐標(biāo),endx,endy為終點(diǎn)坐標(biāo),函數(shù)調(diào)用前后,圖形狀態(tài)下屏幕光標(biāo)(一般不可見(jiàn))當(dāng)前位置不改變。 </p><p> (2)、setcolor()圖形屏幕函數(shù) </p><p> 函數(shù)原型:void setcolor(int color) </p><
24、p> 功能:將當(dāng)前圖形屏幕的當(dāng)前筆畫(huà)顏色置為color.</p><p> (3)、setfillstyle() 設(shè)置填充圖樣和顏色函數(shù)</p><p> 函數(shù)原型: void far setfillstyle(int pattern, int color);</p><p> 功 能: 設(shè)置填充模式和顏色 </p><p>
25、?。?)、fillellipse() 畫(huà)橢圓區(qū)函數(shù)</p><p> 功 能: 畫(huà)出并填充一橢圓 </p><p> 函數(shù)原型: void far fillellipse(int x, int y, int xradius, int yradius); </p><p> 說(shuō)明:填充邊框所定義的橢圓的內(nèi)部,該邊框由一對(duì)坐標(biāo)、一個(gè)寬度和一個(gè)高度指定。</p
26、><p> ?。?)、setbkcolor()</p><p> 功能:該函數(shù)用指定的顏色值來(lái)設(shè)置當(dāng)前的背景色</p><p> 函數(shù)原型:Void far SetBkColor(int Color );</p><p> ?。?)、C語(yǔ)言中的顏色表及填充模式如下兩表所示:</p><p> 5.5、程序源代碼及注釋
27、 </p><p> #include "graphics.h" /*圖形系統(tǒng)頭文件*/</p><p> #define LEFT 0x4b00 /*光標(biāo)左鍵值*/</p><p> #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/</p><p> #define DOWN 0x5000 /*光
28、標(biāo)下鍵值*/</p><p> #define UP 0x4800 /*光標(biāo)上鍵值*/</p><p> #define ESC 0x011b /* ESC鍵值*/</p><p> #define ENTER 0x1c0d /* 回車(chē)鍵值*/</p><p> int a[8][8]={0},key,score1,score2;/*
29、具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/</p><p> char playone[3],playtwo[3];/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/</p><p> void playtoplay(void);/*人人對(duì)戰(zhàn)函數(shù)*/</p><p> void DrawQp(void);/*畫(huà)棋盤(pán)函數(shù)*/</p><p> void S
30、etPlayColor(int x);/*設(shè)置棋子第一次的顏色*/</p><p> void MoveColor(int x,int y);/*恢復(fù)原來(lái)棋盤(pán)狀態(tài)*/</p><p> int QpChange(int x,int y,int z);/*判斷棋盤(pán)的變化*/</p><p> void DoScore(void);/*處理分?jǐn)?shù)*/</p&g
31、t;<p> void PrintScore(int n);/*輸出成績(jī)*/</p><p> void playWin(void);/*輸出勝利者信息*/</p><p> /******主函數(shù)*********/</p><p> void main(void)</p><p><b> {</b&
32、gt;</p><p> int gd=DETECT,gr;</p><p> initgraph(&gd,&gr,"c:\\tc"); /*初始化圖形系統(tǒng)*/</p><p> DrawQp();/*畫(huà)棋盤(pán)*/</p><p> playtoplay();/*人人對(duì)戰(zhàn)*/</p>&
33、lt;p><b> getch();</b></p><p> closegraph();/*關(guān)閉圖形系統(tǒng)*/</p><p><b> }</b></p><p> void DrawQp()/*畫(huà)棋盤(pán)*/</p><p><b> {</b></p&g
34、t;<p><b> int i,j;</b></p><p> score1=score2=0;/*棋手一開(kāi)始得分都為0*/</p><p> setbkcolor(BLUE);</p><p> for(i=100;i<=420;i+=40)</p><p><b> {<
35、;/b></p><p> line(100,i,420,i);/*畫(huà)水平線*/</p><p> line(i,100,i,420); /*畫(huà)垂直線*/</p><p><b> }</b></p><p> setcolor(0);/*取消圓周?chē)囊蝗|西*/</p><p>
36、 setfillstyle(SOLID_FILL,15);/*白色實(shí)體填充模式*/</p><p> fillellipse(500,200,15,15); /*在顯示得分的位置畫(huà)棋*/</p><p> setfillstyle(SOLID_FILL,8); /*黑色實(shí)體填充模式*/</p><p> fillellipse(500,300,15,15);&
37、lt;/p><p> a[3][3]=a[4][4]=1;/*初始兩個(gè)黑棋*/</p><p> a[3][4]=a[4][3]=2;/*初始兩個(gè)白棋*/</p><p> setfillstyle(SOLID_FILL,WHITE);</p><p> fillellipse(120+3*40,120+3*40,15,15);</
38、p><p> fillellipse(120+4*40,120+4*40,15,15);</p><p> setfillstyle(SOLID_FILL,8);</p><p> fillellipse(120+3*40,120+4*40,15,15);</p><p> fillellipse(120+4*40,120+3*40,15
39、,15);</p><p> score1=score2=2; /*有棋后改變分?jǐn)?shù)*/</p><p> DoScore();/*輸出開(kāi)始分?jǐn)?shù)*/</p><p><b> }</b></p><p> void playtoplay()/*人人對(duì)戰(zhàn)*/</p><p><b>
40、 {</b></p><p> int x,y,t=1,i,j,cc=0;</p><p> while(1)/*換棋手走棋*/</p><p><b> {</b></p><p> x=120,y=80;/*每次棋子一開(kāi)始出來(lái)的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/</p><p&
41、gt; while(1) /*具體一個(gè)棋手走棋的過(guò)程*/</p><p><b> {</b></p><p> PrintScore(1);/*輸出棋手1的成績(jī)*/</p><p> PrintScore(2);/*輸出棋手2的成績(jī)*/</p><p> SetPlayColor(t);/*t變量是用來(lái)判斷棋
42、手所執(zhí)棋子的顏色*/</p><p> fillellipse(x,y,15,15);</p><p> key=bioskey(0);/*接收按鍵*/</p><p> if(key==ESC)/*跳出游戲*/</p><p><b> break;</b></p><p><b&
43、gt; else</b></p><p> if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/</p><p><b> {</b></p><p> if(y!=80&&a[(x-120)/40][(y-120)/40]!=1</p><p> &&a[
44、(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒(méi)有棋子*/</p><p><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)*/&l
45、t;/p><p> a[(x-120)/40][(y-120)/40]=2;</p><p> if(!QpChange(x,y,t))/*落子后判斷棋盤(pán)的變化*/</p><p><b> {</b></p><p> a[(x-120)/40][(y-120)/40]=0;/*恢復(fù)空格狀態(tài)*/</p>
46、<p> cc++;/*開(kāi)始統(tǒng)計(jì)嘗試次數(shù)*/</p><p> if(cc>=64-score1-score2) /*如果嘗試超過(guò)空格數(shù)則停步*/</p><p><b> {</b></p><p> MoveColor(x,y);</p><p> fillellipse(x,y,15,
47、15);</p><p><b> break;</b></p><p><b> }</b></p><p><b> else</b></p><p> continue;/*如果按鍵無(wú)效*/</p><p><b> }<
48、/b></p><p> DoScore();/*分?jǐn)?shù)的改變*/</p><p> break;/*棋盤(pán)變化了,則輪對(duì)方走棋*/</p><p><b> }</b></p><p> else/*已經(jīng)有棋子就繼續(xù)按鍵*/</p><p><b> continue;&l
49、t;/b></p><p><b> }</b></p><p> else /*四個(gè)方向按鍵的判斷*/</p><p> if(key==LEFT&&x>120)/*左方向鍵*/</p><p><b> {</b></p><p>
50、MoveColor(x,y);</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
51、> }</b></p><p><b> else</b></p><p> if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/</p><p><b> {</b></p><p> MoveColor(x
52、,y);</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> }<
53、/b></p><p><b> else</b></p><p> if(key==UP&&y>120)/*上方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);</p><p> fill
54、ellipse(x,y,15,15);</p><p> SetPlayColor(t);</p><p><b> y-=40;</b></p><p> fillellipse(x,y,15,15);</p><p><b> }</b></p><p><
55、b> else</b></p><p> if(key==DOWN&&y<400)/*下方向鍵*/</p><p><b> {</b></p><p> MoveColor(x,y);</p><p> fillellipse(x,y,15,15);</p>
56、<p> SetPlayColor(t);</p><p><b> y+=40;</b></p><p> fillellipse(x,y,15,15);</p><p><b> }</b></p><p><b> }</b></p>
57、<p> if(key==ESC)/*結(jié)束游戲*/</p><p><b> break;</b></p><p> if((score1+score2)==64||score1==0||score2==0)/*格子已經(jīng)占滿(mǎn)或一方棋子為0判斷勝負(fù)*/</p><p><b> {</b></p&g
58、t;<p> playWin();/*輸出最后結(jié)果*/</p><p><b> break;</b></p><p><b> }</b></p><p> t=t%2+1; /*一方走后,改變棋子顏色即輪對(duì)方走*/</p><p> cc=0; /*計(jì)數(shù)值恢復(fù)為0*/&
59、lt;/p><p> } /*endwhile*/</p><p><b> }</b></p><p> void SetPlayColor(int t)/*設(shè)置棋子顏色*/</p><p><b> {</b></p><p> if(t%2==1)</p&g
60、t;<p> setfillstyle(SOLID_FILL,15);/*白色*/</p><p><b> else</b></p><p> setfillstyle(SOLID_FILL,8);/*灰色*/</p><p><b> }</b></p><p> voi
61、d MoveColor(int x,int 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/*其
62、他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍(lán)色棋盤(pán)*/</p><p> switch(a[(x-120)/40][(y-120)/40])</p><p><b> {</b></p><p><b> case 1:</b></p><p> setfillstyle(SOLI
63、D_FILL,15);break; /*白色*/</p><p><b> case 2:</b></p><p> setfillstyle(SOLID_FILL,8);break; /*黑色*/</p><p><b> default:</b></p><p> setfillstyl
64、e(SOLID_FILL,BLUE); /*藍(lán)色*/</p><p><b> }</b></p><p><b> }</b></p><p> int QpChange(int x,int y,int t)/*判斷棋盤(pán)的變化*/</p><p><b> {</b>
65、</p><p> int i,j,k,kk,ii,jj,yes;</p><p><b> yes=0;</b></p><p> i=(x-120)/40; /*計(jì)算數(shù)組元素的行下標(biāo)*/</p><p> j=(y-120)/40; /*計(jì)算數(shù)組元素的列下標(biāo)*/</p><p> S
66、etPlayColor(t);/*設(shè)置棋子變化的顏色*/</p><p> /*開(kāi)始往8個(gè)方向判斷變化*/</p><p> if(j<6)/*往右邊*/</p><p><b> {</b></p><p> for(k=j+1;k<8;k++)</p><p> if(a
67、[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結(jié)束*/</p><p><b> break;</b></p><p> if(a[i][k]!=0&&k<8)</p><p><b> {</b></p><p> for(kk=j+
68、1;kk<k&&k<8;kk++)/*判斷右邊*/</p><p><b> {</b></p><p> a[i][kk]=a[i][j]; /*改變棋子顏色*/</p><p> fillellipse(120+i*40,120+kk*40,15,15);</p><p><b
69、> }</b></p><p> if(kk!=j+1) /*條件成立則有棋子改變過(guò)顏色*/</p><p><b> yes=1;</b></p><p><b> }</b></p><p><b> }</b></p><p
70、> if(j>1)/*判斷左邊*/</p><p><b> {</b></p><p> for(k=j-1;k>=0;k--)</p><p> if(a[i][k]==a[i][j]||!a[i][k])</p><p><b> break;</b></p&
71、gt;<p> if(a[i][k]!=0&&k>=0)</p><p><b> {</b></p><p> for(kk=j-1;kk>k&&k>=0;kk--)</p><p><b> {</b></p><p>
72、a[i][kk]=a[i][j];</p><p> fillellipse(120+i*40,120+kk*40,15,15);</p><p><b> }</b></p><p> if(kk!=j-1)</p><p><b> yes=1;</b></p><p
73、><b> }</b></p><p><b> }</b></p><p> if(i<6)/*判斷下邊*/</p><p><b> {</b></p><p> for(k=i+1;k<8;k++)</p><p>
74、if(a[k][j]==a[i][j]||!a[k][j])</p><p><b> break;</b></p><p> if(a[k][j]!=0&&k<8)</p><p><b> {</b></p><p> for(kk=i+1;kk<k&
75、&k<8;kk++)</p><p><b> {</b></p><p> a[kk][j]=a[i][j];</p><p> fillellipse(120+kk*40,120+j*40,15,15);</p><p><b> }</b></p><
76、p> if(kk!=i+1)</p><p><b> yes=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(i>1)/*判斷上邊*/</p><p><b&
77、gt; {</b></p><p> for(k=i-1;k>=0;k--)</p><p> if(a[k][j]==a[i][j]||!a[k][j])</p><p><b> break;</b></p><p> if(a[k][j]!=0&&k>=0)<
78、/p><p><b> {</b></p><p> for(kk=i-1;kk>k&&k>=0;kk--)</p><p><b> {</b></p><p> a[kk][j]=a[i][j];</p><p> fillellipse
79、(120+kk*40,120+j*40,15,15);</p><p><b> }</b></p><p> if(kk!=i-1)</p><p><b> yes=1;</b></p><p><b> }</b></p><p><
80、b> }</b></p><p> if(i>1&&j<6)/*右上*/</p><p><b> {</b></p><p> for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)</p><p> if(a[k]
81、[kk]==a[i][j]||!a[k][kk])</p><p><b> break;</b></p><p> if(a[k][kk]&&k>=0&&kk<8)</p><p><b> {</b></p><p> for(ii=i-1,j
82、j=j+1;ii>k&&k>=0;ii--,jj++)</p><p><b> {</b></p><p> a[ii][jj]=a[i][j];</p><p> fillellipse(120+ii*40,120+jj*40,15,15);</p><p><b> }
83、</b></p><p> if(ii!=i-1)</p><p><b> yes=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(i<6&&
84、j>1)/*左下*/</p><p><b> {</b></p><p> for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)</p><p> if(a[k][kk]==a[i][j]||!a[k][kk])</p><p><b> bre
85、ak;</b></p><p> if(a[k][kk]!=0&&k<8&&kk>=0)</p><p><b> {</b></p><p> for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)</p><p
86、><b> {</b></p><p> a[ii][jj]=a[i][j];</p><p> fillellipse(120+ii*40,120+jj*40,15,15);</p><p><b> }</b></p><p> if(ii!=i+1)</p>&l
87、t;p><b> yes=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(i>1&&j>1)/*左上*/</p><p><b> {</b>&l
88、t;/p><p> for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)</p><p> if(a[k][kk]==a[i][j]||!a[k][kk])</p><p><b> break;</b></p><p> if(a[k][kk]!=0&&a
89、mp;k>=0&&kk>=0)</p><p><b> {</b></p><p> for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)</p><p><b> {</b></p><p> a[ii][
90、jj]=a[i][j];</p><p> fillellipse(120+ii*40,120+jj*40,15,15);</p><p><b> }</b></p><p> if(ii!=i-1)</p><p><b> yes=1;</b></p><p>
91、<b> }</b></p><p><b> }</b></p><p> if(i<6&&j<6)/* 右下*/</p><p><b> {</b></p><p> for(k=i+1,kk=j+1;kk<8&&
92、;kk<8;k++,kk++)</p><p> if(a[k][kk]==a[i][j]||!a[k][kk])</p><p><b> break;</b></p><p> if(a[k][kk]!=0&&kk<8&&k<8)</p><p><b&g
93、t; {</b></p><p> for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)</p><p><b> {</b></p><p> a[ii][jj]=a[i][j];</p><p> fillellipse(120+ii*40,1
94、20+jj*40,15,15);</p><p><b> }</b></p><p> if(ii!=i+1)</p><p><b> yes=1;</b></p><p><b> }</b></p><p><b> }<
95、;/b></p><p> return yes;/*返回是否改變過(guò)棋子顏色的標(biāo)記*/</p><p><b> }</b></p><p> void DoScore()/*處理分?jǐn)?shù)*/</p><p><b> {</b></p><p><b>
96、 int i,j;</b></p><p> score1=score2=0;/*重新開(kāi)始計(jì)分?jǐn)?shù)*/</p><p> for(i=0;i<8;i++)</p><p> for(j=0;j<8;j++)</p><p> if(a[i][j]==1)/*分別統(tǒng)計(jì)兩個(gè)人的分?jǐn)?shù)*/</p><
97、;p><b> score1++;</b></p><p><b> else</b></p><p> if(a[i][j]==2)</p><p><b> score2++;</b></p><p><b> }</b></p&
98、gt;<p> void PrintScore(int playnum)/*輸出成績(jī)*/</p><p><b> {</b></p><p> if(playnum==1)/*清除以前的成績(jī)*/</p><p><b> {</b></p><p> setfillstyl
99、e(SOLID_FILL,BLUE);</p><p> bar(550,100,640,400);</p><p><b> }</b></p><p> setcolor(RED);</p><p> settextstyle(0,0,4);/*設(shè)置文本輸出樣式*/</p><p>
100、 if(playnum==1)/*判斷輸出哪個(gè)棋手的分,在不同的位置輸出*/</p><p><b> {</b></p><p> sprintf(playone,"%d",score1);</p><p> outtextxy(550,200,playone);</p><p><b&
101、gt; }</b></p><p><b> else</b></p><p><b> {</b></p><p> sprintf(playtwo,"%d",score2);</p><p> outtextxy(550,300,playtwo);<
102、;/p><p><b> }</b></p><p> setcolor(0);</p><p><b> }</b></p><p> void playWin()/*輸出最后的勝利者結(jié)果*/</p><p><b> {</b></p&g
103、t;<p> settextstyle(0,0,4);</p><p> setcolor(12);</p><p> if(score2>score1)/*開(kāi)始判斷最后的結(jié)果*/</p><p> outtextxy(100,50,"black win!");</p><p><b>
104、; else</b></p><p> if(score2<score1)</p><p> outtextxy(100,50,"white win!");</p><p><b> else</b></p><p> outtextxy(60,50,"you a
105、ll win!");</p><p><b> }</b></p><p><b> 5.6、調(diào)試結(jié)果</b></p><p> (1)本程序是在Turbo C for Windows 集成實(shí)驗(yàn)與學(xué)習(xí)環(huán)境 V6.0環(huán)境下運(yùn)行的。運(yùn)行程序后,會(huì)得到如下圖4所示初始界面,初始棋盤(pán)上黑白雙方各有兩粒棋子,白棋先走
106、。然后雙方交替找棋,同時(shí)顯示比分,直到把棋盤(pán)走滿(mǎn),最后看看黑白雙方誰(shuí)的棋子多, 輸出勝利者息。如圖5所示。</p><p> 圖4 游戲初始界面 </p><p> 圖5 白方勝利的界面</p><p> (2) 程序運(yùn)行所遇問(wèn)題:程序能夠正常運(yùn)行,但在DOS全屏環(huán)境下無(wú)法截屏,我嘗試過(guò)用printscreen鍵和QQ截圖等很多方法,但都不行。所以,最后只
107、能用相機(jī)把運(yùn)行結(jié)果拍下來(lái),如上兩圖所示,截圖有點(diǎn)斜,就是這個(gè)原因。</p><p><b> 六、設(shè)計(jì)心得體會(huì) </b></p><p> 以前也做過(guò)一次c語(yǔ)言課程設(shè)計(jì),但那時(shí)候?qū)語(yǔ)言基本的知識(shí)點(diǎn)都不是很懂,更別說(shuō)要我們編出那種圖形界面的程序來(lái)。所以感覺(jué)C語(yǔ)言很枯燥,也總認(rèn)為c語(yǔ)言只能編出那種黑底白字的程序。但經(jīng)過(guò)這次計(jì)算機(jī)軟件技術(shù)課程設(shè)計(jì),真正使我對(duì)計(jì)算機(jī)編程
108、培養(yǎng)了濃厚的興趣。當(dāng)我看到了用C語(yǔ)言做出的《黑白棋游戲系統(tǒng)》后,我才真正感受到了C程序設(shè)計(jì)的強(qiáng)大和神奇。原來(lái)C語(yǔ)言一樣也能做出那種很漂亮的圖形界面來(lái)。這讓我真正認(rèn)識(shí)到了學(xué)習(xí)編程的必要性。</p><p> 在大一的時(shí)候我就過(guò)了國(guó)二,但說(shuō)實(shí)話(huà),那基本上只是對(duì)C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)的考查,要我們編出這樣的程序來(lái)還有很遠(yuǎn)距離。雖然說(shuō)這《黑白棋游戲系統(tǒng)》程序不是我自己編寫(xiě)出來(lái)的,但在老師的指導(dǎo)下,我自己查了很多資料,認(rèn)認(rèn)真真
109、地讀了程序,也仔細(xì)分析程序的邏輯思路。使我對(duì)C語(yǔ)言編程有了更深入更真切的了解,具體如下:</p><p> ?。?)、模塊化思想。雖然平常上課老聽(tīng)老師說(shuō)要有模塊化思想,但自己在編寫(xiě)實(shí)例中具體如何模塊化就不是很清楚了。通過(guò)這次課程設(shè)計(jì),使我切實(shí)理解了模塊化思想,比如在《黑白棋游戲系統(tǒng)》中就可以分為畫(huà)棋盤(pán)模塊、人人對(duì)戰(zhàn)模塊、分?jǐn)?shù)處理模塊等,要實(shí)現(xiàn)哪個(gè)功能就直接讀和修改對(duì)應(yīng)的哪個(gè)模塊,這樣就大大提高了程序的可讀性和易修
110、改性。</p><p> ?。?)、分析程序先從主函數(shù)main()入手。Main()函數(shù)是C源程序編譯時(shí)的開(kāi)始,從main()函數(shù)開(kāi)始讀函數(shù)可將其他函數(shù)的功能理解得更透徹。</p><p> ?。?)、本次課程設(shè)計(jì)我收獲最大的就是對(duì)圖形庫(kù)<graphics.h>的認(rèn)識(shí)和了解,平時(shí)我們編程很少用到也不知道怎么用這圖形庫(kù)<graphics.h>,所以一直認(rèn)為C語(yǔ)言編不出
111、那種很漂亮的圖形界面。通過(guò)本次課設(shè),我學(xué)會(huì)了如何調(diào)用圖形庫(kù)里面的功能函數(shù),比如調(diào)用line() 畫(huà)線函數(shù)、setfillstyle() 設(shè)置填充圖樣和顏色函數(shù)、fillellipse() 畫(huà)橢圓區(qū)函數(shù)、setbkcolor()設(shè)置背景顏色函數(shù)等等,對(duì)這些函數(shù)的原型和功能都有所了解。</p><p> (4)、除此之外,我還學(xué)會(huì)了如何對(duì)文檔的整體排版和報(bào)告格式的書(shū)寫(xiě)等等很多處理文檔的能力,是對(duì)我們以后撰寫(xiě)論文的一
112、次很好的鍛煉。</p><p> 總而言之,通過(guò)本次課程設(shè)計(jì),無(wú)論是在學(xué)習(xí)上還是其他方面,都使我受益匪淺。</p><p><b> 七、參考文獻(xiàn)</b></p><p> [1] 譚浩強(qiáng),《C程序設(shè)計(jì)(第三版)》,清華大學(xué)出版社,2005.7</p><p> [2] 郭翠英,《C語(yǔ)言課程設(shè)計(jì)案例精編》, 中國(guó)
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- vb黑白棋游戲課程設(shè)計(jì)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)---黑白棋游戲
- c語(yǔ)言課程設(shè)計(jì)--黑白棋游戲
- 黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 黑白棋游戲畢業(yè)設(shè)計(jì)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--黑白棋
- 黑白棋畢業(yè)論文---黑白棋游戲設(shè)計(jì)與開(kāi)發(fā)(含外文翻譯)
- 基于qt的黑白棋游戲
- 黑白棋游戲畢業(yè)論文
- 嵌入式wince課程設(shè)計(jì)報(bào)告(黑白棋)
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)(論文)-黑白棋
- 黑白棋游戲設(shè)計(jì)與開(kāi)發(fā)畢業(yè)論文
- 基于qt的黑白棋游戲開(kāi)發(fā)(論文)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---黑白棋
- 基于Qt的黑白棋游戲(終稿).doc
- 基于java me的黑白棋游戲設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于java me的黑白棋游戲設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于Alpha-Btea剪枝算法的黑白棋游戲的設(shè)計(jì)與開(kāi)發(fā).pdf
- 畢業(yè)設(shè)計(jì)----黑白棋子的識(shí)別與分揀輸送裝置的設(shè)計(jì)
- 黑白棋盤(pán)網(wǎng)格中的直線檢測(cè)方法研究.pdf
評(píng)論
0/150
提交評(píng)論