1、单机台球游戏系统分析 1.引言 1.1背景 台球,它是一项在国际上广泛流行的高雅室内体育运动,是一种用球杆在台上击球、依靠计算得分确定比赛胜负的室内娱乐体育项目。台球也叫桌球(港澳的叫法)、撞球(台湾的叫法)。台球运动至今已有五、六百年历史,在长期流传中经过人们的不断改进丰富,现已达到了比从较完善的程度,也可见其大众基础良好。要想打好台球必须掌握好打球的角度、力度以及球与球之间的位置关系,存在较强的技巧性和益智元素。 21世纪初,各类台球在中国再度兴起,并得到长足的进步,由街头台球向健康、娱乐型运动迅速发展;中国顶尖球手在世界顶级比赛中也取得良好成绩,世界排名前十二位球手中,中国占居三
2、席,特别是丁俊晖的出现,中国更是刮起了一阵台球风。越来越多的人开始关注并喜欢上台球。而由于受到时间和场地的限制,人们并不能很好地享受到台球的乐趣。而我们所设计的单机台球游戏,模拟现实台球,操作简单、富于趣味,适合各类人群。加之现代人们的娱乐方式影响,PC版的台球游戏便应声而起。而且,现在人们几乎家家户户都有计算机,所以单机台球游戏适用范围广,市场需求较大。 1.2参考资料 a. 王士元. 《C高级实用程序设计》. 北京: 清华大学出版社. 1996 b. 周纯杰,刘正林等. 《标准C语言程序及应用》. 武汉: 华中科技大学出版社. 2005 c.《基于碰撞检测技术的台球游戏设计》
3、丁丹婷 《信息与电脑》 2012年3月刊 d.《C高级编程技术》 e.《C语言游戏编程从入门到精通》 f. 百度百科——台球、斯诺克 G.《小球碰撞检测的算法设计和台球游戏开发》 韩绍兵 朱元忠 《北京工业职业技术学院学报》 2004年11月 2.需求分析 2.1目标 本软件基本以现实中的台球为原型进行模拟。现在的台球已发展为多种多样:有中式八球、俄式落袋台球、英式落袋台球、开伦台球、美式落袋台球和斯诺克台球,其中斯诺克最为普遍,而且被官方认可,已成为一项比赛项目。所以我们单机台球游戏基本以斯诺克的打法来设计。而由于现实的正式比赛与虚拟的娱乐游戏之间存在着差距
4、和不同,在此,我们对规则做了一定的改动和简化. 2. 2基本打法: 比赛时,选手们使用相同的主球击打目标球。主球为白球。共有21只目标球,其中:15只红球各一分;黄色球2分;绿色球3分;棕色球4分;蓝色球5分;粉色球6分;黑色球7分;运动员标准击球顺序:将红色球与彩色球分别交替落袋,彩球落袋后重新回到原来位置,直至所有红色球全部离台,然后按彩球分值由低至高的顺序也至全部离台为止。 颜色 红色 黄色 绿 色 棕色 蓝 色 粉 色 数量 15 1 1 1 1 1 分值 1 2 3
5、 4 5 6 2. 3计分规则: 加分:无犯规,一杆之内按标准的击球顺序使球落袋,计入落袋球的总分。 罚分:(a)没有击中任何目标球,罚分1分。 (b)没有按照正确的顺序击球,按击错的球的分值罚分。 (c)主球进洞,罚分1分。并重置主球。 2. 4选择模式: 本游戏分为单人游戏和双人游戏两种游戏模式。 双人模式:双方轮流击球,若一方没有得分(没有任何目标球落袋)或者犯规,则轮到令一选手击球。计分方式为,加分到得分个人,罚分加入对方得分。最后以得分高者获胜。 单人模式:加分计入得分,罚分扣进得分。总共限制击球25杆,以最后得
6、分记入排行榜。 2.5用户的特点 本游戏操作简单,没有太多的基础性技术要求,适用于任何喜爱台球游戏并能操作鼠标和键盘的人群。人机界面友好,设置简单,元素丰富,适合大众消遣娱乐。同时,通过比赛、竞技形式,也适合有一定台球基础的玩家培养战略意识和空间感知、几何思维能力。 3.功能介绍及操作 3. 1 界面及说明 3.1.1 开始界面 调用插入256色bmp图片 3.1.2 欢迎使用及选择界面 可进行四种选择,进入不同界面后都可以点击退出键选择返回主菜单;snooker battle(决战斯诺克),使用清屏再画的方式编辑出snooker battle的动
7、画效果。 3.1.3单双人游戏界面 21个球,界面上可以选择力量,观察分数,选择退出。单人游戏有输入姓名,有英雄榜按钮,可以查询排名情况。另外双人游戏中包含暂停技术(含暂停计时),以及实时记录击球选手,给出两人分数,含认输功能,某方认输,对方即为获胜者。 3.1.4 球杆选择界面 进入球杆选择界面,有4种颜色的球进行选择,后方圆框即为选择按钮,点击即选中该颜色球杆。 3.1.5 帮助说明界面 对规则进行简介。 3.2 游戏操作简介 球杆随鼠标移动而绕白球转动,确定好击球方向后点击右键即可固定鼠标,再点击po
8、wer条,出现彩色格子即为已选中的力量,点击鼠标左键,白球将被击出。选择力量格数越多,力量越大。 其他按钮均使用鼠标左键点击,即可弹出相应的对话框,显示操作内容。 3.3 功能流程图 3.3.1 球的运动状态 球的运动 杆击球 球撞球 球碰壁 球进洞 3.3.2单人游戏 返回 玩家 选择好开始击球(25次) 得出得分
9、 再来 3.3.3双人游戏 按要求进球,得分 玩家1(先开球) 犯规,罚分 玩家2击球 一方认输 球全入袋
10、 分出胜负
11、 返回主菜单 再来一局 游戏启动 开机界面 主菜单 进入游戏 进入游戏 游戏结束界面 游戏结束界面 单人游戏 双人游戏 帮助说明 联系编者 球杆设置 再来一盘 再来一盘 返回主菜单 返回主菜单 游戏规则 相关说明 退出 3.4 功能流程总图 4. 模块分析 4.1界面模块 欢迎界面:题目、按钮、菜单选择 游戏界面:球桌面、球、球杆、按钮 设置及说明:球杆(实心)及相应选择按钮、说明鞋底 对话框界面:退出、认输、暂停倒数计时 4.2 鼠标模块 初始化鼠标 读鼠标状态及位置 实时显示
12、鼠标位置 鼠标绘制 4.3 进行游戏模块 球杆旋转(击球方向选择) 击球力量选择 球运动 碰撞检测 5. 程序流程图及主要算法分析 5.1 程序流程图(此处插入流程图,未完成) 5.2主要算法分析 5.2.1 台球运动路线 台球路线由两方面决定:(合理击球情况下)1.母球由球杆击打得出运动方向、白球由碰撞决定运动方向 2.子球由碰撞决定运动方向 在640*480的分辨率下,球的x(横坐标),y(纵坐标)可以定位其当前位置,dx(横坐标变化量),dy(纵坐标变化量)可以确定其运动方向: 角度 s=atan2(dy, dx); 若加入了power值 dx=power*
13、cos(s); dy=power*sin(s); 新的位置则可确定下来 x+=dx; y+=dy; 5.2.2 台球碰撞后方向确定 s1=atan2(d1y, d1x); s2=atan2(d2y, d2x); s=atan2(y,x); d1=sqrt(pow(d1x,2)+pow(d1y,2))*cos(s-s1); d2=sqrt(pow(d2x,2)+pow(d2y,2))*cos(PI-(s-s2)); dx1=d1*cos(s); dx2=d2*cos(PI-s); dy1=d1*sin(s); 通过角度计算增量,由横纵坐标的增量
14、得出接下来的角度情况,根据此角度进行下一步的挪动。(此处未写出对分母为零的判断,写程序时需判断) dy2=d2*sin(PI-s); d1x-=dx1; d1y-=dy1; d2x+=dx1; d2y+=dy1; d1x+=dx2; d1y+=dy2; d2x-=dx2; d2y-=dy2; 5.2.3 台球运动时的衰减 真实情况下,台球会在碰撞多次过后存在机械能减少的问题,所以设置减速公式使台球减速。 d1x*=0.97; d1y*=0.97; d2dx*=0.97; d2y
15、0.97; 5.2.4 台球运动动画处理 底色为绿色,若球在一次击打后位置改变,则用绿色园覆盖原位置圆形,结束一次击打,并在新的位置用相应的颜色画圆。 5.2.5 双人交换击球权 当一方失误时,另一方便可击球,由一变量控制,一旦击球违规则改变变量值,传出后判断下一位击球的人。 6. 编程过程中遇到的难点 (1) 数据溢出问题 :台球有21个,每一个都对应有不同的值,用结构包括这些后,用指针指向该结构,指针传址不正确,会出现数据溢出,指针为赋初值会成为野指针,结构里的项没有没有完全赋初值,也会出现数据溢出,还有算角度时经常用到atan2(y, x),当x==0时,数据就会超过域,
16、还有pow(x,2),会因为内部平方过大而溢出。为溢出问题一直在改动程序。 (2) 台球动画处理问题:台球游戏中有大量的台球运动,怎样实现动画一直是问题,采用存储再放的模式时,由于只能存放矩形而在边界上出现了很大的问题,但是用底色覆盖动画又不连贯。 (3) 进入主菜单选择某一项后又返回到主菜单,循环上的逻辑易出错。 (4) 台球运动过程中发生的碰撞是物理刚体的碰撞过程,建立模型较难,推导出物理公式需要很好的数学能力,同时,再把它实现到c语言中又是一个比较难的过程。 (5) 鼠标函数不是特别清晰,菜单使用较多后,鼠标运用多次,很容易疏忽是异或掉她,使之消失还是重画了。 7. 不足之处 (1) 考虑种种因素后没有使用动画效果较好的存储再放模式制作台球动画。 (2) 没有在程序中完全体现出斯诺克游戏的规则,没能让电脑只能选择扣分还是继续发球,没能严格要求台球落袋顺序。 (3) 在快验收前期换核心算法,导致整个程序进展偏慢,不能完善功能。 (4) 打进球洞的球稍稍贴有绿色阴影 8. 组员分工 龙贲璇:文件读写(英雄榜)、开机动画、主菜单、退出 徐祯:单人游戏、双人游戏(算法)






