You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于字典的元素优先级处理:Python简易类星际争霸挖矿算法开发

类星际争霸游戏挖矿算法实现方案

嘿,我来帮你搞定这个类星际争霸游戏里的挖矿算法问题!刚好之前折腾过类似的游戏逻辑,给你梳理下清晰的实现思路和代码示例。

核心需求拆解

咱们的目标很明确:让采矿飞船自动计算自身和所有小行星的距离,挑最近的那一颗去开采。首先得明确,你的游戏字典database里得补上飞船和小行星的坐标信息(不然没法算距离嘛),我先完善下示例数据,方便后续演示:

database = {
    'player1': {
        'type': 'player',
        'ships': {
            'shipOne': {
                'life': 3,
                'type': 'excavator-M',
                'taille': 5,
                'tonnage': 4,
                'remaining_tonnage': 4,
                'status': 'idle',
                'position': (10, 20)  # 新增飞船的2D坐标(x,y)
            }
        }
    },
    'asteroids': {  # 新增小行星数据集
        'asteroidA': {
            'type': 'iron',
            'position': (15, 25),
            'remaining_resources': 100
        },
        'asteroidB': {
            'type': 'gold',
            'position': (5, 10),
            'remaining_resources': 80
        },
        'asteroidC': {
            'type': 'silver',
            'position': (20, 30),
            'remaining_resources': 120
        }
    }
}

分步实现逻辑

1. 先搞定距离计算

星际场景里用欧几里得距离最直观,公式是√[(x2-x1)² + (y2-y1)²]。不过如果只是用来比较远近,完全可以省略开根号的步骤——直接比较平方值就行,性能还能提升不少。

import math

# 标准欧几里得距离计算(用于显示实际距离)
def calculate_distance(pos1, pos2):
    x_diff = pos2[0] - pos1[0]
    y_diff = pos2[1] - pos1[1]
    return math.sqrt(x_diff**2 + y_diff**2)

# 仅用于比较远近的平方值计算(更快)
def calculate_distance_squared(pos1, pos2):
    x_diff = pos2[0] - pos1[0]
    y_diff = pos2[1] - pos1[1]
    return x_diff**2 + y_diff**2

2. 编写找最近小行星的核心函数

这个函数会遍历所有小行星,跳过已经被采空的,然后找出距离当前飞船最近的那一颗:

def find_closest_asteroid(ship_data, asteroids_data):
    """给定单艘飞船数据和所有小行星数据,返回最近的可开采小行星信息"""
    ship_pos = ship_data['position']
    closest_asteroid = None
    min_distance = float('inf')  # 初始化最小距离为无穷大
    
    for asteroid_id, asteroid_info in asteroids_data.items():
        # 跳过资源耗尽的小行星(可选逻辑,根据你的游戏规则调整)
        if asteroid_info['remaining_resources'] <= 0:
            continue
        
        # 计算当前小行星到飞船的距离(这里用标准距离,也可以换成平方值)
        current_distance = calculate_distance(ship_pos, asteroid_info['position'])
        
        # 更新最近小行星记录
        if current_distance < min_distance:
            min_distance = current_distance
            closest_asteroid = {
                'id': asteroid_id,
                'info': asteroid_info,
                'distance': round(min_distance, 2)  # 保留两位小数更友好
            }
    return closest_asteroid

3. 调用示例(整合到游戏逻辑里)

现在把函数和你的游戏字典结合起来,看看实际效果:

# 从数据库中取出玩家1的采矿飞船
player_ship = database['player1']['ships']['shipOne']
# 取出所有小行星数据
all_asteroids = database['asteroids']

# 找到最近的小行星
target_asteroid = find_closest_asteroid(player_ship, all_asteroids)

if target_asteroid:
    print(f"飞船[{player_ship['type']}]将前往最近的小行星:{target_asteroid['id']},距离:{target_asteroid['distance']}")
    # 这里可以添加飞船状态更新、移动逻辑,比如:
    player_ship['status'] = 'moving'
    player_ship['target_asteroid'] = target_asteroid['id']
else:
    print("警告:没有可开采的小行星了!")

扩展优化建议

  • 多飞船支持:如果玩家有多个采矿飞船,只需要循环遍历database['player1']['ships']里的所有飞船,分别调用find_closest_asteroid即可
  • 3D场景适配:如果你的游戏是3D的,把坐标改成(x,y,z),距离计算改成√[(x2-x1)² + (y2-y1)² + (z2-z1)²]就行
  • 资源优先级:如果想优先开采黄金、稀有矿石这类资源,可以在比较距离时加入权重,比如黄金的距离乘以0.8,让它在距离稍远时也能被优先选中
  • 实时更新:游戏运行时,飞船和小行星的位置可能变化,需要定时(比如每帧)调用这个函数更新目标

内容的提问来源于stack exchange,提问作者Manoa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:48:24