孙子韬

摘要:赛车电脑游戏是很多人所喜欢的休闲娱乐活动之一。本文针对某款赛车游戏进行了建模及设计。在该款游戏中,赛车在行驶的过程中会遇到障碍球与能量球,赛车碰撞到能量球或障碍球后,赛车的速度、距离以及赛车的运行轨迹都发生了变化。本文利用matlab与excel对赛车在行驶过程中对两类球的碰撞以及行驶路径进行了建模,得到了一些可以指导实际赛车游戏设计的结论。

关键词:赛车游戏设计;速度控制;路径规划;matlab;Mathematica;建模

中图分类号:TP31      文献标识码:A   文章编号:1009-3044(2019)03-0209-04

Abstract: racing computer games is one of the recreational activities that many people like. In this paper, a racing game for the modeling and design. In this game, the car in the driving process will encounter obstacle ball and energy ball , the car hit the obstacle ball or energy ball, the car's speed, distance and the car's trajectory has changed. In this paper, we use matlab and Mathematica to model the collision between the two kinds of balls and the driving path, and get some conclusions which can be used to guide the design of the actual racing game.

Key words: racing game design; speed control; path planning; matlab Mathematica  modeling

赛车电脑游戏是很多人所喜欢的休闲娱乐活动之一。某款电脑赛车游戏初步构想如下:游戏开始后,赛车的初速度为10p/s,竖直向上。用户只能通过键盘上的上下左右键控制赛车。每按一下向上(下)键,赛车向上速度提高(降低)20%,不按键就保持速度不变。每按一下向左(右)键,赛车就得到向左(右)10p/s2的加速度,加速持续到下一次按左右键,如果2秒不按左右键,加速将不再持续。在该款游戏中,赛车在行驶的过程中会遇到障碍球与能量球,赛车碰撞到能量球或障碍球后,赛车的速度、距离以及赛车的运行轨迹都发生了变化。研究这些变化规律,对游戏方案的设计且有重要意义。

1 问题提出

研究赛车的速度、距离以及赛车的运行轨迹变化规律,需逐步分析、研究以下5个问题。

1.1问题1

赛车向上运动,运动过程中用户未做任何操作。赛车每10秒撞到一个球,共撞到5个障碍球和5个能量球,但是两种球的排列顺序不定,假设撞第1个球时速度为v。撞完第10个球后,赛车速度最大值和最小值为多少?从撞第1个球到撞完第10个球赛车运行距离的最大和最小值。

1.2问题2

假设用户开始游戏后,每隔1秒依左、上、右、下的次序按键,共按了8个键。在此过程中没撞到任何球,按完最后一次,赛车的向上速度和向左的速度各为多少?画出赛车在地面上的运行轨迹。

1.3问题3

假设用户开始游戏后,每隔1秒依左、上、右、下的次序按键,共按了4000个键。在此过程中没撞到任何球,请问按完最后一次,赛车的向上速度和向左的速度各为多少?求出此时赛车在地面上相对于游戏开始时的位置。

1.4 问题4

假设用户从看见能量球或障碍球到做出反应需要0.2秒,最快按键频率每秒8次。当赛车以速度v向上运行时,用户发现正面的障碍球已经完全出现在屏幕正前方,v最小为多少时,用户不可能躲开该球(用左右键躲闪,向下键减速)。

1.5 问题5

假设赛车的初始能量可以运行400km,每改变一次速度会消耗5%。在问题4的假设下,设计一个能量球和障碍球的布局方案,使得用户既有趣味性和成就感,又有挑战性,又不要太疲劳。

2 模型假设

1)所给的数据真实可靠;

2)按键没有延时,立即响应;

3)不做任何操作且未撞到球时速度不变;

4) 游戏时间和操作频率适中。

3 模型的准备工作

1)数据的处理   周期等进行分析;赛车运动变化趋势进行分析;有些数据成等比例,从而进行运算

2)聚类分析(进行采样) 用matlab、Excel、Mathmatica软件聚类分析和各个不同问题的需要,采得2组采样,每组5个采样值。

3)预测的准备工作 根据数据特点,对总体和个体的特点进行比较,以表格或图示方式显示。

4 模型建立与求解

4.1 模型1

因为无论以何种顺序排列,只要碰撞能量球与障碍球的个数相等,那幺初速度所增加的百分数(10%)以及减少的百分数(20%)都恒定,所以,v10恒定。

v10=1.15×0.85v0=0.52772864v0

式中:v10为碰撞第10 个球后,赛车的速度,p/s

并且由此可推出:无论以何种顺序排列,只要初速度相同且在行驶过程中碰撞到的两种球的个数均相等,则赛车的末速度相同,即赛车相撞五个能量球后撞五个障碍球时小车行驶路程最大;先撞五个障碍球,后撞五个能量球时行驶路程最小,现证明如下:

设先撞五个能量球球,后撞五个障碍球的情况记为情况A,(下文简称为“A”);先撞五个障碍球,后撞五个能量球的情况记为情况B(下文简称为“B”);除A,B外的任意情况记为情况C(下文简称为“C”)。第tn个10s时,C中速度与A中速度相同,因为C中0~5个10s内速度一直增大所以A中0~5个10s内任意时刻速度在所有能量球与障碍球的排列情况中最大,所以tn>5,并且在C中0~tn时能量球撞击数均为5。又因为所有排列情况中能量球与障碍球个数均为5个,所以tn后赛车所撞球均为障碍球且个数相同,从而行驶路程也相同。

用matlab软件运行了所有可能的情况(三个图分别对应最大位移,最小位移以及某一种中间情况),结果如下图:

由定积分知识:横坐标t与纵坐标v(v与t)围成面积为路程,则要证A情况速度最大,只需证明在0~tn内任意时刻(记为t),C情况速度小于A情况速度(vn>v)即可。设C情况中所撞障碍球时间为tm

4.4 模型4

计算简化问题, 取赛车的中心, 障碍球的中心作计算, 不考虑形状因素:

建立平面直角坐标系xOy, 其中原点O位于障碍球中心, 障碍球中心朝向赛车的方向为y轴正方向, y轴朝向右侧, 也就是赛车左键加速方向为x轴正方向.

当用户发现正面障碍球完全出现在屏幕最上方时, 由于游戏过程中赛车中心位于屏幕底端最中间, 考虑到赛车是一个长宽高为10(p)的正方体, 赛车中心距离障碍球中心的距离为: 800 - 20/2 = 790(p).

假设赛车此时的速度是v0(p/s), 由于假设用户的反应时间是0.2(s), 那幺在用户实际按键的时候, 赛车中心距离障碍球中心的距离已经减少到: 790 - 0.2 v0 .

实际躲闪的策略是, 以最快的按键频率8(次/s):

1)不停地按下键保持减速, 减少垂直方向赛车中心和障碍球中心距离的减少速度;

2)不停地按左或者右键其中之一, 在赛车中心和障碍球中心相撞前尽量增加两者中心水平方向上的距离。

4.4.1 垂直方向

由于每次按键赛车的速度减少20%, 如果初始速度是v0, 以最快的频率每0.125s一次按键, 经过n*0.125s, 也就是第n次按键的之前的瞬间, 赛车的速度是:

vyn = 0.8nv0

此时赛车走过的距离是一个等比数列求和的形式, 根据求和公式可以写成:

Lyn = v0 (0.8 - 0.8(n+1) )/(1-0.8) = 5v0  (0.8 - 0.8(n+1))

而对于任意时间t, 把时间改写成t = n0.125 + dt的形式, 其中(0<dt<0.125), 那幺在该段时间内赛车走过的距离是:

Lyt = 5v0 (0.8 - 0.8(n+1)) + 0.8(n+1)dt

按照上面的躲闪策略, 用户开始按键, 经过时间t = (0.125n + dt)之后, 垂直方向上赛车中心到障碍球中心的距离是:

Ly = 790 - 0.2 v0 - 5v0 (0.8 - 0.8(n+1)) + 0.8(n+1)dt

4.4.2 水平方向

假设选择一直按右键, 初始速度是0, 以最快的频率每0.125s一次按键, 经过时间t, 赛车的速度是:

vxn = 10t

此时水平方向赛车走过的距离可以利用计算面积的方法得到:

Lx = 10 t 2/2 = 5t 2

综上所述, 如果以障碍球的中心为坐标原点O, 采用以上的规避策略, 那幺赛车中心点所画出来的曲线是:

x = 5 t 2

y = 790 - 0.2 v0 - 5 v0(0.8 - 0.8(n+1)) + 0.8(n+1) v0dt

其中: t = 0.125n + dt, 满足: 0<dt <0.125

依据问题4, 在二维平面上, 赛车可以看成是10*10p的正方形, 而障碍球可以看作一个直径20p的圆形. 采用之前建立的平面直角坐标系, 则问题可以写成以下形式:

求v0的最小值, 使得赛车的右上角经过的路径始终距离原点的距离大于10p。而赛车右上角经过的路径可以写成:

x_rt = x - 5 = 5 * t^2 - 5

y_rt = y - 5 = 785 - 0.2 v0 - 5 * v0 * (0.8 - 0.8^(n+1)) + dt * 0.8^(n+1) * v0

赛车右上角经过的路径是一个不连续的函数, 为了方便计算, 我们使用一个经过这个不连续函数所有间断点的连续函数来作为近似, 这个函数可以写成:

4.5 模型5

利用上一问题的结论, 赛车的速度要低于104 p/s才能保证屏幕上方出现障碍球的时候, 用户有足够的时间操作进行规避. 考虑到用户的反应时间并不一定是0.2 s, 因此保守起见设置赛车的最高速度为 100 p/s, 此时可以确保即使用户的反应时间是0.5 s的时候依然可以规避障碍球.

