貪吃蛇課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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>  課程設(shè)計(jì)目的……………………………………………………………3</p><p>  課程設(shè)計(jì)任務(wù)與要求…………………………………………………3</p><p>  2.1課程設(shè)計(jì)內(nèi)容…………………………………………………………3</p><p>  2.2課程

2、設(shè)計(jì)要求…………………………………………………………3</p><p>  2.3課程設(shè)計(jì)環(huán)境…………………………………………………………3</p><p>  課程設(shè)計(jì)方案……………………………………………………………3</p><p>  3.1方案論證………………………………………………………………3</p><p>  3.2程序整體

3、設(shè)計(jì)說(shuō)明………………………………………………………3</p><p>  3.3設(shè)計(jì)思路………………………………………………………………4</p><p>  3.4設(shè)計(jì)總體流程圖………………………………………………………4</p><p>  3.5設(shè)計(jì)的具體實(shí)現(xiàn)………………………………………………………5</p><p>  程序測(cè)試……

4、……………………………………………………………8</p><p>  4.1測(cè)試內(nèi)容與結(jié)果………………………………………………………8</p><p>  4.2程序運(yùn)行效果圖………………………………………………………9</p><p>  課程設(shè)計(jì)總結(jié)…………………………………………………………10</p><p>  6.參考文獻(xiàn)…………

5、………………………………………………………11</p><p>  附錄 源程序…………………………………………………………………11</p><p><b>  課程設(shè)計(jì)目的:</b></p><p>  復(fù)習(xí)、鞏固才C、C++的基礎(chǔ)知識(shí),進(jìn)一步加深對(duì)VC技術(shù)的理解和掌握;</p><p>  課程設(shè)計(jì)為學(xué)生提供了一個(gè)

6、既動(dòng)手又動(dòng)腦,獨(dú)立實(shí)踐的機(jī)會(huì),將課本上的理論知識(shí)和實(shí)際有機(jī)的結(jié)合起來(lái),鍛煉學(xué)生的分析解決實(shí)際問(wèn)題的能力。</p><p>  培養(yǎng)學(xué)生在項(xiàng)目開(kāi)發(fā)中團(tuán)隊(duì)合作精神、創(chuàng)新意識(shí)及能力</p><p><b>  課程設(shè)計(jì)任務(wù)與要求</b></p><p>  2.1 課程設(shè)計(jì)內(nèi)容</p><p>  貪吃蛇游戲開(kāi)發(fā),首先它可以為

7、大家提供一種當(dāng)前比較流行的休閑小游戲。貪吃蛇是家喻戶(hù)曉的益智類(lèi)小游戲,選擇這個(gè)題目一是為了將自己的所學(xué)知識(shí)加以運(yùn)用,二是一直以來(lái)貪吃蛇這個(gè)游戲就深深地吸引著很多人,它的制作方法對(duì)于很多同學(xué)而言都是很神秘的。所以我們希望通過(guò)這學(xué)期所學(xué)知識(shí)把它剖析開(kāi)來(lái),真真正正的了解它的本質(zhì)和精髓。在這次學(xué)習(xí)中我們將從實(shí)踐和實(shí)際的項(xiàng)目中提高自己的編程能力。因此決定選擇這個(gè)題目作為VC的課程設(shè)計(jì)。</p><p>  最后一部分就是游

8、戲的模塊劃分,根據(jù)分析,貪吃蛇這個(gè)程序一共要實(shí)現(xiàn)如下幾個(gè)功能,包括游戲方面開(kāi)始游戲、暫停游戲以及停止游戲,游戲設(shè)置(蛇的顏色、食物的顏色操作說(shuō)明等)與積分。</p><p><b>  2.2課程設(shè)計(jì)要求</b></p><p>  對(duì)系統(tǒng)進(jìn)行功能模塊分析、控制模塊分析正確,符合課題要求,實(shí)現(xiàn)相應(yīng)功能;可以加以其他功能或修飾,使程序更加完善、合理;</p>

9、<p>  系統(tǒng)設(shè)計(jì)要實(shí)用,采用模塊化程序設(shè)計(jì)方法,編程簡(jiǎn)練、可用,功能全面;</p><p>  說(shuō)明書(shū)、流程圖要清楚;</p><p>  記錄設(shè)計(jì)情況(備查,也為編寫(xiě)設(shè)計(jì)說(shuō)明書(shū)作好準(zhǔn)備);</p><p><b>  2.3課程設(shè)計(jì)環(huán)境</b></p><p>  Windows7操作系統(tǒng),VC6.0

