问题

我在做跳棋游戏时利用树来存储每一个棋子的合法路径,构造落点树时,要求遍历路径上每一个可能的落点。于是出现了一个尴尬的状况——三个落点围成了圈,如下图。

黑色实心点为棋子位置,三个虚线表示位置为形成循环的空位。其他棋子构造合法落点树时,一旦遍历到三个位置中的一个,就会陷入循环。因为棋子在三个中的任一个位置时,其余两个点都是合法落点,可以无限跳转下去,这条路径会有无限长。
出现这种情况可能是由于我写的人工智能算法不够机智,后续调试过程中发现了另外一些类似棋局状况,即三个空位形成循环。

解决办法

  1. 遍历已经形成的落点树,重复点舍去,重复次数过多时停止遍历(未实现)

    遍历已经形成的落点树显然是一种明显思路,但是对于我的程序来说实现较为复杂。
    我写的构造落点树程序在可以隔一子跳跃时发生递归,递归后只保存了部分上一层数据,也就是本次跳跃的起点或者说来路,最多只能追溯两层数据。然而形成循环基本是两次遍历以后的结果,即涉及到三层数据,以我现有的程序不满足直接判断重复落点的条件。且我也不能排除以后出现四子循环出现的可能性。

    于是考虑将落点树改为类中的一个私有变量,其在方法中的作用范围类似于全局变量(为方便表述下文称其类别为全局变量)。
    但是尝试后发现,在递归中几乎无法使用这种有层次的全局变量(有层次的变量即多维变量)。上网搜索后发现一般递归中使用全局变量都没有层次,例如利用递归求累加和等。
    后又尝试将函数中的变量作为缓存,一部分遍历完成后将结果直接替换到落点树中。没写成。总是会有重复替换,合适的替换位置不存在。

    所以从全局变量的角度来说,遍历形成的深度是没有意义的。一维变量更适合作为全局变量使用。

  2. 记录跳转次数,跳转过多时怀疑出现循环(已实现)
    没办法阻止循环出现,就在循环出现后处理。

    我写的人工智能太废柴,所以一般跳转次数不会太多,但是就算跳转很多次,有棋盘高度的限制,跳转次数一般也不会超过20。
    跳转次数基本等同于递归次数,所以递归次数有一个上限,我将其设置为10,正常来讲我的递归次数不会超过10,一旦超过就意味着有异常,我就有理由怀疑出现了循环。

    确定循环出现方法:
    我把棋子路径的六个方向分别标记为1-6,每一次跳转时记录跳转方向,列表存储,称其为方向列表。如果出现循环,则方向列表中的数据一定有循环。
    在出现循环的基础上,方向列表中的最后一个数据一定属于循环数据中的一个。检测其出现次数,就算路径方向集中,同一方向也不应该出现太多次。所以同一数据出现若超过3次,则判定为出现循环。

    处理循环的方法:
    返回空列表。(待改进,貌似有些过于简单粗暴。(但有效))

    #怀疑出现循环
    if firstMove>10:#最后一个元素一定在循环中,所以确认其数量,过大时确认为循环出现if wayOfPlace.count(wayOfPlace[len(wayOfPlace)-1])>3:#处理循环return []
    

跳棋游戏利用树构建合法路径出现循环的解决办法相关推荐

  1. 电脑为什么不能运行php文件路径,window_windows系统下英雄联盟不能启动 指定路径不存在的解决办法,小编把英雄联盟从别人电脑里 - phpStudy...

    windows系统下英雄联盟不能启动 指定路径不存在的解决办法 小编把英雄联盟从别人电脑里拉到电脑里,发现无法启动,在文件里尝试点击了几个可能是启动文件的应用程序,程序能运行但不是联盟的启动程序,后来 ...

  2. Ubuntu 修改mysql存放路径后无法启动解决办法

    Ubuntu 修改mysql存放路径后无法启动解决办法: # vi /etc/apparmor.d/usr.sbin.mysqld # /var/lib/mysql/ r, (即注释掉该行) 改为 / ...

  3. python逐行读取数据时出现错误_Python利用逐行读取readline()打印出现空行的解决办法...

    Python Python开发 Python语言 Python利用逐行读取readline()打印出现空行的解决办法 在利用readline()进行逐行读取文件的时候,我们一般使用以下程序: f=op ...

  4. 关于cmd中路径包含空格的解决办法

    关于cmd中路径包含空格的解决办法 很多人曾经都纠结于cmd中路径没有空格,昨天看到一篇文章,深受启发 1)最简单的方法就是给路径名上加上"" 然后cd或执行即可: 2)用缩写.比 ...

  5. 游戏检测到计算机性能过低,玩游戏fps低怎么办 八个问题九种解决办法

    原标题:玩游戏fps低怎么办 八个问题九种解决办法 很多人玩游戏的时候会遇到fps低的问题,说实在的,玩游戏就是要尽兴,遇到这种问题真的会让人很烦很烦很烦,所以说玩游戏的时候提高fps非常重要,根据我 ...

  6. 超凡蜘蛛侠2游戏进入商店时显示服务器,超凡蜘蛛侠2游戏闪退不能玩是什么原因?游戏黑屏进不去的原因和解决办法[图]...

    类型: 大小: 评分: 平台: 标签: 超凡蜘蛛侠2游戏闪退进不去怎么解决?很多玩家在玩游戏的时候碰到过这样的情况吧?没关系,下面是友情下载小麦搜集相关资料整理出来的游戏黑屏进不去的原因和解决办法,希 ...

  7. IIS出现:“系统找不到指定的路径”问题的有效解决办法

    IIS出现:"系统找不到指定的路径"问题的有效解决办法 今天真的是悬!好吧我还是先讲述一下我的经理来诠释我现在心中的喜悦之情.昨天给公司的服务器装了一个beian.gov.cn推荐 ...

  8. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

  9. 我的世界java一直点不开_游戏我的世界点击启动没反应的解决办法

    如果当你遇到启动游戏后无法打开游戏,甚至游戏没有任何反应时,可以尝试以下方法解决. 1.首先确认你的电脑是否安装了JAVA程序,如果没有就去装一个(直接网页搜索按提示安装即可). 2.如果即使安装了J ...

最新文章

  1. 熬夜翻译完的PureFTPd配置文件
  2. 大数据WEB阶段 TransientDateAccessResourceException
  3. 介绍python修饰器的书_python修饰器
  4. 15_新闻客户端_展示文字内容完成
  5. letsencrypt 自动续期不关闭nginx
  6. 基于MaxCompute InformationSchema进行血缘关系分析
  7. JDBC出现这个错误的解决办法Connections could not be acquired from the underlying database!
  8. linux (fc8) 下的IE
  9. leetcode刷题——415. 字符串相加
  10. mysql存储过程迭代自己获取所有子孙
  11. 改进我个人知识管理手段
  12. B站DR-CANup主电路系统建模_基尔霍夫定律的解题过程分析
  13. Lesson 1#13 作业
  14. Python 快速验证代理IP是否有效
  15. 小米4 win10 刷回android,小米4怎么从win10刷回MIUI 小米4 win10刷回MIUI系统详细教程...
  16. java简易计算器代码
  17. Git文件过大(pack文件过大)
  18. 泛泰A870 Recovery KitKat 合集
  19. 关于打开github网站慢如何解决
  20. Win11下Clion+MSYS2(MinGW64)配置C++编译环境

热门文章

  1. java实现第七届蓝桥杯平方末尾
  2. Python通过类的组合模拟街道红绿灯
  3. 雀巢近260款畅销产品集体亮相第三届进博会
  4. VUE超超超!入门介绍
  5. 英语书写_手写印刷体
  6. 41 ItemsWidget之QListWidget
  7. iOS比较常用的第三方框架
  8. hihoCoder184——满减优惠
  9. 国内网络安全公司、社区简介
  10. Java基础练习:用户在控制台输入一个年份,判断该年份是平年还是闰年