VC贪蛇吃游戏c语言程序设计报告方案.docx
《VC贪蛇吃游戏c语言程序设计报告方案.docx》由会员分享,可在线阅读,更多相关《VC贪蛇吃游戏c语言程序设计报告方案.docx(29页珍藏版)》请在冰豆网上搜索。
VC贪蛇吃游戏c语言程序设计报告方案
C语言课程设计报告
1、设计任务书
1.1题目与要求
本人计划编写一个贪吃蛇游戏,让同学们在无聊之际可以玩一会游戏放松一下-.-此游戏不会像英雄联盟那样容易上瘾,是学习紧张,生活紧张时的良好选择。
具体要求如下:
1.开始动画;
2.游戏规则的说明;
3.游戏开始与结束的选择;
4.游戏难度的选择;
5.游戏得分的实时显示;
6.游戏失败时的提示与显示分数;
1.2本系统涉及的知识点
for循环,while循环,一维,二维数组,if-else,if语句,结构体,函数调用,windows.h库,conio.h的一些使用等;
2、功能设计
2.1算法设计
本游戏需要实现的功能和要求:
1.在最开始选择游戏开始的时候:
gui();规则函数会在屏幕的右侧显示游戏的规则和一些说明提示。
dong();动画函数会运行,屏幕的左侧会出现一个游戏开始的动画。
即main()函数的运行过程如图1所示:
gui()函数
dong()函数
kai()函数
图1.main函数
2.Kai()(游戏开始与结束)函数利用if-else语句设计如图2所示的主菜单
请输入选择编号(1-2)
1----开始游戏
2----结束游戏
图2.游戏开始
3.选择1后,调用游戏难度选择函数,进入函数后是一个if-else-if语句实现的一个如图3所示的
请选择游戏困难程度:
1.简单模式
2.一般模式
3.困难模式
图3.难度选择
根据你所选的123游戏难度函数会返回相应的数,设置的有一个难度数组,里面有每个难度对应的反应时间。
4.选择完难度系数后,会自动的进入到youxi(intxx,intbei)函数,此函数是游戏的主要核心。
在youxi函数中,游戏已准备就绪,前几个蛇身和一个食物已经出现,
我们可以进行入下功能:
操作游戏
游戏暂停
游戏退出
2.2部分模块流程图
游
戏
结
束
开始
游戏
3、程序代码设计
3.1规则模块与动画模块
1)函数原型:
voidgui();voiddong();
2)功能:
利用for循环语句和printf,COORD,Sleep()函数完成光标的移动和游戏规则的输出。
3)变量及类型:
COORDcoord;定义坐标结构体,通过它来移动光标的坐标。
intx,y,R,i;定义x,y两个变量,用来传递坐标的位置。
R为游戏高度。
i为光标与边界距离。
4)说明:
gui();通过for循环与光标的移动输出分割线,然后再通过光标的移动输出游戏规则;dong();通过for循环和i,x,y的变化和Sleep()的停顿效果,改变光标的位置,从外围到内部逐次输出,达到动画的效果。
3.2游戏开始与结束选择模块和游戏难度选择模块
1)函数原型:
intkai();intxuan();
2)功能:
利用for循环语句和printf,COORD函数完成对游戏屏幕左侧的清空,然后利用printf,scanf函数输出游戏的选择类型和输入玩家的选择。
3)变量及类型:
COORDcoord;定义坐标结构体,通过它来移动光标的坐标。
intx,y,lp,xx;定义x,y两个变量,用来传递坐标的位置;lp里存入玩家的选择,是kai()函数的返回值;xx是xuan()函数的返回值。
4)说明:
通过for循环和光标的移动,输出空格使屏幕为空,然后printf函数输出提示语,scanf函数让玩家输入他的选择,最后返回玩家的选择。
3.3游戏主体模块
1)函数原型:
intyouxi(intxx,intbei);
2)功能:
利用for循环语句,while循环语句,if-else,if语句,break语句,结构体,一维,二维数组,printf,rand,kbhit,getch,COORD函数,完成整个游戏运行的功能。
3)变量及类型:
structnode{
intx,y;}shen[1000];定义贪吃蛇的每个身体坐标。
COORDcoord;定义坐标结构体,通过它来移动光标的坐标。
charmap[60][30];定义游戏地图。
charxiang[4]={'w','a','s','d'};存放贪吃蛇的方向。
intx,y,i,R=50,D=24,ll=0,fen=0,p,wu=0,wux,wuy,fafe=0;定义多个变量,x,y用来传递坐标的位置;i为变量;R,D用来代表游戏右边界和下边界;ll表示贪吃蛇的长度;fen记录贪吃蛇所吃的食物;p记录贪吃蛇的方向;wux,wuy通过rand函数随机得到食物的位置;wu表示食物的状态,fafe表示游戏的状态。
4)说明:
先通过for循环和光标的移动和printf清空游戏界面和设置边界,然后通过rand()函数得到第一个贪吃蛇身体和它的方向;for循环,增加贪吃蛇的3个身体;然后rand()使随机出现一个食物,一个while循环+Sleep的停顿效果使游戏暂停,printf输出提示语,kbhit和getch判断是否有键盘输入和得到键盘输入值,跳出while进入游戏操作while循环中,通过printf输出没时刻的分数,通过Sleep,结构体,for,printf使贪吃蛇每隔一段时间向前移动一下。
kbhit和getch判断是否有游戏玩家的方向操作并得到方向值,如果输入空格游戏会暂停,然后可以选择游戏继续或退出。
食物被贪吃蛇所吃会再次随机出现一个食物,while循环一直循环直至游戏失败或游戏退出返回游戏得分。
3.4游戏失败提示模块
1)函数原型:
voidjiesu();
2)功能:
利用for循环语句和printf,COORD函数完成对游戏屏幕左侧中间位置的清空,然后利用printf,scanf函数输出游戏失败提示语。
3)变量及类型:
COORDcoord;定义坐标结构体,通过它来移动光标的坐标。
intx,y,i,j;定义x,y两个变量,用来传递坐标的位置;i,j为循环变量。
4)说明:
通过for循环和光标的移动,输出空格使屏幕为空,然后printf函数输出提示语。
3.5游戏代码及其相应注释
#include
#include
#include
#include
#include
#include
#include
#defineCXcoord.X=x
#defineCYcoord.Y=y
#defineSCPSetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord)//宏定义-.-
structnode{
intx,y;
}shen[1000];
voiddong();
voidgui();
intkai();
intyouxi();
intxuan();
voidjiesu();
intmain()
{
COORDcoord;
intx,y,xx,lp,kp,nan[4]={300,400,200,100};
system("color74");/*设置颜色*/
gui();/*显示规则*/
dong();/*显示动画*/
while
(1)
{
lp=kai();/*选择是否开始游戏*/
if(lp==2)
{
printf("\n\n\n谢谢来玩贪吃蛇!
!
\n欢迎下次再玩-.-\n");
return0;
}
xx=xuan();/*选择游戏难度*/
kp=youxi(nan[xx],xx);/*进入游戏,得到分数*/
x=51;y=14;
CX;CY;SCP;
printf("");/*消游戏中显示的得分...*/
if(kp==-1)
{
x=51;y=12;
CX;CY;SCP;
printf("游戏中退出-.-请重新选择...");
}
else
{
x=51;y=12;
CX;CY;SCP;
printf("本次游戏得分为:
%d",kp*10*xx);
}
}
Sleep(100000);/*暂停一段时间*/
return0;
}
intxuan()/*游戏难度选择模块*/
{
COORDcoord;
intx,y,xx;
for(x=0;x<50;x++)
for(y=0;y<24;y++)
{
CX;CY;SCP;
printf("");/*消去左边屏幕*/
}
x=0;y=0;CX;CY;SCP;
printf("请选择游戏困难程度:
\n");
printf("1.简单模式\n");
printf("2.一般模式\n");
printf("3.困难模式\n");
scanf("%d",&xx);
returnxx;
}
voiddong()/*动画模块*/
{
COORDcoord;
intx=20,y=11,i,R=24;
CX;CY;SCP;/*改变光标位置。
。
*/
printf("贪吃蛇!
");
for(i=0;i<10;i++)
{
x=i;
for(y=x;y{
coord.X=x*2;
coord.Y=y;
SCP;
printf("0");
}
x=(23-i);
for(y=i;y<=x;y++)
{
coord.X=x*2;
coord.Y=y;
SCP;
printf("0");
}
x=i;
for(y=x;y{
coord.Y=x;
coord.X=y*2;
SCP;
printf("0");
}
x=(23-i);
for(y=i;y<=x;y++)
{
coord.Y=x;
coord.X=y*2;
SCP;
printf("0");
}
Sleep(100);
}
return;
}
voidgui()/*规则模块*/
{
COORDcoord;
intx=50,y;
for(y=0;y<26;y++)
{
CX;CY;SCP;
printf("|");
}
x=52;y=0;
CX;CY;
SCP;
printf("游戏规则:
");
x=52;y=2;
CX;CY;SCP;
printf("1.wasd键控制贪吃蛇的方");
y=3;CX;CY;SCP;
printf("向.");
x=52;y=4;
CX;CY;SCP;
printf("2.当贪吃蛇碰到结界或自身会");
y=5;CX;CY;SCP;
printf("死亡.");
x=52;y=6;
CX;CY;SCP;
printf("3.游戏中间按空格键会暂停.");
x=52;y=8;
CX;CY;SCP;
printf("4.游戏暂停后,按'1'键游戏继");
y=9;CX;CY;SCP;
printf("续,按'0'键会回到刚开始游戏");
y=10;CX;CY;SCP;
printf("时的选择界面.");
}
intkai()/*游戏开始与结束选择模块*/
{
COORDcoord;
intx,y,lp;
for(x=0;x<50;x++)
for(y=0;y<24;y++)
{
CX;CY;SCP;
printf("");
}
x=0;y=0;CX;CY;SCP;
printf("1.游戏开始\n");
printf("2.游戏结束\n");
printf("请选择:
");
scanf("%d",&lp);
returnlp;
}
intyouxi(intxx,intbei)/*游戏主体模块*/
{
COORDcoord;charmap[60][30];/*地图*/
charxiang[4]={'w','a','s','d'};/*方向*/
intx,y,i,R=50,D=24,ll=0,fen=0,p,wu=0,wux,wuy,fafe=0;
/*fafe用1和0模拟bool类型,,,R是右边界D是下边界..*/
charzhiling,kp;
for(x=0;x<60;x++)
for(y=0;y<30;y++)
map[x][y]='';/*地图初始化*/
for(x=0;x<50;x++)
for(y=0;y<25;y++)
{
CX;CY;SCP;
printf("");
}
y=24;/*蛇x为0-49,,y为0-23;*/
for(x=0;x<50;x++)
{
CX;CY;SCP;
printf("=");/*下边界*/
}
shen[ll].x=rand()%8+20;
shen[ll++].y=rand()%6+10;
x=shen[ll-1].x;y=shen[ll-1].y;
CX;CY;SCP;
map[x][y]='+';
printf("+");/*蛇头*/
p=rand()%4;/*初始方向*/
if(xiang[p]=='w')
{
for(i=0;i<3;i++)/*增加三个蛇身*/
{
shen[ll].x=shen[ll-1].x;
shen[ll].y=shen[ll-1].y-1;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
CX;CY;SCP;map[x][y]='+';
printf("+");
}
}
elseif(xiang[p]=='a')
{
for(i=0;i<3;i++)
{
shen[ll].x=shen[ll-1].x-1;
shen[ll].y=shen[ll-1].y;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
CX;CY;SCP;map[x][y]='+';
printf("+");
}
}
elseif(xiang[p]=='s')
{
for(i=0;i<3;i++)
{
shen[ll].x=shen[ll-1].x;
shen[ll].y=shen[ll-1].y+1;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
CX;CY;SCP;map[x][y]='+';
printf("+");
}
}
elseif(xiang[p]=='d')
{
for(i=0;i<3;i++)
{
shen[ll].x=shen[ll-1].x+1;
shen[ll].y=shen[ll-1].y;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
CX;CY;SCP;map[x][y]='+';
printf("+");
}
}
while
(1)
{
wux=rand()%R;
wuy=rand()%D;
if(map[wux][wuy]!
='+')
{
x=wux;y=wuy;
CX;CY;SCP;map[x][y]='#';
printf("#");
break;
}
}
while
(1)
{
x=51;y=12;
CX;CY;SCP;
printf("按任意方向键开始游戏...");
if(kbhit())/*kbhit函数判断是否有键盘输入*/
{
kp=getch();/*得到键盘输入*/
if(kp=='w'||kp=='a'||kp=='s'||kp=='d')
{
x=51;y=12;
CX;CY;SCP;
printf("");/*消提示语*/
break;
}
}
Sleep(100);
}
while
(1)
{
x=51;y=14;
CX;CY;SCP;
printf("得分:
%d",fen*10*bei);
if(kbhit())/*判断是否有键盘输入*/
zhiling=getch();/*得到键盘输入*/
if(zhiling!
=xiang[p])
{
if(p<2&&zhiling!
=xiang[p+2]||p>1&&zhiling!
=xiang[p-2])/*判断方向不反向,不然会直接死亡。
。
。
*/
{
if(zhiling=='w')
p=0;
elseif(zhiling=='a')
p=1;
elseif(zhiling=='s')
p=2;
elseif(zhiling=='d')
p=3;
elseif(zhiling=='')/*暂停*/
{
zhiling='1';/*改变一下-.-不然一直暂停...*/
while
(1)
{
if(kbhit())/*判断是否有键盘输入*/
{
kp=getch();/*得到键盘输入*/
if(kp=='1')
break;
elseif(kp=='0')
{
return-1;
}
}
Sleep(100);
}
}
}
}
if(xiang[p]=='w')
{
shen[ll].x=shen[ll-1].x;
shen[ll].y=shen[ll-1].y-1;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
if(x==-1||x==R||y==-1||y==D||map[x][y]=='+')/*贪吃蛇死亡,游戏失败*/
{
fafe=1;
break;
}
if(map[x][y]=='#')/*食物被吃,增加分数,食物状态改变*/
{
fen++;
wu=1;
}
CX;CY;SCP;map[x][y]='+';
printf("+");
if(!
wu)/*蛇身向前一位-.-并消去最后一个*/
{
x=shen[0].x;y=shen[0].y;
CX;CY;SCP;map[x][y]='';
printf("");
for(i=0;ishen[i]=shen[i+1];
ll--;
}
}
elseif(xiang[p]=='a')
{
shen[ll].x=shen[ll-1].x-1;
shen[ll].y=shen[ll-1].y;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
if(x==-1||x==R||y==-1||y==D||map[x][y]=='+')
{
fafe=1;
break;
}
if(map[x][y]=='#')
{
fen++;
wu=1;
}
CX;CY;SCP;map[x][y]='+';
printf("+");
if(!
wu)
{
x=shen[0].x;y=shen[0].y;
CX;CY;SCP;map[x][y]='';
printf("");
for(i=0;ishen[i]=shen[i+1];
ll--;
}
}
elseif(xiang[p]=='s')
{
shen[ll].x=shen[ll-1].x;
shen[ll].y=shen[ll-1].y+1;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
if(x==-1||x==R||y==-1||y==D||map[x][y]=='+')
{
fafe=1;
break;
}
if(map[x][y]=='#')
{
fen++;
wu=1;
}
CX;CY;SCP;map[x][y]='+';
printf("+");
if(!
wu)
{
x=shen[0].x;y=shen[0].y;
CX;CY;SCP;map[x][y]='';
printf("");
for(i=0;ishen[i]=shen[i+1];
ll--;
}
}
elseif(xiang[p]=='d')
{
shen[ll].x=shen[ll-1].x+1;
shen[ll].y=shen[ll-1].y;
ll++;x=shen[ll-1].x;y=shen[ll-1].y;
if(x==-1||x==R||y==-1||y==D||map[x][y]=='+')
{
fafe=1;
break;
}
if(map[x][y]=='#')
{
fen++;
wu=1;
}
CX;CY;SCP;map[x][y]='+';
printf("+");
if(!
wu)
{
x=shen[0].x;y=shen[0]