贪吃蛇智能体控制器

1.测试平台部署

  • 通过该网址https://github.com/kingofprank/snake 部署实验应用:


2.AI智能体核心代码

  • 使用AI:GPT 4.0
  • 核心代码:
#include "uselei.h"
#include <algorithm>

#include <queue>
#include <vector>
#include <windows.h>


// 必须严格匹配测试平台要求的函数签名
extern "C" __declspec(dllexport) int player_1(int *cmd) {
  // 1. 解析游戏状态
  const int food_x = cmd[0];
  const int food_y = cmd[1];
  const int grid_size = cmd[4];

  // 2. 重建地图
  std::vector<std::vector<int>> game_map(grid_size,
                                         std::vector<int>(grid_size));
  for (int i = 0; i < grid_size; ++i) {
    for (int j = 0; j < grid_size; ++j) {
      game_map[i][j] = cmd[40 + i * 40 + j];
    }
  }

  // 3. 重建蛇身
  std::vector<point> snake_body;
  const int body_len = cmd[2005];
  for (int i = 0; i < body_len; ++i) {
    point p;
    p.x = cmd[2006 + 2 * i];
    p.y = cmd[2006 + 2 * i + 1];
    snake_body.push_back(p);
  }
  point head = snake_body[0];

  // 4. 方向决策逻辑
  const int dx[] = {-1, 0, 1, 0}; // 上、右、下、左
  const int dy[] = {0, 1, 0, -1};

  // 安全移动检查
  auto is_safe = [&](int x, int y) {
    if (x < 0 || x >= grid_size || y < 0 || y >= grid_size)
      return false;
    return game_map[x][y] != 1 && game_map[x][y] != 3; // 不是蛇身
  };

  // 5. 智能决策(带优先级)
  int best_dir = -1;
  int min_dist = INT_MAX;

  // 优先靠近食物
  for (int dir = 0; dir < 4; ++dir) {
    int nx = head.x + dx[dir];
    int ny = head.y + dy[dir];

    if (is_safe(nx, ny)) {
      int dist = abs(nx - food_x) + abs(ny - food_y);
      if (dist < min_dist) {
        min_dist = dist;
        best_dir = dir;
      }
    }
  }

  // 没有安全路径时选择第一个安全方向
  if (best_dir == -1) {
    for (int dir = 0; dir < 4; ++dir) {
      int nx = head.x + dx[dir];
      int ny = head.y + dy[dir];
      if (is_safe(nx, ny)) {
        best_dir = dir;
        break;
      }
    }
  }

  // 完全无路可走时返回随机方向(避免崩溃)
  return (best_dir != -1) ? best_dir : rand() % 4;
}

// DLL入口点(必须添加)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call,
                      LPVOID lpReserved) {
  return TRUE;
}

3.测试以及测试结果分析

因为测试需要,我们人为编写一个一直向右的控制器,不妨碍智能体单人行为,同时导出动态dll文件,其中智能体为player_1,
向右为player_2,运行测试,结果如下:

可以看到ai取得胜利,我们来分析一下智能体编写的策略优势:

  • 优先选择靠近食物的方向。这种策略使得智能体能够更有效地获取游戏中的资源。
  • 在没有安全路径时,智能体会选择第一个安全方向,避免了因无路可走而导致的崩溃。这种设计提高了程序的鲁棒性。
  • 当智能体无法找到安全路径时,返回随机方向,确保游戏不会因为决策失败而停止。这种灵活性使得游戏体验更加流畅。

这种策略有助于智能体快速地定位最近食物,但是存在局部优先却忽略全局的缺点,同时由于遇到障碍无法找到安全路径时
存在随机性,导致还有上升的空间。

posted @ 2025-06-09 19:01  哎哎呦呦喂喂0211  阅读(44)  评论(0)    收藏  举报