7.地图随机装饰,与转化过程补充,与ai的设计思路

2023-07-10,,

这两天本来只想实现地图的随机装饰,然后发现以前的bin格式设计存在不足,所以最后不得不去改地图,并去重制整个地图的阶段,此篇总结这个过程

先描述下bin结构

首先地图由无数六边形组合,一个六边形由两层组成,分为上层装饰(backTile)与下层装饰(foreTile),决定一个地块是什么类型的是由下层决定的,同时还有一层(blockType)决定这个地块属于什么地块

以下为MapBinDao,即游戏数据结构

以下为MapBin结构

这里添加了buildId,buildLv,facility,areaId四个新的参数来记录相关数据

同时明确下数据长度,这里之前一直没有明确

//out.writeInt(i);//8位 2147483647
//out.writeShort(i2);//4位 32769
//out.writeByte(i3);//2位 127

之前大家一定很好奇我的世界地图是怎么来的,这里得感谢以前在我的mod生涯中,那时有个大神制作了一款游戏的可视化地图编辑器(ggmapeditor),以及excel编辑器 (GoG Mod btl.xls 无图版)使得我可以在把以前制作的地图数据提取出来并转化为我所要的地图格式.

以下为转化表

使用excel加载并转化数据后,提取生成为bin格式的byte文件,可参考1.自定义游戏地图格式的设定,加载,保存

这里我决定我的游戏暂时使用12张大地图

转化为bin以后,看看效果很不错

由于采用了动态地图,所以放张局部图

