AI创想家,迷宫寻宝

打印 上一主题 下一主题

主题 1718|帖子 1718|积分 5154

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表