游戏《史莱姆大冒险》的设计与开发

时间:2022-08-26 01:46:56

游戏《史莱姆大冒险》的设计与开发

【摘 要】本款游戏属于益智类游戏,玩家需要在一共20层的地图中进行冒险。玩家在每层都会遇到强度各异的怪物和用于强化玩家属性的道具、商店。游戏中,玩家需要谨慎考虑对战的怪物和属性加点路线,稍有错误玩家可能要付出较大的代价继续游戏甚至卡关。本游戏流程条理清晰,界面制作独具一格,可以满足绝大多数喜爱该类型游戏的玩家的需求。

【关键词】魔塔 策略 安卓

1 背景

随着智能移动终端的普及,作为移动应用重要分支的手游产业全面进入井喷期。中国已经成为亚洲乃至全球移动游戏市场规模最大、增速最快的市场。在这样的市场环境下我们的游戏有这很好的发展前景[1]。

《魔塔》作为一款受到广大玩家喜爱的flash小游戏,至今仍有大量同人作品出现。然而,绝大多数作品都是在电脑上用flash运行的,手机平台上的作品并不多见。为了满足玩家能够利用碎片化的时间进行游戏,同时不必使用相对笨重的台式机或笔记本,我们开发了这款魔塔风格的游戏。

2 实现方法

2.1 总体设计思路

魔塔作为一个策略性极其优秀的游戏,如今被人所遗忘让我们觉得十分惋惜,于是我们决定以此为蓝本,制作一款风格接近魔塔的游戏,并功能和玩法以及剧情上进行自己的创新,去引更多的用户参与到这类游戏中来。

2.2 处理流程

游戏流程如下图1所示,后面的解说按图中的内容进行。

开始:进入游戏开始界面,点击开始游戏播放游戏背景故事,播放完毕或者手动跳过之后进入下一环节。

玩家、地图初始化:进入游戏主程序,初始化玩家属性值、道具数量、金钱数,设定地图信息为第一层地图。显示游戏界面,游戏开始。

游戏循环:玩家进行游戏的部分,游戏只有当玩家救出公主后才算结束。程序会判断玩家移动方向上下一格的地图信息。当玩家遭遇敌人时,系统会计算玩家受到的伤害,如果高于玩家现有生命值,怪物将留在原地,玩家不会死亡,但无法通过怪物所占的格子;反之,怪物会从地图上消失,玩家可以通过刚才怪物所占的格子,玩家的生命值会减少同时获得金钱奖励。当玩家遇到道具(包括商店)或门时,玩家会与之互动购买或者拾取道具,打开门。

2.3 开发环境

由于我们的程序以Android开发为主,所以经过讨论我们决定在使用比较广泛的Windows系统下配置Android开发环境,其中使用了JDK(Java SE Development Kit)、Android SDK(Android Software Development Kit)和IntelliJ IDEA集成_发环境,编程语言为JAVA[2]。同时,为简化游戏数据平衡计算和使游戏数据更为科学,我们使用Microsoft Visual Studio 2015集成开发环境开发了一个C++程序[3]。

2.4 程序结构

我们的程序主要由一系列类、布局文件和资源文件构成。其中类又分为游戏逻辑类、人物类、背景音乐类、自定义控件类等等,其中,每一个类Activity类都有与之对应的布局文件[4]。如图2所示。

首先,MenuActivity作为游戏入口进入游戏。在现状版本中,这个类虽然只实现了简单的开始游戏Button和第二段背景音乐的播放与停止,但是这个类又是不可或缺的,因为在接下来的开发中我们还会增加登录注册、游戏设置等功能,需要在这个类中实现跳转。

其次,CartoonActivity进行剧情文字逐字播放,通过一个定时器不断调用TextView的setText达到逐字显示的效果[5],并且在文字显示完全后自动跳转至下一个界面,玩家也可以点击skip按钮跳过剧情介绍。

再者,GameActivity实现游戏的主要逻辑,(从人物怪物地图的初始化,到游戏控制,的大概思路)在这个Activity中初始化了全部道具和敌人的属性,以及商店和NPC的触发事件,调用了mapview和player类来初始化地图和角色,定义了角色上下左右的各个事件来实现人物控制逻辑,初始化了摇杆,在子线程run中监听了摇杆的动作,以此判断人物执行的动作,战斗部分则是调用了combat类来进行计算。

最后,以EndActivity作为游戏的结束,EndActivity基本与CartoonActivity相同,主要区别在文字显示上。

3 关键技术

3.1 文字逐字显示

为了实现文字逐字显示的效果,通过一个定时器不断调用TextView的setText,每次setText将会多一个文字,一次来达到逐字显示的效果,并且在背景介绍部分用计时器实现了文字显示完全之后自动跳转至游戏地图的功能。

3.2 摇杆