下来说随机地块,首先去def_terrainimg.xml文件下获取相关地图资源并处理为map

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- id,0平地,1海洋,2海岸,3桥梁,4丘陵,5山地,6森林,7人为装饰,8自然装饰,9海洋装饰,10道路,11河流 -->
<!--type -1不启用 0底图通用 1海洋 3固定(海岸,桥梁等) 4雪地 5普通草地 6热带草地 7沙漠 -->
<!--绘制海岸时,先使用type2的抹除陆地,然后再把对应编号的river来添加上-->
<!-- idx必须连贯 -->
<mapterrains>
<mapterrain id="1" name="海洋" type="1" idx="0" image="sea1.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="1" image="wave1_1.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="2" image="wave1_2.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="3" image="wave1_3.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="4" image="wave1_4.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="5" image="wave1_5.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="6" image="wave1_6.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="7" image="wave1_7.png"/>
<mapterrain id="1" name="波浪" type="-1" idx="8" image="wave1_8.png"/>
<mapterrain id="2" name="海岸" type="3" idx="0" image="coast_1.png"/>
<mapterrain id="2" name="海岸" type="3" idx="1" image="coast_2.png"/>
<mapterrain id="2" name="海岸" type="3" idx="2" image="coast_3.png"/>
<mapterrain id="2" name="海岸" type="3" idx="3" image="coast_4.png"/>
<mapterrain id="2" name="海岸" type="3" idx="4" image="coast_5.png"/>
<mapterrain id="2" name="海岸" type="3" idx="5" image="coast_6.png"/>
<mapterrain id="2" name="海岸" type="3" idx="6" image="coast_7.png"/>
<mapterrain id="2" name="海岸" type="3" idx="7" image="coast_8.png"/>
<mapterrain id="2" name="海岸" type="3" idx="8" image="coast_9.png"/>
<mapterrain id="2" name="海岸" type="3" idx="9" image="coast_10.png"/>
<mapterrain id="2" name="海岸" type="3" idx="10" image="coast_11.png"/>
<mapterrain id="2" name="海岸" type="3" idx="11" image="coast_12.png"/>
<mapterrain id="2" name="海岸" type="3" idx="12" image="coast_13.png"/>
<mapterrain id="2" name="海岸" type="3" idx="13" image="coast_14.png"/>
<mapterrain id="2" name="海岸" type="3" idx="14" image="coast_15.png"/>
<mapterrain id="2" name="海岸" type="3" idx="15" image="coast_16.png"/>
<mapterrain id="2" name="海岸" type="3" idx="16" image="coast_17.png"/>
<mapterrain id="2" name="海岸" type="3" idx="17" image="coast_18.png"/>
<mapterrain id="2" name="海岸" type="3" idx="18" image="coast_19.png"/>
<mapterrain id="2" name="海岸" type="3" idx="19" image="coast_20.png"/>
<mapterrain id="2" name="海岸" type="3" idx="20" image="coast_21.png"/>
<mapterrain id="2" name="海岸" type="3" idx="21" image="coast_22.png"/>
<mapterrain id="2" name="海岸" type="3" idx="22" image="coast_23.png"/>
<mapterrain id="2" name="海岸" type="3" idx="23" image="coast_24.png"/>
<mapterrain id="2" name="海岸" type="3" idx="24" image="coast_25.png"/>
<mapterrain id="2" name="海岸" type="3" idx="25" image="coast_26.png"/>
<mapterrain id="2" name="海岸" type="3" idx="26" image="coast_27.png"/>
<mapterrain id="2" name="海岸" type="3" idx="27" image="coast_28.png"/>
<mapterrain id="2" name="海岸" type="3" idx="28" image="coast_29.png"/>
<mapterrain id="2" name="海岸" type="3" idx="29" image="coast_30.png"/>
<mapterrain id="2" name="海岸" type="3" idx="30" image="coast_31.png"/>
<mapterrain id="2" name="海岸" type="3" idx="31" image="coast_32.png"/>
<mapterrain id="2" name="海岸" type="3" idx="32" image="coast_33.png"/>
<mapterrain id="2" name="海岸" type="3" idx="33" image="coast_34.png"/>
<mapterrain id="2" name="海岸" type="3" idx="34" image="coast_35.png"/>
<mapterrain id="2" name="海岸" type="3" idx="35" image="coast_36.png"/>
<mapterrain id="2" name="海岸" type="3" idx="36" image="coast_37.png"/>
<mapterrain id="2" name="海岸" type="3" idx="37" image="coast_38.png"/>
<mapterrain id="2" name="海岸" type="3" idx="38" image="coast_39.png"/>
<mapterrain id="2" name="海岸" type="3" idx="39" image="coast_40.png"/>
<mapterrain id="2" name="海岸" type="3" idx="40" image="coast_41.png"/>
<mapterrain id="2" name="海岸" type="3" idx="41" image="coast_42.png"/>
<mapterrain id="2" name="海岸" type="3" idx="42" image="coast_43.png"/>
<mapterrain id="2" name="海岸" type="3" idx="43" image="coast_44.png"/>
<mapterrain id="2" name="海岸" type="3" idx="44" image="coast_45.png"/>
<mapterrain id="2" name="海岸" type="3" idx="45" image="coast_46.png"/>
<mapterrain id="2" name="海岸" type="3" idx="46" image="coast_47.png"/>
<mapterrain id="2" name="海岸" type="3" idx="47" image="coast_48.png"/>
<mapterrain id="2" name="海岸" type="3" idx="48" image="coast_49.png"/>
<mapterrain id="2" name="海岸" type="3" idx="49" image="coast_50.png"/>
<mapterrain id="2" name="海岸" type="3" idx="50" image="coast_51.png"/>
<mapterrain id="2" name="海岸" type="3" idx="51" image="coast_52.png"/>
<mapterrain id="2" name="海岸" type="3" idx="52" image="coast_53.png"/>
<mapterrain id="2" name="海岸" type="3" idx="53" image="coast_54.png"/>
<mapterrain id="2" name="海岸" type="3" idx="54" image="coast_55.png"/>
<mapterrain id="2" name="海岸" type="3" idx="55" image="coast_56.png"/>
<mapterrain id="2" name="海岸" type="3" idx="56" image="coast_57.png"/>
<mapterrain id="2" name="海岸" type="3" idx="57" image="coast_58.png"/>
<mapterrain id="2" name="海岸" type="3" idx="58" image="coast_59.png"/>
<mapterrain id="2" name="海岸" type="3" idx="59" image="coast_60.png"/>
<mapterrain id="2" name="海岸" type="3" idx="60" image="coast_61.png"/>
<mapterrain id="2" name="海岸" type="3" idx="61" image="coast_62.png"/>
<mapterrain id="2" name="海岸" type="3" idx="62" image="coast_63.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="1" image="desert_1.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="2" image="desert_2.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="3" image="desert_3.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="4" image="desert_4.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="5" image="desert_5.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="6" image="desert_6.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="7" image="desert_7.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="8" image="desert_8.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="9" image="desert_9.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="10" image="desert_10.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="11" image="desert_11.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="12" image="desert_12.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="13" image="desert_13.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="14" image="desert_14.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="15" image="desert_15.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="16" image="desert_16.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="17" image="desert_17.png"/>
<mapterrain id="4" name="丘陵" type="7" idx="18" image="desert_18.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="19" image="l1_mountain_1.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="20" image="l1_mountain_2.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="21" image="l1_mountain_3.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="22" image="l1_mountain_4.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="23" image="l1_mountain_5.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="24" image="l1_mountain_6.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="25" image="l1_mountain_7.png"/>
<mapterrain id="4" name="丘陵" type="4" idx="26" image="l1_mountain_8.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="27" image="l2_mountain_1.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="28" image="l2_mountain_2.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="29" image="l2_mountain_3.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="30" image="l2_mountain_4.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="31" image="l2_mountain_5.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="32" image="l2_mountain_6.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="33" image="l2_mountain_7.png"/>
<mapterrain id="4" name="丘陵" type="0" idx="34" image="l2_mountain_8.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="35" image="l3_mountain_1.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="36" image="l3_mountain_2.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="37" image="l3_mountain_3.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="38" image="l3_mountain_4.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="39" image="l3_mountain_5.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="40" image="l3_mountain_6.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="41" image="l3_mountain_7.png"/>
<mapterrain id="4" name="丘陵" type="5" idx="42" image="l3_mountain_8.png"/>
<mapterrain id="5" name="山地" type="4" idx="1" image="h1_mountain_1.png"/>
<mapterrain id="5" name="山地" type="4" idx="2" image="h1_mountain_2.png"/>
<mapterrain id="5" name="山地" type="4" idx="3" image="h1_mountain_3.png"/>
<mapterrain id="5" name="山地" type="4" idx="4" image="h1_mountain_4.png"/>
<mapterrain id="5" name="山地" type="4" idx="5" image="m1_mountain_1.png"/>
<mapterrain id="5" name="山地" type="4" idx="6" image="m1_mountain_2.png"/>
<mapterrain id="5" name="山地" type="4" idx="7" image="m1_mountain_3.png"/>
<mapterrain id="5" name="山地" type="4" idx="8" image="m1_mountain_4.png"/>
<mapterrain id="5" name="山地" type="4" idx="9" image="m1_mountain_5.png"/>
<mapterrain id="5" name="山地" type="4" idx="10" image="m1_mountain_6.png"/>
<mapterrain id="5" name="山地" type="0" idx="11" image="h2_mountain_1.png"/>
<mapterrain id="5" name="山地" type="0" idx="12" image="h2_mountain_2.png"/>
<mapterrain id="5" name="山地" type="0" idx="13" image="h2_mountain_3.png"/>
<mapterrain id="5" name="山地" type="0" idx="14" image="h2_mountain_4.png"/>
<mapterrain id="5" name="山地" type="0" idx="15" image="m2_mountain_1.png"/>
<mapterrain id="5" name="山地" type="0" idx="16" image="m2_mountain_2.png"/>
<mapterrain id="5" name="山地" type="0" idx="17" image="m2_mountain_3.png"/>
<mapterrain id="5" name="山地" type="0" idx="18" image="m2_mountain_4.png"/>
<mapterrain id="5" name="山地" type="0" idx="19" image="m2_mountain_5.png"/>
<mapterrain id="5" name="山地" type="0" idx="20" image="m2_mountain_6.png"/>
<mapterrain id="5" name="山地" type="5" idx="21" image="h3_mountain_1.png"/>
<mapterrain id="5" name="山地" type="5" idx="22" image="h3_mountain_2.png"/>
<mapterrain id="5" name="山地" type="5" idx="23" image="h3_mountain_3.png"/>
<mapterrain id="5" name="山地" type="5" idx="24" image="h3_mountain_4.png"/>
<mapterrain id="5" name="山地" type="5" idx="25" image="m3_mountain_1.png"/>
<mapterrain id="5" name="山地" type="5" idx="26" image="m3_mountain_2.png"/>
<mapterrain id="5" name="山地" type="5" idx="27" image="m3_mountain_3.png"/>
<mapterrain id="5" name="山地" type="5" idx="28" image="m3_mountain_4.png"/>
<mapterrain id="5" name="山地" type="5" idx="29" image="m3_mountain_5.png"/>
<mapterrain id="5" name="山地" type="5" idx="30" image="m3_mountain_6.png"/>
<mapterrain id="6" name="森林" type="5" idx="1" image="broadleaf_1.png"/>
<mapterrain id="6" name="森林" type="5" idx="2" image="broadleaf_2.png"/>
<mapterrain id="6" name="森林" type="5" idx="3" image="broadleaf_3.png"/>
<mapterrain id="6" name="森林" type="5" idx="4" image="broadleaf_4.png"/>
<mapterrain id="6" name="森林" type="5" idx="5" image="broadleaf_5.png"/>
<mapterrain id="6" name="森林" type="5" idx="6" image="broadleaf_6.png"/>
<mapterrain id="6" name="森林" type="5" idx="7" image="broadleaf_7.png"/>
<mapterrain id="6" name="森林" type="5" idx="8" image="broadleaf_8.png"/>
<mapterrain id="6" name="森林" type="5" idx="9" image="broadleaf_9.png"/>
<mapterrain id="6" name="森林" type="5" idx="10" image="shrubbery2_1.png"/>
<mapterrain id="6" name="森林" type="5" idx="11" image="shrubbery2_2.png"/>
<mapterrain id="6" name="森林" type="5" idx="12" image="shrubbery2_3.png"/>
<mapterrain id="6" name="森林" type="5" idx="13" image="shrubbery2_4.png"/>
<mapterrain id="6" name="森林" type="5" idx="14" image="shrubbery2_5.png"/>
<mapterrain id="6" name="森林" type="5" idx="15" image="shrubbery2_6.png"/>
<mapterrain id="6" name="森林" type="5" idx="16" image="shrubbery2_7.png"/>
<mapterrain id="6" name="森林" type="5" idx="17" image="shrubbery2_8.png"/>
<mapterrain id="6" name="森林" type="5" idx="18" image="shrubbery2_9.png"/>
<mapterrain id="6" name="森林" type="7" idx="19" image="cactus-1.png"/>
<mapterrain id="6" name="森林" type="7" idx="20" image="cactus-2.png"/>
<mapterrain id="6" name="森林" type="7" idx="21" image="cactus-3.png"/>
<mapterrain id="6" name="森林" type="7" idx="22" image="cactus-4.png"/>
<mapterrain id="6" name="森林" type="7" idx="23" image="cactus-5.png"/>
<mapterrain id="6" name="森林" type="7" idx="24" image="cactus-6.png"/>
<mapterrain id="6" name="森林" type="7" idx="25" image="cactus-7.png"/>
<mapterrain id="6" name="森林" type="7" idx="26" image="cactus-8.png"/>
<mapterrain id="6" name="森林" type="7" idx="27" image="cactus-9.png"/>
<mapterrain id="6" name="森林" type="7" idx="28" image="shrubbery3_1.png"/>
<mapterrain id="6" name="森林" type="7" idx="29" image="shrubbery3_2.png"/>
<mapterrain id="6" name="森林" type="7" idx="30" image="shrubbery3_3.png"/>
<mapterrain id="6" name="森林" type="7" idx="31" image="shrubbery3_4.png"/>
<mapterrain id="6" name="森林" type="7" idx="32" image="shrubbery3_5.png"/>
<mapterrain id="6" name="森林" type="7" idx="33" image="shrubbery3_6.png"/>
<mapterrain id="6" name="森林" type="7" idx="34" image="shrubbery3_7.png"/>
<mapterrain id="6" name="森林" type="7" idx="35" image="shrubbery3_8.png"/>
<mapterrain id="6" name="森林" type="7" idx="36" image="shrubbery3_9.png"/>
<mapterrain id="6" name="森林" type="0" idx="37" image="coniferous2_1.png"/>
<mapterrain id="6" name="森林" type="0" idx="38" image="coniferous2_2.png"/>
<mapterrain id="6" name="森林" type="0" idx="39" image="coniferous2_3.png"/>
<mapterrain id="6" name="森林" type="0" idx="40" image="coniferous2_4.png"/>
<mapterrain id="6" name="森林" type="0" idx="41" image="coniferous2_5.png"/>
<mapterrain id="6" name="森林" type="0" idx="42" image="coniferous2_6.png"/>
<mapterrain id="6" name="森林" type="0" idx="43" image="coniferous2_7.png"/>
<mapterrain id="6" name="森林" type="0" idx="44" image="coniferous2_8.png"/>
<mapterrain id="6" name="森林" type="0" idx="45" image="coniferous2_9.png"/>
<mapterrain id="6" name="森林" type="4" idx="46" image="coniferous_1.png"/>
<mapterrain id="6" name="森林" type="4" idx="47" image="coniferous_2.png"/>
<mapterrain id="6" name="森林" type="4" idx="48" image="coniferous_3.png"/>
<mapterrain id="6" name="森林" type="4" idx="49" image="coniferous_4.png"/>
<mapterrain id="6" name="森林" type="4" idx="50" image="coniferous_5.png"/>
<mapterrain id="6" name="森林" type="4" idx="51" image="coniferous_6.png"/>
<mapterrain id="6" name="森林" type="4" idx="52" image="coniferous_7.png"/>
<mapterrain id="6" name="森林" type="4" idx="53" image="coniferous_8.png"/>
<mapterrain id="6" name="森林" type="4" idx="54" image="coniferous_9.png"/>
<mapterrain id="6" name="森林" type="4" idx="55" image="shrubbery_1.png"/>
<mapterrain id="6" name="森林" type="4" idx="56" image="shrubbery_2.png"/>
<mapterrain id="6" name="森林" type="4" idx="57" image="shrubbery_3.png"/>
<mapterrain id="6" name="森林" type="4" idx="58" image="shrubbery_4.png"/>
<mapterrain id="6" name="森林" type="4" idx="59" image="shrubbery_5.png"/>
<mapterrain id="6" name="森林" type="4" idx="60" image="shrubbery_6.png"/>
<mapterrain id="6" name="森林" type="4" idx="61" image="shrubbery_7.png"/>
<mapterrain id="6" name="森林" type="4" idx="62" image="shrubbery_8.png"/>
<mapterrain id="6" name="森林" type="4" idx="63" image="shrubbery_9.png"/>
<mapterrain id="6" name="森林" type="6" idx="64" image="palmae_1.png"/>
<mapterrain id="6" name="森林" type="6" idx="65" image="palmae_2.png"/>
<mapterrain id="6" name="森林" type="6" idx="66" image="palmae_3.png"/>
<mapterrain id="6" name="森林" type="6" idx="67" image="palmae_4.png"/>
<mapterrain id="6" name="森林" type="6" idx="68" image="palmae_5.png"/>
<mapterrain id="6" name="森林" type="6" idx="69" image="palmae_6.png"/>
<mapterrain id="6" name="森林" type="6" idx="70" image="palmae_7.png"/>
<mapterrain id="6" name="森林" type="6" idx="71" image="palmae_8.png"/>
<mapterrain id="6" name="森林" type="6" idx="72" image="palmae_9.png"/>
<mapterrain id="7" name="人为装饰" type="0" idx="1" image="farm_1.png"/>
<mapterrain id="7" name="人为装饰" type="0" idx="2" image="farm_2.png"/>
<mapterrain id="7" name="人为装饰" type="0" idx="3" image="farm_3.png"/>
<mapterrain id="7" name="人为装饰" type="0" idx="4" image="farm_4.png"/>
<mapterrain id="8" name="自然装饰" type="0" idx="1" image="swamp1.png"/>
<mapterrain id="8" name="自然装饰" type="0" idx="2" image="swamp2.png"/>
<mapterrain id="8" name="自然装饰" type="0" idx="3" image="swamp3.png"/>
<mapterrain id="8" name="自然装饰" type="0" idx="4" image="swamp4.png"/>
</mapterrains>