10、開(kāi)發(fā)環(huán)境。</p><p><b>  課程設(shè)計(jì)方案</b></p><p><b>  3.1方案論證</b></p><p>  方案一:基于MFC設(shè)計(jì)</p><p>  該方案的好處是系統(tǒng)自動(dòng)生成軟件框架,設(shè)計(jì)者只需填充編寫(xiě)的代碼即可,程序設(shè)計(jì)比較復(fù)雜,對(duì)于編程能力不強(qiáng)的同學(xué)來(lái)說(shuō)難度較大。&

11、lt;/p><p>  方案二:基于easyX設(shè)計(jì)</p><p>  該方案的好處是設(shè)計(jì)者只需編寫(xiě)程序文件,完成后編譯即可生成可執(zhí)行文件,編程前需要先安裝easyX圖形庫(kù)。</p><p>  由于編程能力不強(qiáng),方案二設(shè)計(jì)簡(jiǎn)單,易于調(diào)試,故選擇方案二。</p><p>  3.2程序整體設(shè)計(jì)說(shuō)明</p><p>  一個(gè)

12、游戲要有開(kāi)始部分,運(yùn)行部分,結(jié)束部分(實(shí)際上開(kāi)始部分與運(yùn)行部分是一體的)。</p><p><b>  游戲界面:</b></p><p>  1)開(kāi)始游戲(加載并開(kāi)始)</p><p>  2)暫停游戲(從當(dāng)前進(jìn)度結(jié)束)</p><p>  3)重新開(kāi)始(在某一時(shí)刻暫停后可以繼續(xù)接著玩)</p><

13、p><b>  游戲設(shè)置:</b></p><p>  1)蛇的顏色(紅色)</p><p>  2)游戲幫助(游戲控制說(shuō)明)</p><p>  3)積分(每次吃掉一個(gè)食物增加10分,并顯示出來(lái))</p><p><b>  3.3設(shè)計(jì)思路</b></p><p&g

14、t;  這個(gè)程序的關(guān)鍵是表示蛇的圖形以及蛇的移動(dòng)。用一個(gè)小矩形表示蛇的一節(jié)身體,身體每長(zhǎng)一節(jié),增加一個(gè)矩形塊。移動(dòng)時(shí)必須從蛇頭開(kāi)始,所以蛇不能向相反方向移動(dòng),也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當(dāng)前方向上前移,當(dāng)游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動(dòng),一步移動(dòng)一節(jié)身體,所以當(dāng)按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從蛇頭的新位置開(kāi)始畫(huà)出蛇,這時(shí)原來(lái)蛇的位置和新蛇的位置差一個(gè)單位,所

15、以看起來(lái)蛇會(huì)多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)和消失也是畫(huà)矩形塊和覆蓋矩形塊。</p><p>  3.4設(shè)計(jì)總體流程圖</p><p>  3.5設(shè)計(jì)的具體實(shí)現(xiàn)</p><p><b>  食物類(lèi)</b></p><p>  struct Food/*食物的結(jié)構(gòu)體定義*/</p&g

16、t;<p><b>  {</b></p><p>  int x;/*食物的橫坐標(biāo)*/</p><p>  int y;/*食物的縱坐標(biāo)*/</p><p>  int addFood;/*判斷是否要出現(xiàn)食物的變量*/</p><p><b>  };<

17、;/b></p><p><b>  2)蛇塊類(lèi)</b></p><p>  把蛇分成一塊一塊,一個(gè)蛇相當(dāng)于有若干個(gè)塊,蛇塊類(lèi)就是用來(lái)描述每塊的信息。</p><p>  struct Snake/*蛇的結(jié)構(gòu)體定義*/</p><p><b>  {</b></p>

18、<p>  int x[MAX_JOINTS]; /*保存蛇身每一節(jié)位于屏幕上的列坐標(biāo)*/</p><p>  int y[MAX_JOINTS]; /*保存蛇身每一節(jié)位于屏幕上的行坐標(biāo)*/</p><p>  int joint;/*蛇的節(jié)數(shù)*/</p><p>  int direction;/*蛇移動(dòng)方向*/&l

19、t;/p><p>  int life;/*蛇的生命,0活著,1死亡*/</p><p><b>  };</b></p><p><b>  初始化游戲</b></p><p>  游戲開(kāi)始界面的初始化:</p><p>  void InitGraph()<

20、/p><p><b>  {</b></p><p>  cleardevice();</p><p>  setbkcolor(BLUE); /*設(shè)置背景顏色*/</p><p>  setcolor(WHITE); /*設(shè)置前景顏色*/</p><p>  cleardevice();

21、</p><p>  setfont(25, 0, _T("微軟雅黑"));</p><p>  outtextxy(170,150,"Greedy Snake"); /*在坐標(biāo)(170,150)處輸出字符串*/</p><p>  outtextxy(219,254,"Ready?");</p&

22、gt;<p><b>  getch();</b></p><p>  setbkcolor(0);</p><p>  cleardevice();</p><p><b>  }</b></p><p><b>  繪制游戲場(chǎng)景</b></p>

