貪吃蛇專業課程設計方案報告_第1頁
貪吃蛇專業課程設計方案報告_第2頁
貪吃蛇專業課程設計方案報告_第3頁
貪吃蛇專業課程設計方案報告_第4頁
貪吃蛇專業課程設計方案報告_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

目錄課程設計目標……………3課程設計任務和要求…………………32.1課程設計內容…………32.2課程設計要求…………32.3課程設計環境…………3課程設計方案……………33.1方案論證………………33.2程序整體設計說明………33.3設計思緒………………43.4設計總體步驟圖………43.5設計具體實現………5程序測試…………………84.1測試內容和結果………84.2程序運行效果圖………9課程設計總結…………106.參考文件…………………11附錄源程序…………………11課程設計目標:復習、鞏固才C、C++基礎知識,深入加深對VC技術了解和掌握;課程設計為學生提供了一個既動手又動腦,獨立實踐機會,將書本上理論知識和實際有機結合起來,鍛煉學生分析處理實際問題能力。培養學生在項目開發中團體合作精神、創新意識及能力課程設計任務和要求2.1課程設計內容貪吃蛇游戲開發,首先它能夠為大家提供一個目前比較流行休閑小游戲。貪吃蛇是家喻戶曉益智類小游戲,選擇這個題目一是為了將自己所學知識加以利用,二是一直以來貪吃蛇這個游戲就深深地吸引著大家,它制作方法對于很多同學而言全部是很神秘。所以我們期望經過這學期所學知識把它剖析開來,真真正正了解它本質和精髓。在這次學習中我們將從實踐和實際項目中提升自己編程能力。所以決定選擇這個題目作為VC課程設計。最終一部分就是游戲模塊劃分,依據分析,貪吃蛇這個程序一共要實現以下多個功效,包含游戲方面開始游戲、暫停游戲和停止游戲,游戲設置(蛇顏色、食物顏色操作說明等)和積分。2.2課程設計要求對系統進行功效模塊分析、控制模塊分析正確,符合課題要求,實現對應功效;能夠加以其它功效或修飾,使程序愈加完善、合理;系統設計要實用,采取模塊化程序設計方法,編程簡練、可用,功效全方面;說明書、步驟圖要清楚;統計設計情況(備查,也為編寫設計說明書作好準備);2.3課程設計環境Windows7操作系統,VC6.0開發環境。課程設計方案3.1方案論證方案一:基于MFC設計該方案好處是系統自動生成軟件框架,設計者只需填充編寫代碼即可,程序設計比較復雜,對于編程能力不強同學來說難度較大。方案二:基于easyX設計該方案好處是設計者只需編寫程序文件,完成后編譯即可生成可實施文件,編程前需要先安裝easyX圖形庫。因為編程能力不強,方案二設計簡單,易于調試,故選擇方案二。3.2程序整體設計說明一個游戲要有開始部分,運行部分,結束部分(實際上開始部分和運行部分是一體)。游戲界面:1)開始游戲(加載并開始)2)暫停游戲(從目前進度結束)3)重新開始(在某一時刻暫停后能夠繼續接著玩)游戲設置:1) 蛇顏色(紅色)2) 游戲幫助(游戲控制說明)3) 積分(每次吃掉一個食物增加10分,并顯示出來)3.3設計思緒這個程序關鍵是表示蛇圖形和蛇移動。用一個小矩形表示蛇一節身體,身體每長一節,增加一個矩形塊。移動時必需從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。假如不按任何鍵,蛇自行在目前方向上前移,當游戲者按了有效方向鍵后,蛇頭朝著指定方向移動,一步移動一節身體,所以當按了有效方向鍵后,先確定蛇頭位置,然后蛇身體伴隨蛇頭移動,圖形實現是從蛇頭新位置開始畫出蛇,這時原來蛇位置和新蛇位置差一個單位,所以看起來蛇會多一節身體,所以將蛇最終一節用背景色覆蓋。食物出現和消失也是畫矩形塊和覆蓋矩形塊。3.4設計總體步驟圖是是游戲結束否蛇頭是否撞墻或本身否否隨機生成下一個食物依據鍵盤控制蛇移動方向是蛇開始移動判定是否開始載入游戲并初始化是是游戲結束否蛇頭是否撞墻或本身否否隨機生成下一個食物依據鍵盤控制蛇移動方向是蛇開始移動判定是否開始載入游戲并初始化蛇頭和食物坐標是否重合否是否蛇頭和食物坐標是否重合否是否3.5設計具體實現食物類structFood /*食物結構體定義*/{ intx; /*食物橫坐標*/ inty; /*食物縱坐標*/ intaddFood; /*判定是否要出現食物變量*/};2)蛇塊類把蛇分成一塊一塊,一個蛇相當于有若干個塊,蛇塊類就是用來描述每塊信息。structSnake /*蛇結構體定義*/{intx[MAX_JOINTS]; /*保留蛇身每一節在屏幕上列坐標*/ inty[MAX_JOINTS]; /*保留蛇身每一節在屏幕上行坐標*/ intjoint; /*蛇節數*/ intdirection; /*蛇移動方向*/ intlife; /*蛇生命,0活著,1死亡*/};初始化游戲游戲開始界面初始化:voidInitGraph(){ cleardevice(); setbkcolor(BLUE);/*設置背景顏色*/ setcolor(WHITE);/*設置前景顏色*/ cleardevice(); setfont(25,0,_T("微軟雅黑")); outtextxy(170,150,"GreedySnake");/*在坐標(170,150)處輸出字符串*/ outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }繪制游戲場景setlinestyle(PS_SOLID,5)用于繪制實心寬度為5個像素線型,bar(i,40,i+7,47);為畫一個左上角為(i,40),右下角為(i+7,47)矩形條,rectangle(i,40,i+10,49)也用于畫矩形。voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //畫圍墻 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上邊 bar(i,40,i+7,47); bar(i,551,i+7,558); //下邊 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左邊 bar(591,i,598,i+7); //右邊 }}結束游戲PrScore(score)用于輸出分數。voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微軟雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//關閉音樂 getch(); exit(0);}判定是否需要出現食物if(food.addFood==1) //需要出現新食物{food.x=rand()%400+60; food.y=rand()%350+60; //食物出現后必需在整格內才能讓蛇吃到 while(food.x%10!=0) {food.x++;} while(food.y%10!=0){food.y++;} food.addFood=0; //畫面上有食物 } if(food.addFood==0) //畫面上有食物,則顯示 {setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }7)在沒有按鍵情況下,蛇自己移動身體for(i=snake.joint-1;i>0;i--) //蛇每個節往前移動 {snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四個方向,來決定蛇頭移動 switch(snake.direction){caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; }8)a.從蛇第四節開始判定是否撞到自己,因為蛇頭為兩節,第三節不可能拐過來for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //顯示失敗 snake.life=1; //蛇死*/ break; } }b.判定蛇是否撞到墻壁if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //此次游戲結束 snake.life=1; //蛇死 }c.判定是否撞到障礙物for(intobs_i=0;obs_i<vox.size();obs_i++){ if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); }以上三種判定以后,假如蛇死就跳出內循環,重新開始。吃到食物后畫蛇if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物后 { //把畫面上食物清除setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新一節先放在看不見位置,下次循環就取前一節位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snake.joint++; //蛇身體長一節 food.addFood=1; //畫面上需要出現新食物 score+=10; //------------------------- PrScore(score); //輸出新得分 } //畫蛇 setcolor(RED); for(i=0;i<snake.joint;i++) { rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); } Sleep(gamespeed); //延時控制蛇速度 //去除蛇最終一節 setcolor(0); rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10); 10)按鍵操作key=getch();//接收按鍵 switch(key){//判定按鍵,是否往相反方向移動 case'w':case'W':{if(snake.direction!=MV_DOWN)snake.direction=MV_UP;}break; case'd':case'D':{if(snake.direction!=MV_LEFT)snake.direction=MV_RIGHT;}break; case'a':case'A':{if(snake.direction!=MV_RIGHT)snake.direction=MV_LEFT;}break; case's':case'S':{if(snake.direction!=MV_UP)snake.direction=MV_DOWN;}break; case'p':case'P':fun_pause();break; case'r':case'R':fun_reset();break; }編好程序后進行編譯、運行,生成可實施文件,就能夠玩貪吃蛇游戲了。4.程序測試4.1測試內容和結果1) 開始:程序運行后,會出來藍色背景界面和提醒語Ready?,按任意鍵開始,注意不要在漢字輸入法下玩。開始后只有兩節紅色蛇和一個綠色食物,而且蛇是運動。2) 方向鍵和WSAD鍵:蛇開始運行以后,當點擊上下左右鍵(或WSAD)蛇就會按對應方向運動,蛇不能180度轉彎,只能進行90度轉彎。程序檢測時蛇確實會按點擊方向運動且不會向相反方向運動,全部方向鍵使用正確。3) 暫停/繼續:當程序正在運行時,點擊暫停/繼續按鈕“P”,蛇停在目前位置,再次點擊“P”蛇又從目前位置繼續運動。此按鈕符合要求,所以暫停/繼續按鈕使用正確,功效能夠實現。4) 重新開始:當游戲結束或想重新開始一局時,點擊按鈕“R”,游戲又回到最初狀態,一個食物,一個運動著紅色蛇塊,且游戲積分清零。所以重新開始功效能夠實現。5) 界面右側能夠出現按鍵提醒和分數顯示等相關信息。4.2程序運行效果圖5.課程設計總結在設計這個程序中我關鍵學會了怎樣利用以下相關C語言和C++知識:1)函數定義是要做到顧名思義是很關鍵,它對讀程序人正確定識程序十分關鍵,在修改這個程序過程中也能很快找到程序各模塊作用,大大增加了程序可讀性。2)分析函數先從main()函數入手。Main()函數是C++源程序編譯時開始,從main()函數開始讀函數可將其它函數功效了解得更透徹。3)在做程序時候先列框架,將這個程序所要達成目標(功效)分析出來,選擇正確數據結構然后在將程序模塊化,根據模塊編寫函數愈加簡單合理。4)我還了解了很多庫函數作用,如字符串函數中有很多對字符串進行處理函數,其功效我全部有所了解。5)學會了相關頭文件使用方法,及系統調配問題處理方法等。6)了解到了注釋關鍵性。經過這次試驗,讓我學到很多這個學期沒有接觸過很多知識,完成一個貪吃蛇項目;第一步就是先理清思緒,設計主界面,主界面是以一塊封閉畫布,并在畫布內設計蛇體和食物。蛇頭假如碰到墻或和蛇身某一部分碰到就會死亡;假如蛇頭碰到食物,就會自動增加一節蛇身,并更改得分。想要寫出好程序,還是要有扎實基礎,這么碰到問題就不會一籌莫展來。在編程時我們要有想象力,不要拘泥于現有貪吃蛇游戲,而是要把自己想到再加上所學知識,碰到問題不能怕,而是要用心找出問題原因,再回來看看書本知識,不懂還能夠問問老師。編程過程還要養成良好編程習慣,這么不僅自己能夠很好看懂自己代碼,也讓人家輕易看懂自己代碼,而不至于代碼知識自己會看,出來問題只有自己會處理而其它人全部不會處理;碰到問題時要考慮最簡單處理方案,只有簡單方案不能滿足要求時再考慮復雜方案。最關鍵編程還是要多和人溝通,不會不能立即問她人,不過一段時間后處理不了時還是應該向她人請教請教,“三人行必有我師”正是這個意思。經過這次試驗,我深刻地體會到了面向對象和面向過程區分。程序在最初設計時因為面向對象思想不夠成熟,造成在最終想要增加部分新功效時,出現了部分麻煩。總而言之,我們還需要深入提升自己能力。6.參考文件《C語言程序設計》武雅麗清華大學出版社《C++面向對象程序設計》譚浩強清華大學出版社《C語言課程設計案例精編》李麗娟中國水利水電出版社附錄:源程序/////////////////////////////////////////////////程序名稱:貪吃蛇//制作:莫新存//編譯環境:VisualC++6.0,EasyX//////////////////////////////////////////////#include<iostream>#include<graphics.h>#include<stdlib.h>#include<conio.h>#include<dos.h>#include<time.h>#include<stdio.h>#include<vector>#definerandom(a,b)(rand()%((b)-(a)))+(a)#pragmacomment(lib,"Winmm.lib")//加入背景音樂時使用usingnamespacestd;#defineMAX_JOINTS 200#defineMV_RIGHT1#defineMV_LEFT2#defineMV_UP3#defineMV_DOWN4intrnd1,rnd2;vector<int>vox;vector<int>voy;voidInitGraph(void); /*圖形界面初始化函數*/voidDrawFence(void); /*繪制游戲場景*/voidGameOver(intscore); /*結束游戲*/voidGamePlay(void); /*玩游戲具體過程*/voidPrScore(intscore);/*顯示分數*/voidfun_pause();/*暫停游戲*/voidfun_reset();/*重置游戲*/voidfun_obstacle();/*設置障礙物*/structFood{ /*食物結構體定義*/ intx; /*食物橫坐標*/ inty; /*食物縱坐標*/ intaddFood; /*判定是否要出現食物變量*/};structSnake{ /*蛇結構體定義*/ intx[MAX_JOINTS]; /*保留蛇身每一節在屏幕上列坐標*/ inty[MAX_JOINTS]; /*保留蛇身每一節在屏幕上行坐標*/ intjoint; /*蛇節數*/ intdirection; /*蛇移動方向*/ intlife; /*蛇生命,0活著,1死亡*/};voidplay(){ initgraph(800,600); InitGraph(); DrawFence(); GamePlay(); getch(); }intmain(){mciSendString("playmo.mp3",NULL,0,NULL);//播放音樂 play(); return0;}//初始化voidInitGraph(){ cleardevice(); setbkcolor(BLUE); setcolor(WHITE); cleardevice(); setfont(25,0,_T("微軟雅黑")); outtextxy(170,150,"GreedySnake"); outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }//繪制游戲場景voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //畫圍墻 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上邊 bar(i,40,i+7,47); bar(i,551,i+7,558); //下邊 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左邊 bar(591,i,598,i+7); //右邊 }}//結束游戲voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微軟雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//關閉音樂 getch(); exit(0);}//輸出成績voidPrScore(intscore){ charstr_score[10]; //setfillstyle(YELLOW); //bar(50,15,220,35); //setcolor(6); //setfont(25,0,_T("微軟雅黑")); //setfillstyle(BLACK); setbkmode(TRANSPARENT); //---new--- BeginBatchDraw(); setfillstyle(BLACK); bar(601,0,800,600); setfont(60,0,_T("微軟雅黑")); setcolor(YELLOW); outtextxy(625,30,_T("貪吃蛇")); setfont(30,0,_T("微軟雅黑")); setcolor(LIGHTGREEN); outtextxy(625,140,_T("制作:莫新存")); outtextxy(625,170,_T("班級:24041001")); outtextxy(625,200,_T("學號:19")); setfont(25,0,_T("微軟雅黑")); setcolor(CYAN); outtextxy(625,380,_T("上:W")); outtextxy(625,400,_T("下:S")); outtextxy(625,420,_T("左:A")); outtextxy(625,440,_T("右:D")); outtextxy(625,460,_T("分數:")); outtextxy(625,490,_T("暫停(P鍵)")); outtextxy(625,520,_T("重新游戲(R鍵)")); setcolor(LIGHTBLUE); sprintf(str_score,"%i",score); outtextxy(680,460,str_score); EndBatchDraw(); if(score>0&&score%50==0)fun_obstacle();}voidGamePlay(){ int i,key; int gamespeed=200; //控制游戲速度* int score=0; //統計游戲得分 structFoodfood; //食物結構體變量 structSnakesnake; //蛇結構體變量 food.addFood=1; //1表示需要出現新食物,0表示已經存在食物 snake.life=0; //置蛇生命狀態為活著 snake.direction=MV_RIGHT; //置蛇頭方向往右 snake.x[0]=100;snake.y[0]=100; //置蛇頭初始位置 snake.x[1]=110;snake.y[1]=100; snake.joint=2; //置蛇初始節數為2 PrScore(score); //顯示游戲得分 //反復玩游戲,直到按Esc鍵結束 srand(time(NULL)); while(1) { while(!kbhit()) { mciSendString("playmo.mp3",NULL,0,NULL);//播放音樂 if(food.addFood==1){ //需要出現新食物 food.x=rand()%400+60; food.y=rand()%350+60; //食物出現后必需在整格內才能讓蛇吃到 while(food.x%10!=0) { food.x++; } while(food.y%10!=0){ food.y++; } food.addFood=0; //畫面上有食物 } if(food.addFood==0){ //畫面上有食物,則顯示 setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }//在沒有按鍵情況下,蛇自己移動身體 for(i=snake.joint-1;i>0;i--){ //蛇每個節往前移動 snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四個方向,來決定蛇頭移動 switch(snake.direction){ caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; } //從蛇第四節開始判定是否撞到自己,因為蛇頭為兩節,第三節不可能拐過來 for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //顯示失敗 snake.life=1; //蛇死*/ break; } } //判定蛇是否撞到墻壁 if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //此次游戲結束 snake.life=1; //蛇死 } for(intobs_i=0;obs_i<vox.size();obs_i++){ //-----判定是否撞到障礙物---- if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); } //以上三種判定以后,假如蛇死就跳出內循環,重新開始 if(snake.life==1) break; if(snake.x[0]==food.x&&snake.y[0]==food.y){//吃到食物后 //把畫面上食物清除 setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新一節先放在看不見位置,下次循環就取前一節位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snake.join

溫馨提示

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

最新文檔

評論

0/150

提交評論