藏宝湾网游单机站

 找回密码
 注册

QQ登录

只需一步,快速开始

★【黑暗之光SF★我是大主宰SF】【神将三国SF】★

★【0.1折】★【变态网页游戏私服】★

★神将三国网页版上线送V5 5w元宝 5000w铜币 我是大主宰上线满v,80万元宝,小怪都爆元宝,耐玩长久稳定★

【原始传奇SF/维京传奇SF】【GM包站手游】

★【原始传奇SF/维京传奇SF】【GM包站手游】★

★2025火爆『传奇岁月+赤焰号角+维京传奇+原始传奇』爆战力称号BUFF+神装99999999万人PK★

★全网独家 可以单机 可以互动的传奇!★

★全网独家 可以单机 可以互动的传奇!★

★全网唯一持续更新的可单机游戏!每15-25天更新一次内容,保持游戏新鲜度!! 众多独家的功能特色,众多你没见过的全新玩法,有能力的赚点烟钱,还能偶尔沙城战斗!★

神武端游源码泄露08年神武2复古1比1原版
★08年神武2复古1比1原版金币翼龙免费4月10日新开2区★

★神武端游源码泄露08年神武2复古1比1原版金币翼龙免费4月10日新开2区★

☆五一活动开放放置传奇☆

★五一活动开放放置传奇★

★可白嫖 上班摸鱼类 放置文字传奇游戏(放置休闲)qq群756025698★

【独家RPG文字梦幻】【摸鱼搬砖不氪不肝】

★【独家RPG文字梦幻】【摸鱼搬砖不氪不肝】★

★新区开放,三端互通,适合上班挂机、摸鱼。 休闲放置,不占时间,玩熟了一天只需十几分钟就能轻松搞定。★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★DNF★全职业平衡★公益服★
★DNF★全职业平衡★公益服★

【dnf86版本】【怀旧服】【全职业平衡】【非变态服】【非商业服】【775016356】

★完美国际纯防六职业,4月18号正式开区★

★完美国际纯防六职业,4月18号正式开区 ,上线赠送飞机坐骑,红蓝符★

★本服为纯06版本,1比1匹配,为大长期版本。半年一个新区。。上线1级生活技能全满,包裹仓库全开★

★梦幻16门派全新大唐九黎★

★梦幻16门派全新大唐九黎★

★★新增全新门派九黎城,★不做垃圾,力争什么都做到最好★持续更新,长久稳定★

★承接推广★

★承接推广★

★承接推广★

三职业复古★开局送神装★爆率100%★散人逆袭
★三职业复古★开局送神装★爆率100%★散人逆袭★

★〖双线〗〖无忧传奇〗〖每日新区〗〖开局送神装 100%高爆率 装备元宝打怪爆〗★

★《天使之战MU》经典奇迹重现★

★《天使之战MU》经典奇迹重现★

★2025年热门手游推荐:所有游戏充值永久0.1折,648只需6.48元!原版物价不膨胀★

★承接推广★

★承接推广★

★承接推广★

★彩虹岛s6独家玩法肝帝天堂★

★彩虹岛s6独家玩法肝帝天堂★

★s6彩虹岛,新服开区,来就送死霸脚底龙晶诸多特效。独家玩法护肝不杆不克,可刷一切★

查看: 1712|回复: 4

[分享] 金铲铲利用paddleocr+pyautogui来实现自动买牌

[复制链接]
 楼主| 发表于 2024-10-6 21:42:33 | 显示全部楼层 |阅读模式
本帖最后由 15119242233 于 2024-10-6 21:45 编辑


搬运隔壁吾爱 作者:无阻



国庆放假玩了一天金铲铲之战。

因为手残每次后面梭哈都手忙脚乱要么就是手速不够要么就是漏牌
搞得我追不出来想要的牌
一气之下写了个自动买牌的

但是目前只实现了识别英雄名之后自动买牌的功能
CPU优化啥的都没做
后续继续开发吧。弄个金铲铲游戏助手啥的来玩