23、<p>  setlinestyle(PS_SOLID, 5)用于繪制實(shí)心的寬度為5個(gè)像素的線(xiàn)型,bar(i,40,i+7,47);為畫(huà)一個(gè)左上角為(i,40),右下角為(i+7,47)的矩形條,rectangle(i, 40, i+10, 49)也用于畫(huà)矩形。</p><p>  void DrawFence(){</p><p><b>  int i;</

24、b></p><p>  setbkcolor(LIGHTGREEN);</p><p>  setlinestyle(PS_SOLID, 5);</p><p><b>  //畫(huà)圍墻</b></p><p>  setfillstyle(LIGHTBLUE);</p><p>  for

25、 (i=50; i<=591; i+=10){</p><p>  //rectangle(i, 40, i+10, 49);//上邊</p><p>  bar(i,40,i+7,47);</p><p>  bar(i, 551, i+7,558);//下邊</p><p><b>  }</b><

26、;/p><p>  for (i=40; i<=550; i+=10){</p><p>  bar(50, i, 57, i+7);//左邊</p><p>  bar(591, i, 598, i+7);//右邊</p><p><b>  }</b></p><p><b>

27、;  }</b></p><p><b>  結(jié)束游戲</b></p><p>  PrScore(score)用于輸出分?jǐn)?shù)。</p><p>  void GameOver(int score)</p><p><b>  {</b></p><p>  cle

28、ardevice();</p><p>  PrScore(score);</p><p>  setcolor(RED);</p><p>  setfont(80, 0, _T("微軟雅黑"));</p><p>  outtextxy(100, 200, "GAME OVER");</p&g

29、t;<p>  mciSendString("close mo.mp3", NULL, 0, NULL); //關(guān)閉音樂(lè)</p><p><b>  getch();</b></p><p><b>  exit(0);</b></p><p><b>  }</b>

30、;</p><p>  判斷是否需要出現(xiàn)食物</p><p>  if (food.addFood == 1) //需要出現(xiàn)新食物</p><p><b>  {</b></p><p>  food.x = rand() % 400 + 60;</p><p>  food.y = ra

31、nd() % 350 + 60;</p><p>  //食物出現(xiàn)后必須在整格內(nèi)才能讓蛇吃到</p><p>  while (food.x%10 != 0)</p><p>  {food.x++;}</p><p>  while (food.y%10 !=0)</p><p>  {food.y++; }<

32、/p><p>  food.addFood=0;//畫(huà)面上有食物 </p><p><b>  }</b></p><p>  if (food.addFood==0) //畫(huà)面上有食物,則顯示 </p><p><b>  {</b></p><p>  setc

33、olor(GREEN);</p><p>  rectangle(food.x, food.y, food.x+10, food.y-10);</p><p><b>  }</b></p><p>  7)在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體</p><p>  for (i=snake.joint-1; i>0;

34、 i--)//蛇的每個(gè)節(jié)往前移動(dòng) </p><p>  {snake.x[i] = snake.x[i-1];</p><p>  snake.y[i] = snake.y[i-1];</p><p><b>  }</b></p><p>  //1,2,3,4 表示右,左,上,下四個(gè)方向,來(lái)決定蛇頭的移動(dòng) <

35、/p><p>  switch(snake.direction)</p><p>  {case MV_RIGHT: snake.x[0] += 10; break;</p><p>  case MV_LEFT: snake.x[0] -= 10; break;</p><p>  case MV_UP: snake.y[0] -= 1

36、0; break;</p><p>  case MV_DOWN: snake.y[0] += 10; break;</p><p><b>  }</b></p><p>  8)a.從蛇的第四節(jié)開(kāi)始判斷是否撞到自己,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)</p><p>  for (i=3; i<snake.jo

37、int; i++)</p><p><b>  {</b></p><p>  if (snake.x[i]==snake.x[0] && snake.y[i]==snake.y[0])</p><p><b>  {</b></p><p>  GameOver(score);

38、//顯示失敗</p><p>  snake.life = 1; //蛇死*/</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  b.判斷蛇是否撞到墻

39、壁</p><p>  if (snake.x[0]<55 || snake.x[0]>595 || snake.y[0]<55 || snake.y[0]>455)</p><p><b>  {</b></p><p>  GameOver(score);//本次游戲結(jié)束</p><p>

40、;  snake.life = 1; //蛇死</p><p><b>  }</b></p><p>  c.判斷是否撞到障礙物</p><p>  for(int obs_i = 0; obs_i<vox.size(); obs_i++)</p><p><b>  {</b>&

41、lt;/p><p>  if(vox[obs_i]==snake.x[0] && voy[obs_i]==snake.y[0]) GameOver(score);</p><p><b>  }</b></p><p>  以上三種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始。</p><p><b>

42、;  吃到食物后畫(huà)蛇</b></p><p>  if (snake.x[0]==food.x && snake.y[0]==food.y) //吃到食物后</p><p>  {//把畫(huà)面上的食物清除</p><p>  setcolor(0);</p><p>  rectangle(food.x, foo

43、d.y, food.x+10, food.y-10);</p><p>  //新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置</p><p>  snake.x[snake.joint] =-20; snake.y[snake.joint] =-20;</p><p>  snake.joint++;//蛇的身體長(zhǎng)一節(jié)</p><

44、p>  food.addFood = 1;//畫(huà)面上需要出現(xiàn)新食物</p><p>  score += 10;</p><p>  //-------------------------</p><p>  PrScore(score);//輸出新得分</p><p><b>  }</b><

45、/p><p><b>  //畫(huà)蛇</b></p><p>  setcolor(RED);</p><p>  for (i=0; i<snake.joint; i++)</p><p><b>  {</b></p><p>  rectangle(snake.x[i]

46、, snake.y[i],snake.x[i]+10, snake.y[i]-10);</p><p><b>  }</b></p><p>  Sleep(gamespeed); //延時(shí)控制蛇的速度</p><p>  //去除蛇的最后一節(jié)</p><p>  setcolor(0);</p>

