前言: 在第一篇文章中(link),我们讨论了 如何用 pygame 写一个小游戏,并用键盘交互控制 。接下来,我们将分别用 DFS 、BFS 、DRL 实现自动控制。这篇文章讨论了什么是深度优先搜索,如何匹配其到我们的小游戏上。

使用深度优先搜索方法实现游戏的自动控制

本文涉及一个 .py 文件:

dfs_play.py


如上图,我们将使用“深度优先搜索”的方法,来控制黑色方块自动闯关。

所谓“深度优先搜索”,即:

  • 搜索:精准预测下一步操作后,黑色方块将到达什么位置;并再次精准预测在这个位置进行操作后,黑色方块将到达什么位置…直到触发终止条件,即找到最终得分的路径;
  • 深度优先:假设黑色方块有两个动作可以选择:A与B,那么黑色方块做出“选择A后应该到达的位置”的预测后,继续接着这条路径预测,而非去预测在初始状态下“选择B后应该到达的位置”。具体原理如下图。


图片生成自:https://visualgo.net/zh/dfsbfs

为了更好地了解 DFS 的特性,你可以用 BFS(广度优先搜索) 进行对比:

如何用 DFS 匹配我们的小游戏

在我写的小游戏(小游戏项目地址,小游戏代码结构详解)中,我们的小方块时刻面临三个选择:

  • 给自己一个左上的力;
  • 给自己一个右上的力;
  • 什么也不做,这一时刻任由自己受重力牵制而掉落。

因此,我们每层也就有三个结点,如下图:

但是因为算法本身的时间复杂度过大,我们可以不考虑“什么也不做”这一动作。否则,将如下图,需要搜索的结点过多,导致程序运行过慢或内存溢出。

这样,每层的父结点就只有两个子结点,大大减少需要遍历的空间。

使用递归的实现

我使用递归来实现 DFS 算法,我大概描述一下这个过程。数据结构不够硬的同学,应该静下心来读读我的源码、或者其他经典的 DFS 教程、或者刷刷 LeetCode 。

我的源码见:https://github.com/PiperLiu/Amazing-Brick-DFS-and-DRL/blob/master/dfs_play.py

final_s_a_list = []
def dfs_forward(root_state, show=False):# 最后需要返回的就是这个(状态、动作)列表global final_s_a_listfinal_s_a_list = []# 在内部定义 dfs ,用于递归# 在递归过程中,修改 final_s_a_list 的值# 总是保留目前最优解def dfs(state, s_a_list):global final_s_a_list# a trick# 每次结点的排列都不一样# 这样搜索速度更快# 能更快地找到可行解if len(s_a_list) % 2 == 1:ACTIONS_tmp = (2, 1)else:ACTIONS_tmp = (1, 2)for action in ACTIONS_tmp:if len(final_s_a_list) > 0:breaknew_state = move_forward(state, action)new_s_a_list = s_a_list.copy()new_s_a_list.append((new_state, action))if check_crash(new_state):if show:# 绘图部分pygame.draw.rect(SCREEN, (255, 0, 0), \(new_state['x'] - game_state.s_c.x, new_state['y'] - game_state.s_c.y, game_state.player.width, game_state.player.height))pygame.display.update()del new_statedel new_s_a_listelse:if show:# 绘图部分pygame.draw.rect(SCREEN, (100, 100, 100), \(new_state['x'] - game_state.s_c.x, new_state['y'] - game_state.s_c.y, game_state.player.width, game_state.player.height))pygame.display.update()if check_for_score(new_state):if show:# 绘图部分pygame.draw.rect(SCREEN, (0, 0, 255), \(new_state['x'] - game_state.s_c.x, new_state['y'] - game_state.s_c.y, game_state.player.width, game_state.player.height))pygame.display.update()final_s_a_list = new_s_a_listbreakdfs(new_state, new_s_a_list)# 开始递归dfs(root_state, [])return final_s_a_list

我这里 DFS 算法效果较好:

python dfs_play.py

输入参数 --display 可以查看寻路过程:

python dfs_play.py --display

源码:https://github.com/PiperLiu/Amazing-Brick-DFS-and-DRL

欢迎 star 。

