如何用python做一个金铲铲自动拿牌器(思路)

如何用python做一个金铲铲自动拿牌器(思路)

要实现一个金铲铲之战的自动拿牌工具,需要结合图像识别和自动化操作技术。以下是分步实现的思路和代码:

import cv2

import numpy as np

import pyautogui

import time

from PIL import ImageGrab

# 配置参数

REFRESH_POS = (1600, 900) # 刷新商店按钮位置

BUY_POSITIONS = [ # 商店卡牌购买位置

(1100, 900),

(1220, 900),

(1340, 900),

(1460, 900),

(1580, 900)

]

# 加载棋子模板(需要提前截取)

champion_templates = {

"zed": cv2.imread('templates/zed.png', 0),

"yasuo": cv2.imread('templates/yasuo.png', 0),

# 添加更多棋子模板...

}

def capture_screen():

"""捕获游戏区域截图"""

return np.array(ImageGrab.grab(bbox=(0,0,1920,1080)))

def find_champions(screen):

"""使用模板匹配识别棋子"""

gray = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)

matches = []

for name, template in champion_templates.items():

res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)

threshold = 0.8

loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):

matches.append({

"name": name,

"position": (pt[0], pt[1])

})

return matches

def auto_buy():

"""执行购买操作"""

# 刷新商店

pyautogui.click(REFRESH_POS)

time.sleep(0.5)

# 购买所有匹配的棋子

screen = capture_screen()

matches = find_champions(screen)

for match in matches:

x, y = match['position']

# 检查是否在商店区域

if y > 800 and 1000 < x < 1700:

pyautogui.click(x+50, y+50) # 点击购买按钮

time.sleep(0.2)

def main_loop():

"""主循环"""

while True:

auto_buy()

time.sleep(1) # 每次操作间隔

if __name__ == "__main__":

main_loop()

关键实现步骤:

1.屏幕捕获:

使用PIL的ImageGrab捕获屏幕

可以根据游戏窗口位置调整截图区域

2.图像识别:

使用OpenCV进行模板匹配

需要预先准备棋子模板图片

调整阈值(threshold)平衡识别精度和召回率

3.自动化操作:

使用pyautogui模拟鼠标点击

需要根据实际屏幕分辨率校准坐标

添加操作间隔防止检测

4.策略逻辑:

需要扩展阵容判断逻辑

添加经济管理模块(识别金币数量)

实现升级决策逻辑

改进方向:

使用更先进的识别方案:

# 使用YOLO进行目标检测(需要训练自定义模型)

model = YOLO('best.pt')

results = model(screen)

添加状态检测:

def get_game_state():

# OCR识别金币、等级等信息

gold_region = (1800, 50, 1900, 80)

gold_img = ImageGrab.grab(gold_region)

gold = pytesseract.image_to_string(gold_img)

return {"gold": int(gold)}

决策逻辑:

def should_refresh(gold):

return gold > 50

def buy_strategy(matches):

# 优先购买目标棋子

priority_list = ["zed", "yasuo"]

for target in priority_list:

if any(m['name'] == target for m in matches):

return target

注意事项:

需要手动准备棋子模板图片(保存在templates目录)

坐标需要根据实际分辨率调整

需要管理员权限运行

建议在实际使用前先测试各个模块功能,可以通过显示识别结果可视化来调试:

def debug_show(matches):

screen = capture_screen()

for m in matches:

cv2.rectangle(screen, m['position'],

(m['position'][0]+50, m['position'][1]+50),

(0,255,0), 2)

cv2.imshow('Debug', screen)

cv2.waitKey(1)

相关探索