47、<p>  rectangle(snake.x[snake.joint-1], snake.y[snake.joint-1],</p><p>  snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);</p><p><b>  10)按鍵操作</b></p><p>  key

48、=getch();//接收按鍵</p><p>  switch(key)</p><p>  {//判斷按鍵,是否往相反方向移動(dòng)</p><p>  case 'w':case 'W':{if(snake.direction!=MV_DOWN) snake.direction = MV_UP;}break;</p>&

49、lt;p>  case 'd':case 'D':{if(snake.direction!=MV_LEFT) snake.direction = MV_RIGHT;}break;</p><p>  case 'a':case 'A':{if(snake.direction!=MV_RIGHT) snake.direction = MV_LEF

50、T;}break;</p><p>  case 's':case 'S':{if(snake.direction!=MV_UP) snake.direction = MV_DOWN;}break;</p><p>  case 'p':case 'P':fun_pause();break;</p><p&

51、gt;  case 'r':case 'R':fun_reset();break;</p><p><b>  }</b></p><p>  編好程序后進(jìn)行編譯、運(yùn)行,生成可執(zhí)行文件,就可以玩貪吃蛇游戲了。</p><p><b>  4.程序測(cè)試</b></p><p

52、>  4.1測(cè)試內(nèi)容與結(jié)果</p><p>  1)開(kāi)始:程序運(yùn)行后,會(huì)出來(lái)藍(lán)色背景界面和提示語(yǔ)Ready?,按任意鍵開(kāi)始,注意不要在中文輸入法下玩。開(kāi)始后只有兩節(jié)的紅色蛇和一個(gè)綠色的食物,并且蛇是運(yùn)動(dòng)的。</p><p>  2)方向鍵和WSAD鍵:蛇開(kāi)始運(yùn)行之后,當(dāng)點(diǎn)擊上下左右鍵(或WSAD)蛇就會(huì)按相應(yīng)的方向運(yùn)動(dòng),蛇不能180度轉(zhuǎn)彎,只能進(jìn)行90度的轉(zhuǎn)彎。程序檢測(cè)時(shí)蛇確實(shí)會(huì)

53、按點(diǎn)擊方向運(yùn)動(dòng)且不會(huì)向相反方向運(yùn)動(dòng),所有方向鍵使用正確。</p><p>  3)暫停/繼續(xù):當(dāng)程序正在運(yùn)行時(shí),點(diǎn)擊暫停/繼續(xù)按鈕“P”,蛇停在當(dāng)前的位置,再次點(diǎn)擊“P”蛇又從當(dāng)前位置繼續(xù)運(yùn)動(dòng)。此按鈕符合要求,所以暫停/繼續(xù)按鈕使用正確,功能能夠?qū)崿F(xiàn)。</p><p>  4)重新開(kāi)始:當(dāng)游戲結(jié)束或想重新開(kāi)始一局時(shí),點(diǎn)擊按鈕“R”,游戲又回到最初的狀態(tài),一個(gè)食物,一個(gè)運(yùn)動(dòng)著的紅色蛇塊,

54、且游戲積分清零。所以重新開(kāi)始功能能夠?qū)崿F(xiàn)。</p><p>  5)界面右側(cè)能夠出現(xiàn)按鍵提示和分?jǐn)?shù)顯示等有關(guān)信息。</p><p>  4.2程序運(yùn)行效果圖</p><p><b>  5.課程設(shè)計(jì)總結(jié)</b></p><p>  在設(shè)計(jì)這個(gè)程序中我主要學(xué)會(huì)了如何運(yùn)用以下有關(guān)C語(yǔ)言和C++的知識(shí):</p>