处理为map的方法

  //获得地形装饰的最高上限,最低下限为0
//储存方式为 Map(id_type+"_min",idx_min) Map(id_type+"_max",idx_max)
public static Map getDecorateRandMaxMap() {
DefTerrainimg defTerrainimg = new DefTerrainimg();
List<DefTerrainimg> defTerrainimgs = new ArrayList<DefTerrainimg>();
try {
defTerrainimgs = GameUtils.getDaoListByClass(defTerrainimg,
"config/def_terrainimg.xml");
} catch (Exception e) {
e.printStackTrace();
}
int i,iLength;
iLength=defTerrainimgs.size();
Map map=new HashMap();
for(i=0;i<iLength;i++) {//省略掉类型为-1的值
if(defTerrainimgs.get(i).getType()==-1) {
} else if(!map.containsKey((defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_min"))) {
map.put(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_min", defTerrainimgs.get(i).getIdx());
} else if(!map.containsKey((defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_max"))) {
map.put(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_max", defTerrainimgs.get(i).getIdx());
}else if((Integer)map.get(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_min")>defTerrainimgs.get(i).getIdx() ) {
map.put(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_min", defTerrainimgs.get(i).getIdx());
}else if((Integer)map.get(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_max")<defTerrainimgs.get(i).getIdx() ) {
map.put(defTerrainimgs.get(i).getId()+"_"+defTerrainimgs.get(i).getType()+"_max", defTerrainimgs.get(i).getIdx());
}
}
return map;
}

结果为

{6_6_max=72, 2_3_max=62, 6_0_min=37, 8_0_max=4, 4_7_max=18, 4_5_min=35, 6_4_min=46, 4_0_min=27, 5_5_max=30, 6_6_min=64, 6_5_max=18, 4_4_min=19, 5_0_max=20, 5_4_max=10, 7_0_min=1, 5_5_min=21, 6_7_min=19, 4_4_max=26, 6_4_max=63, 7_0_max=4, 4_7_min=1, 5_4_min=1, 5_0_min=11, 6_0_max=45, 6_7_max=36, 2_3_min=0, 8_0_min=1, 4_5_max=42, 1_1_min=0, 4_0_max=34, 6_5_min=1}

注意xml中的某一type的idx必须连续,让某一种type的idx是处于一个区间

下面为随机地块方法,根据BackTile和BlockType来随机他的idx

//随机装饰(除特殊装饰外)
public void randomAllDecoration() {
Random rand = new Random();
//储存地块最高范围
Map map=GameMap.getDecorateRandMaxMap(); //Map(id_type+"_min",idx_min) Map(id_type+"_max",idx_max)
//循环遍历所有地块
int i;int iLength=MapBin.size();
int vMin,vMax;
for(i=0;i<iLength;i++) {
/*if(MapBin.get(i).getBackTile()==5) {
Gdx.app.log("MapBin.i:", "imin:"+(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")+" imax:"+(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max"));
}*/
if(map.containsKey(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")&&map.containsKey(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max")) { vMin=(Integer)map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min");
vMax=(Integer)map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max");
//Gdx.app.log("", " backTile:"+MapBin.get(i).getBackTile()+" type:"+MapBin.get(i).getBackTile()+" max:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max")+" min:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")+" backIdx:"+backIdx);
MapBin.get(i).setBackIdx(rand.nextInt(vMax-vMin+1) + vMin);
}
if(map.containsKey(MapBin.get(i).getForeTile()+"_"+MapBin.get(i).getBlockType()+"_min")&&map.containsKey(MapBin.get(i).getForeTile()+"_"+MapBin.get(i).getBlockType()+"_max")) {
vMin=(Integer)map.get(MapBin.get(i).getForeTile()+"_"+MapBin.get(i).getBlockType()+"_min");
vMax=(Integer)map.get(MapBin.get(i).getForeTile()+"_"+MapBin.get(i).getBlockType()+"_max");
//Gdx.app.log("", " backTile:"+MapBin.get(i).getBackTile()+" type:"+MapBin.get(i).getBackTile()+" max:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max")+" min:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")+" backIdx:"+backIdx);
MapBin.get(i).setForeIdx(rand.nextInt(vMax-vMin+1) + vMin);
}
}
}

同时根据4丘陵,5山地,6森林可以随机相互配对的原则来生成上层装饰(ForeTile)

//随机增加2层装饰
public void randomForeDecoration() {
int foreId,vMin,vMax;
Random rand = new Random();
//储存地块最高范围
Map map=GameMap.getDecorateRandMaxMap();
//循环遍历所有地块
int i;int iLength=MapBin.size();
Object o1; for(i=0;i<iLength;i++) {
//配对规则
//4丘陵 4 5 6
//5山地 4 5 6
//6森林 4 5 6
if(rand.nextInt(100)<31&&map.containsKey(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")&&map.containsKey(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max")&&MapBin.get(i).getBackTile()>3&&MapBin.get(i).getBackTile()<7) {
foreId=4+rand.nextInt(3);
MapBin.get(i).setForeTile(foreId);
o1=map.get(foreId+"_"+MapBin.get(i).getBlockType()+"_min");
if(o1!=null) {
vMin=(Integer)map.get(foreId+"_"+MapBin.get(i).getBlockType()+"_min");
vMax=(Integer)map.get(foreId+"_"+MapBin.get(i).getBlockType()+"_max");
//Gdx.app.log("", " backTile:"+MapBin.get(i).getBackTile()+" type:"+MapBin.get(i).getBackTile()+" max:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_max")+" min:"+map.get(MapBin.get(i).getBackTile()+"_"+MapBin.get(i).getBlockType()+"_min")+" backIdx:"+backIdx);
MapBin.get(i).setForeIdx(rand.nextInt(vMax-vMin+1) + vMin);
}
}else {
MapBin.get(i).setForeTile(0);
MapBin.get(i).setForeIdx(0);
}
}
}

以下为转化后的原图

以下为随机装饰的图

以下为随机2层装饰的图

关于ai的设计思路

以前做mod的时候,最困难的是测试和难度调节,如果使用外部养成机制(养成将军,战斗可以代入将军),当难度大时,玩家会非常偏向于破解,难度小了,又赚不到钱

所以我的游戏设计思路为养成机制尽量内置,即在一局内游戏可以包含养成元素(科技,将军),但外部不能包含养成元素,由这点保证公平.

以前大致游戏的制作流程为:

准备阶段:制作大地图

画大地图-->加载所有游戏势力,设为中立-->设置城市-->城市加兵-->根据年代,势力划分区域

制作阶段:截取并细化地图

根据战斗背景,截取作战区域-->设定参战势力敌对-->添加兵种-->随机兵种类型-->添加将军-->设定战斗目标,剧情

但这样做出来的游戏通常ai难以把握,需要反复测试难度

所以本游戏的设计思路为,根据预定义项来让玩家自动遇敌,根据年代,玩家兵力,政治自动刷兵

在战略大地图上,直接用黑幕来遮住玩家未探索区域,同时增加内部矛盾等数值,防止玩家扩张太快,同时增加一个不同年代,各国区域划分,只要年代到了,就刷兵,强行模拟历史,slg游戏以前胜利的方式通常都是征服世界,玩家全是战争狂,但世界历史往往是好战必忘,忘战必危

国家的使命是维护社会稳定,为国民提供发展机会,国进民进,我设计的这个游戏的主题就是 与国同体,在风雨飘摇的近代,崛起,与历史命运所抗争

这就是我关于这个游戏的ai设计思路

7.地图随机装饰,与转化过程补充,与ai的设计思路的相关教程结束。

《7.地图随机装饰,与转化过程补充,与ai的设计思路.doc》

下载本文的Word格式文档,以方便收藏与打印。