Computer vision玩转游戏--kick-ya-chop

Computer vision玩转游戏--kick-ya-chop

运行环境

surface电脑
kick-ya-chop是一个网页端的flash游戏

项目来源

https://github.com/ClarityCoders/ComputerVision-OpenCV/tree/master/Lesson3-TemplateMatching
虽然作者在油管上讲的是cv自动采摘农场的作物, 但实际给出的代码只有这个空手道的小游戏(https://www.addictinggames.com/clicker/kick-ya-chop)

运行方式以及效果图

直接分屏, 左边运行网页端的flash游戏, 右边跑python脚本。
Computer vision玩转游戏--kick-ya-chop

代码

import keyboard
import mss
import cv2
import numpy
from time import time, sleep
import pyautogui
# 一些宏变量的定义
pyautogui.PAUSE = 0
left = True
# 动画中的人物可以通过点击鼠标向左, 向右. 这里需要根据自己的电脑屏幕设定鼠标的落点坐标
JUMP_LEFT=(250, 600)
JUMP_RIGHT=(900, 600)
x = JUMP_LEFT[0]
y = JUMP_LEFT[1]
sct = mss.mss()
# 完整画幅
# 'width': 2600,
# 'height': 1800
dimensions = {
        'left': 0,
        'top': 0,
        'width': 1368,
        'height': 1800
        # 'height': 912
    }
# scr = numpy.array(sct.grab(dimensions))
# cv2.imshow('Screen sct', scr)
# cv2.waitKey(-1)

# width=100, h=30
dimensions_left = {
        'left': 320,
        'top': 1100,
        'width': 290,
        'height': 60
    }

dimensions_right = {
        'left': 780,
        'top': 1100,
        'width': 290,
        'height': 60
    }
# 模板匹配的阈值, 可以自己设置
MATCHING_TH=0.5
# 动画中人物打击的时间间隔, 这值越小,打击速度越快
KICKING_TIME=0.2
#Tag: 程序开始
print("Press 's' to start playing.")
print("Once started press 'q' to quit.")
keyboard.wait('s')
wood_left = cv2.imread('woodleft.jpg')

wood_right = cv2.imread('woodright.jpg')
w = wood_left.shape[1]
h = wood_left.shape[0]

fps_time = time()
while True:

    if left:
        scr = numpy.array(sct.grab(dimensions_left))
        wood = wood_left
    else:
        scr = numpy.array(sct.grab(dimensions_right))
        wood = wood_right

    # Cut off alpha
    scr_remove = scr[:,:,:3]
    # Tag:需要注意就是img size必须小于template.
    result = cv2.matchTemplate(scr_remove, wood, cv2.TM_CCOEFF_NORMED)

    _, max_val, _, max_loc = cv2.minMaxLoc(result)
    print(f"Max Val: {max_val} Max Loc: {max_loc}")
    src = scr.copy()
    if max_val > MATCHING_TH:
    # if max_val > .85:

        if left:
            # x=340
            x=JUMP_RIGHT[0]
            y=JUMP_RIGHT[1]
            print("trun right")
        else:
            x=JUMP_LEFT[0]
            y=JUMP_LEFT[1]
        left = not left


    pyautogui.click(x=x, y=y)
    # 0.1s不行, 运行有点问题.
    # sleep(.10)
    sleep(KICKING_TIME)
    if keyboard.is_pressed('q'):
        break

    print('FPS: {}'.format(1 / (time() - fps_time)))
    fps_time = time()
上一篇:atom


下一篇:踏上全球数字化征程 | LTD&营销SaaS参加首届亚太域名系统论坛 (APAC DNS Forum)