近来无事,又研究其了之前看到过的自动连连看的代码,碰到了一些问题, 因此做下笔记
pywin32
- win32gui:定位窗体,操作窗体
- win32api:提供API,操作鼠标、键盘
- win32con:具体API事件
==>对于窗体的操作使用win32gui;而对键盘、鼠标操作可以用更高级封装的库pymouse、pykeyboard;剪切板使用win32clipboard
程序的设计:
getWindowPosition
=>先确定游戏窗口位置pos,并置顶getScreenImage()
==>在窗口置顶后再截图getAllSquare()
=>找到游戏边界,pos[0]+100
,pos[1]+100
,即中间所有图块部分。切割出所有图案;getAllSquareTypes()
将所有图案进行比较分类,归纳出所有不同的种类
1 | # ndarray的切片方法,[纵坐标起始位置:纵坐标结束为止,横坐标起始位置:横坐标结束位置] |
getAllSquareRecord()
==>将不同种类的图案做映射,转换成相对应的数字矩阵。autoRemove(result, board_pos)
==>执行自动消除Matcher类
==>实现游戏规则: 横消,纵消, 单拐点消除,双拐点消除。需要注意跟QQ连连看不同的是没有实现更高阶的拐点消除。
附录: 遇到的问题
列表的清空
代码中有一段,在line满了后,会将line清空,再添加
1 | if len(line) == V_NUM: |
注意: 这边的写法line = []
是可行的。而line.clear()
是不行的。原因是涉及内存空间引用问题
原因在于: list.clear()
会清除当前变量指向的内存地址内容,而line = []
其实是指向了另一块地址。因此导致了最终的结果是line = []
的result为[[1,2,3...], [2, 3, 4...]]
;而list.clear()
的result全为空[[],[],[]]]
1 | a= [1, 2, 3] |
图片的维度问题:
开源代码提供的empty.png图片规格为: 25*21像素。而25对应的为y, 21对应的为x。而需要注意的是在代码中,表达为img[0: 25, 0: 21]
GetWindowRect窗口大小有误
1 | # 获取窗体坐标位置(左上) |
如图操作下来, 发现返回的pos为(408, 172),但用spy++抓到的窗口左上角坐标为(510, 215),研究发现横、纵都是1.25倍, 以为是分辨率的问题,所以打开了“显示设置”,结果正好看到了缩放布局是125%,因此问题可能出现在这个设置上,果然修改为100%后,程序能够正常运行。
额外,百度也找到了这个问题——win32gui.GetWindowRect在win10上获取窗口宽高不正确的另一种可能; win32gui.GetWindowRect() 取值不准的解决方案——亲测这个无效
附录:
config.py中需要注意的设置
1 | # 方块宽度(算上了边界) |
Author: Mrli
Link: https://nymrli.top/2020/10/13/AutoLianliankan笔记/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.