C++贪吃蛇说明.docx
- 文档编号:2937111
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:32
- 大小:70.26KB
C++贪吃蛇说明.docx
《C++贪吃蛇说明.docx》由会员分享,可在线阅读,更多相关《C++贪吃蛇说明.docx(32页珍藏版)》请在冰点文库上搜索。
C++贪吃蛇说明
创作编号:
GB8878185555334563BT9125XW
创作者:
凤呜大王*
C语言课程设计报告
题目:
贪吃蛇
指导教师:
许盟
院系:
电气信息工程学院
班级:
01
姓名:
齐英帅
学号:
15
1、课程设计目的:
1.进一步掌握和利用C语言进行行程设计的能力;
2.进一步理解和运用结构化程序设计的思想和方法;
3.初步掌握开发一个小型实用系统的基本方法;
4.学会调试一个较长程序的基本方法;
5.学会利用流程图表示算法;
6.掌握书写程序设计开发文档的能力(书写课程设计报告)。
2、课程设计具体要求:
贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长。
只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。
和别的游戏不同,贪食蛇是一个悲剧性的游戏。
许多电子游戏都是打通关到底,游戏操作者以胜利而告终。
而贪食蛇的结局却是死亡。
“贪食蛇”,要命的就在一个“贪”字上。
所以,有时候真的需要及时收手,不要逼人太甚。
如果没有余地,就算你的手再快,面临的结局也是——崩盘。
3、程序功能:
我设计的贪吃蛇V1.00主要具有以下功能
1.每吃到一个普通食物,蛇的身体增长一节,玩家的分数加1。
同时,蛇移动的速度也会随之加快。
2.可以选择FASTNOMALSLOW三个速度等级。
3.可以选择单人游戏或者双人游戏,选择双人游戏时,按方向键控制Player1,按WASD控制Player2.首先撞死的蛇为败者。
4.每吃掉3个普通食物,将产生一个奖励食物,如果吃掉奖励食物,玩家的分数加1,但是蛇的身体不增长。
5.每吃掉3个普通食物,同时将产生一个障碍,如果吃掉奖励食物,障碍也将随之消失。
另外,每次产生的障碍形状不同。
6.如果在难度等级对应的时间内没有吃掉奖励食物,食物消失,障碍也会消失。
7.按空格键可以控制暂停与开始,按ESC键退出游戏。
8.游戏有排行榜功能,当得分不为0时,玩家的姓名将被记录到排行榜中;进行双人游戏时,胜利玩家的姓名将被记录到排行榜中。
9.游戏开始以及蛇吃到食物,蛇死亡时,都有不同的音效。
创作编号:
GB8878185555334563BT9125XW
创作者:
凤呜大王*
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
#include
#include
#include
#include
#include"pcc32.h"
#include"mmsystem.h"
#include"jkey32.h"
#pragmacomment(lib,"winmm.lib")
#pragmacomment(lib,"libpcc32.a")
#pragmacomment(lib,"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//结构体坐标
{
创作编号:
GB8878185555334563BT9125XW
创作者:
凤呜大王*
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");
printf("\t\t\t1-Fast2-Normal3-Slow\n");
printf("\n\t\t\tPleasePressThenumbers..\n");
do//确保输入的为规定情况之一
{ch1=getch();}
while(ch1!
='1'&&ch1!
='2'&&ch1!
='3');
printf("\t\t\tYouhavechoosedthespeed%c!
",ch1);
printf("\n\n\t\t\tPressAnykeytocontinue!
");
if(jkGetKey())
{
system("cls");//清空屏幕#include
return(ch1);//返回一个选择的速度
}
}
charmenudouble()
{
charch2;
setTextColor(6);
gotoTextPos(24/2,16/2);
PlaySound("d:
\\片头.wav",NULL,SND_ASYNC|SND_NODEFAULT);
printf("\t\tPleasechoosethegamemode:
\n");
printf("\t\t\t1-1player\n");
printf("\t\t\t2-2players\n");
printf("\n\t\t\tPleasePressThenumbers..\n");
do
{
ch2=getch();
}while(ch2!
='1'&&ch2!
='2');
printf("\t\t\tYouhavechoosedthemode%c!
",ch2);
printf("\n\n\t\t\tPressAnykeytostart!
");
if(jkGetKey())
{
system("cls");
return(ch2);
}
}
voidDELAY(charch1)
{
if(ch1=='1')
{
delayMS(gamespeed);
}
elseif(ch1=='2')
{
delayMS(gamespeed);
delayMS(gamespeed);
创作编号:
GB8878185555334563BT9125XW
创作者:
凤呜大王*
}
else
{
delayMS(gamespeed);
delayMS(gamespeed);
delayMS(gamespeed);
delayMS(gamespeed);
}
}
voidmain()
{
FILE*fp,*p1;
charch1;
charch2;
inti,j,n,k;
inttemp_point;
chartemp_name[20];
printf("贪吃蛇--Byqiyingshuai\n");
printf("zhuandian09-01-15\n");
setCursorVisible(0);
setConsoleTitle("贪吃蛇—qiyingshuai\n");//标题
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);
printf("+");
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[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); printf("□"); for(i=0;i<4;i++) { gotoTextPos(stone[i].x,stone[i].y); printf("□"); } for(j=0;j<4;j++)//石头坐标清零。 创作编号: GB8878185555334563BT9125XW 创作者: 凤呜大王* { 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<(ch2-48);i++) drawsnake(i); if(snake_life[1]==0&&snake_life[0]==0) gotod; for(i=0;i<(ch2-48);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;break; default: break; } } } c: PlaySound("d: \\超级马里奥兄弟死掉音.wav",NULL,SND_ASYNC|SND_NODEFAULT); d: setTextColor(14); gotoTextPos(25,20); if(ch2=='1') printf("Gameover! "); elseif(ch2=='2') { if(snake_life[0]==0&&snake_life[1]! =0) printf("player2win! "); elseif(snake_life[1]==0&&snake_life[0]! =0) printf("player1win! "); else printf("Gameover! /n"); } getch(); if(score[0]! =0||score[1]! =0)//当有其中一个玩家的分数不为零,记录排行榜 { if((fp=fopen("player_rank","rb"))==NULL)//打开排行榜文件 { printf("fileopenerror"); exit(0); } if((p1=fopen("num","rb"))==NULL)//打开排行榜玩家数量文件 { printf("fileopenerror"); exit(0); } n=fgetc(p1);//调用排行榜玩家数到内存,赋值给n for(j=0;j fread(&player[j],sizeof(structrank),1,fp); fclose(fp); fclose(p1); printf("Pleaseintputthenameofplayer: "); scanf("%s",player[n].name); if(ch2=='1') 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;i { k=i; for(j=i+1;j 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); printf("player'snamescore"); 创作编号: GB8878185555334563BT9125XW 创作者: 凤呜大王* printf("\n"); for(i=0;i { gotoTextPos(25,21+i+1); printf("%-15s%4d\n",player[i].name,player[i].point); } if((fp=fopen("player_rank","wb"))==NULL)//打开排行榜文件 { printf("fileopenerror"); exit(0); } if((p1=fopen("num","wb"))==NULL)//打开排行榜玩家数量文件 { printf("fileopenerror"); exit(0); } for(j=0;j fwrite(&player[j],sizeof(structrank),1,fp); fputc(n,p1); fclose(fp); fclose(p1); } getch(); } voiddrawmap() { intj,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("¤"); } 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("¤"); } } voidsnake_move() { if(jkHasKey()) { switch(jkGetKey()) { caseJK_UP: if(snake_dir[0]! =DIR_DOWN) snake_dir[0]=DIR_UP; break; case'w': if(snake_dir[1]! =DIR_DOWN) snake_dir[1]=DIR_UP; break; caseJK_DOWN: if(snake_dir[0]! =DIR_UP) snake_dir[0]=DIR_DOWN; break; case's': if(snake_dir[1]! =DIR_UP) snake_dir[1]=DIR_DOWN; break; caseJK_L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 贪吃 说明