【实战项目记录1】编写一个传奇3法师自动练级的python脚本续1

 本文为基于pyautogui、tkinter以及几个标准库开发的用于传奇3法师自动练级的python脚本,代码编写并不完美,只是将本人业余学的python正好运用到了实践当中,有了兴趣的趋动,最终能成功运行,权当是python练手一用。

接上篇博文《【实战项目记录1】编写一个传奇3法师自动练级的python脚本》

今天发布剩下的模块:初始化模块mir3_init.py;遇敌判断模块mir3_is_enemy.py;捡物品模块:mir3_is_item.py

大部分都是借助了pyautogui的控制键鼠功能和图片识别功能,个人觉得比较难的是设置行动范围和规划捡物品路线,供参考。

1.初始化模块mir3_init.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# @Time      :2022-5-4 0:08

# @Author    :Mengxh

# @File      :mir3_init.py
import os

# 装备图库载入列表
itemlist = []
for root, dirs, files in os.walk("./pics/pickup", topdown=False):
    for name in files:
        itemlist.append(os.path.join(root, name))

# 定义逐点行走方向和鼠标左右键
l = 350  # x = 100左
r = 700  # x = 900右
u = 200  # y = 150上
d = 500  # y = 550下
role_x = 503  # 人物中心点x坐标
role_y = 353  # 人物中心点y坐标
x_list = [x for x in range(23,1031,48)]
y_list = [x for x in range(65,641,32)]
lu = (l, u)  # 左上
ld = (l, d)  # 左下
ru = (r, u)  # 左上
rd = (r, d)  # 左上
move_list_u = [lu, ru]
move_list_d = [ld, rd]
move_list = move_list_d + move_list_u
region_0 = (1052, 67, 362, 214)  # 大补贴截屏范围
region_main = (21, 51, 1000, 730)  # 游戏主画面范围
region_jq = (903, 30, 120, 125)
jq_pos = (975, 105)
print('行走方向设置完成')
print('主游戏画面区域设置完成')

if __name__ == '__main__':
    print(x_list)
    print(y_list)

2.遇敌判断模块mir3_is_enemy.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# @Time      :2022-5-3 23:49

# @Author    :Mengxh

# @File      :mir3_is_enemy.py
import time
import pyautogui
import mir3_init
pyautogui.PAUSE = 1


def is_enemy():
    t = pyautogui.locateOnScreen('./pics/locatepng/guaiwu.png', region=mir3_init.region_0, confidence=0.7)
    if t is not None:
        return True
        # for i in range(2):
        #     pyautogui.press('f2', interval=0.5)
        # im_1 = pyautogui.locateOnScreen('./pics/menupng/kouxue.png', region=mir3_init.region_main, confidence=0.9)
        # im_2 = pyautogui.locateOnScreen('./pics/menupng/kouxue.png', region=mir3_init.region_main, confidence=0.9)
        # if im_1 or im_2:
        #     # print('打了有怪')
        #     return True
        # else:
        #     # print('打了无怪')
        #     return False
    else:
        # print('信息无怪')
        return False


if __name__ == '__main__':
    time.sleep(2)
    is_enemy()

3.捡物品模块:mir3_is_item.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# @Time      :2022-5-3 23:30

# @Author    :Mengxh

# @File      :mir3_is_item.py

import pyautogui
import mir3_init
import threading
import pandas as pd

# 对比标准x,y坐标列表,重新设置物品标准坐标
def compare_xy(a,b):
    x = mir3_init.x_list[list(map(lambda x: abs(x - a), mir3_init.x_list)).index(min(list(map(lambda x: abs(x - a), mir3_init.x_list))))]
    y = mir3_init.y_list[list(map(lambda x: abs(x - b), mir3_init.y_list)).index(min(list(map(lambda x: abs(x - b), mir3_init.y_list))))]
    return x,y

def is_item(item, pos_list):
    ts = pyautogui.locateAllOnScreen('%s' % item, region=mir3_init.region_main, confidence=0.6)
    if ts is not None:
        for t in ts:
            pos = pyautogui.center(t)
            pos = compare_xy(pos.x,pos.y)
            pos_list.append(pos)

def move_line(pos_list):
    pos0 = (mir3_init.role_x,mir3_init.role_y)
    df = pd.DataFrame(pos_list, columns=['x', 'y'], dtype='int32')
    df['s'] = ((df['x'] - pos0[0]) ** 2 + (df['y'] - pos0[1]) ** 2) ** 0.5
    newpos_list = []
    while True:
        i = df['s'].idxmin()
        newpos_list.append((int(df.loc[i][0]),int(df.loc[i][1])))

        delta_x = pos0[0] - df.loc[i][0]
        delta_y = pos0[1] - df.loc[i][1]
        df = df.drop(index=[i])

        df['x'] = df['x'] + delta_x
        df['y'] = df['y'] + delta_y


        df['s'] = ((df['x'] - pos0[0]) ** 2 + (df['y'] - pos0[1]) ** 2) ** 0.5
        if df.shape[0] == 0:
            return newpos_list

def multi_thread():
    print('开始扫描装备')
    threads = []
    pos_list= []
    for item in mir3_init.itemlist:
        threads.append(
            threading.Thread(target=is_item, args=(item, pos_list))
        )

    for thread in threads:
        thread.start()

    for thread in threads:
        thread.join()

    print('结束扫描装备')
    if pos_list:
        pos_list = move_line(pos_list)
    print(pos_list)
    return pos_list

if __name__ == '__main__':
    while True:
        multi_thread()

最后比较遗憾的是,这个脚本必须在前台运行,电脑就只能挂机,干不了别的事。自己本想用pywin32尝试后台控制,但因为本人非专业人士,不懂Windows编程,尝试最终也是失败。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Python自动挂机脚本是使用Python编写一个程序,可以用于自动执行特定的任务或操作,而无需人工干预。 使用Python编写自动挂机脚本可以帮助我们提高工作效率,减轻重复繁琐的操作,节省时间和精力。 Python自动挂机脚本的应用范围非常广泛。例如,在网络游戏中,我们可以编写自动挂机脚本来完成一些重复性的任务,如打怪、练级、收集资源等。在网页数据爬取中,我们可以使用自动挂机脚本来定时获取特定网站的信息,并将数据保存到本地或进行进一步的分析。此外,在自动化测试中,我们可以借助自动挂机脚本来模拟用户操作,自动化执行测试用例。 编写一个简单的Python自动挂机脚本通常包括以下步骤: 1. 导入必要的库和模块。 2. 连接到目标应用程序或游戏。 3. 设置自动挂机的条件和触发器,如时间间隔、特定关卡等。 4. 编写相应的代码来执行自动化任务,例如模拟鼠标点击、键盘输入等。 5. 循环执行自动化任务直到达到预设的条件或触发器。 6. 保存结果或输出报告,可选的可以将相关数据保存到本地文件或数据库中。 总而言之,Python自动挂机脚本是一种方便实用的工具,可以帮助我们自动执行任务,提高工作效率。编写一个高效稳定的自动挂机脚本需要一定的编程经验和对目标应用程序的了解,同时需要遵守相关法律法规和道德规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值