[TC大程序设计之水果忍者]-最终报告_第1页
[TC大程序设计之水果忍者]-最终报告_第2页
[TC大程序设计之水果忍者]-最终报告_第3页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计综合实验期末报告指导教师:张引报告日期:2013年6月24日报告人:余楠学号姓名专业联系方式组长(打钩)10余楠竺可桢混合班V该版本为报告的最终版本,在我们最后的修改里面优化了程序中的几个低频率 bug,并在游戏时增加了点击鼠标右键暂停的功能,在暂停时返回主菜单,再次点 击开始游戏,游戏继续。并且在源程序中为方便理解增加了详细的注释。望老师满 意。余楠 2013/06/24概述1. 问题描述2. 实现功能列表功能名称简述类别基本中级高级自扩展切水果基本功能V有炸弹切到炸弹GameOverV精确判定鼠标十分划过水果结合解析几何知识V切水果光影效果切到水果生成光影效果V水果碎片生成切到水果

2、会生成碎片,而且碎片分布满足V基本物理公式模拟物理引擎重力与动量寸恒等基础物理定律满足V连击加分连击水果会获得加分完美一击加分如果水果切割 完美,切成均 匀的两瓣则有 额外加分V多种类的水果有多种颜色的水果V精确的分数记录V最高分的记录如果获得当前最高分,则在游戏结束后会 显示HighScore 并且在游戏开始屏幕上有显示V用户手册1. 安装手册I .将“ FruitNinja 切水果.zip ”解压缩到桌面。II.打开“ FruitNinja 切水果”运行“ ”脚本文件,出现 TC2.0界面。III .点击Alt+F打开File目录,在Load选项下点击回车键。IV .点击回车,下键,回车,

3、打开 test目录,在该目录中找到F_MAIN.c,点击回车打开该C文件,At+R开始运行。2. 使用手册切水果是最近几年流行发展的休闲娱乐小游戏,由于其操作简单,画面精美,受到人们的广泛欢迎。我们游戏的操作方法与手机版水果忍者类似, 点击鼠标左键然后划向水果, 像 忍者一样的去砍水果吧!但是请记住,游戏里红色的圆为炸弹,千万不要切炸弹哦,否则T_T,还不快点击开始?进入水果忍者的世界吧!三. 程序结构和总体流程1.数据结构介绍游戏的重要常数数据被分为五类,其中第一类是固定常数,这类常数用大写表示, 一般情况下这类常数不做更改,如屏幕大小设定,TRUE FALSE的布尔值定义。#define

4、WID 600#defi ne L_AMOUNT 4#defi ne HIG 450#define DELAY 15#defi ne F_AMOUNT 15#defi ne TRUE 1#defi ne B_AMOUNT 15#define FALSE 0#defi ne P_AMOUNT 100第二类是游戏运行常数,这类常数在游戏的各种调整中会经常改变,并在不断测试后找到合适值,如物理常数 G的设定,水果的刷新概率,水果的初始速度范围等等。#defi ne c_least 2#defi ne pat_amt 6#defi ne phy_g 1#defi ne pat_arr 15#defi

5、ne act_spe 25#defi ne bkc WHITE#defi ne fru_r 30#defi ne time_perfect 25#define fru_tottype 3#define time_combo 25#defi ne fru_frq 2#defi ne light_len 200#defi ne fru_perfect 7#defi ne light_c LIGHTRED#defi ne fru_max_spe_x 8#define light_time 10#defi ne fru_max_spe_y 30#defi ne bla_c RED#defi ne fr

6、u_max_spe_w 10#defi ne bla_r 30#defi ne bla_tra 0第三类是全局控制变量, 由于本游戏实行完全鼠标操控,故全局控制变量均与鼠标有关,其中有鼠标坐标,鼠标速度,鼠标加速度等等。int mou_x;int mou_k;int mou_y;int mou_s;int mou_dx;int mou_v;int mou_dy;int mou_a;第四类是结构体数组,用于定义游戏里大量出现的游戏数据,例如水果的各类数据被定义为struct fruit,刀刃闪光的情况被定义为struct blade 。struct Lightstruct Bladeint ex

7、i;int x1;int exi;int x2;int x;int y1;int y;int y2;int hx;int timer;int hy;lightL_AMOUNT;bladeB_AMOUNT;struct Fruitstruct Patchint exi;int exi;int type;int type;int x;int x;int y;int y;int dx;int dx;int dy;int dy;int w;patchP_AMOUNT;fruitF_AMOUNT;第五类是函数里面的各类变量,这类变量与普通使用方式相差不多,如 int i,j,k,temp; 等 等,在此

8、不赘述。程序全数据分配表格见附表 01. 数据分配表。2. 程序函数介绍我们的辅助函数分为三大类其中第一类是数学类,包括利用解析几何做图形分析的函数 ptl (点到直线距离) ,ltl (直 线间距)等等,这类函数在切割水果判定里起到了极大作用float ptl(float k,float b,float x,float y)return ( abs(k*x-y+b)/sqrt(k*k+1) ) ;还如随机数生成函数, 通过时间随机种子来产生随机数, 本游戏的随机部分均靠本函数实现, 本函数实用性很强。int ran_int(int min,int max)int ret;ret=rand()

9、%(max-min+1)+min;return ret;第二类是图形输出类,例如。void vis_patch(struct Patch patch)int i;for(i=0;i<P_AMOUNT;i+)if(patchi.exi=1) setcolor(GREEN);circle(patchi.x,HIG-patchi.y,fru_r/3);水果碎片的显示。void vis_fruit(struct Fruit fruit)int i;for(i=0;i<F_AMOUNT;i+)if(fruiti.exi=1)setcolor(GREEN);circle(fruiti.x,HI

10、G-fruiti.y,fru_r);水果的显示。void vis_light(struct Light light)int i;for(i=0;i<L_AMOUNT;i+)if(lighti.exi=1)setcolor(light_c);line(lighti.x1,HIG-lighti.y1,lighti.x2,HIG-lighti.y2);光影效果的显示。第三大类是控制类,用于鼠标操作。void mou_read()union REGS r1,r2;struct SREGS s;int86x(0x33,&r1,&r2,&s);读取鼠标位置,此函数至关重要。v

11、oid mou_spe()static int hx,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;鼠标速度计算,对于刀刃的判定很重要。void mou_act()static int hk;if(mou_k=hk) mou_a=0;elseif(mou_k=1) mou_a=1;if(mou_k=2) mou_a=2;if(mou_k=0) mou_a=-1;hk=mou_k;鼠标激活状态判定。除了这三大类以外也有很

12、多其他很有用的函数,再此不一一列举。程序全函数分配见附表 02.程序全函数一览表。3. 函数清单见附表Excel文件4. 程序中涉及到的高级技术文本界面图形界面鼠标键盘动画图像音效乐曲汉字中断其他(需具体说明)VVVVVV物理环境模拟以及精确的解析几何分析与计算四、程序自评程序的亮点/特色用户界面很友好,游戏内有清楚的玩法简介。游戏操作性十分高,鼠标操作 除了小概率跳帧以外操作很精确,游戏运行顺滑,切割水果的判定精确,并 且在切割完水果后会生成碎片与光影,效果很好。在游戏结束后会记录最高 分。程序内部结构十分明了,游戏的几个界面用几个while循环,通过int型整数scene来控制各场景的转换

13、,各函数分为若干大类,如数学类,图形 类等。程序的不足之处由于TurboC的一些局限因此图形的显示效果上有较大的不足,闪屏的问题 虽然试过用不同的方法解决但是最后还是有比较明显的闪屏。自我评价优是否申优是五、小组成员自评1.个人开发任务和代码量组员姓名承担任务编写代码行数完成函数(所在文件)余楠程序总构架设计,查 阅跨学科资料(基础 物理,解析几何等) 并利用资料设计游戏 物理引擎,进行水果 切割判定等。最终版 本程序风格调整与注 释添加。F_main.c ( 547行)F_def.c ( 38 行) 共585行Main()函数的全部编写与F.def.c中的游戏常量定义宋詰游戏图形界面设计,

14、负责设计拓展图形函 数,并积极提供游戏 设计思路。提供游戏 思路,并测试游戏,进行debug。F_gra.c ( 244行)F_gra.c中的图形函数 void vis_patch(struct Patch patch)void vis_fruit(struct Fruit fruit)void vis_light(struct Light light)void vis_blade(struct Blade blade)void vis_apple(i ntxd, intyd)void vis_watermel on (i nt xd,int yd)void vis_coconut(intxd

15、, intyd)void vis_oran ge(i nt xd, intyd)void vis_ma ngo(i ntxd, intyd)void vis_bomb(i ntxd, intyd)张丽君设计鼠标操控函数,帮助设计辅助数学函数。提供游戏思路, 并测试游戏,进行 debug。F_mou.c( 82 行)与 F_math.c( 22行)共104行F_mou.cvoid mou_on()void mou_off()voidcursorx y(un sig nedintx,un sig ned int y)void mou_read()void mou_spe()void mou_act

16、()F_math.cfloatptl(floatk,floatb,float x,float y)计算点到线的距离int ran_int(intmin,int max)为游戏提供随机整数2.个人开发难点及解决方法很高兴地讲,就本程序而言,几大难点以及被我们通过小组集思广益认真思考以及组长比较丰富的经验所攻克。本程序最难的地方也是程序的核心,即切割水果的判定,这项判定并没有想象中的简单,或者说,十分困难。为了解决判定切割水果,我们玩了很多次手机版水果忍者,发现切割判定有如下几点特点:1) 如果手不滑动,仅仅碰到了水果,水果不会被切碎。2)当滑动的刀刃切割到了水果上,则判定切割成功3) 当刀刃离水

17、果中心足够近,则会被判定为完美切割为了实现如上功能,我们参阅了大学数学的解析几何部分,并通过严谨思考,最后比较完美的解决了该问题。程序的判定分为两部分, 第一部分是鼠标active判定,即鼠标左键被按下,且非静止,因此我们利用鼠标速度函数与键位判定函数And速度激活最低速度),当active=TRUE时再进行几何判用逻辑式写出activ=(左键按下段为L3,并且L1,L3交点为P1,P0,半径r,左边的线段为L1,右边线段为L2,中间线L2,L3的交点为P2。P1为上次记录时鼠标位置,P2为当前鼠标位置,两点连线得到P3,分别作两条垂线得到 L1,与L2.判定方式为:1)P0 到 L3的距离小于等于r。判定水果被切到。2)P0到L3距离小于常数perfect。判定水果被完美切到。3)(L1到P0的距离+L2到P0的距离)=L1到L2的距离,即判定水果在L1,L2中间。如果1)And 3),即切割成功,如果2)And 3),即完美切割,至此,问题圆满解决。除此难题外我们在鼠标操控,动画的流畅度处理,物理引擎方面也做了不少的努力,在此由于时间原因就不赘述了。仅供个人用于学习、研究;不得用于商业用途。For personal use only in study and research; not for commercial use.Nur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论