【深度优先搜索】一个实例+两张动图彻底理解 DFS | DFS 与 BFS 的区别 | 用 DFS 自动控制我们的小游戏相关推荐

  1. 【广度优先搜索】一个实例+两张动图彻底理解 BFS | 思路+代码详解 | 用 DFS 自动控制我们的小游戏

    前言: 在 第一篇文章 中,我们讨论了 如何用 pygame 写一个小游戏,并用键盘交互控制 .接下来,我们将分别用 DFS .BFS .DRL 实现自动控制.DFS 已经在 这篇文章 中讨论过,现在 ...

  2. 彻底明白TCP的三次握手与四次挥手的两张动图

    常用的熟知端口号 应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL 熟知端口 21,20 69 23 25 53 80 22 3306 传输层协议 TCP UD ...

  3. 两张动图,彻底明白TCP的三次握手与四次挥手

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:22j.co/bVws 通过上一篇中 网络模型中的IP层 的介绍,我 ...

  4. 你们要的动图来了:2张动图快速理解高内聚与低耦合

    模块 模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决. 耦合主要描述模块之间的关系, 内聚主要描述模块内部. 模块的粒度可大可小, 可以是函数, 类, ...

  5. 谷歌AI最新3D数据集,1.5万张动图,让AR主宰你的生活

    谷歌AI最新3D数据集,1.5万张动图,让AR主宰你的生活 这是谷歌的开源3D物体数据集Objectron,包含15000份短视频样本,以及从五个大洲.十个国家里收集来的400多万张带注释的图像. 作 ...

  6. HighNewTech之5G网络:带你了解5G网络的前世今生—两张长图帮你捋清思路

    High&NewTech之5G网络:带你了解5G网络的前世今生-两张长图帮你捋清思路 目录 5G简介 第一张图理解5G 第二张图理解5G 技术原理 主要功能 发展前景 5G简介 5G网络是第五 ...

  7. 两张趣图助你理解 HTTP 状态码

    转载自   两张趣图助你理解 HTTP 状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. 我们可以通过查看HTTP状态码来判断服务器状态, ...

  8. 4 张动图解释为什么(什么时候)使用 Redux

    dev-reading/fe 是一个阅读.导读.速读的 repo,不要依赖于 dev-reading/fe 学习知识.本 repo 只是一个快速了解文章内容的工具,并不提供全文解读和翻译.你可以通过本 ...

  9. 秒懂物理计算机出题规划,57张动图, 让你秒懂高中物理原理! 考试次次拿第一

    原标题:57张动图, 让你秒懂高中物理原理! 考试次次拿第一 物理不像语文或者英语,文科的东西记的东西偏多,理解的成分偏少,但物理理解的成分很重,要死记硬背的东西反而很少. 要想把物理学好,先要把简单 ...

最新文章

  1. 2019年度最受欢迎中国开源软件公布
  2. 「Ubuntu」系统常用命令
  3. 【原创】【狗眼看股】【2008-4-25】干扰了节奏,改变不了趋势
  4. 基于Linux解决登录ssh客户端失败问题—sshd error: could not load host key
  5. 7、STC12C5A60S2核心芯片说明文档
  6. java poi PAGELAYOUT_Apache POI PPT - 幻灯片布局( Slide Layouts)
  7. STM32F429第二篇之推挽输出与开漏输出
  8. Outlook-没有自动回复-使用规则创建外出邮件
  9. 硬件防火墙和软件防火墙的比较
  10. 海内存知己,天涯若比邻
  11. dubbo-go 中如何实现远程配置管理?
  12. AAM Alignment最后一篇:Robust AAM Alignment with Occlusion
  13. RFID技术应用及其发展趋势分析
  14. java程序怎么写_java程序怎么写
  15. 全站最详细的Python numpy 搭建全连接神经网络模型教程(理论计算+代码实现)(不止能预测手写数字数据,准确率93.21%)
  16. Lenet5实现及代码详解——以MINST数据集为例
  17. Windows 10超级简单的重置方法
  18. 1、树莓派4B设置热点,一步步细心来
  19. java输入长和宽输出面积_用Java实现计算矩形的面积与周长
  20. stm32F407-------电容触摸按键

热门文章

  1. 【Hive】Hive的三种交互方式
  2. WIN10安装和使用MySql5.6中遇到的一些问题与解决
  3. ng-bind-html在ng-repeat中问题的解决办法
  4. 异常详细信息: System.UnauthorizedAccessException: 对路径的访问被拒绝。
  5. 在win10环境中安装xilinx vivado IDE时出现的问题及解决方法
  6. 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法
  7. CoffeeScript中的三元操作
  8. 我可以隐藏HTML5号码输入的旋转框吗?
  9. XmlHttpRequest错误:Access-Control-Allow-Origin不允许使用原点null
  10. 为什么++ [[]] [+ []] + [+ []]返回字符串“ 10”?