AI创想家:迷宫寻宝大挑战

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

作者:lqk30875

物联沃分享整理
物联沃-IOTWORD物联网 » AI创想家:迷宫寻宝大挑战

发表回复