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

提交评论