7.地图随机装饰,与转化过程补充,与ai的设计思路
这两天本来只想实现地图的随机装饰,然后发现以前的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的设计思路的更多相关文章
- 2D地图随机生成
2D地图随机生成基础绘图 海陆分布
- 数据的随机抽取 及 jQuery补充效果(菜单、移动)
一.数据的随机抽取 都见过那种考试题从很多题中随机抽取几道的试卷吧,现在就要做这样的一个例子:从数据库中随机抽取几条数据出来显示(例如:一百中随机挑选50条) 随机挑选是要有提交数据的,所以肯定是要有 ...
- python学习日记(装饰器的补充)
如何返回被装饰函数的函数名及注释? 问题及实现 先看典型的装饰器: def wrapper(f):#装饰器函数,f是被装饰函数 def inner(*args,**kwargs): '''执行函数之前 ...
- 深入浅出百度地图API开发系列(3):模块化设计
在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...
- PHP实现微信随机红包算法和微信红包的架构设计简介
微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...
- C#窗体->>随机四则运算
用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在 ...
- It is better to have the ability of fast learning
来自某位大佬: 内功=算法+数据结构+编译原理+操作系统原理+软件工程+英文 十足的自信心+强烈的求知欲+对Programming&&C&&CPP的执着+百折不挠的钻研 ...
- 仿造slither.io第二步:加个地图,加点吃的
前言 上一篇博文讲了如何造一条蛇,现在蛇有了,要让它自由的活动起来,就得有个地图啊,而且只能走也不行呀,还得有点吃的,所以还得加点食物,这一篇博文就来讲讲如何添加地图和食物. 预览效果 当前项目最新效 ...
- 18.libgdx制作预览图,背景移动循环,改变地图颜色
经过构思,游戏将分为两部分, 1,预览图,只负责展示世界形势 2,根据预览图生成的战役项 现在要记录的是我制作预览图的部分 1.预览图只有实际地图的1/4,首先生成地图(建议不要缩放以前地图,由于误差 ...
随机推荐
- Win10下VirtualBox安装流程
一.VirtualBox简介 VirtualBox 是一款开源的虚拟机软件,最初由美国SUN公司开发,后来SUN被Oracle收购,VirtualBox 更名为Oracle VirtualBox .不 ...
- JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...
- 可视化n次贝塞尔曲线及过程动画演示--大宝剑
起因 研究css中提供了2次.3次bezier,但是没有对n次bezier实现.对n次的实现有很大兴趣,所以就用js的canvas搞一下,顺便把过程动画模拟了一下. 投入真实生产之中,偏少. n次be ...
- linux 环境变量 转
https://www.cnblogs.com/aaronLinux/p/5837702.html export PATH=/home/one/:$PATH export PATH=$PATH:/ho ...
- SSRS表达式里引用.net dll
在SSRS的表达式里使用了一个.NET的DLL,用来生成条码图片,发布以后用不了. 需要修改一个SSRS的权限配置项,确保Report_Expressions_Default_Permissions的 ...
- [转] ESXI6.5 误将硬盘阵列卡配置为passthru直通模式后, 找不到硬盘的问题
There is no easy way to do it, it seems. So I wanted to say that I couldn't afford to do an upgrade ...
- go调查内存泄漏
curl x.x.x.x/debug/pprof/heap > base.heap 过段时间 curl x.x.x.x/debug/pprof/heap > current.heap go ...
- python bmp转jpg 且灰度图转彩色
今天在简书,上看到了一个 bmp转jpg的代码,便记录一下. # coding:utf-8 import os from PIL import Image # bmp 转换为jpg,灰度图转RGB d ...
- 【练习】Python第三次
对函数,内置函数的用法,递归,程序运行顺序的考试 1.列举布尔值为 False 的值 0 False '' [] () {} None 经常使用的场景是 if object 如果object有值就执行 ...
- python之字符串拼接:%和format
使用百分号拼接字符串: 例如: msg='i am %s my hobby is...' %'abc' print(msg) 如果需要用2个%s呢?就使用括号例如: msg='I am %s my h ...