掃雷課程設計報告_第1頁
掃雷課程設計報告_第2頁
掃雷課程設計報告_第3頁
掃雷課程設計報告_第4頁
掃雷課程設計報告_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計報告課程名稱:計算機課程掃雷設計院系:建筑工程學院專業(yè)班級:土木1102班成員姓名:黃梟威王曉偉宋浩余彬李凱凱李婷婷張娣朱月梅子指導教師:趙先完成時間:2012.6.6報告成績:掃雷游戲設計綜述在計算機逐步滲入社會生活各個層面的今天,計算機已經成為人們日常生活的一分,越來越多的人使用計算機辦公、娛樂等等。掃雷游戲是Windows操作系統(tǒng)自帶的一款小游戲,在過去的幾年里,Windows操作系統(tǒng)歷經數次換代更新,變得越來越龐大、復雜,功能也越來越強大,但是這款小游戲依然保持原來的容貌,可見這款小游戲受到越來越多人的喜愛。我們小組利用TurboC編寫了與它功能相仿的掃雷游戲,寓學于樂。一、應用環(huán)境1.1硬件環(huán)境一臺完整的電腦,包括鍵盤、鼠標,最小硬盤空間1GHz1.1386,486,586及兼容機.640K基本內存;2.11M以上擴充內存,10M以上的顯示內存.2.2軟件環(huán)境開發(fā)環(huán)境:本系統(tǒng)的設計采用的是C語言開發(fā)Windows操作系統(tǒng),TurboC2.0漢化版二、程序的作用及設計目的2.1程序功能程序的功能是隨機生成地雷位置,通過鍵盤操作玩游戲,空格鍵進行打開,回車鍵進行標記,所有地雷標出后勝利,當單擊到地雷時失敗。2.2程序設計目的1.培養(yǎng)綜合運用所學知識獨立完成課題的能力。2.更深入地理解和掌握該課程中的有關基本概念,程序設計思想和方法。3.提高對工作認真負責、一絲不茍,對同學團結友愛,協(xié)作攻關的基本素質。4.培養(yǎng)勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學技術人員應具有的素質。5.培養(yǎng)從資料文獻、科學實驗中獲得知識的能力,提高從別人經驗中找到解決問題的新途徑的悟性,初步培養(yǎng)工程意識和創(chuàng)新能力。6.對掌握知識的深度、運用理論去處理問題的能力、實驗能力、課程設計能力、書面及口頭表達能力進行考核。三、程序分析和設計3.1游戲規(guī)則設計30×16格區(qū)域,按上空格鍵后,該格顯示數字,則表示它周圍8個空格內含有的地雷數,周圍沒有地雷的顯示空白,則不能再按空格鍵了。如果是地雷,則游戲結束。如果判斷是地雷,可以使用回車鍵標出,顯示紅旗,要取消標志則再按回車鍵,當所有地雷都標出,每個空格都處理過了,則結束。3.2游戲界面游戲界面為30*16的黑底灰色方框。3.3設計思路掃雷程序主要用了一個30行16列的二維數組表示,數組的num代表格內當前處于什么狀態(tài),值為1表示有雷,值為0表示已經變成空白格或者顯示過數字,roundnum統(tǒng)計每個格子周圍有多少地雷,flag主要是空格鍵測試的標志,如果flag為1則表示格子顯示紅旗,這樣回車鍵點在這個格子中將無效。算法的重點是一開始統(tǒng)計好每個格子周圍有多少地雷,然后當空格鍵點在沒地雷的格子上時進行兩種判斷,如果格子周圍沒地雷就先在原來的格子位置顯示空白格,然后用遞歸的方法同樣判斷周圍的8個格子;如果格子周圍有地雷,就在該格子上顯示具體的雷數。在遞歸判斷8個格子時,如果格子上有雷或者格子已經顯示過雷數或者空白格,以及格子上有紅旗標志的話,就不再對格子進行任何判斷。1main()主函數定義使用到的常數、函數原型說明。然后初始化圖形系統(tǒng),調用游戲控制函數,游戲只接鍵盤標操,作按任意鍵結束游戲,關閉圖形系統(tǒng),程序結束。2游戲控制函數調用函數redraw重畫函數,調用為具體游戲操作過程,重畫游戲界面。即對下一操作,不管是打開數字,還是空格,亦或是地雷,都重畫一次。3畫初始界面這個函數完成初始界面的設計以及隨機生成地雷數。初始界面的主要工作是確定圖的位置和方格顯示的位置。外邊框的左上角坐標為(190,60),右下角坐標為(390,290),顯示地雷數的區(qū)域為(190,60)~(390,90),每個方格的寬度和高度均為16。讀者可以參照修改區(qū)域的大小。5randlei隨機布雷隨機布雷(randlei)函數用于隨機布雷,且計算每個各自周圍雷的個數。6DrawRedflag()顯示紅旗用點擊回車鍵表示起地雷,起雷后顯示一個小紅旗。7游戲過程游戲過程主要是對按鍵的處理,具體算法如下:統(tǒng)計每個格子周圍有多少地雷。(1)如果單擊了空格鍵則判斷:如果單擊了方格,判斷該格子里有紅旗,則按鍵無效。如果單擊的格子沒有顯示過數字或空白,則判斷;如果是地雷,游戲結束,顯示地雷分布;如果不是地雷,則統(tǒng)計該格子周圍(8個方向)的地雷數,如果周圍地雷數為0,調用函數tansuo處理周圍格子的情況,顯示周圍地雷數或空白。如果單擊的格子周圍地雷數不為0,則顯示周圍地雷數,將處理過的格子作標記。如果所有格子處理完畢,游戲勝利。(2)如果單擊了回車鍵,該格子沒有紅旗,則顯示紅旗。如果有紅旗,再擊回車鍵,則紅旗消失。(3)重復步驟(2)直到按鍵結束程序。8統(tǒng)計地雷統(tǒng)計每個格子周圍的雷數,分別考慮格子處于四個角、四條邊以及中間某個位置的情況。周圍指上、下、左、右、左上、左下、右上、右下。注意程序中使用的是多個if語句,而沒有使用或運算連接組成復合表達式,考慮到C語言的邏輯表達式的問題,邏輯或只要前面的表達式為真,后面就不必判斷了,這樣可能造成少計地雷數。9顯示無雷區(qū)的空白格當單擊了某個格子,該格子周圍地雷數為0時,應該繼續(xù)判斷它周圍8個方向的格子的周圍地雷數是否為0,將這些格子都用空白顯示。所以這也是一個遞歸問題,將其構造為遞歸函數。一個遞歸函數有兩個要素,一個是入口參數,且是降規(guī)模的,另一個為出口參數。本函數的入口參數為格子的坐標,表示處理哪個格子,出口參數是該格子有紅旗或者已經顯示過數字或空白格子。具體算法如下:(1)如果當前格子有紅旗或者已經顯示過數字或空白格子,則返回。(2)空白格子數減1(統(tǒng)計處理過多少格子)。(3)如果周圍的地雷數為0,且它不是地雷,則將它顯示為空白,同時將它的狀態(tài)值num置0,表示處理過;如果周圍的地雷數不為0,顯示周圍地雷數,同時將它的狀態(tài)值num置0,表示處理過(即顯示過數字),返回。(4)8個方向探索調用函數顯示所有的空白格子。四、程序測試及分析4.1程序調試是指對程序的查錯和排錯。為了便于查錯、閱讀,在設計該程序的過程中我們采用了結構化程序方法編輯,添加了盡可能多的注釋,這就為接下來的調試過程帶來了很多方便。4.2經過仔細檢查之后進行上機調試。進行編譯,如果在編譯和連接過程中發(fā)現(xiàn)錯誤,屏幕上顯示了出錯信息,根據提示找到出錯的位置,加以改正,再進行編譯……如此反復,直到順利通過編譯和連接為止。4.3在本次作業(yè)過程中碰到的編譯、連接的錯誤主要有:缺少變量定義,定義位置不正確、語法錯誤、注釋的位置等。4.4錯誤解決方法。(1)缺少變量定義,定義位置不正確;由于該程序相對來講稍有些長,前后有些變量不容易聯(lián)系起來,但是在錯誤信息的提示下一般還是很容易找到。不過需要注意的是在定義的時候有些函數使用同樣的變量名而表示不同的作用,因而使用要很小心,定義及定義的位置要特別留意。為減少這樣的錯誤我后來還是用不同的變量名來表示,結果引起的那些錯誤解決了。(2)語法錯誤;大多的語法錯誤在通過書本參考下能夠修改。主要是平時缺乏鍛煉、不太注意而產生的。如沒有注意具體數據使用是有一定的范圍限定;過分重視分號的重要性而在for、if、while語句中畫蛇添足加分號;在使用文件的時候忘記將文件先打開,對打開的方式(3)注釋的位置;程序設計中在注釋的時候不能同我們平常寫字一樣隨心所欲,我們應該注意注釋的格式。且注釋中能含有C語言可執(zhí)行的語句。心得體會課程設計是本科學習階段一次非常難得的理論與實際相結合的機會,通過這次比較完整的一個程序的設計,我擺脫了單純的理論知識學習狀態(tài)。以前在課堂上因為有老師輔導、而且學習時每次的代碼作業(yè)都是局限的一段,所以從未料想到一個游戲程序的整體把握還是有一定難度的,代碼每一個地方都是有聯(lián)系的,一個地方錯,其他地方都會錯?!S梟威實際設計的結合鍛煉了我的綜合運用所學的基礎知識,解決實際問題的能力,同時也提高我查閱文獻資料、對程序整體的把握等其他能力水平。我現(xiàn)在才發(fā)現(xiàn)以前在課堂學的東西還不夠,很多都是要靠我們舉一反三,此次的游戲設計讓我發(fā)現(xiàn),代碼不管怎么變,思維是不變的,其中的思想很多是很相似的?!鯐詡ネㄟ^對整體的掌控,對局部的取舍,以及對細節(jié)的斟酌處理,都使我的能力得到了鍛煉,經驗得到了豐富。我再不會像以前那樣看到代碼就會頭疼,因為通過此次作業(yè)我學習了C語言的數據類型、常量與符號常量、變量、C語言的運算符和表達式、賦值運算符和賦值表達式、自增自減運算符以及逗號表達式等?!魏朴淇斓暮献?,共同付出,然后收獲,這是我們都希望看到的也正是我們進行課程設計的目的所在。而且我也明白了C語言的簡潔,使用靈活方便,運算符豐富,表達能力強。還有數計類型豐富,目標程序質量高,具有面向硬件系統(tǒng)的特點,具有結構化的控制語句和模塊化的程序結構,具有編譯預處理功能,而且程序設計自由度大,可移植性好?!顒P凱雖然設計內容繁多,過程繁瑣但我的收獲卻更加豐富。各種組件的運用,各種算法的應用,各種控件的利用我都是隨著設計的不斷深入而不斷熟悉并逐步掌握的。從而啟發(fā)我,要想寫好程序,在寫好課本知識的同時還需要多讀和專業(yè)有關的一些書籍,同時還需要多動腦子,盡量把所學的知識綜合起來應用,力爭寫出完美的程序?!铈面煤屠蠋熞约巴瑢W的溝通交流更使我對程序整體的規(guī)劃與設計有了新的認識也對自己提出了新的要求。本程序在剛開始調試時有許多錯誤,但在我的努力及同學的幫助下都被一一克服,在剛開始的幾次調試中曾經出現(xiàn)過不能運行等等問題。經過我的努力及同學的幫助,這些問題得到克服,并且使程序的功能也得到了一定的完善———————————張娣提高是有限的但提高也是全面的,正是這一次設計讓我積累了許多實際經驗,也必然會讓我在未來的工作學習中表現(xiàn)出更高的應變能力和理解力除此之外,我還得到了一些有用的教訓:寫程序時必須要細心,不能輸錯一個字符標點,就連全角半角也得注意。在修改時要有耐心,編譯出錯后必須逐個錯誤去改正,絕不能心急浮躁,否則修改之后還會有新的錯誤?!啾蝽樌缙诘耐瓿杀敬握n程設計給了我很大的信心,但是也讓多不足的地方,學習其實就是一個不斷完善的過程,正視自己的不足之處,在以后的工作和學習中不斷的彌補這些不足之處,在以后的生活中也要保持同樣的態(tài)度,不斷的完善自己。。在這次設計過程中,不僅復習課本上所學知識,還通過查資料、問同學學到了課本上沒有的知識。——————————朱月梅子六、總結6.1知識點1數組的應用。2全局變量的應用。3按鍵的處理。4探索函數。5.功能擴充、修改程序,設初級、中級、高級三個等級,初級地雷數較少,在15個以內,中級在15到30個,高級則擴大棋盤為20×20,地雷數為30個以上。七、主要代碼#include<graphics.h>#include<stdlib.h>#include<bios.h>#include<time.h>/*定義幾個游戲中要用到的功能按鍵*/#defineESC0x11b#defineUP0x4800#defineDOWN0x5000#defineLEFT0x4b00#defineRIGHT0x4d00#defineSPACE0x3920#defineENTER0x1c0dinta[50][50]={0};/*存放雷的數組*/intb[50][50]={0};/*存放格子狀態(tài)的數組*/charnum[9][2]={"?","1","2","3","4","5","6","7","8"};intgbx=320,gby=240;/*當前光標位置(0,0)表示左上角*/intii,jj;main(){inti,j,m=30,n=16,d=20,k;intgdriver=DETECT,gmode;randlei(30,16,100);ii=m/2;jj=n/2;registerbgidriver(gdriver);initgraph(&gdriver,&gmode,"c:\\turboc2");wangge(m,n,d);redraw(m,n,d);while(1)/*反復從鍵盤獲得程序需要的按鍵*/{if(bioskey(1))/*判斷是否有按鍵*/{k=bioskey(0);switch(k){caseESC:exit(0);break;caseUP:if(jj>1){jj-=1;redraw(m,n,d);}break;caseDOWN:if(jj<n)/*DOWN鍵向下移動光標*/{jj+=1;redraw(m,n,d);}break;caseLEFT:/*LEFT鍵向下移動光標*/if(ii>1){ii-=1;redraw(m,n,d);}break;caseRIGHT:/*RIGHT鍵向下移動光標*/if(ii<m){ii+=1;redraw(m,n,d);}break;caseSPACE:/*空格鍵認為無雷打開*/{b[jj][ii]=1;if(a[jj][ii]==0)tansuo(jj,ii,n,m);}redraw(m,n,d);break;caseENTER:/*回車鍵認為有雷標記*/if(b[jj][ii]==0)b[jj][ii]=-1;elseif(b[jj][ii]==-1)b[jj][ii]=2;elseif(b[jj][ii]==2)b[jj][ii]=0;redraw(m,n,d);break;}}}getch();closegraph();}/*redraw重畫函數在用戶有操作后,重畫游戲畫面*/redraw(intm,intn,intd){inti,j;wangge(m,n,d);for(i=1;i<=n;i++)for(j=1;j<=m;j++){if(b[i][j]!=1)gezi3d(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);elseif(a[i][j]>=0){gezi2d(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);if(a[i][j]>0){shownum(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,a[i][j]);}}elsedrawlei(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,a[i][j]);if(b[i][j]==-1)showflag(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);if(b[i][j]==2)shownum(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,0);}gbx=320+(ii-1-m/2)*d;gby=240+(jj-1-n/2)*d;drawGB(gbx,gby,d);}/*隨機布雷(randlei)函數用于隨機布雷,且計算每個各自周圍雷的個數Intm:橫向各自的數量要求是雙數Intn:縱向格子的數量要求是雙數Intnum:雷的個數*/randlei(intm,intn,intnum){inti,j,xx,yy,sum=0,t;srand(time(NULL));do{t=random(m*n);xx=t/m+1;yy=t%m+1;if(a[xx][yy]==0){a[xx][yy]=-1;sum++;}}while(sum<num);for(i=1;i<=n;i++)for(j=1;j<=m;j++){if(a[i][j]!=-1){if(a[i-1][j-1]==-1)a[i][j]++;if(a[i-1][j]==-1)a[i][j]++;if(a[i-1][j+1]==-1)a[i][j]++;if(a[i][j-1]==-1)a[i][j]++;if(a[i][j+1]==-1)a[i][j]++;if(a[i+1][j-1]==-1)a[i][j]++;if(a[i+1][j]==-1)a[i][j]++;if(a[i+1][j+1]==-1)a[i][j]++;}}}wangge(intm,intn,intd){inti,j;setcolor(7);/*網格區(qū)域填充淺灰色底色*/setfillstyle(1,7);bar(320-m/2*d,240-n/2*d,320+m/2*d,240+n/2*d);setcolor(15);for(i=320-m/2*d;i<320+m/2*d;i=i+d)/*小格子起點的橫坐標序列*/for(j=240-n/2*d;j<240+n/2*d;j=j+d)/*小格子起點的縱坐標序列*/;/*gezi3d(i,j,d);*//*繪制一個立體效果的小格子*/}/*畫雷(drawlei)函數用于繪制給定坐標位置的雷雷畫在格子的正中心Intx:雷所在格子左上角點橫坐標Inty:雷所在格子左上角點縱坐標Intd:格子間的間距*/drawlei(intx,inty,intd){intr;setcolor(0);/*雷顏色為黑色*/for(r=d/4;r>0;r--)circle(x+d/2,y+d/2,r);/*畫多個小園形成雷外殼*/line(x+d/2,y+3,x+d/2,y+d-3);/*畫雷外殼上的刺*/line(x+3,y+d/2,x+d-3,y+d/2);line(x+5,y+5,x+d-5,y+d-5);line(x+5,y+d-5,x+d-5,y+5);}/*顯示數字(shownum)函數用于顯示給定坐標位置的數字數字顯示在格子的正中心lntx:數字所在格子左上角點橫坐標lnty:數字所在格子左上角點縱坐標intd:格子間的間距intn:要顯示的數字*/shownum(intx,inty,intd,intn){setcolor(0+n);/*數字顏色為黑色*/settextstyle(SMALL_FONT,HORIZ_DIR,0);outtextxy(x+0.3*d,y+0.4*d,num[n]);}/*顯示旗子(showflag)函數用于顯示給定坐標位置的標志為雷的小紅旗intx:旗子所在格子左上角點橫坐標inty:旗子所在格子左上角點縱坐標intd:格子間的間距*/showflag(intx,inty,intd){intk,l;setcolor(4);for(l=1,k=y+0.2*d;k<=y+0.5*d;l=l+1.5,k++)line(x+d/2-1,k,x+d/2,k);setcolor(0);line(x+d/2,y+d/2,x+d/2,y+d*0.8);line(x+d*0.2,y+d*0.8,x+d*0.8,y+d*0.8);line(x+d*0.2-1,y+d*0.8+1,x+d*0.8+1,y+d*0.8+1);}/*繪制三維小格子(gezi3d)函數用于將掃雷界面的每個小格子繪制為三維效果這是該格子未被打開時的效果intx:旗子所在格子左上角點橫坐標inty:旗子所在格子左上角點縱坐標intd:格子間的間距*/gezi3d(intx,inty,intd){setcolor(8);line(x,y,x,y+d);line(x,y,x+d,y);line(x+d,y+d,x,y+d);line(x+d,y+d,x+d,y);setcolor(15);line(x+1,y+1,x+1,y+d-1);line(x+1,y+1,x+d-1,y+1);setcolor(0);line(x+d-1,y+d-1,x+1,y+d-1);line(x+d-1,y+d-1,x+d-1,y+1);}/*繪制二維小格子(gezi3d)函數用于將掃雷界面的每個小格子繪制為二維效果這是該格子未被打開時的效果intx:旗子所在格子左上角點橫坐標inty:旗子所在格子左上角點縱坐標intd:格子間的間距*/gezi2d(intx,inty,intd){setcolor(8);line(x,y,x,y+d);line(x,y,x+d,y);line(x+d,y+d,x,y+d);line(x+d,y+d,x+d,y);setfillstyle(1,7);bar(x+1,y+1,y+d-1,y+d-1);}/*畫爆炸雷(drawBZlei)函數用于繪制給定坐標位置的爆炸雷雷畫在格子的正中心格子背景色為紅色intx:旗子所在格子左上角點橫坐標inty:旗子所在格子左上角點縱坐標intd:格子間的間距*/drawBZlei(intx,inty,intd){intr;setcolor(4);setfillstyle(1,4);bar(x+1,y+1,x+d-1,y+d-1);setcolor(0);for(r=d/4;r>0;r--)circle(x+d/2,y+d/2,r);line(x+d/2,y+3,x+d/2,y+d-3);line(x+3,y+d/2,x+d-3,y+d/2);line(x+5,y+5,x+d-5,y+d-5);line(x-5,y+d-5,x+d-5,y+5);}/*畫光標(drawGB)函數用于繪制給定坐標位置的光標光標為一個藍色正方形intx:旗子所在格子左上角點橫坐標inty:旗子所在格子左上角點縱坐標intd:格子間的間距*/drawGB(intx,inty,intd){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論