为增加游戏体验,使玩家操作更多元化,所以我们将一开始使用的按钮式操作升级为现在较为流行的摇杆操作。为此,我们引入了自定义的XML属性,通过继承View类,自定义了测量和绘制两个部分,除此之外我们还需要重写onTouchEvent()方法进行View事件处理,最后,在主线中开启一个子线程对自定义的摇杆类进行监听,从而实现对史莱姆的控制。

3.3 数据平衡

数据设计具体方案:

无疑,直接设置一些倍数或者具体数值都十分困难――因为缺少一个标准来衡量这些数值是否合适。所以考虑引入一个怪物强度(G)当做一个衡量标准,即在怪物的攻击力(A)、防御力(D)、生命值(H)与怪物强度之间建立一种函数关系:G=f(A,D,H)。

然而怪物的三个属性不能直接用来计算怪物的强度:一个怪物可能有非常高的血量,但无法对玩家造成任何伤害,这个怪物不能算强;同样有的怪物的血量并不高,但由于其具有较高的攻击力和防御力,足以对玩家造成巨大的威胁。这么看来,攻击力、防御力、生命值在对怪物强度的定义中应占有不同的权重,而且生命值所占权重要相对偏低。出于这方面的考虑,重新定义怪物强度的表达式:G=g(f(A,D,H)),其中f(A,D,H)=0.7A+0.6D+0.3H。这个公式只是一个尝试,并没能找到数学方法证明该公式是最佳的。

在确定了f(A,D,H)后,就需要确定g。由于数学知识有限,g便在初等函数的范围内寻找。首先确定怪物强度一定是一个单调不减的函数,但是怪物强度不应增长过快,以免强度相差不多而属性值却天差地别的情况出现;同时也不应该增长过缓,导致属性值已经差距很多而强度值却十分接近,这样强度值就失去了衡量的意义。在几类基本初等函数中,对数函数可能出现负值,指数函数增长速度过快,三角函数又呈现出周期性,都不太适合作为g。剩下的幂函数中,幂指数大于1时增长速度过快,所以选择幂指数小于1的幂函数作为g。看过一些函数图像之后,选择y=x^(2/3)这个函数,增长速度合适。根据这些函数,怪物强度的表达式最后被定义为:G=[(0.7A+0.6D+0.3H)]^(2/3)。这样就可以根据给定的怪物度计算出怪物的攻击力、防御力、生命值。

接下来的问题就是如何解出这个三元一次方程。先将方程变形:

(1)不难看出等式的左边是一个常数。但由于方程只有一个,也就是说接下来的工作是解出这个不定方程。

容易看出该方程有无穷多个解,但必须求出某个特定的解,所以根据线性代数的相关知识,把上面的方程写成两个矩阵相乘的形式。

(2)其中,由于矩阵[0.7 0.6 0.3]的逆矩阵不存在或者没意义,无法通过线性代数中求逆矩阵的方法对该方程进行求解,所以通过求广义逆矩阵的方法求解该方程。

将上述方程写成Ax=b的形式,其中A=[0.7 0.6 0.3],x=[A D H]T,b=[a]那么方程的通解可以表示为(I为三维单位矩阵,y为任意三维列向量)。

(3)由于矩阵A是行满秩矩阵,A的广义逆矩阵A^-就可以通过下式求得。

(4)最后只要给定一个向量y就可以得出矩阵x,即所求的A、D、H倍数。

只要确定了攻击力、防御力、生命值各自的初始值,就可以乘上计算好的倍数得出具体的数值。

4 现版本中的问题

由于游戏测试人员不够多,数据平衡性上可能还需要进行微调,目前来看难度偏高。

遥感灵敏性和范围判定不太完善,在玩家操作过快时可能出现重复操作。

5 结语

本文首先介绍了在智能终端普及且安卓操作系统为主流系统的大背景下,手游产业全面进入井喷期。而魔塔类游戏在该平台上数量极少,但是却拥有广大的玩家基数以及良好的策略性,受到广大90后玩家的喜爱。本游戏是基于安卓平台开发的软件,能够满足玩家随时随地进行该类型游戏的需求。本游戏流程条例清晰,界面制作独具一格,可以满足绝大多数喜爱该类型游戏的玩家的需求。

参考文献:

[1]吴亚峰,苏亚光,于复兴.Android应用案例开发大全第3版[M].人民邮电出版社,2015:45-50.

[2]任玉刚.Android开发艺术探索 第1版[M].电子工业出版社,2015:32-40.

[3][美]James S Cho著;李强.译. Android游戏开发详解 第1版[M].人民邮电出版社,2015:60-70.

[4][美]策希纳(Mario Zechner),[美]格林(Robert Green) 著;赵凯,佘建伟.译. Android 4游戏入门经典 第3版[M].清华大学出版社 ,2013:60-80.

上一篇:电网规划建设与改造运行中存在的问题及应对 下一篇:药店药品养护的重要性