C++貪吃蛇說明參考模板_第1頁
C++貪吃蛇說明參考模板_第2頁
C++貪吃蛇說明參考模板_第3頁
C++貪吃蛇說明參考模板_第4頁
C++貪吃蛇說明參考模板_第5頁
已閱讀5頁,還剩32頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 C語言課程設計報告題 目: 貪吃蛇 指導教師: 許 盟 院 系:電氣信息工程學院班 級: 01 姓 名: 齊英帥 學 號: 15 目 錄1 / 371程序設計目的02程序設計具體要求03程序功能04設計思路05程序清單06總結與體會07結束語01、課程設計目的:1進一步掌握和利用C語言進行行程設計的能力;2進一步理解和運用結構化程序設計的思想和方法;3初步掌握開發一個小型實用系統的基本方法;4學會調試一個較長程序的基本方法;5學會利用流程圖表示算法;6掌握書寫程序設計開發文檔的能力(書寫課程設計報告)。2、課程設計具體要求:貪吃蛇是一種風靡全球的小游戲,就是一條小蛇,不停地在屏幕上游走,吃各

2、個方向出現的蛋,越吃越長。只要蛇頭碰到屏幕四周,或者碰到自己的身子,小蛇就立即斃命。和別的游戲不同,貪食蛇是一個悲劇性的游戲。許多電子游戲都是打通關到底,游戲操作者以勝利而告終。而貪食蛇的結局卻是死亡。“貪食蛇”,要命的就在一個“貪”字上。所以,有時候真的需要及時收手,不要逼人太甚。如果沒有余地,就算你的手再快,面臨的結局也是崩盤。3、程序功能:我設計的貪吃蛇V1.00主要具有以下功能1.每吃到一個普通食物,蛇的身體增長一節,玩家的分數加1。同時,蛇移動的速度也會隨之加快。2可以選擇FAST NOMAL SLOW三個速度等級。3可以選擇單人游戲或者雙人游戲,選擇雙人游戲時,按方向鍵控制Play

3、er1,按W A S D控制Player2.首先撞死的蛇為敗者。4每吃掉3個普通食物,將產生一個獎勵食物,如果吃掉獎勵食物,玩家的分數加1,但是蛇的身體不增長。5每吃掉3個普通食物,同時將產生一個障礙,如果吃掉獎勵食物,障礙也將隨之消失。另外,每次產生的障礙形狀不同。6.如果在難度等級對應的時間內沒有吃掉獎勵食物,食物消失,障礙也會消失。7按空格鍵可以控制暫停與開始,按ESC鍵退出游戲。8.游戲有排行榜功能,當得分不為0時,玩家的姓名將被記錄到排行榜中;進行雙人游戲時,勝利玩家的姓名將被記錄到排行榜中。9.游戲開始以及蛇吃到食物,蛇死亡時,都有不同的音效。10.兼容性:代碼大概620行,在WI

4、NDOWS 7&&VC+6.0環境下編譯通過。生成的EXE游戲文件在WINDOWS 7 | | WINDOW XP環境下都能運行。4、設計思路:1程序總體結構貪吃蛇的關鍵算法為:先調用畫圖函數畫出地圖以及蛇的身體,將蛇的每一步移動當成一次循環來處理,判斷是否吃到食物或者撞到障礙等問題,如果撞到障礙,則游戲結束;如果不撞到障礙,則進行下一次循環。其主流程如圖2所示。圖2貪吃蛇的流程圖2界面設計貪吃蛇的界面如圖3所示,具體設計如下:(1)地圖背景采用黑色,蛇的可移動范圍為綠色方框部分,地圖邊框為藍色圖形部分。(2)地圖左右兩邊用綠色字體,調用newscore(int i)函數分別輸

5、出兩個玩家的得分情況。(3)兩條蛇分別用不同顏色輸出。普通食物以紫色星星輸出;獎勵食物以白色星星輸出,障礙以紅色圖形輸出。(5)當游戲結束時,在地圖下方輸出勝利者以及排行榜信息。圖3貪吃蛇V1.00的外觀3重要數據的數據結構設計貪吃蛇的主體程序為蛇的移動,主要用到了循環算法。由于TC中的gotoxy(int x, int y)函數到VC或者其它編譯器中用不了了,這樣一來如果想在控制臺程序中進行簡單的屏幕輸出控制就不好辦了。所以為了實現在VC+6.0中顏色字體的輸出以及清屏,光標位置控制等功能,必須在頭文件中包括”pcc32.h” “common.h” ”jkey32.h ”等文件。利用上述同文

