深度强化学习制作森林冰火人游戏AI获取窗口部分界面
Posted 怪皮蛇皮怪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度强化学习制作森林冰火人游戏AI获取窗口部分界面相关的知识,希望对你有一定的参考价值。
概述
这篇主要讲述如何用python获取森林冰火人窗口部分界面
在获取部分界面的图片之后通过图片识别/分类来判断当前游戏所属的状态
前篇:深度强化学习制作森林冰火人游戏AI(三)向游戏输出键盘控制信息
后篇:深度强化学习制作森林冰火人游戏AI(五)识别游戏状态
森林冰火人游戏界面介绍
游戏开始界面
游戏开始界面很简单,只有一个开始游戏与右上角的背景音乐控制按钮
程序其实不太需要控制开始界面,手动点进去就可以节省很多代码工作量
选关界面
选关界面可以选择的按钮就多了,而且选关界面是固定的
也就是说后续控制选关界面只需要计算固定点坐标点击就好了
游戏界面
游戏界面需要注意,游戏界面具有两个不同背景
其次,游戏界面左上角的红钻石就是算法的奖励函数的需要识别的对象
游戏界面区分方法
因为几个状态其实差别蛮大的,所以本文就简单的做截图识别来区分几个界面的状态
截图界面选取
游戏左上角有一块区域,在不同界面不一样,但在同一截面基本一致
区域起点坐标(左上角为0,0)(20,40) 区域高宽(70,265)
关卡选择界面
游戏界面
游戏开始界面
获取 部分窗口截屏 代码
class window_capture():
def __init__(self,window_name):
self.__handle = windll.user32.FindWindowW(None, window_name)
def capture_part(self,start_x,start_y,height,width):
# 获取窗口客户区的大小
# r = RECT()
windll.user32.SetProcessDPIAware()
# windll.user32.GetClientRect(self.__handle, byref(r))
# width, height = r.right, r.bottom
# 开始截图
dc = windll.user32.GetDC(self.__handle)
cdc = windll.gdi32.CreateCompatibleDC(dc)
bitmap = windll.gdi32.CreateCompatibleBitmap(dc, width, height)
windll.gdi32.SelectObject(cdc, bitmap)
windll.gdi32.BitBlt(cdc, 0,0, width, height, dc, start_x, start_y, 0x00CC0020)
# 截图是BGRA排列,因此总元素个数需要乘以4
total_bytes = width*height*4
buffer = bytearray(total_bytes)
byte_array = c_ubyte*total_bytes
windll.gdi32.GetBitmapBits(bitmap, total_bytes, byte_array.from_buffer(buffer))
windll.gdi32.DeleteObject(bitmap)
windll.gdi32.DeleteObject(cdc)
windll.user32.ReleaseDC(self.__handle, dc)
img_arr=np.frombuffer(buffer, dtype=np.uint8).reshape(height, width, 4)
image_resize = Image.fromarray(img_arr).resize((self.__reshape_width,self.__reshape_height))
return image_resize
主体还是之前的后台截屏,不过这次是部分截取
以上是关于深度强化学习制作森林冰火人游戏AI获取窗口部分界面的主要内容,如果未能解决你的问题,请参考以下文章