目前代码只是适腾讯手游助手

想要换成别的模拟器就把窗口标题改成别的模拟器窗口标题就OK


其实不需要OCR 可以用yolo




2024.10.2  优化了截图 触发方式等功能来实现CPU优化








# coding = utf-8
import traceback
import numpy as np
from paddleocr import PaddleOCR
from pyautogui import *
import win32gui
import win32api
import logging
import pynput, time
import keyboard
import loguru
import pathlib
import datetime
import os
from concurrent.futures import ThreadPoolExecutor, as_completed, ALL_COMPLETED, wait

# 创建日志目录
log_dir = pathlib.Path('./logs')
log_dir.mkdir(exist_ok=True)
if not os.path.exists(f"/logs/"):
    os.mkdir(f"/logs/")
current_date = datetime.datetime.now().strftime('%Y-%m-%d')
if not os.path.exists(f"/logs/{current_date}/"):
    os.mkdir(f"/logs/{current_date}/")
log_file = log_dir.joinpath(f'./logs/{current_date}/' + "log_{time: YYYY_MM_DD}.log")
log = loguru.logger

# 只允许一条线程同时识别,解决CPU占用
pool = ThreadPoolExecutor(max_workers=1)

# 关闭paddleocr的打印功能,不需要关闭的话去掉下面两行代码
logging.disable(logging.DEBUG)  # 关闭DEBUG日志的打印
logging.disable(logging.WARNING)  # 关闭WARNING日志的打印



#主要识别并且购买函数
def ocr_hero_buy(heroname, windowTitle="腾讯手游助手(64位)", isClick=True):
    time.sleep(0.25)  # 键盘或鼠标按下后0.3秒后触发
    """
    自动截图模拟器窗口并且OCR指定英雄然后点击购买
    :param heroname:英雄名称,多个请直接传入数组
    :param windowName:模拟器窗口名称
    :param isClick:识别到了是否自动点击
    :return:
    """
    if type(heroname) == str:
        # 如果传入的是单个英雄或者不为数组就转换为数组
        heroname = [heroname]

    # 获取指定窗口在屏幕的位置大小函数
    def get_window_rect(window_title):
        # 获取指定窗口标题的窗口在系统中的位置
        hwnd = win32gui.FindWindow(0, window_title)
        if hwnd:
            rect = win32gui.GetWindowRect(hwnd)
            return rect
        return None
    rect = get_window_rect(windowTitle)
    if rect:
        # 计算模拟器窗口在桌面的起始位置和终点位置 启动StartLeft,StartTop这两个参数是窗口在桌面的坐标位置,后面OCR识别到指定英雄的位置的时候必须要加回去
        StartLeft, StartTop, right, bottom = rect
        width = right - StartLeft
        height = bottom - StartTop
    else:
        StartLeft, StartTop, right, bottom = 0, 0, 1, 1
        width = right - StartLeft
        height = bottom - StartTop
    # 调用 pyautogui 进行窗口截图
    image = screenshot(region=(StartLeft, StartTop, width, height))

    # 这里是处理裁剪掉模拟器窗口图片的上面80%的图片面积,因为图片越小识别越快,0.8代表80%。如果识别不准确请少截取一点,但是我个人测试只留下20%下方图片即可
    heroBoxheight = image.height * 0.95
    # 这里是处理裁剪掉模拟器窗口图片的左边10%的图片面积,因为图片越小识别越快
    heroBoxwidth = image.width * 0.2

    # 记录一下截取掉的位置,后期识别到了点击的时候要架上,因为这部分位置被裁剪掉了
    StartLeft = StartLeft + heroBoxwidth
    StartTop = StartTop + heroBoxheight
    #裁剪图片到适合识别的大小
    image = image.crop((int(heroBoxwidth), int(heroBoxheight), image.width, image.height))
    oimage = image
    # 下面开始OCR
    image = np.array(image)
    result = ocr.ocr(image, cls=False)
    # 一堆if是在检查是否ocr成功,for是遍历识别结果
    point = win32api.GetCursorPos()
    if result is not None:
        for line in result:
            if line is not None:
                for word in line:
                    # 遍历识别结果
                    log.error(word)
                    for hero in heroname:

                        if str(word).find(hero) > -1 or heroname == "":
                            log.success(
                                f"发现英雄牌:{hero},坐标位置,x:{word[0][0][0] + StartLeft},y:{word[0][0][1] + StartTop}")
                            if isClick:
                                moveTo(word[0][0][0] + StartLeft, word[0][0][1] + StartTop)
                                click()

    return ""


