基于c语言的喜庆丰收游戏结题作业.docx
- 文档编号:24243882
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:42
- 大小:71.75KB
基于c语言的喜庆丰收游戏结题作业.docx
《基于c语言的喜庆丰收游戏结题作业.docx》由会员分享,可在线阅读,更多相关《基于c语言的喜庆丰收游戏结题作业.docx(42页珍藏版)》请在冰豆网上搜索。
基于c语言的喜庆丰收游戏结题作业
喜庆丰收
1需求分析-------------------------------------3-6
1.1功能与数据要求--------------------------------3
1.1.1游戏功能介绍--------------------------------4
1.1.2游戏进行中的功能键--------------------------4
1.2界面需求-----------------------------------4-6
2概要设计---------------------------------------6-9
2.1主要数据结构----------------------------------7-8
2.2程序总体结构------------------------------------9
3详细设计---------------------------------------9-21
3.1函数调用说明-----------------------------------9
3.3局部函数详解---------------------------------9-21
4测试----------------------------------------21
4.1键盘鼠标测试--------------------------------21
4.2游戏数据测试---------------------------------21
4.3错误修改------------------------------------21
7源程序代码--------------------------------------23-37
1需求分析
游戏名称:
喜庆丰收,这是一款锻炼玩家反应能力的眼里的游戏,游戏中玩家通过控制上和左右键控制可爱的小猴子在地面上跳跃或者是平行移动来接取天空中飘落的水果。
接到不同的水果会得到不同的分数,桃子10分,西瓜20分,菠萝30分,接到炸弹扣40分,接不到水果也会扣10分,当扣分达到500游戏结束(扣分只计算没接到水果),当得分到达500会进入下一关,右侧会显示最高得分玩家的用户名和分数,游戏中可以点击暂停键,暂停,再次点击游戏开始,按空格键也可以暂停游戏,在按任意键开始,点击结束会关闭游戏,不保存游戏信息,正常游戏结束,会将游戏信息保存到c盘的根目录下。
1.1功能与数据需求
基本功能:
一、主界面
1.主界面分为三个区域:
游戏区、按钮区和信息显示区。
2.按钮区有游戏的主要菜单,“开始”、“暂停”、“结束”等需要的按钮。
扩展后的功能按钮也放在本区。
3.信息显示区显示游戏的状态,至少需要显示用户名、最高得分等信息。
二、游戏规则
4.游戏采用键盘控制.
5.当游戏开始时,需要添加新用户可以读取已经保存的用户。
6.选中开始按钮后回车游戏开始,小猴子可以移动接水果。
按空格可以暂停。
7.游戏可用键盘左右箭头控制小猴左右移动接水果。
8.水果有3种不同类型,不同水果下落的速度不同,得分不一样。
9.游戏也有炸弹下落,接到炸弹需要扣40分。
若有水果没接到需要扣10分,当总扣分达到一定分数(050分),游戏结束,记录用户得分。
10.从空中落下的水果或者炸弹垂直下落,或作不规则运动,但速度不同。
当接近画面底部时消失,被小猴接到也会消失。
11.每个用户及最高得分的信息,用户排行榜以文件的形式存储到本地。
扩展功能:
1.增加和美化界面元素,使游戏更具趣味性。
2.游戏可以调整水果下落的速度
3.小猴具有上下或者水平跳跃功能。
4.游戏增加了背景音乐
5.游戏增加了第二关,且第二关水果下落的方式变得摆动而不是竖直下落。
1.1.1游戏功能介绍
(1)通过VC6.0进入喜庆丰收游戏界面.或者进入release文件夹点击shuiguo.exe开始
(2)进入游戏界面后根据提示查看游戏控制信息并点击确认。
(3)显示排名前三名,根据提示输入相关的用户名和游戏的速度。
(4)只要总扣分不到达500,游戏可以无限进行。
(5)得分到达500可以进入第二关。
(6)游戏结束的情况是扣分到达500,如果被强制退出则不会保存用户信息。
1.1.2游戏进行中的功能键
鼠标左键:
游戏中可以随时点击暂停键暂停,再次点击开始。
根据提示输入信息后,点击开始按钮开始游戏,点击结束游戏结束。
键盘上下左右键:
上下左右键可以控制小猴的移动和跳起。
1.2开发与运行环境需求
开发环境:
VC6.0
运行环境:
WindowsXPWindows7
1.4其他方面需求
无。
2概要设计
再次点击暂停键
暂停键
退出键
否
是
是是
2.1主要数据结构
2.1.1结构体
控制水果属性的结构体
typedefstructtargets//-------------------控制水果属性的结构体
{
shorttype;//------------------------随机产生水果的种类
floatx;//-------------------坐标
floaty;
floatspeed;//-------------------下落的速度
structtargets*node;
}target;
用户名分数结构体
structscores//------------------------分数系统
{
intscore0;//------------------得分数
intscore1;//----------------------扣分数
intscore2;//---------------------最高的分数
charname[20];//-------------------用户信息
charname1[20];//-----------------最高姓名
}score;
猴子的属性结构体
struct_monkey//------------------猴子的属性
{
floatx;//----------------------坐标
floaty;
floatspeed;//------------------速度
}monkey;
生成水果属性链表
if((i%1000)<=30&&count<15)//-------------------------------生成水果链表赋随机值
{
point=head;
head=(targets*)malloc(sizeof(targets));
++count;
head->speed=speed;
head->type=(i%6);
head->x=(i%6000);
head->y=-10;
head->node=point;
}
2.1.2全局变量
1.intspeed
用于控制水果的下落速度
2.intguanshu
关数控制的变量
3.ints2
用来改变第二关时水果的摆动正负交替
4.intcount
用来计数当前铃铛的数量
2.2程序总体结构
2.2.1逻辑结构
2.2.2函数结构
voidprintmenu();
voidprintscore();
voidmonkeymove();
voidprintguanshu(int);
voidpaixu();
voidpaixu2();
3详细设计
3.1函数调用说明
voidprintmenu();用于显示开始暂停结束按钮
voidprintscore();用于显示分数
voidmonkeymove();用来控制猴子移动
voidprintguanshu(int);用来显示关数
voidpaixu();排分数
voidpaixu2();排名字
3.2局部函数详解
3.2.1Main函数
intmain()
{
MessageBox(NULL,"游戏通过键盘的左右键控制小猴左右移动,上键控制小猴的跳动,按住shift可以加速,点击确定后,输入用户名,后回车,点击开始按钮开始游戏,游戏中点击暂停键可以暂停游戏,移开鼠标后再次点击暂停键开始,点击结束键可以结束游戏","杨盼的游戏说明",MB_OK);//-------------------排名的部分
FILE*fp1;//--------------------记录玩家姓名成绩
FILE*fp;//--------------------------记录最高分
FILE*fp2;//--------------------记录玩家成绩
FILE*fp3;//--------------------记录玩家姓名
fp1=fopen("排名2.txt","a");
fp2=fopen("排名3.txt","a");
fp3=fopen("test.txt","a");
if((fp=fopen("排名.txt","r"))==NULL)//--------------------------判断排名文件不存在
{cout<<"当前不存在排名"< fp=fopen("排名.txt","w");//----------------------以只写的方式建立一个txt文件 paixu(); paixu2(); cout<<"请输入玩家的姓名: ";//----------------------------输入用户名并将用户名保存到txt cin>>score.name;//----------------------输入玩家的名字 score.score0=0;//----初始化 score.score1=0; score.score2=0; } else { score.score0=0; score.score1=0; fp=fopen("排名.txt","r+");//---------------------判断文件存在打开 fscanf(fp,"%s",&score.name1);//----------------------读取排名的名字为name1 fscanf(fp,"%d",&score.score2);//-----------------------读取排名的分数为score2 paixu(); paixu2(); cout<<"请输入玩家的姓名: "; cin>>score.name;//---------------------------当前玩家的名字为name } intspeed=10; cout<<"请输入水果的移动速度,要量力而行啊! 推荐值10-30: ";//-----------------------可以用户自行设定速度speed为结构体的speed赋值 cin>>speed; srand((unsignedint)time(NULL)); initgraph(750,480);//---------------------初始窗口大小 mciSendString("open明天的记忆.mp3aliasmymusic",NULL,0,NULL);//--------打开音乐 mciSendString("playmymusic",NULL,0,NULL);//--------------------------播放音乐 MOUSEMSGm,m1,m2; intguanshu=1;//------------------------------关卡全局变量 IMAGEimg_scoredel; loadimage(&img_scoredel,"targets\\scoredel.bmp"); IMAGEimg_xigua; loadimage(&img_xigua,"targets\\xigua.bmp"); IMAGEimg_taozi; loadimage(&img_taozi,"targets\\taozi.bmp"); IMAGEimg_boluo; loadimage(&img_boluo,"targets\\boluo.bmp"); HDCdstDC=GetImageHDC(); HDCsrcDC; IMAGEimg_zhadan; loadimage(&img_zhadan,"targets\\zhadan.bmp"); IMAGEimg; loadimage(&img,"targets\\monkey.bmp"); IMAGEimgbeijing; loadimage(&imgbeijing,"targets\\背景.jpg",640,480); IMAGEimgbeijing1; loadimage(&imgbeijing1,"targets\\背景1.jpg",640,480); printmenu(); putimage(0,0,&imgbeijing); BeginBatchDraw(); target*head=NULL,*point=NULL,*pre=NULL; intcount=0; inti=0; ints2=1; monkey.x=3200,monkey.speed=0,monkey.y=3800; while (1) { //-------------开始暂停结束控制部分 if(MouseHit())//------------------------判断是否按鼠标 { m=GetMouseMsg(); switch(m.uMsg) { caseWM_LBUTTONDOWN: //-------------------------鼠标左键 if(m.x>=670&&m.x<=720&&m.y>=0&&m.y<=50)//满足开始坐标--------开始 { while (1) { if(MouseHit())//------------------------判断是否按鼠标 { m1=GetMouseMsg(); switch(m1.uMsg) { caseWM_LBUTTONDOWN: if(m1.x>=670&&m1.x<=720&&m1.y>=60&&m1.y<=110)//满足暂停坐标进入死循环---------暂停 { while (1) { Sleep(20); m2=GetMouseMsg(); if(MouseHit())//---------------------判断再次点击跳出循环继续 { if(m2.uMsg==WM_LBUTTONDOWN&&m2.x>=670&&m2.x<=720&&m2.y>=60&&m2.y<=110) { break; } } } //system("pause"); }//break; //caseWM_RBUTTONDOWN: if(m1.x>=670&&m1.x<=720&&m1.y>=120&&m1.y<=170)//----------结束 { closegraph(); }break; } } i=rand(); if(guanshu==1){ putimage(0,0,&imgbeijing);//------------清屏 } else { putimage(0,0,&imgbeijing1);//------------清屏 } printscore(); monkeymove(); printguanshu(guanshu); srcDC=GetImageHDC(&img); TransparentBlt(dstDC,monkey.x/10,monkey.y/10,60,60,srcDC,0,0,60,60,RGB(0,0,0)); if((i%1000)<=30&&count<15)//-------------------------------生成水果链表赋随机值 { point=head; head=(targets*)malloc(sizeof(targets)); ++count; head->speed=speed; head->type=(i%6); head->x=(i%6000); head->y=-10; head->node=point; } for(pre=point=head;point! =NULL;pre=point,point=point->node) { if(abs(point->y-monkey.y)<=300&&abs(monkey.x-point->x)<=300)//------------------------碰到水果的条件 { if(point->type==3)//---------------------------------桃子加分 { putimage(700,450,&img_scoredel); score.score0+=10; } if(point->type==1)//------------------------------------西瓜加分 { putimage(700,450,&img_scoredel); score.score0+=20; } if(point->type==2)//-------------------------------------菠萝加分 { putimage(700,450,&img_scoredel); score.score0+=30; } if(point->type==0)//---------------------------------------------炸弹减分 { putimage(700,450,&img_scoredel); score.score0-=40; } if(head==point)//------------------------------------遍历链表消除满足条件的水果 { head=point->node; free(point); --count; point=head; if(point==NULL) break; continue; } pre->node=point->node; free(point); --count; point=pre; continue; } if(point->y>5000)//-----------------------------------------边界5000 //--------------------------------------没有接到的水果扣分 { if(point->type==3)//-----------------------------------------桃子 { score.score1+=10; } } if(point->y>5000) { if(point->type==1)//------------------------------------西瓜 { score.score1+=10; } } if(point->y>5000) { if(point->type==2)//-----------------------------------------菠萝 { score.score1+=10; } } if(score.score0>500)//---------------------------------当得分达到500进入第二关 { guanshu=2; } if(score.score1>500)//------------------------------------当没接到水果扣分达到500要求退出游戏 { MessageBox(NULL,"你输了,系统将保存您当前的用户名和得分","张玉虎提醒您",MB_OK); fprintf(fp1,"%s",score.name);//-------------------写入所有玩家信息 fprintf(fp1,"%d\0",score.score0); fprintf(fp2,"%d\0",score.score0); fprintf(fp3,"%s",score.name); if(score.score0>score.score2)//判断如果当前用户的得分大于最高的历史得分那么则覆盖最高 { fp=fopen("排名.txt","w"); fprintf(fp,"%s",score.name); fprintf(fp,"%d",score.score0); } exit(0); } if(point->y>5000)//---------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 喜庆 丰收 游戏 作业