6、件中的接口函數,便能夠在WIN32控制臺程序中實現TC中才能實現的屏幕控制以及鍵盤控制等功能。另外,在設計游戲排行榜的過程中,運用了C文件調用以及重新保存技術。5、函數清單:貪吃蛇V1.00程序采用了結構化程序設計的思想,由8個h文件,1個cpp文件,2個普通文件,2個.a靜態庫文件和4個.wav組成.其中包含11個自編函數,函數名及功能如下:/*注:由于游戲功能強大,以下函數僅為主要函數,一些用于控制細節的函數,如Playsound()等將不予以一一列出,詳見源代碼*/1.Char menu();/*用于輸入玩家選擇的游戲速度,返回一個char值*/2.Char menudouble();/

7、*用于輸入玩家選擇的游戲人數,返回一個chare值*/3.DELAY(char ch1);/*用于控制游戲速度*/4.Void main();/*主函數,用于控制游戲*/5.void drawmap();/*繪制游戲地圖函數*6.void drawfood(char ch);/*繪制普通食物函數*/7.void snake_move();/*蛇的移動函數*/8.void drawsnake(int i);/*繪制蛇身函數*/9.void newscore(int i);/*更新玩家得分函數*/10.void drawrw_food(char ch);/*繪制獎勵食物函數*/11.void dr

8、awstone(char ch);/*繪制障礙函數*/貪吃蛇包含的文件有:common.h,pcc32.h,jkey32.h,libpcc32.a,libjkey32.a,finalsnake.cpp,片頭.wav,超級馬里奧兄弟 死掉音.wav,食物.wav,獎勵食物.wav。源代碼如下:#include <stdio.h>#include<stdlib.h>#include<time.h>#include<stdlib.h>#include<string.h>#include "pcc32.h"#include

9、 "mmsystem.h"#include "jkey32.h"#pragma comment(lib, "winmm.lib")#pragma comment(lib,"libpcc32.a")#pragma comment(lib,"libjkey32.a") #define DIR_UP 1#define DIR_DOWN 2#define DIR_LEFT 3#define DIR_RIGHT 4void drawmap();void drawfood(char ch);void sna

10、ke_move();void drawsnake(int i);void newscore(int i);void drawrw_food(char ch);void drawstone(char ch);struct point /結構體坐標int x;int y;snake280,food,rw_food,stone4;struct rank /排行榜char name20; int point;player80;clock_t begin_time,end_time;int count=0; /記錄吃掉普通食物的次數int num=0;int gamespeed=50;int nofoo

11、d=1;int nopause=0;int norw_food=1;int rwtime;int snake_dir2=DIR_RIGHT,DIR_RIGHT;int snake_life2=1,1;int snake_len2=3,3; /蛇的初始節數都為3int hx2,hy2; /蛇頭坐標int score2=0,0;/得分為零char menu()char ch1;setTextColor(2);gotoTextPos(24/2,16/2);PlaySound("d:片頭.wav",NULL, SND_ASYNC|SND_NODEFAULT );/SND_ASYNC

12、用異步方式播放聲音,PlaySound函數在開始播放后立即返回。SND_NODEFAULT不播放缺省聲音,若無此標志,則PlaySound在沒找到聲音時會播放缺省聲音。 printf("ttPlease choose the gamespeed:n"); printf("ttt1-Fast 2-Normal 3-Slown"); printf("ntttPlease Press The numbers.n"); do /確保輸入的為規定情況之一 ch1=getch(); while(ch1!='1'&&

13、ch1!='2'&&ch1!='3'); printf("tttYou have choosed the speed %c!",ch1); printf("nntttPress Anykey to continue!"); if(jkGetKey() system("cls"); /清空屏幕#include <stdlib.h> return(ch1); /返回一個選擇的速度 char menudouble()char ch2;setTextColor(6);gotoText

14、Pos(24/2,16/2);PlaySound("d:片頭.wav",NULL, SND_ASYNC|SND_NODEFAULT );printf("ttPlease choose the game mode:n"); printf("ttt1-1 playern"); printf("ttt2-2 playersn"); printf("ntttPlease Press The numbers.n"); do ch2=getch(); while(ch2!='1'&&

15、amp;ch2!='2'); printf("tttYou have choosed the mode %c!",ch2); printf("nntttPress Anykey to start!"); if(jkGetKey() system("cls"); return(ch2); void DELAY(char ch1)if(ch1='1')delayMS(gamespeed); else if(ch1='2')delayMS(gamespeed); delayMS(gamespe

16、ed);else delayMS(gamespeed); delayMS(gamespeed);delayMS(gamespeed);delayMS(gamespeed);void main()FILE *fp,*p1;char ch1;char ch2;int i,j,n,k;int temp_point;char temp_name20; printf("貪吃蛇-By qiyingshuain");printf("zhuandian 09-01-15n");setCursorVisible(0); setConsoleTitle("貪吃蛇q

17、iyingshuain"); /標題ch1=menu();ch2=menudouble();drawmap();switch(ch1) case '1':rwtime=2500;break; case '2':rwtime=3000;break; case '3':rwtime=3500;break;for(i=0;i<(ch2-48);i+) newscore(i);for(i=0;i<(ch2-48);i+) /畫出蛇的最初形態setTextColor(15); gotoTextPos(30, 5+i*9); print

18、f("");gotoTextPos(30+2, 5+i*9);setTextColor(3+i*2); printf("");setTextColor(4+i*2);gotoTextPos(30+4, 5+i*9);printf("");for(i=0;i<(ch2-48);i+) /定位蛇每節身體的初始坐標 for(j=0;j<snake_leni;j+)snakeij.x=34-j*2; snakeij.y=5+i*9;hxi=snakei0.x; /蛇頭初始坐標hyi=snakei0.y;while(snake_li

19、fe0&&snake_life1) /開始游戲 if(nopause) DELAY(ch1); /賦予游戲速度 delayMS(80-snake_len0*2); /游戲速度隨蛇長度的增加而加快 if(nofood) drawfood(ch2); /產生食物 if(norw_food=1&&count=3) /每吃掉3個普通食物產生一個獎勵食物,并產生障礙 drawrw_food(ch2); drawstone(ch2); begin_time=clock(); end_time=begin_time+rwtime; snake_move(); if(end_t

20、ime<=clock()&&norw_food=0) /在難度等級對應的時間內沒有吃掉獎勵食物,食物消失 gotoTextPos(rw_food.x, rw_food.y); setTextColor(2); printf(""); for(i=0;i<4;i+) gotoTextPos(stonei.x,stonei.y); printf(""); for(j=0;j<4;j+) /石頭坐標清零。 stonej.x=0; stonej.y=0; rw_food.x=0; /獎勵食物坐標清零 rw_food.y=0; b

21、egin_time=0; end_time=0; norw_food=1; for(i=0;i<(ch2-48);i+) drawsnake(i);if(snake_life1=0&&snake_life0=0)goto d;for(i=0;i<(ch2-48);i+) /如果有其中一只蛇死亡,結束游戲if(snake_lifei=0)goto c; if(jkHasKey() switch(jkGetKey()case JK_SPACE: nopause=!nopause; break;case JK_ESC:snake_life1=0;snake_life0=0

22、;score0=0;score1=0;goto d;break;default:break; c:PlaySound("d:超級馬里奧兄弟 死掉音.wav",NULL, SND_ASYNC|SND_NODEFAULT );d:setTextColor(14);gotoTextPos(25,20);if(ch2='1') printf("Game over!");else if(ch2='2') if(snake_life0=0&&snake_life1!=0)printf("player 2 wi

23、n!"); else if(snake_life1=0&&snake_life0!=0) printf("player 1 win!"); else printf("Game over!/n");getch();if(score0!=0|score1!=0) /當有其中一個玩家的分數不為零,記錄排行榜if(fp=fopen("player_rank","rb")=NULL) /打開排行榜文件printf("file open error");exit(0); if(p1

24、=fopen("num","rb")=NULL) /打開排行榜玩家數量文件printf("file open error");exit(0); n=fgetc(p1); /調用排行榜玩家數到內存,賦值給n for(j=0;j<n;j+) /調用排行榜玩家信息到內存 fread(&playerj,sizeof(struct rank),1,fp);fclose(fp); fclose(p1); printf("Please intput the name of player:");scanf("

25、;%s",); if(ch2='1') playern.point=score0;else /雙人游戲時,分數高的玩家姓名被記錄到排行榜if(score0>=score1)playern.point=score0;else playern.point=score1;n+; /排行榜記錄加1for(i=0;i<n-1;i+) /按照得分進行從大到小排序k=i;for(j=i+1;j<n;j+)if(playerj.point>playerk.point)k=j; temp_point=playerk.point; play

26、erk.point=playeri.point; playeri.point=temp_point; strcpy(temp_name,); strcpy(,); strcpy( ,temp_name); gotoTextPos(25,21);printf("player's name score");printf("n");for(i=0;i<n;i+) /輸出排行榜 gotoTextPos(25,21+i+1);printf("%-

27、15s%4dn",,playeri.point); if(fp=fopen("player_rank","wb")=NULL) /打開排行榜文件printf("file open error");exit(0); if(p1=fopen("num","wb")=NULL) /打開排行榜玩家數量文件printf("file open error");exit(0);for(j=0;j<n;j+) /將排行榜玩家信息重新寫入文件 fwrit

28、e(&playerj,sizeof(struct rank),1,fp);fputc(n,p1); fclose(fp); fclose(p1);getch();void drawmap()int j,i;setTextColor(2); for(i=0;i<16;i+) gotoTextPos(16, 3+i); for(j=0;j<24;j+)printf("");setTextColor(9); for(j=0;j<26;j+) /輸出上邊gotoTextPos(14+j*2, 2); printf("¤");

29、for(i=0;i<18;i+) /輸出左邊 gotoTextPos(14, 2+i);printf("¤");for(i=0;i<18;i+) /輸出右邊gotoTextPos(14+25*2, 2+i); printf("¤"); for(j=0;j<26;j+) /輸出下邊gotoTextPos(14+j*2, 2+17); printf("¤");void snake_move() if(jkHasKey() switch(jkGetKey()case JK_UP: if(sna

30、ke_dir0!=DIR_DOWN) snake_dir0=DIR_UP; break; case 'w': if (snake_dir1!=DIR_DOWN) snake_dir1=DIR_UP; break;case JK_DOWN: if (snake_dir0!=DIR_UP) snake_dir0=DIR_DOWN; break;case 's': if (snake_dir1!=DIR_UP) snake_dir1=DIR_DOWN; break; case JK_LEFT: if (snake_dir0!=DIR_RIGHT) snake_dir0

31、=DIR_LEFT; break; case 'a': if (snake_dir1!=DIR_RIGHT) snake_dir1=DIR_LEFT; break; case JK_RIGHT: if (snake_dir0!=DIR_LEFT) snake_dir0=DIR_RIGHT;case 'd': if (snake_dir1!=DIR_LEFT) snake_dir1=DIR_RIGHT; break;case JK_SPACE: nopause=!nopause; break; case JK_ESC:snake_life1=0;snake_lif

32、e0=0;score0=0;score1=0;break; void drawsnake(int i) int j,k=1; switch(snake_diri) case DIR_UP: hyi-;break; case DIR_DOWN: hyi+;break; case DIR_LEFT:hxi=hxi-2;break; case DIR_RIGHT:hxi=hxi+2;break; if(hxi>=64|hxi<=14|hyi>=19|hyi<=2) /判斷蛇是否撞墻 snake_lifei=0,k=0; for(j=0;j<4;j+)/蛇是否撞到障礙 i

33、f(hxi=stonej.x&&hyi=stonej.y) snake_lifei=0,k=0; for(j=0;j<snake_leni;j+) /蛇是否撞到自己if(hxi=snakeij.x&&hyi=snakeij.y)snake_lifei=0,k=0; if(i=0) /當進行雙人游戲時,需判斷是否撞到對方的蛇 for(j=0;j<snake_len1;j+) if(hx0=snake1j.x&&hy0=snake1j.y) snake_life0=0,k=0; if(i=1) for(j=0;j<snake_len

34、0;j+) if(hx1=snake0j.x&&hy1=snake0j.y) snake_life1=0,k=0;if(hxi=food.x&&hyi=food.y) /如果吃到食物 count+;num+; PlaySound("d:食物.wav",NULL, SND_ASYNC|SND_NODEFAULT ); gotoTextPos(food.x, food.y); setTextColor(4+i*2); printf("");gotoTextPos(snakei0.x, snakei0.y);setTextCol

35、or(3+i*2); printf("");scorei+;newscore(i);snake_leni+;k=0;nofood=1; if(hxi=rw_food.x&&hyi=rw_food.y)/如果吃到獎勵食物加兩分 PlaySound("d:獎勵食物.wav",NULL, SND_ASYNC|SND_NODEFAULT); gotoTextPos(rw_food.x,rw_food.y); setTextColor(4+i*2); printf("");gotoTextPos(snakei0.x,snakei

36、0.y);setTextColor(3+i*2); printf("");gotoTextPos(snakeisnake_leni-1.x,snakeisnake_leni-1.y);setTextColor(2); printf("");gotoTextPos(snakeisnake_leni-2.x,snakeisnake_leni-2.y);setTextColor(15); printf(""); setTextColor(2); rw_food.x=0; /獎勵食物坐標清零 rw_food.y=0; for(j=0;j<

37、;4;j+) gotoTextPos(stonej.x,stonej.y); printf(""); for(j=0;j<4;j+) /石頭坐標清零。stonej.x=0;stonej.y=0; scorei=scorei+2;newscore(i);k=0;norw_food=1; if(k=1) /蛇正常前進 gotoTextPos(hxi,hyi); setTextColor(4+i*2); printf(""); gotoTextPos(snakei0.x,snakei0.y); setTextColor(3+i*2); printf(&q

38、uot;");gotoTextPos(snakeisnake_leni-1.x,snakeisnake_leni-1.y);setTextColor(2); printf("");gotoTextPos(snakeisnake_leni-2.x,snakeisnake_leni-2.y);setTextColor(15); printf(""); for(j=1;j<snake_leni;j+) /重新定義蛇身和蛇尾坐標 snakeisnake_leni-j.x=snakeisnake_leni-j-1.x; snakeisnake_le

39、ni-j.y=snakeisnake_leni-j-1.y; snakei0.x=hxi; / 重新定義蛇頭坐標 snakei0.y=hyi;void drawfood(char ch)int i,j;srand(unsigned)time(NULL); /產生隨機種子 a: food.x=rand()%47+16;food.y=rand()%16+3;if(food.x%2!=0)goto a;for(i=0;i<(ch-48);i+) /食物是否在蛇身體內for(j=0;j<snake_leni;j+)if(food.x=snakeij.x&&food.y=sn

40、akeij.y)goto a;if(food.x=rw_food.x&&food.y=rw_food.y) /食物是否與獎勵食物重合 goto a; for(j=0;j<4;j+) /食物是否與障礙重合 if(food.x=stonej.x&&food.y=stonej.y) goto a; gotoTextPos(food.x, food.y); /滿足條件的坐標產生食物 setTextColor(5); printf(""); nofood=0;void newscore(int i) /輸出分數if(i=0) setTextCol

41、or(2); gotoTextPos(2,5); printf("Player 1"); gotoTextPos(2,7); printf("Score: %d.", score0);if(i=1) setTextColor(2); gotoTextPos(70,5); printf("Player 2"); gotoTextPos(70,7); printf("Score: %d.", score1);void drawrw_food(char ch) int i,j;srand(unsigned)time(NU

42、LL); /產生隨機種子 a: rw_food.x=rand()%47+16;rw_food.y=rand()%16+3;if(rw_food.x%2!=0)goto a;for(i=0;i<(ch-48);i+) /食物是否在蛇身體內for(j=0;j<snake_leni;j+)if(rw_food.x=snakeij.x&&rw_food.y=snakeij.y)goto a;if(food.x=rw_food.x&&food.y=rw_food.y) /食物是否與普通食物重合 goto a; for(j=0;j<4;j+) /食物是否與

43、障礙重合 if(rw_food.x=stonej.x&&rw_food.x=stonej.y) goto a; gotoTextPos(rw_food.x, rw_food.y); /滿足條件的坐標產生食物 setTextColor(7); printf(""); norw_food=0; begin_time=0; end_time=0; count=0;void drawstone(char ch) /畫障礙函數int i,method,j,z;srand(unsigned)time(NULL);b:method=rand()%4+1;switch(method) case 1: stone0.x=rand()%43+16; stone0.y=r

溫馨提示

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

評論

0/150

提交評論