55、<p>  1)函數(shù)定義是要做到顧名思義是很重要的,它對(duì)讀程序的人正確認(rèn)識(shí)程序十分重要,在修改這個(gè)程序的過(guò)程中也能很快找到程序各模塊的作用,大大增加了程序的可讀性。</p><p>  2)分析函數(shù)先從main()函數(shù)入手。Main()函數(shù)是C++源程序編譯時(shí)的開(kāi)始,從main()函數(shù)開(kāi)始讀函數(shù)可將其他函數(shù)的功能理解得更透徹。</p><p>  3)在做程序的時(shí)候先列框架,將

56、這個(gè)程序所要達(dá)到的目的(功能)分析出來(lái),選擇正確的數(shù)據(jù)結(jié)構(gòu)然后在將程序模塊化,按照模塊編寫(xiě)函數(shù)更加簡(jiǎn)單合理。</p><p>  4)我還了解了很多的庫(kù)函數(shù)的作用,如字符串函數(shù)中有很多對(duì)字符串進(jìn)行處理的函數(shù),其功能我都有所了解。</p><p>  5)學(xué)會(huì)了有關(guān)頭文件的使用方法,及系統(tǒng)調(diào)配問(wèn)題的解決方法等。</p><p>  6)了解到了注釋的重要性。</

57、p><p>  通過(guò)這次試驗(yàn),讓我學(xué)到很多這個(gè)學(xué)期沒(méi)有接觸過(guò)的很多知識(shí),完成一個(gè)貪吃蛇的項(xiàng)目;第一步就是先理清思路,設(shè)計(jì)主界面,主界面是以一塊封閉的畫(huà)布,并在畫(huà)布內(nèi)設(shè)計(jì)蛇體和食物。蛇頭如果碰到墻或者與蛇身的某一部分碰到就會(huì)死亡;如果蛇頭碰到食物,就會(huì)自動(dòng)增加一節(jié)蛇身,并更改得分。</p><p>  想要寫(xiě)出好的程序,還是要有扎實(shí)的基礎(chǔ),這樣遇到問(wèn)題就不會(huì)一籌莫展來(lái)。在編程時(shí)我們要有想象力,不

58、要拘泥于現(xiàn)有的貪吃蛇游戲,而是要把自己想到的再加上所學(xué)的知識(shí),遇到問(wèn)題不能怕,而是要專(zhuān)心找出問(wèn)題的原因,再回來(lái)看看書(shū)本的知識(shí),不懂的還可以問(wèn)問(wèn)老師。編程過(guò)程還要養(yǎng)成良好的編程習(xí)慣,這樣不僅自己能夠很好看懂自己的代碼,也讓人家容易看懂自己的代碼,而不至于代碼知識(shí)自己會(huì)看,出來(lái)問(wèn)題只有自己會(huì)解決而其他人都不會(huì)解決;遇到問(wèn)題時(shí)要考慮最簡(jiǎn)單的解決方案,只有簡(jiǎn)單的方案不能滿(mǎn)足要求時(shí)再考慮復(fù)雜的方案。最主要編程還是要多與人溝通,不會(huì)的不能立即問(wèn)別人

59、,但是一段時(shí)間后解決不了時(shí)還是應(yīng)該向別人請(qǐng)教請(qǐng)教,“三人行必有我?guī)煛闭沁@個(gè)意思。</p><p>  通過(guò)這次實(shí)驗(yàn),我深刻地體會(huì)到了面向?qū)ο笈c面向過(guò)程的區(qū)別。程序在最初設(shè)計(jì)時(shí)由于面向?qū)ο蟮乃枷氩粔虺墒?,?dǎo)致在最后想要增加一些新的功能時(shí),出現(xiàn)了一些麻煩??傊?,我們還需要進(jìn)一步提升自己的能力。</p><p><b>  6.參考文獻(xiàn)</b></p>&l

60、t;p>  《C語(yǔ)言程序設(shè)計(jì)》 武雅麗 清華大學(xué)出版社</p><p>  《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》 譚浩強(qiáng) 清華大學(xué)出版社</p><p>  《C語(yǔ)言課程設(shè)計(jì)案例精編》 李麗娟 中國(guó)水利水電出版社</p><p>  附錄:源程序 </p><p>  //////////////////////////////

61、/////////////////</p><p>  // 程序名稱(chēng):貪吃蛇</p><p><b>  // 制作:莫新存</b></p><p>  // 編譯環(huán)境:Visual C++ 6.0 ,EasyX</p><p>  ///////////////////////////////////////////