其结果可以在Mathematica里面输入命令:Plot[{785 - 0.5*a - 4*a*(1 - 0.8^(8*Sqrt[(x - 5)/5]) + 1), Sqrt[100 - x^2]} /. a -> 100, {x, 0, 10}]确认。

为了设计一个较为合理的游戏, 考虑以下几点假设进行限制:

1)游戏时间不能太长, 游戏时间过长会使得用户产生视觉疲劳, 不利于身心健康。

2)游戏时间不能太短, 游戏时间太短并不能引起用户的兴趣。

3)游戏中用户出现的障碍球和奖励球应该都能通过用户的反应操作获取或者躲避, 不能出现无法躲避或者获取的球体。

4)游戏中需要用户操作的频率不能太低, 太低的话用户有可能会感到无聊。

按照游戏给定限制, 400km的初始能量可以通过换算关系得到其等价像素为400×100/0.3约为130万p,如果按照10p/s的默认速度来说的话要经过130000s=36个小时才能结束。

假设用户刚开始为了尽量撞到更多的能量球的同时规避障碍球为目标进行操作, 用户需要尽快加速到100p/s, 然后通过遇到障碍球减速,没有障碍球加速的方法进行游戏。

根据问题4的结论, 当以100p/s的初速度规避障碍球的时候, 赛车向一侧移动了至少5 t2 = 15p, 解得t=1.732,考虑到每次操作花费0.125s,并且赛车在横向和纵向都进行同样时长和频率的操作,因此每次躲避障碍球需要花费1.732/0.125×2=26次操作。

同时,在躲避障碍球后,用户希望继续加快速度获得能量球, 因此使用1.732/0.125=13次加速操作来重新达到100p/s的速度,因此每次躲避障碍球需要39次操作。

另外假设获取能量球可以同样使用一直平移的策略获取, 那幺获取能量球可以需要13次操作。

为了使得游戏更好玩, 因此要平衡操作数。

假设游戏1分钟是理想的时间, 那幺允许

log(300/130000)/log(0.95)=149次操作

假设游戏2分钟是理想的时间, 那幺允许

log(300/130000)/log(0.95)=136次操作.

假设游戏5分钟是理想的时间, 那幺允许

log(300/130000)/log(0.95)=118次操作.

假设游戏10分钟是理想的时间, 那幺允许

log(300/130000)/log(0.95)=104次操作.

综合考虑游戏2分钟是比较理想的时间, 需要平均每秒用户发生一次操作比较好.所以比如7次能量球与6次障碍球交叉排列这种方案即可。另外,游戏可以设计成障碍球出现在赛车正前方, 能量球出现在赛车一直加速正好能获取的测前方比较好。

5 模型评价

笔者利用简单的定积分知识, 把游戏问题建模成为一个积分和优化问题, 在问题1中, 作者利用排列组合原理, 用反证法证明了先加速后减速赛车行驶距离最远, 而先减速后加速赛车行驶距离最近, 并利用matlab得出函数图像,Excel计算了数值的结果;在问题2中,作者使用了简单的定积分方法获得了按照一定次序按键之后赛车的运动曲线;在问题3中, 作者利用Excel计算了4000次循环操作后赛车的最终速度; 在问题4中, 作者通过循序渐进的方式利用简单的定积分原理和Mathematica数学软件获得了使得用户能安全躲避障碍球的最大速度. 在问题5中,在考虑到玩家趣味性、挑战性、成就感三方面以及游戏的本身设计后,综合得出了最佳的设计方案。

对于前三个问题, 笔者获得的是精确解, 模型并没有引入误差, 在第四个问题中,由于路径函数并不是连续函数,其函数一阶导数并不是连续的,因此难以使用微分方法获得精确解,笔者先是使用连续函数对路径函数做了近似, 然后利用Mathematica的数学工具获得了问题的近似解, 如果问题对精度有进一步要求, 是可以使用更为复杂的微分算法来获得问题更加精确的解的. 第五个问题作者使用了几个假设, 利用函数以及假设一些条件,综合玩家的心理分析的出游戏时间为2分钟,玩家每秒操作一次较好,排布方案为7个能量球与6个障碍球交叉排列即可。

参考文献:

[1] 张伟新. 排列组合问题的基本解法[J]. 中等数学, 2005(1):6-9.

[2] 郑庆玉, 郭政. 数学分析方法[M]. 电子工业出版社, 2010.

[3] 陈成明, 王慧, 周健,等. VDT视觉疲劳及其测量方法综述[J]. 人类工效学, 2013, 19(2):92-95.

[4] Wolfram Research, Inc., Mathematica, Version 9.0, Champaign, IL

【通联编辑:梁书】