这是一个完整的游戏自动回收代码,游戏启动后自动聚焦游戏窗口,游戏窗口标题为辅助测试游戏,启动任务后自动进入游戏地图每五秒自动检测是否在指定地图如果不在指定地图则自动按下T键飞进地图,装备回收勾选框勾选后自动回收装备。 import tkinter as tk from tkinter import ttk import pyautogui import time import keyboard import threading import win32gui import win32con class AutoClickerApp: def __init__(self, root): self.root = root self.root.title("只是单独回收") self.root.geometry("400x500") root.resizable(False, False) # 配置参数 self.target_img = r"C:\Users\Administrator\Desktop\img\wz.png" self.click_img = r"C:\Users\Administrator\Desktop\img\ljqw.png" self.recycle_img1 = r"C:\Users\Administrator\Desktop\img\hs.png" self.recycle_img2 = r"C:\Users\Administrator\Desktop\img\kshs.png" self.recycle_img3 = r"C:\Users\Administrator\Desktop\img\hc.png" self.recycle_img4 = r"C:\Users\Administrator\Desktop\img\fj.png" self.check_interval = 5 self.recycle_interval = 15 self.window_title = "9377传奇霸主" self.running = False self.recycle_running = False self.log_text = None self.window_rect = None self.setup_ui() self.focus_game_window_with_click() def setup_ui(self): control_frame = ttk.LabelFrame(self.root, text="控制面板") control_frame.pack(pady=10, padx=10, fill=tk.X) ttk.Label(control_frame, text="窗口标题:").grid(row=0, column=0, padx=5) self.window_entry = ttk.Entry(control_frame, width=30) self.window_entry.grid(row=0, column=1, padx=5) self.window_entry.insert(0, self.window_title) self.enable_var = tk.BooleanVar(value=False) toggle_btn = ttk.Checkbutton(control_frame, text="启用自动任务", variable=self.enable_var, command=self.toggle_task) toggle_btn.grid(row=1, column=0, columnspan=2, pady=5) # 添加装备回收功能控件 recycle_frame = ttk.LabelFrame(self.root, text="装备回收设置") recycle_frame.pack(pady=10, padx=10, fill=tk.X) self.recycle_var = tk.BooleanVar(value=False) recycle_check = ttk.Checkbutton(recycle_frame, text="启用装备回收", variable=self.recycle_var, command=self.toggle_recycle) recycle_check.grid(row=0, column=0, padx=5, sticky="w") ttk.Label(recycle_frame, text="回收间隔(秒):").grid(row=0, column=1, padx=5) self.recycle_interval_entry = ttk.Entry(recycle_frame, width=8) self.recycle_interval_entry.grid(row=0, column=2, padx=5) self.recycle_interval_entry.insert(0, str(self.recycle_interval)) self.status_var = tk.StringVar(value="状态: 就绪") ttk.Label(control_frame, textvariable=self.status_var).grid(row=2, column=0, columnspan=2) log_frame = ttk.LabelFrame(self.root, text="操作日志") log_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5) self.log_text = tk.Text(log_frame, height=15, state=tk.DISABLED) self.log_text.pack(fill=tk.BOTH, expand=True) def toggle_recycle(self): if self.recycle_var.get(): try: self.recycle_interval = int(self.recycle_interval_entry.get()) if self.recycle_interval < 5: self.recycle_interval = 5 self.recycle_interval_entry.delete(0, tk.END) self.recycle_interval_entry.insert(0, str(self.recycle_interval)) self.log("回收间隔最小为5秒,已自动调整") except ValueError: self.recycle_interval = 15 self.recycle_interval_entry.delete(0, tk.END) self.recycle_interval_entry.insert(0, str(self.recycle_interval)) self.log("请输入有效的数字,已重置为默认15秒") self.recycle_running = True self.log(f"装备回收已启用,间隔{self.recycle_interval}秒") if not hasattr(self, 'recycle_thread') or not self.recycle_thread.is_alive(): self.recycle_thread = threading.Thread(target=self.recycle_loop, daemon=True) self.recycle_thread.start() else: self.recycle_running = False self.log("装备回收已禁用") def recycle_loop(self): while self.recycle_running: try: self.perform_recycle() time.sleep(self.recycle_interval) except Exception as e: self.log(f"装备回收出错: {str(e)}") time.sleep(5) def perform_recycle(self): self.focus_game_window_with_click() keyboard.press('b') time.sleep(0.1) keyboard.release('b') time.sleep(1) try: pos1 = pyautogui.locateCenterOnScreen(self.recycle_img1, confidence=0.7) if pos1: pyautogui.click(pos1) self.log("成功点击回收按钮1") time.sleep(1)
pos2 = pyautogui.locateCenterOnScreen(self.recycle_img2, confidence=0.7) if pos2: pyautogui.click(pos2) self.log("成功点击回收按钮2") except Exception as e: self.log(f"回收按钮点击失败: {str(e)}")
time.sleep(1) keyboard.press('b') time.sleep(0.1) keyboard.release('b') # 其余原有方法保持不变... def get_window_rect(self): try: hwnd = win32gui.FindWindow(None, self.window_title) if hwnd: rect = win32gui.GetWindowRect(hwnd) self.window_rect = { 'left': rect[0], 'top': rect[1], 'right': rect[2], 'bottom': rect[3], 'width': rect[2] - rect[0], 'height': rect[3] - rect[1] } return True except Exception as e: self.log(f"获取窗口坐标失败: {str(e)}") return False def focus_game_window_with_click(self): try: hwnd = win32gui.FindWindow(None, self.window_title) if hwnd: win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) win32gui.SetForegroundWindow(hwnd) if not self.get_window_rect(): return click_x = self.window_rect['left'] + self.window_rect['width']//2 click_y = self.window_rect['top'] + self.window_rect['height']//4 pyautogui.click(click_x, click_y) self.log("窗口聚焦成功") except Exception as e: self.log(f"窗口聚焦失败: {str(e)}") def toggle_task(self): if self.enable_var.get(): self.running = True self.status_var.set("状态: 运行中") self.log("自动检测点击已启用") self.thread = threading.Thread(target=self.run_script, daemon=True) self.thread.start() else: self.running = False self.status_var.set("状态: 已停止") self.log("自动检测点击已禁用") def run_script(self): while self.running: try: if not self.is_on_target_map(): self.log("检测到不在目标地图,执行操作序列") self.perform_actions() else: self.log("当前在目标地图,等待下次检测") except Exception as e: self.log(f"检测出错: {str(e)}") time.sleep(self.check_interval) def is_on_target_map(self): try: return pyautogui.locateOnScreen(self.target_img, confidence=0.8) is not None except Exception as e: self.log(f"图像识别出错: {str(e)}") return False def perform_actions(self): self.focus_game_window_with_click() keyboard.press('t') time.sleep(0.1) keyboard.release('t') time.sleep(1) try: button_pos = pyautogui.locateCenterOnScreen(self.click_img, confidence=0.7) if button_pos: pyautogui.click(button_pos) self.log("成功点击目标按钮") except Exception as e: self.log(f"按钮点击失败: {str(e)}") time.sleep(1) keyboard.press('z') time.sleep(0.1) keyboard.release('z') def log(self, message): if self.log_text: self.log_text.config(state=tk.NORMAL) self.log_text.insert(tk.END, f"[{time.strftime('%H:%M:%S')}] {message}\n") self.log_text.config(state=tk.DISABLED) self.log_text.see(tk.END) if __name__ == "__main__": root = tk.Tk() app = AutoClickerApp(root) root.mainloop() |