62、///</p><p>  #include <iostream></p><p>  #include <graphics.h></p><p>  #include <stdlib.h></p><p>  #include <conio.h></p><p>  #

63、include <dos.h></p><p>  #include <time.h></p><p>  #include <stdio.h></p><p>  #include <vector></p><p>  #define random(a,b) (rand()%((b)-(a))

64、)+(a)</p><p>  #pragma comment(lib,"Winmm.lib") //加入背景音樂(lè)時(shí)使用</p><p>  using namespace std;</p><p>  #define MAX_JOINTS200</p><p>  #define MV_RIGHT

65、 1</p><p>  #define MV_LEFT 2</p><p>  #define MV_UP 3</p><p>  #define MV_DOWN 4</p><p>  int rnd1,rnd2;</p><p>  vector<int>

66、;vox;</p><p>  vector<int>voy;</p><p>  void InitGraph(void);/*圖形界面初始化函數(shù)*/</p><p>  void DrawFence(void);/*繪制游戲場(chǎng)景*/</p><p>  void GameOver(int score);/

67、*結(jié)束游戲*/</p><p>  void GamePlay(void);/*玩游戲具體過(guò)程*/</p><p>  void PrScore(int score); /*顯示分?jǐn)?shù)*/</p><p>  void fun_pause(); /*暫停游戲*/</p><p>

68、  void fun_reset(); /*重置游戲*/</p><p>  void fun_obstacle(); /*設(shè)置障礙物*/</p><p>  struct Food{/*食物的結(jié)構(gòu)體定義*/</p><p>  int x;/*食物的橫坐標(biāo)*/</p&

69、gt;<p>  int y;/*食物的縱坐標(biāo)*/</p><p>  int addFood;/*判斷是否要出現(xiàn)食物的變量*/</p><p><b>  };</b></p><p>  struct Snake{/*蛇的結(jié)構(gòu)體定義*/</p><p>  int x

70、[MAX_JOINTS]; /*保存蛇身每一節(jié)位于屏幕上的列坐標(biāo)*/</p><p>  int y[MAX_JOINTS]; /*保存蛇身每一節(jié)位于屏幕上的行坐標(biāo)*/</p><p>  int joint;/*蛇的節(jié)數(shù)*/</p><p>  int direction;/*蛇移動(dòng)方向*/</p><p&

71、gt;  int life;/*蛇的生命,0活著,1死亡*/</p><p><b>  };</b></p><p>  void play()</p><p><b>  {</b></p><p>  initgraph(800,600);</p><p>

72、  InitGraph();</p><p>  DrawFence();</p><p>  GamePlay();</p><p><b>  getch();</b></p><p><b>  }</b></p><p>  int main ()</p&g

73、t;<p>  { mciSendString("play mo.mp3", NULL, 0, NULL); //播放音樂(lè)</p><p><b>  play();</b></p><p><b>  return 0;</b></p><p><b>  }</b

74、></p><p><b>  //初始化 </b></p><p>  void InitGraph(){</p><p>  cleardevice();</p><p>  setbkcolor(BLUE);</p><p>  setcolor(WHITE);</p>

75、<p>  cleardevice();</p><p>  setfont(25, 0, _T("微軟雅黑"));</p><p>  outtextxy(170,150,"Greedy Snake");</p><p>  outtextxy(219,254,"Ready?");</p

76、><p><b>  getch();</b></p><p>  setbkcolor(0);</p><p>  cleardevice();</p><p><b>  }</b></p><p><b>  //繪制游戲場(chǎng)景</b></p&g

77、t;<p>  void DrawFence(){</p><p><b>  int i;</b></p><p>  setbkcolor(LIGHTGREEN);</p><p>  setlinestyle(PS_SOLID, 5);</p><p><b>  //畫(huà)圍墻</b&g

78、t;</p><p>  setfillstyle(LIGHTBLUE);</p><p>  for (i=50; i<=591; i+=10){</p><p>  //rectangle(i, 40, i+10, 49);//上邊</p><p>  bar(i,40,i+7,47);</p><p>

79、;  bar(i, 551, i+7,558);//下邊</p><p><b>  }</b></p><p>  for (i=40; i<=550; i+=10){</p><p>  bar(50, i, 57, i+7);//左邊</p><p>  bar(591, i, 598, i+7);/

80、/右邊</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //結(jié)束游戲</b></p><p>  void GameOver(int score){</p><p>  cleardevice(

81、);</p><p>  PrScore(score);</p><p>  setcolor(RED);</p><p>  setfont(80, 0, _T("微軟雅黑"));</p><p>  outtextxy(100, 200, "GAME OVER");</p><p

82、>  mciSendString("close mo.mp3", NULL, 0, NULL); //關(guān)閉音樂(lè)</p><p><b>  getch();</b></p><p><b>  exit(0);</b></p><p><b>  }</b></p&g

83、t;<p><b>  //輸出成績(jī)</b></p><p>  void PrScore(int score)</p><p><b>  {</b></p><p>  char str_score[10];</p><p>  //setfillstyle(YELLOW);<

84、;/p><p>  //bar(50, 15, 220, 35);</p><p>  //setcolor(6);</p><p>  //setfont(25, 0, _T("微軟雅黑"));</p><p>  //setfillstyle(BLACK);</p><p>  setbkmode(

85、TRANSPARENT);//---new---</p><p>  BeginBatchDraw();</p><p>  setfillstyle(BLACK);</p><p>  bar(601,0,800,600);</p><p>  setfont(60, 0, _T("微軟雅黑"));</p>

