发明内容
针对上面的问题,本发明开发一种自动生成随机游戏场景的方法、系统和装置,从选择场景、布局等,全是由程序自动生成,让玩家有“真正随机的感觉”,以提高场景的重复利用率,以及增加游戏的探索性。
根据本发明的第一个方面,提供了一种自动生成随机游戏场景的方法,包括以下步骤:
将游戏地图分割成地图块,其中所述地图块有两个以上的边界,所述边界具有表示允许游戏角色通行至边界对侧的地图块的开放状态和禁止游戏角色通行至边界对侧的地图块的关闭状态;
选取一个地图块,将所述地图块设为当前地图块;
检测游戏地图中具有至少一个边界为开放状态的地图块数,重复执行:
检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的所述边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块,
直到所述具有至少一个边界为开放状态的地图块数满足预设条件;
检测各所述地图块的各所述边界的开闭状态,根据各所述地图块的各所述边界的开放状态或关闭状态,配置对应的场景配置信息。
优选地,每各所述地图块的边界数为4。
优选地,还包括步骤:查找游戏地图中开放状态的边界数为1的地图块,设置对应数量的所述地图块为出入口地图块,并配置与出入口对应的场景配置信息。
优选地,上述步骤中选取一个地图块的方法为:获取一侧边界的对侧为游戏地图外的各地图块,从获取的各地图块中随机选取一各所述地图块。
优选地,所述地图块还包括用于表示其相对位置的坐标,并且根据所述坐标获取对应地图块的各边界对侧的地图块。
优选地,所述地图块的所述坐标包括横坐标和纵坐标,还包括步骤:获取游戏地图中开放状态的边界数大于等于1的地图块的横坐标和纵坐标,分别将各所述地图块的横坐标与游戏地图横坐标方向的边长中点的横坐标相比较,如果各所述地图块的横坐标都小于所述边长中点的横坐标,则各所述地图块分别向横坐标的正方向移动,移动距离为游戏地图横坐标方向对应边长的四分之一;如果各所述地图块的横坐标都大于所述边长中点的横坐标,则各所述地图块分别向横坐标的负方向移动,移动距离为游戏地图横坐标方向对应边长的四分之一;分别将各所述地图块的纵坐标与游戏地图纵坐标方向的边长中点的纵坐标相比较,如果各所述地图块的纵坐标都小于所述边长中点的纵坐标,则各所述地图块分别向纵坐标的正方向移动,移动距离为游戏地图纵坐标方向对应边长的四分之一;如果各所述地图块的纵坐标都大于所述边长中点的纵坐标,则各所述地图块分别向纵坐标的负方向移动,移动距离为游戏地图纵坐标方向对应边长的四分之一。
根据本发明的第二个方面,提供了一种自动生成随机游戏场景的系统,包括以下模块:
游戏地图分割模块,将游戏地图分割成地图块,其中所述地图块有两个以上的边界,所述边界具有表示允许游戏角色通行至边界对侧的地图块的开放状态和禁止游戏角色通行至边界对侧的地图块的关闭状态;
初始地图块选择模块,选取一个地图块,将所述地图块设为当前地图块;
路径生成模块,检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块;
条件确定模块,检测具有至少一个边界为开放状态的地图块数,重复执行:检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块,直到所述具有至少一个边界为开放状态的地图块数满足预设条件;
场景配置模块,检测各所述地图块的各所述边界的开闭状态,根据各所述地图块的各所述边界的开放状态或关闭状态,配置对应的场景配置信息。
根据本发明的第三个方面,提供了一种自动生成随机游戏场景的装置,包括:
存储器,用于存储应用程序;
处理器,执行所述应用程序以用于实施以下步骤:
将游戏地图分割成地图块,其中所述地图块有两个以上的边界,所述边界具有表示允许游戏角色通行至边界对侧的地图块的开放状态和禁止游戏角色通行至边界对侧的地图块的关闭状态;
选取一个地图块,将所述地图块设为当前地图块;
检测游戏地图中具有至少一个边界为开放状态的地图块数,重复执行:检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块,直到所述具有至少一个边界为开放状态的地图块数满足预设条件;
检测各所述地图块的各所述边界的开闭状态,根据各所述地图块的各所述边界的开放状态或关闭状态,配置对应的场景配置信息。
本发明的有益效果:设计者只需输入简单的地图尺寸等参数就能自动生成随机游戏场景。通过检测地图块各边界的状态,随机扩展可以通行的地图块,同时避免可以通行的地图块之间可以交叉。通过检测可以通行的地图块的分布,移动所述地图块的位置,从而防止在扩展地图块时卡死。通过检测地图块的各边界的状态,在地图的特定位置配置对应的场景信息,丰富游戏场景内容。
具体实施方式
场景在游戏中,非常重要,是玩家游戏的“世界”,诚然开发者可以找一批美术,制作大量的场景,每个场景只用一次,这种制作方式最大的问题需要:
1.消耗大量的人力和物力。
2.由于开发量大,可能还会影响进度。
3.每一个场景都是只用一遍,有些浪费。同时,每次看角度都一样,玩家也不容易有新鲜感。
4.地图的路线也是设计好的。玩家每次都是走同样的路线。
针对上面的问题,本发明提出一种自动生成随机游戏场景的方法、系统和装置的技术方案,从选择场景、布局等,由程序自动生成,让玩家有“真正随机的感觉”,以提高场景的重复利用率,以及增加游戏的探索性。
根据本发明第一实施例一种自动生成随机游戏场景的方法,包括以下步骤:
步骤A:将游戏地图分割成地图块,其中所述地图块有两个以上的边界,所述边界具有表示允许游戏角色通行至边界对侧的地图块的开放状态和禁止游戏角色通行至边界对侧的地图块的关闭状态。具体而言,根据用户预设的参数创建游戏地图后,将地图分割成各地图块,示例性的,各所述地图块的大小相同,呈矩形,具有4个边界。在4个边界的情况下边界方向与游戏地图的方向对应,可以简化设计。(示例性的,将地图块设置为正六边形,即具有6个边界亦可)
游戏地图定义东、南、西、北四个方向,分别用0,1,2,3表示如下:
DIR_W=0//西
DIR_S=1//南
DIR_E=2//东
DIR_N=3//北
所述地图块的4个边界分别与东、南、西、北四个方向相对应。所述地图块的开放状态的边界方向,即开放方向,我们用1表示;地图块的封闭状态的边界方向,即为封闭方向,没有路,则用0表示,那么可以表示如下:
四种单方向开口
00011//开放方向向西,东南北都是封闭方向
00102//开放方向向南,其余三个方向为封闭方向
01004//开放方向向东,其余三个方向为封闭方向
10008//开放方向向北,其余三个方向为封闭方向
这些地图块对接的时候,要求地图块的开放方向,需要和另一个地图块的开放方向的对接。例如如开放方向向东的地图块:0100和开放方向向西的0001地图块可以在开放状态的边界上对接。为了方便查看,我们定义了一套通俗的符号,用于方便理解游戏地图,参照图1。
此外,两个拥有相邻边界地图块的开口方向也可以不相同,例如相邻边界的一方地图块的开口方向为开,而相邻边界对侧的另一块地图块的开口方向为关,在根据地图块的边界开口方向,配置对应的场景配置信息时,不仅根据单一一块地图块的边界开口方向,还根据该地图块各边界的对侧地图块的边界开口方向,配置对应的场景配置信息,对应更多种场景配置信息,从而使自动生成的游戏场景更加丰富。
步骤B:选取一个地图块,将所述地图块设为当前地图块。具体而言,先将游戏地图初始化,即将游戏地图内所有地图块的4个边界都设置为封闭状态。此时,我们需要选出一个地图块作为初始地图块。选择方法包括从游戏地图中随机选择,其优点在于不可预料性更高,生成的地图重复率更低;也可以手工选取初始地图块,防止地图生成无序;还可以选取一个地图块的方式为从一侧边界的对侧为游戏地图外的地图块中随机选取该所述地图块,从而防止带有开放状态边界的地图块集中在游戏地图的中间部分,地图的边缘都集中没有开放状态边界的游戏角色不可达的地图块,造成实际可用场景变小,资源浪费的问题。通过上述手段之一选取一个地图块,将该地图块设为当前地图块
步骤C:检测游戏地图中具有至少一个边界为开放状态的地图块数,其中,至少一个边界为开放状态的地图块即为游戏角色可以通行的地图区域。根据本发明的方案,设计者在创建游戏场景时,除了输入整个游戏场景(游戏地图)的总的大小外,还要设定预设条件来限制游戏地图中可以通行的地图区域的大小,这个大小可以是直接输入地图块的块数,也可以是系统根据游戏场景的总的大小,按照预定范围内取一个随机的比例进行计算得出的。例如,设置地图尺寸为100个地图块,地图块的长宽为固定值,预设地图可以通行的地图区域的范围为15%-60%,假定随机得到的比例为50%,则具有至少一个边界为开放状态的地图块数需等于50块。示例性的,生成随机游戏地图的输入参数的数据结构如下:
{
'type_id':10002,
'name':'测试随机场景',
'entrance_pos':None,#出生点(步骤B中选取的初始的地图块的)位置
'chunk_size':(#地图块每一块的大小
1000,
1000,
),
'chunk_count':6,#使用6块进行生成可通行的地图块
'path':'scene/test',#资源路径
'type':'random',#以随机自动的方式生成
'maxXNum':6,#横坐标方向空间6单位
'maxZNum':8,#纵坐标方向空间8单位
}
其中,本发明使用到开源的脚本代码python作为配置文件(https://www.python.org/),遵循通用性公开许可证(GeneralPublicLicense,简称GPL)技术协议标准,但可设想,本发明并不限于上述计算机语言,使用其他合适的语言也是可以的。
遍历第1块,即入口那块的“东南西北”(上下左右)4个方向,可以填场景的话则填上第2块。并根据这两块的连接方式,确定场景的开口。接着,依次循环遍历第2块,得到第3块,遍历第3块得到第4块的位置。最后得到一个符合条件的场景。具体而言,包括步骤:检测所述具有至少一个边界为开放状态的地图块数,是否了满足预设条件,如果不满足,则重复执行:检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块,直到所述具有至少一个边界为开放状态的地图块数满足预设条件,再进入下一个步骤。通过上述方式能够沿随机的方向逐步扩大游戏地图中可通行区域的大小。生成的地图块及其符号定义参考图2和图1,其中空白的地图块代表四个边界都为关闭状态的地图块。自动生成的迷宫最后也会保证其连通性。
步骤D:通过遍历的方式检测各所述地图块的各所述边界的开闭状态,根据各所述地图块的各所述边界的开放状态或关闭状态,配置对应的场景配置信息。示例性的,我们将游戏场景的配置信息的命名,和地图块的表示边界开口状态的代码对应起来即可,如命名为:0100.scn,0111.scn,0001.scn等,程序将配置信息,添加路径和后缀,即可以找到对应的配置资源,配置资源为贴图、游戏中的宝物、NPC和敌人等。在生成游戏场景时,先读取游戏地图中地图块的表示开放封闭方向的编码,例如读取表示开放方向向西,东南北都是封闭方向的编码0001后,读取与之对应的游戏场景的配置信息0001.scn获得配置资源,将配置资源加载在地图块的对应位置上,各配置资源之间的相对位置与地图块之间的相对位置相同。从而自动生成随机游戏场景。
此外,我们也可以将多种不同的游戏场景的配置资源对应一种地图块的表示边界开口状态的代码或一种地图块的各边界对侧的地图块边界的开口状态,配置资源命名为0100a.scn,0100b.scn,0100c.scn等,对应0100的地图块随机选取其一,从而实现更加丰富的游戏场景效果。
游戏场景不仅包括地形等场景元素,还包括敌人、宝箱、门等非场景元素。此类非场景元素的位置往往非常固定,具有极强规律性。例如门位于地图的一端或两端,Boss或宝箱位于地图的与门相反的一端。在自动创设游戏场景时,希望不仅能包含场景元素,也能自动随机创设非场景元素。采取的手段为步骤E:查找游戏地图中开放状态的边界数为1的地图块,设置对应数量的所述地图块为出入口地图块,并配置与出入口对应的场景配置信息。此处的场景配置信息包括配置在地图两端的敌人、宝箱、门等非场景元素。
在实际应用中,我们往往需要地图之间能够相互拼接,即一张地图的出口与另一张地图的入口之间建立连接关系,因此,较为理想的情况下,初始地图块最好建立在地图的边缘以便能够和其他游戏场景进行无缝贴合。上述地图生成的方法无法限制出作为出入口的初始地图块的位置。尽管我们可以通过在选取一个地图块阶段手动选取初始的地图块,根据对全自动生成随机游戏场景的需要,应当通过技术手段限制生成初始地图块的位置。在此采取的手段是:获取一侧边界的对侧为游戏地图外的各地图块,即选取一个在游戏地图边缘同时不再4个角落的地图块,从获取的各地图块中随机选取一各所述地图块。
上述地图生成的方法由于缺乏控制,很可能会生成的可以通行的地图块全部集中于一隅(参照图2),空间利用率很低,不利于后期的再拓展和人工修饰。为此我们设计了一套方法,自动检测可以通行的地图块是否集中在一个角落,如果是则将其移动至地图中央。采取的手段为:获取游戏地图中开放状态的边界数大于等于1的地图块的横坐标和纵坐标,分别将各所述地图块的横坐标与游戏地图横坐标方向的边长中点的横坐标相比较,如果各所述地图块的横坐标都小于所述边长中点的横坐标,则各所述地图块分别向横坐标的正方向移动地图横坐标方向对应边长的四分之一;如果各所述地图块的横坐标都大于所述边长中点的横坐标,则各所述地图块分别向横坐标的负方向移动地图横坐标方向对应边长的四分之一;分别将各所述地图块的纵坐标与游戏地图纵坐标方向的边长中点的纵坐标相比较,如果各所述地图块的纵坐标都小于所述边长中点的纵坐标,则各所述地图块分别向纵坐标的正方向移动地图纵坐标方向对应边长的四分之一;如果各所述地图块的纵坐标都大于所述边长中点的纵坐标,则各所述地图块分别向纵坐标的负方向移动地图纵坐标方向对应边长的四分之一。游戏地图横坐标方向的边长中点为2和3之间,这里取3,纵坐标方向的边长中点为3和4之间,这里取4。经比较,所有开放状态的边界数大于等于1的地图块(即可以通行的地图块)的横坐标都小于3,纵坐标都小于4,因此所有上述地图块将分别沿横坐标的正方向移动6的四分之一,取整为1即一个坐标单位,沿纵坐标的正方向移动8的四分之一,取整为2即两个坐标单位,图2中可以通行的地图块移动后的效果参考图3。移动的时机可以为生成预设数量的可以通行的地图块之后,也可以在还未生成足够可以通行的地图块前,当前地图块已经没有符合条件的继续拓展的地图块时,从而降低创建游戏场景时无法生成预设数量的可以通行的地图块的概率。
根据本发明的第二实施例的流程可参照图4。按箭头标记的顺序执行。其中,“生成场景参数”相当于于第一实施例的步骤A;“先随机入口块”和“取得入口的位置”相当于于第一实施例的步骤B;“乱序东南西北,依次查询哪个方向可以摆一块地图块”至“生成地图数据”之间的流程,相当于相当于于第一实施例的步骤C;“根据游戏地图数据生成具体的游戏场景”相当于本发明第一实施例的步骤D。
本发明第二实施例表示成伪代码的形式如下:
self.node_map={};#初始化数据结构
defAddNode(self,x,z):#尝试在x,z格添加一个场景,并赋初值0
ifnotself.node_map.has_key((x,z)):
self.node_map[(x,z)]=0
returnTrue
returnFalse
defCreateNode(self,init_pos,maxx,maxz,max_node):
self.AddNode(init_pos[0],init_pos[1])#添加初始化的点
x=init_pos[0]
z=init_pos[1]
while(True):
neighbour=random.sample(CONNECT_TO_DIR,4)#取得方向乱序列表
fordinneighbour:#尝试在东南西北4个方向添加场景
nx=x+d[0]
nz=z+d[1]
if位置可以摆放场景:
self.AddNode(nx,nz)#在新的点(位置)记录可添加场景
ConnectNode(x,z,nx,nz);#记录每块的开口向方向标志
x=nx
z=nz#下次相对(nx,nz)进入东南西北方向查找可以摆放位置
iflen(self.node_map)>=max_node:#使用的块数达到最大块,退出
returnTrue
break;#东南西北有一个方向可以摆场景,则跳出本次循环
returnFalse
defConnectNode(self,x1,z1,x2,z2):
dx=x2-x1
dz=z2-z1
self.node_map[(x1,z1)]|=CONNECT_TO_DIR.get((dx,dz),0)#根据开口方向,设置标志
dx=x1-x2
dz=z1-z2
self.node_map[(x2,z2)]|=CONNECT_TO_DIR.get((dx,dz),0)#根据开口方向,设置标志
经过该算法后,可以生成场景的“平面图”的数据结构,输出数据结构参考如下:
{
'beginPosition':(1,1),
'data':[
['0','0','0','0'],
['0','0010','0','0'],
['0','1100','0111','0011'],
['0','0','1100','1001']
]
}。
根据“平台图”的数据结构中的数组序号及各方向边界的开闭状态信息等数据,我们在相应的地图块位置加载相关的场景资源信息,即可以自动生成一个随机的游戏场景。
生成迷宫场景后,我们便建立了游戏基本的环境。游戏可以在上面游戏走。但更重要是为了丰富和扩展玩法。没有玩法,该场景就是一个干巴巴的场景,没有趣味。下一步,我们充分利用场景的特点,扩展场景的功能,让策划的思想,可以快速运用到场景中来。
玩法扩展功能集合如下:
1.入口位置随机旋转集合中{0,90,180,270}的一个角度。0表示不旋转。90表示顺时针旋转90度。例如上面的随机入口是'beginPosition':(1,1),正常玩家进来时,是往南方向往下走,旋转90度后,将会是往东走。旋转180度后,将会是往北走。这种哪些玩家生成的随机场景布局一样,每次进入,感觉也会是不一样的,增加了游戏的新鲜感。
2.地图块索引布怪法:如针对:'0111'这个地图块,我们可以配置多份布怪数据‘0111_01.npc’~‘0111_0n.npc’,每次随机其中一份。那玩家每次进来,怪物的节奏也是不同的。
3.随机布boss。根据有场景的地图块(又可以理解场景块或房间)的数量,每3块地图块,我们随机增加一些小头目或者小boss,让玩家每打完2个场景,第三可能会有惊喜:杀小头目或boss获得奖励。然后,最后的一个地图块,有概率生成一个大boss,让玩家挑战,掉落也更加丰富。大大增加游戏的趣味。
4.增加解迷玩法。我们从地图块里随机出两块不同的块,然后随机选择块中一个位置,其中一块布置一个宝箱,另一块布置一把钥匙。玩家打开宝箱,需要先获得钥匙。通过这种设计,可以增加玩家挑战的难度,也正是游戏随机,每次挑战的感觉将会不一样。
5.增加阻档玩法。这套迷宫生成算法有一个特点:地图块之间是有序生成的,如第1块到第6块,我们可以知道这个顺序。我们可以从第2~5块之间,选择一块“n”(如n随机出来=4)布置上一块门的机关,要开这个门,需要杀死第n-1块小头目,杀死后,门才会打开。
6.往地图块里动态添加任务。我们可以将策划“脑洞大开”的新设计和新想法做成任务的形式,动态关联到指定的地图块中来。如:某个地图块挂上需要杀10只怪,门才会打开。又如,进入了这个房间,角色的移动速度减10%。又如进入这个房间,角色需要在3分钟内杀死所有的怪。
上述规律可根据地图块的相对关系而进行配置,例如随机布boss,采取步骤为:遍历游戏地图中所有一个边界为开口状态的地图块,从该地图块出发沿开口状态的边界方向前进,每前进3格,根据当前所在地图格的坐标或/及边界开口方向读取相应的boss配置信息。
参照图5,根据本发明的第三实施例提供了一种自动生成随机游戏场景的装置,包括存储器和处理器,其中
存储器,用于存储应用程序;
处理器,执行所述应用程序以用于实施以下步骤:
将游戏地图分割成地图块,其中所述地图块有两个以上的边界,所述边界具有表示允许游戏角色通行至边界对侧的地图块的开放状态和禁止游戏角色通行至边界对侧的地图块的关闭状态;
选取一个地图块,将所述地图块设为当前地图块;
检测游戏地图中具有至少一个边界为开放状态的地图块数,重复执行:
检测当前地图块的各边界是否为关闭状态,以及各边界对侧是否为游戏地图外,随机选取一个处于关闭状态且对侧不为游戏地图外的边界,将所述边界设置为开放状态,并将所述边界对侧的地图块设为当前地图块,直到所述具有至少一个边界为开放状态的地图块数满足预设条件;
检测各所述地图块的各所述边界的开闭状态,根据各所述地图块的各所述边界的开放状态或关闭状态,配置对应的场景配置信息。
根据本发明的实施例,相对现有技术具有以下优点:
1.设计者通过填表,输出简单的参数,如使用场景块数、横向和坚向空间等,便可以生成布局丰富的场景。由于场景有随机性,每次玩家进入,可能布局,怪物都不一样,会带来新鲜的感觉。
2.生成算法可以重复利用迷宫的某一块,提高场景的利用率。
3.使用配置生成场景,可以根据需要扩展配置信息,从而让场景附加很多游戏所需的功能,用该场景是否可以PK,该场景的音乐类型等。
4.策划可以方便灵活地扩充玩法点,以及玩法生成的规则,通过规则去组合生成各式各样的玩法。方便灵活扩展。
5.规则可以生成多种不同玩法,增加游戏的随机性和趣味。
用户根据自己的需求,可以这样去应用本发明,示例性地,例如:
1.和美术人员一起制定场景的规范,例如,场景文件放哪里(指定文件夹路径),场景的大小(如1000*100),场景开口方向。
2.设计者(策划或美术人员)填表输出简单的参数,如使用场景块数、横向和坚向空间等。
3.将设计表导出成配置。
4.程序根据配置信息,生成迷宫场景。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。