我正在尝试创建一个可点击的地图游戏(如Risk),其中我有许多类似于此的svg路径:
Example SVG Map
因此,当玩家1点击玩家2的区域以攻击它时,所点击的区域应该与玩家1的区域有边界,否则其他攻击无效。
我认为在多维数组中存储所有路径及其相邻路径,如下所示:
path[0] -> path[0][0] path[0][1] path[0][2]
path[1] -> path[1][0] path[1][1]
但是因为我的地图很大,所以我这样做是非常低效的。关于如何解决这个问题的任何建议?
答案 0 :(得分:2)
创建国家/地区表
包含邻接信息,每个国家通常最多有7个邻居,除非你有像梵蒂冈,卢森堡这样的小州......所以对于统一的地图细分,你可以使用静态的邻居数量。像这样:
int map[countries_max][neighbors_max];
统一地图划分
有更多方法可以获得邻接信息。对于均匀划分的地图,您可以计算通常靠近国家中心的边界路径的平均点。获取每个国家/地区点并找到距离它最近的国家/地区(点)。如果距离较小,则阈值存储邻居列表中的国家/地区索引。阈值可以是国家/地区的大小(对于矩形分割,每个轴需要2个阈值)。
通用地图划分
您需要检查国家/地区边界路径的任何部分是否接近/平行于其他国家/地区边界路径的任何部分。如果是,则将国家索引存储在邻居列表中。只有拥有边界路径时才可以这样做。
通用地图划分(无边框路径)
如果您的地图是栅格或矢量但不是每个国家/地区的封闭多边形/路径形式(例如,您可以使用分割路径),则上述方法无法使用。当你攻击时你知道攻击的开始和结束位置,从头到尾(DDA或Bresenham)投射线并计算你穿过的边界线数(计算颜色边缘)。如果计数为1,则移动有效。如果您多次跨越相同边界进行攻击,则会出现假阴性。
答案 1 :(得分:1)
我认为将数组用于此类事情的想法并不是正确的方法。
你应该尝试创建一个class Map
,这个类中的所有函数都代表一个区域,所有玩家都是这个类的对象。这样做,你可以控制情况更简单。
例如:要知道player1是否已经获得了地图的这一部分,您只需要查看函数player1.Brazil
(其中Brazil
是否是函数内部的函数对象player1的class Map
已经有一个flag = True。此标志为boolean
,每当您获得该区域时,您应将此标志更改为True。
因此,通过比较玩家1和玩家2的两个函数以及简单的if
语句,您可以创建一个尊重游戏规则的相邻路径。