86、;<p>  setcolor(YELLOW);</p><p>  outtextxy(625, 30, _T("貪吃蛇"));</p><p>  setfont(30, 0, _T("微軟雅黑"));</p><p>  setcolor(LIGHTGREEN);</p><p> 

87、 outtextxy(625, 140, _T("制作:莫新存"));</p><p>  outtextxy(625, 170, _T("班級(jí):24041001"));</p><p>  outtextxy(625, 200, _T("學(xué)號(hào):19"));</p><p>  setfont(25, 0,

88、 _T("微軟雅黑"));</p><p>  setcolor(CYAN);</p><p>  outtextxy(625, 380, _T("上:W"));</p><p>  outtextxy(625, 400, _T("下:S"));</p><p>  outtextx

89、y(625, 420, _T("左:A"));</p><p>  outtextxy(625, 440, _T("右:D"));</p><p>  outtextxy(625, 460, _T("分?jǐn)?shù):"));</p><p>  outtextxy(625, 490, _T("暫停(P鍵)&

90、quot;));</p><p>  outtextxy(625, 520, _T("重新游戲(R鍵)"));</p><p>  setcolor(LIGHTBLUE);</p><p>  sprintf(str_score,"%i",score);</p><p>  outtextxy(680,

91、 460, str_score);</p><p>  EndBatchDraw();</p><p>  if(score>0 && score%50==0) fun_obstacle();</p><p><b>  }</b></p><p>  void GamePlay(){</p&

92、gt;<p>  int i, key;</p><p>  int gamespeed =200;//控制游戲速度*</p><p>  int score = 0;//記錄游戲得分</p><p>  struct Food food;//食物結(jié)構(gòu)體變量</p><p>  struct

93、Snake snake;//蛇結(jié)構(gòu)體變量</p><p>  food.addFood = 1;//1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物</p><p>  snake.life = 0;//置蛇的生命狀態(tài)為活著</p><p>  snake.direction = MV_RIGHT;//置蛇頭方向往右</p>&

94、lt;p>  snake.x[0] = 100; snake.y[0] = 100;//置蛇頭初始位置</p><p>  snake.x[1] = 110; snake.y[1] = 100;</p><p>  snake.joint = 2;//置蛇的初始節(jié)數(shù)為2</p><p>  PrScore(score);//顯示游戲得分

95、</p><p>  //重復(fù)玩游戲,直到按Esc鍵結(jié)束</p><p>  srand(time(NULL));</p><p><b>  while (1)</b></p><p><b>  { </b></p><p>  while (!kbhit())&l

96、t;/p><p>  {mciSendString("play mo.mp3", NULL, 0, NULL); //播放音樂(lè)</p><p>  if (food.addFood == 1){ //需要出現(xiàn)新食物</p><p>  food.x = rand() % 400 + 60;</p><p> 

97、 food.y = rand() % 350 + 60;</p><p>  //食物出現(xiàn)后必須在整格內(nèi)才能讓蛇吃到</p><p>  while (food.x%10 != 0)</p><p><b>  {</b></p><p><b>  food.x++;</b></p>

98、<p><b>  }</b></p><p>  while (food.y%10 !=0){</p><p><b>  food.y++;</b></p><p><b>  }</b></p><p>  food.addFood=0;//畫(huà)面上有食物

99、 </p><p><b>  }</b></p><p>  if (food.addFood==0){ //畫(huà)面上有食物,則顯示 </p><p>  setcolor(GREEN);</p><p>  rectangle(food.x, food.y, food.x+10, food.y-10);<

100、/p><p><b>  }</b></p><p>  //在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體</p><p>  for (i=snake.joint-1; i>0; i--){//蛇的每個(gè)節(jié)往前移動(dòng) </p><p>  snake.x[i] = snake.x[i-1];</p><p&

101、gt;  snake.y[i] = snake.y[i-1];</p><p><b>  }</b></p><p>  //1,2,3,4 表示右,左,上,下四個(gè)方向,來(lái)決定蛇頭的移動(dòng) </p><p>  switch(snake.direction){</p><p>  case MV_RIGHT: snake

