博客
关于我
qt c++实现的ai贪吃蛇吃满屏幕,超详细!(二)ai的具体实现
阅读量:572 次
发布时间:2019-03-11

本文共 1910 字,大约阅读时间需要 6 分钟。

在设计AI蛇游戏时,我专注于实现智能策略来帮助蛇吃满屏幕,而不是过多描述图形用户界面。以下是关于AI蛇实现的详细内容。

AI策略说明

AI蛇的本质是一个追踪食物同时躲避自我碰撞的路径规划问题。在一个方格图中,每移动一步,整体局面都在变化。通过将蛇的行动模式分解为一个策略问题,可以简单地解决这个看似复杂的问题。

关键点在于:

  • 蛇头占据一个位置。
  • 蛇尾留出一个空格。
  • 当蛇头能找到一条从自身到蛇尾的路径时,蛇处于安全状态。
  • 基于此,我设计了一个策略:

  • 当真蛇(用于区分实际蛇和虚拟蛇)能找到食物路径时,派出一条虚拟蛇去吃食物。
    • 若虚拟蛇返回安全(即虚拟蛇头能到达虚拟蛇尾),则由真蛇执行。
    • 否则,真蛇随机移动。
  • 如果真蛇无法找到食物路径,仅能随机移动或朝蛇尾方向走。
  • 路径寻找的具体实现

    通过BFS算法找到最短路径来实现食物和头尾的相互路径判断。路径长度通过权值计算,确保搜索效率。BFS遍历整张图,争取找到最短路径。

    代码实现

    以下是用于路径规划的关键部分:

    //serviceName: snakeAI//Include necessary headers#include 
    #include
    using namespace std;//_DIRECTION Defines// ... 其他代码省略bool snakeAI::bfs(snake &currentSnake, unit_block target) { // 初始化 queue
    bfsQueue; bfsQueue.push(currentSnake.head / 10, currentSnake.head / 10); // Out-of-bound checks if (target.x < 0 || target.x >= 43 || target.y < 0 || target.y >= 43) return false; // BFS Architecture while (!bfsQueue.empty()) { auto current = bfsQueue.front(); bfsQueue.pop(); // 取下邻各点 for (auto dir = 0; dir < 4; dir++) { int x = current.x + dx[dir]; int y = current.y + dy[dir]; if (x < 0 || y < 0 || x >= 43 || y >= 43) continue; if (blockWall(x, y) || currentSnake.body.find({x, y})) continue; if ( visited[x][y] == 0 ) { // 第一步访问 visited[x][y] = true; bfsQueue.push({x, y}); distance[x][y] = distance[current.x][current.y] + 1; } else if (distance[x][y] > distance[current.x][current.y] + 1) { // 已经访问过但有更短路径 distance[x][y] = distance[current.x][current.y] + 1; } } if (current == target) return true; } return false;}

    这个函数检查当前蛇是否能找到到目标点(食物或身后)的最短路径。若能,返回路径;否则,返回失败。

    总结

    通过BFS算法实现路径规划,结合蛇的策略逻辑,AI能够有效引导蛇移动,确保安全性。 虚拟蛇和真蛇的双重机制既保证了效率,又避免了自我碰撞。

    转载地址:http://oprvz.baihongyu.com/

    你可能感兴趣的文章
    API_Net官方代码之训练网络
    查看>>
    Python机器学习(五十二)SciPy 基础功能
    查看>>
    Python机器学习(六十五)Matplotlib 入门
    查看>>
    关于WebView当前地址问题的疑惑
    查看>>
    Python机器学习(九十二)Pandas 统计
    查看>>
    大数据集群运维(24)kylin 系列(一)安装部署
    查看>>
    项目实战 从 0 到 1 学习之Flink (26)Flink采集kafka数据后存到mongodb
    查看>>
    项目实战从0到1之hive(24)企业级数据仓库构建(六):数仓理论及数仓搭建
    查看>>
    智能网联改装实训整车,智能网联汽车实训台
    查看>>
    SecSolar:为代码“捉虫”,让你能更专心写代码
    查看>>
    a标签常用属性——你是否都用过?
    查看>>
    Trying to construct an instance of an invalid type
    查看>>
    使用Qt将图片转换为灰度图
    查看>>
    Android TraceView分析日志
    查看>>
    iOS UIPickerView和UIDatePicker控件
    查看>>
    1965 - 2019 年最流行的编程语言变化
    查看>>
    XML数据如何进行解析呢,方式有哪些?
    查看>>
    Ubuntu16.04安装谷歌浏览器
    查看>>
    如何设置Mosquitto MQTT服务器并从OwnTracks接收数据
    查看>>
    链上钱包的博彩雷区
    查看>>