python 4399别踩白块儿脚本

持续无聊中,看到别踩白块儿觉得这个脚本貌似比较好写。

需要用到的python 库如下

import pyautogui
from PIL import ImageGrab, Image
import win32gui,win32api,win32con

打开4399,选一个别踩白块的小游戏,点击全屏固定屏幕,按下F12获取该窗口的标题

python 4399别踩白块儿脚本_第1张图片

由于我用谷歌浏览器,所以titile = u"别再踩白块了_别再踩白块了html5游戏在线玩_4399h5游戏-4399在线玩 - Google Chrome"

随便选一个模式,进去后是这样的:

python 4399别踩白块儿脚本_第2张图片

只要我们点击一下黑块,上面一行就会下来,所以我们只要追踪倒数第二行就行,一直判断倒数第二行到底点击第几个方块。

利用picpick软件获取倒数第二行的位置信息,将其截取成图片

截取图片之后还要对图片进行二值化处理,方便统计,如下所示:

python 4399别踩白块儿脚本_第3张图片

接着上面截取的图片做4次像素遍历统计,这里我们不用将图片分成4块,只需要在特定位置截取4个20*20的矩形,判断这4个矩形中谁的黑色像素占比最大,谁就是黑块,当然我们也可以把尺寸截取小一点10*10, 5*5都行,目的只是为了快速计算,毕竟这里面有一个模式是速度逐渐增大的,所以哈哈,为了破纪录不择手段。如下所示

python 4399别踩白块儿脚本_第4张图片

知道第几个方块是黑块就用鼠标点击那个位置就好了!

传入一个runNum参数,控制程序执行次数,由于追求速度,就没用time.sleep()函数

完整代码如下,很短欸,60多行:

import pyautogui
from PIL import ImageGrab, Image
import win32gui,win32api,win32con
import cv2
import numpy
import time

pyautogui.FAILSAFE = False

class GameAssist:

    # 初始化
    def __init__(self, winName):
        self.handwin = win32gui.FindWindow(0, winName)
        if not self.handwin:
            print("无法找到窗口")
            exit()
        # 放置最前
        win32gui.SetForegroundWindow(self.handwin)
        # 截取的四个块位置
        self.fourRect = (523, 474, 843, 583)
        # 从哪里开始统计黑色像素,相对坐标
        self.localFourPos = ((20, 20), (100, 20), (180, 20), (260, 20))
        # 每个统计尺寸(宽、高)
        self.localSize = (20, 20)

    # 根据图片判断按那个方块
    def img2ans(self, img):
        # 二值化
        img = img.convert('1')
        # 四个方块黑色占比
        scoreList = []
        # 分别遍历四个区域
        for idex in range(4):
            # 黑色像素占比
            blackScore = 0
            for i in range(self.localFourPos[idex][1], self.localFourPos[idex][1] + self.localSize[1]):
                for j in range(self.localFourPos[idex][0], self.localFourPos[idex][0] + self.localSize[0]):
                    if img.getpixel((j, i)) == 0:
                        blackScore += 1
            scoreList.append(blackScore)
        # 返回最大值的下标
        return scoreList.index(max(scoreList))



    # 主控制程序,runNum 执行次数
    def master(self, runNum):
        for num in range(runNum):
            blockImg = ImageGrab.grab(self.fourRect)
            ans = self.img2ans(blockImg)
            #pyautogui.click(x=self.fourRect[0] + self.localFourPos[ans][0],
            #                y=self.fourRect[1] + self.localFourPos[ans][1])
            pyautogui.click(x=self.fourRect[0] + self.localFourPos[ans][0],
                            y=self.fourRect[1] + self.localFourPos[ans][1] + 60)
            #time.sleep(0.1)
        pass



if __name__ == "__main__":
    winName = u"别再踩白块了_别再踩白块了html5游戏在线玩_4399h5游戏-4399在线玩 - Google Chrome"
    demo = GameAssist(winName)
    demo.master(100)

以前4399给我带来很多乐趣,现在依旧哈哈,gif图演示,超级模糊

 

 

你可能感兴趣的:(游戏开发)