102、.x[0] += 10; break;</p><p>  case MV_LEFT: snake.x[0] -= 10; break;</p><p>  case MV_UP: snake.y[0] -= 10; break;</p><p>  case MV_DOWN: snake.y[0] += 10; break;</p><

103、p><b>  }</b></p><p>  //從蛇的第四節(jié)開(kāi)始判斷是否撞到自己,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)</p><p>  for (i=3; i<snake.joint; i++){</p><p>  if (snake.x[i]==snake.x[0] && snake.y[i]==snake

104、.y[0]){</p><p>  GameOver(score);//顯示失敗</p><p>  snake.life = 1; //蛇死*/</p><p><b>  break;</b></p><p><b>  }</b></p><p><b&g

105、t;  }</b></p><p>  //判斷蛇是否撞到墻壁</p><p>  if (snake.x[0]<55 || snake.x[0]>595 || snake.y[0]<55 || snake.y[0]>455){</p><p>  GameOver(score);//本次游戲結(jié)束</p>&l

106、t;p>  snake.life = 1; //蛇死</p><p><b>  }</b></p><p>  for(int obs_i = 0; obs_i<vox.size(); obs_i++){//-----判斷是否撞到障礙物----</p><p>  if(vox[obs_i]==snake.x[0] &a

107、mp;& voy[obs_i]==snake.y[0]) GameOver(score);</p><p><b>  }</b></p><p>  //以上三種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始</p><p>  if (snake.life == 1)break;</p><p>  if (sn

108、ake.x[0]==food.x && snake.y[0]==food.y){ //吃到食物后</p><p>  //把畫(huà)面上的食物清除</p><p>  setcolor(0);</p><p>  rectangle(food.x, food.y, food.x+10, food.y-10);</p><p> 

109、 //新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置</p><p>  snake.x[snake.joint] =-20; snake.y[snake.joint] =-20;</p><p>  snake.joint++;//蛇的身體長(zhǎng)一節(jié)</p><p>  food.addFood = 1;//畫(huà)面上需要出現(xiàn)新食物</p>

110、<p>  score += 10;</p><p>  //-------------------------</p><p>  PrScore(score);//輸出新得分</p><p><b>  }</b></p><p><b>  //畫(huà)蛇</b></p&

111、gt;<p>  setcolor(RED);</p><p>  for (i=0; i<snake.joint; i++)</p><p><b>  {</b></p><p>  rectangle(snake.x[i], snake.y[i],snake.x[i]+10, snake.y[i]-10);</p

112、><p><b>  }</b></p><p>  Sleep(gamespeed); //延時(shí)控制蛇的速度</p><p>  //去除蛇的最后一節(jié)</p><p>  setcolor(0);</p><p>  rectangle(snake.x[snake.joint-1], sna

113、ke.y[snake.joint-1],</p><p>  snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);</p><p>  } //end of while(!kbhit)</p><p>  if (snake.life == 1) break;//如果蛇死,則跳出循環(huán)</

114、p><p>  key=getch();//接收按鍵</p><p>  switch(key){//判斷按鍵,是否往相反方向移動(dòng),按Esc鍵則退出</p><p>  case 'w':case 'W':{if(snake.direction!=MV_DOWN) snake.direction = MV_UP;}break;</p

115、><p>  case 'd':case 'D':{if(snake.direction!=MV_LEFT) snake.direction = MV_RIGHT;}break;</p><p>  case 'a':case 'A':{if(snake.direction!=MV_RIGHT) snake.direction =

116、 MV_LEFT;}break;</p><p>  case 's':case 'S':{if(snake.direction!=MV_UP) snake.direction = MV_DOWN;}break;</p><p>  case 'p':case 'P':fun_pause();break;</p>

117、<p>  case 'r':case 'R':fun_reset();break;</p><p><b>  }</b></p><p>  }//end of while(1)</p><p><b>  }</b></p><p>

118、;  void fun_pause()</p><p><b>  {</b></p><p>  while(true)</p><p><b>  {</b></p><p>  char c = getch();</p><p>  if(c=='P'

119、|| c=='p')</p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

120、b>  }</b></p><p>  void fun_reset()</p><p><b>  {</b></p><p><b>  play();</b></p><p><b>  }</b></p><p>  void

121、fun_obstacle(){</p><p>  rnd1 = random(50,580);</p><p>  rnd2 = random(60,550);</p><p>  while(rnd1%10 != 0)</p><p><b>  rnd1++;</b></p><p>  w

122、hile(rnd2%10 != 0) </p><p><b>  rnd2++;</b></p><p>  vox.push_back(rnd1);</p><p>  voy.push_back(rnd2);</p><p>  setfillstyle(RGB(255,204,51));</p>&

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論