|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sjyabd 于 2022-5-4 04:47 编辑
求助各位大佬,我自己写了一个小游戏的脚本,功能逻辑很简单,是游戏内商城扫货的。大致原理为:
循环点击商城刷新按钮 -> 判断商品栏位颜色
-> 如果商品未出现,则continue继续刷新
-> 判断如果商品出现,通过GetPixel判断得到显示商品的栏位颜色匹配为制定商品颜色
-> 点击商品选中,点击购买,continue继续循环
我原本想要在睡觉的时候,让小号可以挂机,自动秒所有上架的材料。但是问题是
- 正常情况应该为:每次刷新商城,货架为空,读取的颜色为(142,155,31)。
- 当有人上架:货架有了商品,读取的颜色为(166,28,127),这个颜色通过if语句判断匹配后,进入后面的购买操作。购买结束后,继续循环,继续刷新商城。
- 每次循环到5000次的时候,从5001次开始,GetPixel读取的颜色便不是正常的RGB格式,而是返回(255,255,-1)。导致无法继续读取货架位置的颜色,从而无法判断和购买
- 手动ctrl+c终止程序,然后再次运行,恢复正常。等循环到5000次的时候,问题再次出现。
- 尝试用try except来捕捉异常 但是程序其实并没有报错,GetPixel仍然在一直读数出来,但是读到的RGB元组却是不合理的。所以无法用这个办法来解决。
- 在网上搜索,有人说GetPixel是读取内存里的数据(巴拉巴拉,其他的没看太懂)。我猜想是不是存储颜色的内存满了,就尝试手动释放内存。判断当读数为(255,255,-1),使用gc.collect()释放内存,然后开启新的循环。但该办法无效,释放内存后读数仍为(255,255,-1)。
- 尝试用双循环来实现,在内循环检测到错误RGB值出现时break,由外循环开启新的循环,以达到自动“重启”的效果。但是该方法失败。
while True
while True
正常的代码循环
if getPixel == (255,255,-1):
break - 当使用双循环时,程序运行到3334次开始报错,而不是之前的5000次。不知道为什么报错的次数会在多了一重循环之后减少。希望这个可以给大佬一点线索。
GetPixel处具体代码如下:
- def get_colour(x,y):
- gdi32 = windll.gdi32
- user32 = windll.user32
- hdc = user32.GetDC(None)
- pixel = gdi32.GetPixel(hdc, x, y)
- r = pixel & 0x0000ff
- g = (pixel & 0x00ff00) >> 8
- b = pixel >> 16
- return (r,g,b)
复制代码
其他地方的代码实在是简单的不能再简单了,基本上就是:
While True,
if colour == XXX:,
mouse.click;
if colour == XXX:
continue
应该不是其他地方的代码出的问题。如果大佬需要看整个代码的话,我再贴出来。
本帖最后由 hrpzcf 于 2022-5-4 22:27 编辑
- from ctypes import windll
- # 把以下三行从函数内移出,避免每次调用函数都获取一次HDC但又不释放
- gdi32 = windll.gdi32
- user32 = windll.user32
- HDC = user32.GetDC(None)
- def get_colour(x, y):
- pixel = gdi32.GetPixel(HDC, x, y)
- r = pixel & 0x0000FF
- g = (pixel & 0x00FF00) >> 8
- b = pixel >> 16
- return (r, g, b)
- count = 0
- while count < 10000:
- count += 1
- print(f"{count:>10}", get_colour(1000, 800))
- # 程序退出时
- user32.ReleaseDC(None, HDC)
复制代码
不知道行不行,代码改不改我都没有成功复现楼主的问题
|
|