C语言贪吃蛇程序设计说明书.docx
《C语言贪吃蛇程序设计说明书.docx》由会员分享,可在线阅读,更多相关《C语言贪吃蛇程序设计说明书.docx(14页珍藏版)》请在冰豆网上搜索。
![C语言贪吃蛇程序设计说明书.docx](https://file1.bdocx.com/fileroot1/2023-6/7/27793bce-c1ef-4e8c-ae29-deefdd1ab466/27793bce-c1ef-4e8c-ae29-deefdd1ab4661.gif)
C语言贪吃蛇程序设计说明书
C语言贪吃蛇程序设计说明书
题目:
贪吃蛇游戏
学校:
系别:
专业
班级:
姓名:
学号:
指导老师:
日期:
一、设计题目:
贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:
本游戏要求实现以下几个功能:
(1)用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;
(2)用户可以调节蛇的运行速度来选择不同的难度;
(3)游戏分多个难度级别;
(4)用户可自选颜色;
(5)记录成绩前五名的游戏玩家;
(6)增加背景音乐;
(7)提高障碍物和游戏级别。
三、程序模块图:
贪吃蛇游戏
初画控设帮
始图制置助
模模模模化
块块块块
墙蛇食移食死变成等音
体身物动物亡长绩级效
2
四、算法流程图:
开始初始化界面和蛇身
放置食物
获取按键
开始运动
碰到边界
是
否
否蛇吃到食
是
蛇长大
蛇死亡是
继续
否
结束
3
五、函数原型与功能1.主函数:
voidmain()
启动程序,触动其他函数。
2.初始化:
voidinit()
设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:
voidsetfoodcrd()
设置食物生成坐标,0表示食物被吃。
4.画食物:
voidshowfood()
用矩形框来画食物
5.画蛇:
voidshowsnake()
根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:
voidsnakemove()
根据按键,重设坐标
7.改变蛇的方向:
voidchangeskdir()
响应用户的运动方向
8.判断蛇是否死亡:
voidjudgeslod
判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:
voidjudgefood()
判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:
voidgameover()
结束话语,并执行下一步。
六、基本代码
#include#include
#include
#pragmacomment(lib,"Winmm.lib")
#include"MyTimer.h"#defineSIZEMAX100/*蛇最大长度*/#defineSPEED100/*初始速度*/#definelen20/*蛇宽度*/
#definelm10/*蛇每次移动距离*/#defineinitlen600/*初始化窗口正方形的长度*/#defineMin_snakelen2/*蛇的最小长度*/
typedefstruct{
intx,y;
}DIR;
intsnakelen=Min_snakelen;/*蛇的长度*/
4
intisfood=1;/*食物状态*/intisover=0;/*游戏状态*/
intispause=1;/*暂停状态*/
intismusic=1;/*音乐播放状态*/chardir;/*记录蛇运动的方向*/charc='d';
DIRsnake[500],food;/*定义蛇节点和食物的类型*/intspeed=SPEED;
voiddrawmap()/*画地图函数*/{
IMAGEimg;
charstr[10];
loadimage(&img,"贪吃蛇.jpg");/*游戏界面*/
putimage(0,0,&img);
loadimage(&img,"7.jpg");/*侧栏提示*/
putimage(600,0,&img);
sprintf(str,"%d",snakelen);
setfont(30,0,"宋体");
setbkmode(TRANSPARENT);
outtextxy(620,10,"操作说明:
");
setfont(20,0,"宋体");
outtextxy(615,50,"awsd控制方向键");
outtextxy(615,80,"p键暂停");
outtextxy(615,110,"o键继续");
outtextxy(615,200,"esc键退出");
outtextxy(615,140,"l键暂停音乐");
outtextxy(615,170,"k键继续播放");
outtextxy(730,250,str);
outtextxy(620,250,"蛇当前长度");
}
voidinit()/*初始化蛇函数*/{
inti;
IMAGEimg;
snake[0].x=9*len+lm;
snake[0].y=4*len+lm;
loadimage(&img,"1.jpg");
putimage(snake[0].x-lm,snake[0].y-lm,&img);
for(i=1;i{
snake[i].x=len*(9-i)+lm;
snake[i].y=len*4+lm;
5
loadimage(&img,"2.jpg");
putimage(snake[i].x-lm,snake[i].y-lm,&img);
}
}
voidshowsnake()/*画蛇函数*/{
inti;
IMAGEimg;
loadimage(&img,"1.jpg");
putimage(snake[0].x-lm,snake[0].y-lm,&img);
loadimage(&img,"2.jpg");
for(i=1;iputimage(snake[i].x-lm,snake[i].y-lm,&img);
}
voidsnakemove()/*画动蛇函数*/{
inti;
intmx=snake[0].x;
intmy=snake[0].y;
switch(dir)
{
case'a':
mx-=len;break;
case'd':
mx+=len;break;
case'w':
my-=len;break;
case's':
my+=len;break;
default:
break;
}
for(i=snakelen-1;i>=0;i--)
{
snake[i+1].x=snake[i].x;
snake[i+1].y=snake[i].y;
}
snake[0].x=mx;
snake[0].y=my;
showsnake();
}
intceshiover()/*检测游戏结束函数*/{
inti;
if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)
return1;
for(i=1;i6
{
if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y)
return1;
}
return0;
}
intfoodinsnake()/*检测食物是否在蛇上函数*/{
for(inti=0;iif(food.x==snake[i].x&&food.y==snake[i].y)
return1;
else
return0;
}
voidshowfood()/*画食物函数*/
{
IMAGEimg;
do{
food.x=(rand()%30)*len+lm;
food.y=(rand()%30)*len+lm;
}
while(foodinsnake());
loadimage(&img,"3.jpg");
putimage(food.x-lm,food.y-lm,&img);
isfood=0;
}
voidkmusic()
{
if(ismusic==0)
mciSendString("pausemymusic",NULL,0,NULL);
if(ismusic==1)
mciSendString("resumemymusic",NULL,0,NULL);
}
voidplaybkmusic()/*播放背景音乐函数*/
{
mciSendString("open超级玛丽.mp3aliasmymusic",NULL,0,NULL);
mciSendString("playmymusicrepeat",NULL,0,NULL);
}
voidplaygame()/*玩游戏函数*/
{
c='d';//蛇开始向右移动
isover=0;
7
snakelen=Min_snakelen;
dir='d';
IMAGEimg;
MyTimert;//定义精确延时对象
intT=200;//延长时间
drawmap();//画游戏地图
init();//画小蛇初始位置
while(!
isover)
{
if(ispause)
{
snakemove();
FlushBatchDraw();//批量绘图
EndBatchDraw();//结束批量绘图
if(snake[0].x==food.x&&snake[0].y==food.y){
snakelen++;
isfood=1;
}
if(isfood)
showfood();
if(snakelen<35)
T=200-3*snakelen;
t.Sleep(T);
BeginBatchDraw();//开始批量绘图模式,防止闪烁问题
drawmap();
loadimage(&img,"3.jpg");//加载食物图片
putimage(food.x-lm,food.y-lm,&img);
};
//按键控制
if(kbhit())
c=getch();
switch(c){
case'a':
if(dir!
='d'){
dir=c;
}break;
case'd':
if(dir!
='a'){
dir=c;
}break;
case'w':
if(dir!
='s'){
8
dir=c;
}break;
case's':
if(dir!
='w'){
dir=c;
}break;
case27:
exit(0);break;//游戏退出
case'p':
ispause=0;break;//p暂停
case'o':
ispause=1;break;//o继续游戏
case'l':
ismusic=0;break;//l暂停音乐
case'k':
ismusic=1;break;//k继续播放
default:
break;
}
kmusic();//音乐控制播放
//判断游戏结束
if(ceshiover())
isover=1;
//判断是否重新再来
HWNDwnd=GetHWnd();//获取窗口句柄
if(isover)
if(MessageBox(wnd,"游戏结束。
\n重来一局吗,","询问",MB_YESNO|
MB_ICONQUESTION)==IDYES)
playgame();//递归判断出口
}
EndBatchDraw();//结束批量绘图模式}
voidgameover()//游戏结束函数
{
IMAGEimg;
loadimage(&img,"结束.jpg");
putimage(0,0,&img);
setcolor(BLUE);
setfont(30,0,"宋体");
settextcolor(YELLOW);
outtextxy(280,100,"125042120郭栋");
outtextxy(320,150,"感谢您玩,谢谢");
Sleep(2000);
}
9
voidgamebegin()//游戏开始函数
{
MOUSEMSGm;
IMAGEimg,img2;
mciSendString("openbk.mp3aliasmymusic",NULL,0,NULL);//打开音乐
mciSendString("playmymusic",NULL,0,NULL);//播放音乐
loadimage(NULL,"开始.jpg");
putimage(0,0,&img);
getimage(&img2,260,250,211,71);
settextcolor(BLUE);
setfont(70,0,"宋体");
setbkmode(TRANSPARENT);//设置字体背景为透明
outtextxy(260,100,"贪吃蛇");
RECTr={260,250,470,320};
setfont(40,0,"黑体");
setcolor(YELLOW);
drawtext("开始游戏",&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
while
(1)
{
m=GetMouseMsg();//获取鼠标消息
switch(m.uMsg)
{
caseWM_MOUSEMOVE:
//鼠标移动
if(m.x>260&&m.x<470&&m.y>250&&m.y<320){
setfillcolor(RED);
fillrectangle(260,250,470,320);
drawtext("开始游戏",&r,DT_CENTER|DT_VCENTER|
DT_SINGLELINE);
}
else{
putimage(260,250,&img2);
setcolor(YELLOW);
drawtext("开始游戏",&r,DT_CENTER|DT_VCENTER|
DT_SINGLELINE);
}break;
caseWM_LBUTTONDOWN:
//鼠标左键按下
if(m.x>260&&m.x<470&&m.y>250&&m.y<320){
mciSendString("closemymusic",NULL,0,NULL);//关闭音乐
playbkmusic();
cleardevice();
playgame();
10
}break;
default:
break;
}
if(isover==1)
break;
}
}
voidmain()
{
initgraph(initlen+160,initlen);
HWNDhWnd=GetHWnd();
SetWindowText(hWnd,"贪吃蛇游戏-郭栋");
gamebegin();
gameover();
getch();
closegraph();
}
11