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