C++贪吃蛇说明Word下载.docx
- 文档编号:5585821
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:32
- 大小:70.26KB
C++贪吃蛇说明Word下载.docx
《C++贪吃蛇说明Word下载.docx》由会员分享,可在线阅读,更多相关《C++贪吃蛇说明Word下载.docx(32页珍藏版)》请在冰点文库上搜索。
另外,每次产生的障碍形状不同。
6.如果在难度等级对应的时间内没有吃掉奖励食物,食物消失,障碍也会消失。
7.按空格键可以控制暂停与开始,按ESC键退出游戏。
8.游戏有排行榜功能,当得分不为0时,玩家的姓名将被记录到排行榜中;
进行双人游戏时,胜利玩家的姓名将被记录到排行榜中。
9.游戏开始以及蛇吃到食物,蛇死亡时,都有不同的音效。
10.兼容性:
代码大概620行,在WINDOWS7&
&
VC++6.0环境下编译通过。
生成的EXE游戏文件在WINDOWS7||WINDOWXP环境下都能运行。
4、设计思路:
1.程序总体结构
贪吃蛇的关键算法为:
先调用画图函数画出地图以及蛇的身体,将蛇的每一步移动当成一次循环来处理,判断是否吃到食物或者撞到障碍等问题,如果撞到障碍,则游戏结束;
如果不撞到障碍,则进行下一次循环。
其主流程如图2所示。
图2贪吃蛇的流程图
2.界面设计
贪吃蛇的界面如图3所示,具体设计如下:
(1)地图背景采用黑色,蛇的可移动范围为绿色方框部分,地图边框为蓝色图形部分。
(2)地图左右两边用绿色字体,调用newscore(inti)函数分别输出两个玩家的得分情况。
(3)两条蛇分别用不同颜色输出。
普通食物以紫色星星输出;
奖励食物以白色星星输出,障碍以红色图形输出。
(5)当游戏结束时,在地图下方输出胜利者以及排行榜信息。
图3贪吃蛇V1.00的外观
3.重要数据的数据结构设计
贪吃蛇的主体程序为蛇的移动,主要用到了循环算法。
由于TC中的gotoxy(intx,inty)函数到VC或者其它编译器中用不了了,这样一来如果想在控制台程序中进行简单的屏幕输出控制就不好办了。
所以为了实现在VC++6.0中颜色字体的输出以及清屏,光标位置控制等功能,必须在头文件中包括”pcc32.h”“common.h””jkey32.h”等文件。
利用上述同文件中的接口函数,便能够在WIN32控制台程序中实现TC中才能实现的屏幕控制以及键盘控制等功能。
另外,在设计游戏排行榜的过程中,运用了C文件调用以及重新保存技术。
5、函数清单:
贪吃蛇V1.00程序采用了结构化程序设计的思想,由8个.h文件,1个.cpp文件,2个普通文件,2个.a静态库文件和4个.wav组成.其中包含11个自编函数,函数名及功能如下:
/*注:
由于游戏功能强大,以下函数仅为主要函数,一些用于控制细节的函数,如Playsound()等将不予以一一列出,详见源代码*/
1.Charmenu();
/*用于输入玩家选择的游戏速度,返回一个char值*/
2.Charmenudouble();
/*用于输入玩家选择的游戏人数,返回一个chare值*/
3.DELAY(charch1);
/*用于控制游戏速度*/
4.Voidmain();
/*主函数,用于控制游戏*/
5.voiddrawmap();
/*绘制游戏地图函数*
6.voiddrawfood(charch);
/*绘制普通食物函数*/
7.voidsnake_move();
/*蛇的移动函数*/
8.voiddrawsnake(inti);
/*绘制蛇身函数*/
9.voidnewscore(inti);
/*更新玩家得分函数*/
10.voiddrawrw_food(charch);
/*绘制奖励食物函数*/
11.voiddrawstone(charch);
/*绘制障碍函数*/
贪吃蛇包含的文件有:
common.h,pcc32.h,jkey32.h,libpcc32.a,libjkey32.a,finalsnake.cpp,片头.wav,超级马里奥兄弟死掉音.wav,食物.wav,奖励食物.wav。
源代码如下:
#include<
stdio.h>
#include<
stdlib.h>
time.h>
string.h>
#include"
pcc32.h"
mmsystem.h"
jkey32.h"
#pragmacomment(lib,"
winmm.lib"
)
#pragmacomment(lib,"
libpcc32.a"
libjkey32.a"
)
#defineDIR_UP1
#defineDIR_DOWN2
#defineDIR_LEFT3
#defineDIR_RIGHT4
voiddrawmap();
voiddrawfood(charch);
voidsnake_move();
voiddrawsnake(inti);
voidnewscore(inti);
voiddrawrw_food(charch);
voiddrawstone(charch);
structpoint//结构体坐标
{
intx;
inty;
}snake[2][80],food,rw_food,stone[4];
structrank//排行榜
charname[20];
intpoint;
}player[80];
clock_tbegin_time,end_time;
intcount=0;
//记录吃掉普通食物的次数
intnum=0;
intgamespeed=50;
intnofood=1;
intnopause=0;
intnorw_food=1;
intrwtime;
intsnake_dir[2]={DIR_RIGHT,DIR_RIGHT};
intsnake_life[2]={1,1};
intsnake_len[2]={3,3};
//蛇的初始节数都为3
inthx[2],hy[2];
//蛇头坐标
intscore[2]={0,0};
//得分为零
charmenu()
charch1;
setTextColor
(2);
gotoTextPos(24/2,16/2);
PlaySound("
d:
\\片头.wav"
NULL,SND_ASYNC|SND_NODEFAULT);
//SND_ASYNC用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_NODEFAULT不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。
printf("
\t\tPleasechoosethegamespeed:
\n"
);
\t\t\t1-Fast2-Normal3-Slow\n"
\n\t\t\tPleasePressThenumbers..\n"
do//确保输入的为规定情况之一
{ch1=getch();
}
while(ch1!
='
1'
ch1!
2'
3'
\t\t\tYouhavechoosedthespeed%c!
"
ch1);
\n\n\t\t\tPressAnykeytocontinue!
if(jkGetKey())
{
system("
cls"
//清空屏幕#include<
return(ch1);
//返回一个选择的速度
}
charmenudouble()
charch2;
setTextColor(6);
\t\tPleasechoosethegamemode:
\t\t\t1-1player\n"
\t\t\t2-2players\n"
do
ch2=getch();
}while(ch2!
ch2!
\t\t\tYouhavechoosedthemode%c!
ch2);
\n\n\t\t\tPressAnykeytostart!
return(ch2);
voidDELAY(charch1)
if(ch1=='
delayMS(gamespeed);
}
elseif(ch1=='
delayMS(gamespeed);
else
voidmain()
FILE*fp,*p1;
inti,j,n,k;
inttemp_point;
chartemp_name[20];
贪吃蛇--Byqiyingshuai\n"
zhuandian09-01-15\n"
setCursorVisible(0);
setConsoleTitle("
贪吃蛇—qiyingshuai\n"
//标题
ch1=menu();
ch2=menudouble();
drawmap();
switch(ch1)
case'
:
rwtime=2500;
break;
rwtime=3000;
rwtime=3500;
for(i=0;
i<
(ch2-48);
i++)
newscore(i);
i++)//画出蛇的最初形态
{setTextColor(15);
gotoTextPos(30,5+i*9);
+"
gotoTextPos(30+2,5+i*9);
setTextColor(3+i*2);
printf("
■"
setTextColor(4+i*2);
gotoTextPos(30+4,5+i*9);
◆"
i++)//定位蛇每节身体的初始坐标
{
for(j=0;
j<
snake_len[i];
j++)
{
snake[i][j].x=34-j*2;
snake[i][j].y=5+i*9;
}
hx[i]=snake[i][0].x;
//蛇头初始坐标
hy[i]=snake[i][0].y;
while(snake_life[0]&
snake_life[1])//开始游戏
if(nopause)
DELAY(ch1);
//赋予游戏速度
delayMS(80-snake_len[0]*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_time<
=clock()&
norw_food==0)//在难度等级对应的时间内没有吃掉奖励食物,食物消失
{
gotoTextPos(rw_food.x,rw_food.y);
setTextColor
(2);
□"
for(i=0;
4;
{
gotoTextPos(stone[i].x,stone[i].y);
}
for(j=0;
j++)//石头坐标清零。
stone[j].x=0;
stone[j].y=0;
rw_food.x=0;
//奖励食物坐标清零
rw_food.y=0;
begin_time=0;
end_time=0;
norw_food=1;
}
for(i=0;
i++)
drawsnake(i);
if(snake_life[1]==0&
snake_life[0]==0)
gotod;
i++)//如果有其中一只蛇死亡,结束游戏
if(snake_life[i]==0)
gotoc;
if(jkHasKey())
switch(jkGetKey())
caseJK_SPACE:
nopause=!
nopause;
break;
caseJK_ESC:
snake_life[1]=0;
snake_life[0]=0;
score[0]=0;
score[1]=0;
gotod;
default:
c:
\\超级马里奥兄弟死掉音.wav"
setTextColor(14);
gotoTextPos(25,20);
if(ch2=='
Gameover!
elseif(ch2=='
if(snake_life[0]==0&
snake_life[1]!
=0)
player2win!
elseif(snake_life[1]==0&
snake_life[0]!
player1win!
else
/n"
getch();
if(score[0]!
=0||score[1]!
=0)//当有其中一个玩家的分数不为零,记录排行榜
if((fp=fopen("
player_rank"
"
rb"
))==NULL)//打开排行榜文件
fileopenerror"
exit(0);
if((p1=fopen("
num"
))==NULL)//打开排行榜玩家数量文件
n=fgetc(p1);
//调用排行榜玩家数到内存,赋值给n
for(j=0;
n;
j++)//调用排行榜玩家信息到内存
fread(&
player[j],sizeof(structrank),1,fp);
fclose(fp);
fclose(p1);
Pleaseintputthenameofplayer:
scanf("
%s"
player[n].name);
if(ch2=='
player[n].point=score[0];
else//双人游戏时,分数高的玩家姓名被记录到排行榜
if(score[0]>
=score[1])
player[n].point=score[0];
else
player[n].point=score[1];
n++;
//排行榜记录加1
for(i=0;
n-1;
i++)//按照得分进行从大到小排序
k=i;
for(j=i+1;
if(player[j].point>
player[k].point)
k=j;
temp_point=player[k].point;
player[k].point=player[i].point;
player[i].point=temp_point;
strcpy(temp_name,player[k].name);
strcpy(player[k].name,player[i].name);
strcpy(player[i].name,temp_name);
gotoTextPos(25,21);
player'
snamescore"
i++)//输出排行榜
gotoTextPos(25,21+i+1);
%-15s%4d\n"
player[i].name,player[i].point);
if((fp=fopen("
wb"
j++)//将排行榜玩家信息重新写入文件
fwrite(&
fputc(n,p1);
fclose(fp);
voiddrawmap()
intj,i;
16;
gotoTextPos(16,3+i);
24;
printf("
setTextColor(9);
26;
j++)//输出上边
gotoTextPos(14+j*2,2);
¤
18;
i++)//输出左边
{gotoTextPos(14,2+i);
i++)//输出右边
gotoTextPos(14+25*2,2+i);
j++)//输出下边
gotoTextPos(14+j*2,2+17);
voidsnake_move()
caseJK_UP:
if(snake_dir[0]!
=DIR_DOWN)
snake_dir[0]=DIR_UP;
w'
if(snake_dir[1]!
snake_dir[1]=DIR_UP;
break;
caseJK_DOWN:
if(snake_dir[0]!
=DIR_UP)
snake_dir[0]=DIR_DOWN;
case'
s'
if(snake_dir[1]!
snake_dir[1]=DIR_DOWN;
break;
caseJK_L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 贪吃 说明