马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import api
import math
# 判定玩家是否必要离场
def ShouldLeave():
context = api.get_context()
# 玩家和止境信息
me, exit = context.me, context.exit
# 计算到止境距离
distance = len(api.check.path(me, exit))
# 判定是否必要离场
ret = (me.energy <= distance + 1)
return ret
# 缓存计算数据,每回合一次
def cache():
context = api.get_context()
round = context.round
# 获取玩家的宝石收集情况
data = context.me.item_count.items()
# 忽略宝箱, 只统计宝石信息
data = {k:v for k, v in data if k != 'box'}
# 得到收集数目最少的宝石
least = min(data.values())
# 得到成套宝石中, 还缺少的宝石名称
ret = [k for k, v in data.items() if v == least]
context.set('cc', ret)
print(f'第{round}回合, 待收集的宝石: {ret}')
# 获取回合数
record = context.get('record')
if not record:
record = dict({0: {}, 1: {}})
enemy = context.players.get(1)
if enemy:
record[round % 2]['enemy'] = enemy
me = context.me
record[round % 2]['me'] = me
context.set('record', record)
# 计算坐标附近的宝石数目
def GetNearCount(row, col):
items = api.get.items()
count = 0
for item in items:
if abs(item.row - row) <3:
if abs(item.col - col) <3:
start = (row, col)
l = len(api.check.path(start, item, player_id=-1))
if l < 3:
count +=1
return count
# 估算物品的价值
def EstimateItemValue(item):
context = api.get_context()
me = context.me
formula = 1 # 计算公式数值
# 计算物品附近的宝石, 优先前往资源丰富的地区
nearCnt = GetNearCount(item.row, item.col)
if nearCnt > 1:
print(f'X {nearCnt} {item}')
formula *= nearCnt
# 计算玩家到物品距离
self_distance = len(api.check.path(me, item))
# 获取待收集的宝石
allOne = context.get('cc')
allOneCnt = len(allOne)
# 假如是待收集的宝石
isBelongToAllOne = item.name in allOne
if isBelongToAllOne:
formula *= (5 / allOneCnt)
# 假如有对头
enemy = context.players.get(1)
if enemy:
enemy_score = enemy.score
enemy_distance = len(api.check.path(enemy, item,player_id=enemy.id))
# 获取对头的上一回合信息
record = context.get('record')
prev_enemy = record[(context.round + 1) %2].get('enemy')
# 假如对头离宝石更近
if enemy_distance < self_distance:
formula *= 0.5
if prev_enemy:
prev_enemy_distance = len(api.check.path(prev_enemy, item,player_id=enemy.id))
# 假如对头正在远离宝石
if prev_enemy_distance < enemy_distance:
formula *= 2
# 否则对头正在靠近宝石
else:
formula *= 1
elif enemy_distance == self_distance:
formula *= 2 if me.order < enemy.order else 0.5
else: # 假如对头离宝石更远
if prev_enemy:
prev_enemy_distance = len(api.check.path(prev_enemy, item))
# 假如对头正在远离宝石
if prev_enemy_distance < enemy_distance:
formula *= 1
# 否则对头正在靠近宝石
else:
formula *= 2
# 假如物品是宝箱
isBelongToBox = item.name == 'box'
if isBelongToBox:
formula *= 3
# 距离短就优先思量, 距离过长就主动放弃
formula *= 16 / (math.pow(self_distance, 2))
return formula
# 探求最有价值的物品
def findBestValueItem():
items = api.get.items()
estimate = lambda item: (EstimateItemValue(item), item)
bestInfo = max([estimate(item) for item in items],key=lambda t: t[0])
bestValue, bestItem = bestInfo
print(f'最有价值物品: [Value = {bestValue:.2f}][Item = {bestItem}]')
return bestItem
def update(context):
cache()
if ShouldLeave():
exit = context.exit
print(f'前往出口 {exit}')
direction = api.check.next(exit)
else:
item = findBestValueItem()
print(f'前往物品 {item}')
direction = api.check.next(item)
return direction
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |