多图剖析python玩“跳一跳”的识别算法,附代码(文末附赠教程)
对游戏画面识别的代码是边试边改,比较乱,问的较多,解释下思路。毕竟咱们玩游戏的乐趣不在于名次本身,而在于体验用python解决问题的过程。研究出算法才是乐趣所在。
(文末附完整实验代码下载办法)
一、找到跳跃目的地的算法
1、找目的地顶点的算法
从顶部肯定是背景的位置开始,取该点颜色作为标准背景色,然后逐行扫描,直到遇到一个颜色明显不是背景的点,就找到了目的地的顶点。
分析图片可知,目的地或圆或方,但是顶部都是收敛的,因此这样逐行扫描总能找到一个顶点。
、找目的地中心点的算法
由图可知,目的地顶面都是规则的圆或者方,因此其中心点必定在最长的横线上
以
们如果能识别出物体轮廓,便能自上而下逐行确定其宽度,宽度自开始是逐行增加的,一旦找到某一个位置,其后宽度不变或者减少,那么那个位置就是中心点所在的行了。
确定轮廓的问题主要是要解决阴影的干扰。由于这个游戏图像很简单,图像都是轴对称图像,阴影也都只可能是一个方向的,因此可以推断,任何物体起码有一侧,左侧或者右侧是无阴影的,即该侧是和背景色直接接壤的。
因为是轴对称图像,从轴往两边试探背景色,应该距离相差不大,如果有差别,肯定是一侧因为阴影存在而距离变长,所以直接放弃较长值,以较短一侧为准,就能排除阴影干扰准确计算出物体每行的宽度。
现在我们从上往下搜索能找到目的地物体的顶点,找到顶点的x也就是中心点的x,又自顶点向下逐行搜索到物体最宽行,于是又确定了中心点y。因此中心点坐标搜索成功。
注意两个要点,由于屏幕背景是自上而下渐变色,直接用上部的背景色为标准和下部的色差较大,因此代码中采取了逐行修正的办法。每一行都统计出该行中最接近背景色的颜色,然后作为新的标准背景色使用。
其次,每次都命中目标中心点实在不像人工操作,因此可以加一个允许跳跃误差,把目标的中心点参杂一些误差而成为一段区间,跳跃往该目标区间随机跳跃。
二、找小人的算法
找小人的算法是简单而粗暴的,就是简单的在小人脚部用取色器取色。
然后尝
下,把搜索到的接近色标记为红色,一看,发现很集中
因此就单
把坐标取了个均值画个十字,发现精度很不错可以直接用。就完成了。
最后,想学习Python的小伙伴们!
请关注+私信回复:“学习”就可以拿到一份我为大家准备的Python学习资料!
pytyhon学习资料
python学习资料