TC大程序设计之水果忍者最终报告Word文件下载.docx
- 文档编号:16544905
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:12
- 大小:24.59KB
TC大程序设计之水果忍者最终报告Word文件下载.docx
《TC大程序设计之水果忍者最终报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《TC大程序设计之水果忍者最终报告Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
自扩展
切水果基本功能
有炸弹
切到炸弹GameOver
精确判定鼠标十分划过水果
结合解析几何知识
切水果光影效果
切到水果生成光影效果
水果碎片生成
切到水果会生成碎片,而且碎片分布满足基本物理公式
模拟物理引擎
重力与动量守恒等基础物理定律满足
连击加分
连击水果会获得加分
完美一击加分
如果水果切割完美,切成均匀的两瓣则有额外加分
多种类的水果
有多种颜色的水果
精确的分数记录
最高分的记录
如果获得当前最高分,则在游戏结束后会显示HighScore并且在游戏开始屏幕上有显示
二、用户手册
1.安装手册
I.将“FruitNinja切水果.zip”解压缩到桌面。
II.打开“FruitNinja切水果”运行“TurboC2.0.vbs”脚本文件,出现TC2.0界面。
III.点击Alt+F打开File目录,在Load选项下点击回车键。
IV.点击回车,下键,回车,打开test目录,在该目录中找到F_MAIN.c,点击回车打开该C文件,Alt+R开始运行。
2.使用手册
切水果是最近几年流行发展的休闲娱乐小游戏,由于其操作简单,画面精美,受到人们的广泛欢迎。
我们游戏的操作方法与手机版水果忍者类似,点击鼠标左键然后划向水果,像忍者一样的去砍水果吧!
但是请记住,游戏里红色的圆为炸弹,千万不要切炸弹哦,否则T_T,还不快点击开始?
进入水果忍者的世界吧!
三.程序结构和总体流程
1.数据结构介绍
游戏的重要常数数据被分为五类,其中第一类是固定常数,这类常数用大写表示,一般情况下这类常数不做更改,如屏幕大小设定,TRUE,FALSE的布尔值定义。
#defineWID600
#defineHIG450
#defineF_AMOUNT15
#defineB_AMOUNT15
#defineP_AMOUNT100
#defineL_AMOUNT4
#defineDELAY15
#defineTRUE1
#defineFALSE0
第二类是游戏运行常数,这类常数在游戏的各种调整中会经常改变,并在不断测试后找到合适值,如物理常数G的设定,水果的刷新概率,水果的初始速度范围等等。
#definec_least2
#definephy_g1
#defineact_spe25
#definefru_r30
#definefru_tottype3
#definefru_frq2
#definefru_perfect7
#definefru_max_spe_x8
#definefru_max_spe_y30
#definefru_max_spe_w10
#definepat_amt6
#definepat_arr15
#definebkcWHITE
#definetime_perfect25
#definetime_combo25
#definelight_len200
#definelight_cLIGHTRED
#definelight_time10
#definebla_cRED
#definebla_r30
#definebla_tra0
第三类是全局控制变量,由于本游戏实行完全鼠标操控,故全局控制变量均与鼠标有关,其中有鼠标坐标,鼠标速度,鼠标加速度等等。
intmou_x;
intmou_y;
intmou_dx;
intmou_dy;
intmou_k;
intmou_s;
intmou_v;
intmou_a;
第四类是结构体数组,用于定义游戏里大量出现的游戏数据,例如水果的各类数据被定义为structfruit[],刀刃闪光的情况被定义为structblade[]。
structLight
{
intexi;
intx1;
intx2;
inty1;
inty2;
inttimer;
}light[L_AMOUNT];
structFruit
inttype;
intx;
inty;
intdx;
intdy;
intw;
}fruit[F_AMOUNT];
structBlade
inthx;
inthy;
}blade[B_AMOUNT];
structPatch
}patch[P_AMOUNT];
第五类是函数里面的各类变量,这类变量与普通使用方式相差不多,如inti,j,k,temp;
等等,在此不赘述。
程序全数据分配表格见附表01.数据分配表。
2.程序函数介绍
我们的辅助函数分为三大类
其中第一类是数学类,包括利用解析几何做图形分析的函数ptl(点到直线距离),ltl(直线间距)等等,这类函数在切割水果判定里起到了极大作用
floatptl(floatk,floatb,floatx,floaty)
return(abs(k*x-y+b)/sqrt(k*k+1));
}
还如随机数生成函数,通过时间随机种子来产生随机数,本游戏的随机部分均靠本函数实现,本函数实用性很强。
intran_int(intmin,intmax)
intret;
ret=rand()%(max-min+1)+min;
returnret;
第二类是图形输出类,例如。
voidvis_patch(structPatchpatch[])
inti;
for(i=0;
i<
P_AMOUNT;
i++)
{
if(patch[i].exi==1)
setcolor(GREEN);
circle(patch[i].x,HIG-patch[i].y,fru_r/3);
}
水果碎片的显示。
voidvis_fruit(structFruitfruit[])
F_AMOUNT;
if(fruit[i].exi==1)
circle(fruit[i].x,HIG-fruit[i].y,fru_r);
水果的显示。
voidvis_light(structLightlight[])
L_AMOUNT;
if(light[i].exi==1)
setcolor(light_c);
line(light[i].x1,HIG-light[i].y1,light[i].x2,HIG-light[i].y2);
光影效果的显示。
第三大类是控制类,用于鼠标操作。
voidmou_read()
unionREGSr1,r2;
structSREGSs;
r1.x.ax=3;
int86x(0x33,&
r1,&
r2,&
s);
mou_x=r2.x.cx;
mou_y=HIG-r2.x.dx;
mou_k=r2.x.bx;
读取鼠标位置,此函数至关重要。
voidmou_spe()
staticinthx,hy;
mou_dx=mou_x-hx;
mou_dy=mou_y-hy;
mou_v=mou_v*0.5+0.5*sqrt(abs(mou_dx*mou_dx+mou_dy*mou_dy));
hx=mou_x;
hy=mou_y;
鼠标速度计算,对于刀刃的判定很重要。
voidmou_act()
staticinthk;
if(mou_k==hk)mou_a=0;
else
if(mou_k==1)mou_a=1;
if(mou_k==2)mou_a=2;
if(mou_k==0)mou_a=-1;
hk=mou_k;
鼠标激活状态判定。
除了这三大类以外也有很多其他很有用的函数,再此不一一列举。
程序全函数分配见附表02.程序全函数一览表。
3.函数清单
见附表Excel文件
4.程序中涉及到的高级技术
文本界面
图形界面
鼠标
键盘
动画
图像
音效
乐曲
汉字
中断
其他(需具体说明)
物理环境模拟以及精确的解析几何分析与计算
四、程序自评
程序的亮点/特色
用户界面很友好,游戏内有清楚的玩法简介。
游戏操作性十分高,鼠标操作除了小概率跳帧以外操作很精确,游戏运行顺滑,切割水果的判定精确,并且在切割完水果后会生成碎片与光影,效果很好。
在游戏结束后会记录最高分。
程序内部结构十分明了,游戏的几个界面用几个while循环,通过int型整数scene来控制各场景的转换,各函数分为若干大类,如数学类,图形类等。
程序的不足之处
由于TurboC的一些局限因此图形的显示效果上有较大的不足,闪屏的问题虽然试过用不同的方法解决但是最后还是有比较明显的闪屏。
自我评价
优
是否申优
是
五、小组成员自评
1.个人开发任务和代码量
组员姓名
承担任务
编写代码行数
完成函数(所在文件)
程序总构架设计,查阅跨学科资料(基础物理,解析几何等)并利用资料设计游戏物理引擎,进行水果切割判定等。
最终版本程序风格调整与注释添加。
F_main.c(547行)
F_def.c(38行)
共585行
Main()函数的全部编写
与F.def.c中的游戏常量定义
宋喆
游戏图形界面设计,负责设计拓展图形函数,并积极提供游戏设计思路。
提供游戏思路,并测试游戏,进行debug。
F_gra.c(244行)
F_gra.c中的图形函数
voidvis_blade(structBladeblade[])
voidvis_apple(intxd,intyd)
voidvis_watermelon(intxd,intyd)
voidvis_coconut(intxd,intyd)
voidvis_orange(intxd,intyd)
voidvis_mango(intxd,intyd)
voidvis_bomb(intxd,intyd)
张丽君
设计鼠标操控函数,帮助设计辅助数学函数。
F_mou.c(82行)与F_math.c(22行)
共104行
F_mou.c
voidmou_on()
voidmou_off()
voidcursorxy(unsignedintx,unsignedinty)
F_math.c
计算点到线的距离
为游戏提供随机整数
2.个人开发难点及解决方法
很高兴地讲,就本程序而言,几大难点以及被我们通过小组集思广益认真思考以及组长比较丰富的经验所攻克。
本程序最难的地方也是程序的核心,即切割水果的判定,这项判定并没有想象中的简单,或者说,十分困难。
为了解决判定切割水果,我们玩了很多次手机版水果忍者,发现切割判定有如下几点特点:
1)
如果手不滑动,仅仅碰到了水果,水果不会被切碎。
2)
当滑动的刀刃切割到了水果上,则判定切割成功3)
当刀刃离水果中心足够近,则会被判定为完美切割为了实现如上功能,我们参阅了大学数学的解析几何部分,并通过严谨思考,最后比较完美的解决了该问题。
程序的判定分为两部分,第一部分是鼠标active判定,即鼠标左键被按下,且非静止,因此我们利用鼠标速度函数与键位判定函数用逻辑式写出activ=(左键按下And速度>
激活最低速度),当active=TRUE时再进行几何判定,几何判定的方法是
蓝色球体为水果,其中心点为P0,半径r,左边的线段为L1,右边线段为L2,中间线段为L3,并且L1,L3交点为P1,L2,L3的交点为P2。
P1为上次记录时鼠标位置,P2为当前鼠标位置,两点连线得到P3,分别作两条垂线得到L1,与L2.判定方式为:
P0到L3的距离小于等于r。
判定水果被切到。
P0到L3距离小于常数perfect。
判定水果被完美切到。
3)
(L1到P0的距离+L2到P0的距离)==L1到L2的距离,即判定水果在L1,L2中间。
如果1)And
3),即切割成功,如果2)And
3),即完美切割,至此,问题圆满解决。
除此难题外我们在鼠标操控,动画的流畅度处理,物理引擎方面也做了不少的努力,在此由于时间原因就不赘述了。
仅供个人用于学习、研究;
不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;
notforcommercialuse.
Nurfü
rdenpersö
nlichenfü
rStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'
é
tudeetlarechercheuniquementà
desfinspersonnelles;
pasà
desfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TC 程序设计 水果 最终 报告