Skip to content
wujayway edited this page Aug 25, 2012 · 12 revisions

基本规则

游戏地图场景如下:

场景

  • 游戏场景由一个个的星球, 以及星球之间的路径组成。
  • 每个星球有这样的一些属性: def防御指数, res资源指数, max最大生产数量。 上面的图片中有这样的标识。
  • 标识例子: ⊙1.2 ★1 + 5 , 表示这个星球的基本属性。 ⊙1.2表示def防御系数,★1 + 5 表示资源系数res和cos, ≥100 表示max最大生产数量, 这些系数是应用在生产, 防御上面的, 具体见下方对应区域的说明。

游戏进行时候的场景如下, 建议看一下在线Demo来了解一下游戏的过程:

游戏进行阶段场景

  • 每个玩家开始的时候, 会被指派一个星球作为母星, 然后会拥有一定数量的单位, 放置在星球上面。
  • 当一个星球被玩家占据的时候, 星球颜色会变化, 上面会显示星球上面有多少玩家的单位占据。
  • 游戏以回合制进行. 每个回合进行单位生产, 玩家移动, 战斗判断等动作。
  • 每个回合中, 玩家可以做的操作就是派遣单位去别的星球, 星期间的距离就是从一个星球到达另外一个星球需要花费的回合数(图中没有指示, 游戏开始的时候可以通过单位在不同的星球间移动的速度看出, API会提供这些数据)。
  • 上面图片中, 小的有颜色圆圈表示从一个星球派往另外一个星球的单位。
  • 当回合限制到达或者只有一个玩家剩下的时候, 游戏结束. 胜利判断按照: 星球总数, 单位数量, 玩家顺序 依次判断数值哪个玩家最高来算. (不会出现平局)

计策

每个回合, 玩家除了可以控制单位的移动以外, 还可以进行一次的计策操作(协议见 通讯协议里面moves)。 每个回合玩家都会获得一个点数(points), 然后不同的计策消耗不同的点数。 计策类型如下:

  • terminator 毁灭武器 选择一个星球, 消灭所有上面的单位, 下一个回合起效。 消耗点数: 3, 参数: planet(对应的星球编号)
  • defend 防守星球(未实现)
  • attack 攻击(未实现)
  • fast 快速移动单位到一个星球(未实现)
  • teleport 传送(未实现)
  • halt 停止一个星球单位的生产。(未实现)
  • boost 加速一个星球单位的生产, 双倍生产。(未实现)
  • eleminate 毁灭所有敌人。(未实现)
  • swap 和一个玩家的单位和星球转换。(未实现)
  • god 单位无敌, 能够立刻消灭目标所在星球所有的人。(未实现)

维护费用

  • 需在地图文件中增加一行 maintain_fee: True 主动激活此限制
  • 每个玩家的兵力总数(units)超出一定数量(mt_base_line)时, 生产速度会减慢
  • < mt_base_line 按照普通方式增长
  • < mt_base_line * 1.5 增长速度减半
  • < mt_base_line * 2 增长速度再减半
  • mt_base_line * 2 完全不增长

  • mt_base_line 计算方法: 地图上所有星球的 max 属性求和后折半再除以在线玩家数
def adjust_mt_fee(self):                                                                                                                                                                                
    """动态调整维修费用"""
    active_players = len([i for i in self.players if i.alive])
    self.mt_base_line = int(self.map_max_units / float(2) / active_players)

回合进行内容

回合顺序和操作

一个回合做的操作顺序是这样的:

  • 生产回合. 所有星球的人口计算生产.
  • 玩家回合. 每一个玩家依次控制单位移动, 单位立刻消失, 放置在路线上面. 玩家可以随意设置移动单位数量和次数.
  • 到达回合. 在航行的单位, 如果时间凑到了路程数, 就出现在目的星球.
  • 战斗回合. 如果一个星球同时有2个阵营的部队存在, 进入战斗过程.

至此一个回合结束.

生产回合

所有星球上面的驻军数量会按照下面的算法改变.

  • planet_count 星球现有单位数量
  • res 星球资源系数, 系数增长部分(0<=res)
  • cos 星球资源系数, 常量增长部分(0<=cos)
  • max 星球最大生产量

我们使得星球驻军的增长速度以res为比例,以cos为常数进行增长. 那么,新的星球的单位数量将为planet * res + cos向下取整后的结果,并保证其增长不会超过max. 具体的细节如下:

new_count = int(planet_count * res + cos)
if planet_count < max:
    planet_count = min(new_count, max)
elif new_count < planet_count:
    planet_count = new_count

战斗回合

  • 战斗都发生在星球和驻军之间, 如果同时有好几方到达一个星球, 则对每一方进行战斗力统计,战斗力最高的一方获胜
  • 防守方的战斗力进行def加权, 星球的单位 X def 当作星球的战斗力量,如果防守星球有援军到达,援军的战斗力并不享受def加成
  • 计算伤害时,为了模拟数量优势,采用以下方法:
    • 双方交战
    • 双方数量一样, 同时全灭
    • A>B的时候, B全灭, A剩下A-B/(A/B) ( B/(A/B) 部分为造成的伤害,A越多造成的伤害越小,B越多造成的伤害越大,伤害向上取整后再从A的总数中去除)
    • B>A时同理
    • 多方交战
    • 战斗力最高的两方战斗力一样,所有交战方全灭
    • 设交战方为A、B、C、D,战斗力最高为A,则B、C、D全灭。A剩下A-(B/(A/B)/3+C/(A/C)/3+D/(A/D)/3) ,原理同双方交战
  • 如果驻守方胜利, 除回def系数, 去掉小数部分到整数作为剩下的数量.

举例1

  • 比如: 星球驻军10, 星球防御1.4, 攻击方数量12.
  • 加权重: 12 vs 14
  • 进攻方全灭, 防守方 = (14 - UPROUND(144/14))/1.4 = 3/1.4 = 2

举例2

  • 比如:星球B驻军10,星球防御1.5,援军B=10,攻击方A=12,攻击方C=50,攻击方D = 30
  • 计算战斗力
  • B = 10 * 1.5 + 10 = 25
  • A = 12
  • C = 50
  • D = 30
  • 战斗力最高的为 C方,所以C获胜,A、B、D全灭。C剩余部队数量计算如下: 50-(UPROUND(25/(50/25))/3 + UPROUND(12/(50/12))/3 + UPROUND(30/(50/30))/3) =50-(5 + 1 + 6) = 38