if __name__ == '__main__':
    # 要截图的窗口标题,目前是腾讯手游模拟器,可以改成别的模拟器的标题一样通用
    windowName = "腾讯手游助手(64位)"
    # 要购买的卡牌名称
    heros = ['雷克顿', '莎弥拉', '卡西奥佩娅', '崔丝塔娜', '烬']


    # 监听键盘按键,如果是在手游模拟器里面按下的指定按键就启动识别
    def keyboardDown():
        currentWindow(windowName)


    # 监听鼠标按键,如果是在手游模拟器里面按下的按键就启动识别
    def on_click(x, y, button, pressed):
        if not pressed:
            currentWindow(windowName)
            return True


    # 判断当前鼠标所在窗口是否是指定模拟器窗口
    def currentWindow(windowTitle):
        point = win32api.GetCursorPos()
        hwnd = win32gui.WindowFromPoint(point)  # 请填写 x 和 y 坐标
        hwnd = win32gui.GetParent(hwnd)
        if hwnd == 0:
            hwnd = win32gui.WindowFromPoint(point)  # 请填写 x 和 y 坐标
        title = win32gui.GetWindowText(hwnd)
        if title == windowTitle:
            pool.submit(lambda cxp: ocr_hero_buy(*cxp),
                        (heros, windowTitle, True))


    log.success("正在载入OCR金铲铲自动识别选牌工具,正在初始化PaddleOCR模块")
    # 初始化 PaddleOCR
    ocr = PaddleOCR(use_angle_cls=False, lang="ch", use_gpu=False, debug=False, show_log=False)
    log.success("PaddleOCR模块初始化成功,您可以在游戏里按下D键或者鼠标任意键来触发自动选牌")
    # 监听D键 按一次d键启动一次卡牌识别功能并且购买
    keyboard.add_hotkey('d', keyboardDown)
    # 监听鼠标键 按一次启动一次卡牌识别功能并且购买解决死循环D牌导致的CPU占用问题。但是这样也很高,这里还能优化
    with pynput.mouse.Listener(
            on_click=on_click) as listener:
        listener.join()


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 5金币 +11 收起 理由
170127496 + 3 『能加分解决的问题,都不是问题』
bossini02 + 2 『能加分解决的问题,都不是问题』
kai8000 + 2 『你那么流逼,你家里人知道吗?』
myselfacg01 + 3 『你那么流逼,你家里人知道吗?』
sj779950514 + 1 『你那么流逼,你家里人知道吗?』

查看全部评分

发表于 2024-10-6 22:39:19 | 显示全部楼层
点赞!~~
发表于 2024-10-6 22:47:14 | 显示全部楼层
谢谢分享
发表于 2024-10-8 08:41:34 | 显示全部楼层
小手一抖金币扣走
发表于 2024-10-8 17:55:43 | 显示全部楼层
话说这游戏可以断网离线玩?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

本站内容如若侵犯到您的权益,请来电来函告知,我们会尽快处理!
联系QQ:1953150286,2251387361,123784736,免责申明

排行榜|联系我们|小黑屋|手机版|Archiver|游戏藏宝湾 |

GMT+8, 2025-5-8 02:17 , Processed in 0.060239 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表