python语言-连连看v4.92修改器代码QZQ-2026-9-19

发布时间:2026/11/6 1:38:46

python语言-连连看v4.92修改器代码QZQ-2026-9-19 import pymem import pymem.process import tkinter as tk from tkinter import ttk, messagebox import threading import time import psutil class LianLianKanTrainer: # 内存地址 ADDR_LIFE 0x0019FE68 # 生命 ADDR_HINT 0x0019FE6C # 提示 ADDR_SCORE 0x0019FE70 # 分数 ADDR_TIME 0x0019F484 # 时间新找到的 # 时间数据类型: int 或 float TIME_TYPE int # 冻结时间时写入的值按实际类型调整 TIME_FREEZE_VALUE 99999 # 自动扫描时匹配的进程名关键词 PROC_KEYWORDS [lian, llk, link, game, pet, match, 连连看] def __init__(self, root): self.root root self.root.title(连连看v4.92修改器) self.root.geometry(540x600) self.root.resizable(False, False) self.pm None self.process_name self.auto_thread None self.auto_running False self.freeze_time False # 是否冻结时间 self.setup_ui() self.root.after(200, self.scan_processes) # ---------------- UI ---------------- def setup_ui(self): # 进程选择区 top ttk.LabelFrame(self.root, text进程选择) top.pack(fillx, padx10, pady8) ttk.Label(top, text候选进程:).grid(row0, column0, padx5, pady5, stickyw) self.combo_proc ttk.Combobox(top, width42, statereadonly) self.combo_proc.grid(row0, column1, columnspan2, padx5, pady5, stickywe) self.combo_proc.bind(ComboboxSelected, self.on_combo_select) ttk.Button(top, text自动扫描, commandself.scan_processes).grid(row1, column0, padx5, pady4) ttk.Button(top, text附加选中, commandself.attach_selected).grid(row1, column1, padx5, pady4) ttk.Button(top, text附加 PID, commandself.attach_by_pid).grid(row1, column2, padx5, pady4) ttk.Label(top, text手动进程名:).grid(row2, column0, padx5, pady4, stickyw) self.entry_proc ttk.Entry(top, width28) self.entry_proc.grid(row2, column1, padx5, pady4, stickywe) self.entry_proc.insert(0, game.exe) ttk.Button(top, text附加, commandself.attach_manual).grid(row2, column2, padx5, pady4) self.lbl_status ttk.Label(top, text状态: 未附加, foregroundred) self.lbl_status.grid(row3, column0, columnspan3, padx5, pady3, stickyw) # 数值显示区 info ttk.LabelFrame(self.root, text当前数值) info.pack(fillx, padx10, pady8) self.var_life tk.StringVar(value-) self.var_hint tk.StringVar(value-) self.var_score tk.StringVar(value-) self.var_time tk.StringVar(value-) ttk.Label(info, text生命:).grid(row0, column0, padx5, pady4, stickyw) ttk.Label(info, textvariableself.var_life, width12, foregroundblue).grid(row0, column1, stickyw) ttk.Label(info, text提示:).grid(row0, column2, padx5, pady4, stickyw) ttk.Label(info, textvariableself.var_hint, width12, foregroundblue).grid(row0, column3, stickyw) ttk.Label(info, text分数:).grid(row1, column0, padx5, pady4, stickyw) ttk.Label(info, textvariableself.var_score, width12, foregroundblue).grid(row1, column1, stickyw) ttk.Label(info, text时间:).grid(row1, column2, padx5, pady4, stickyw) ttk.Label(info, textvariableself.var_time, width12, foregroundblue).grid(row1, column3, stickyw) ttk.Button(info, text刷新数值, commandself.refresh_values).grid(row2, column3, padx5, pady4) # 修改区 mod ttk.LabelFrame(self.root, text修改) mod.pack(fillx, padx10, pady8) ttk.Label(mod, text生命:).grid(row0, column0, padx5, pady4, stickyw) self.entry_life ttk.Entry(mod, width10) self.entry_life.grid(row0, column1, padx5) self.entry_life.insert(0, 99) ttk.Button(mod, text写入, commandlambda: self.write_value(life)).grid(row0, column2, padx5) ttk.Label(mod, text提示:).grid(row1, column0, padx5, pady4, stickyw) self.entry_hint ttk.Entry(mod, width10) self.entry_hint.grid(row1, column1, padx5) self.entry_hint.insert(0, 99) ttk.Button(mod, text写入, commandlambda: self.write_value(hint)).grid(row1, column2, padx5) ttk.Label(mod, text分数:).grid(row2, column0, padx5, pady4, stickyw) self.entry_score ttk.Entry(mod, width10) self.entry_score.grid(row2, column1, padx5) self.entry_score.insert(0, 999999) ttk.Button(mod, text写入, commandlambda: self.write_value(score)).grid(row2, column2, padx5) ttk.Label(mod, text时间:).grid(row3, column0, padx5, pady4, stickyw) self.entry_time ttk.Entry(mod, width10) self.entry_time.grid(row3, column1, padx5) self.entry_time.insert(0, str(self.TIME_FREEZE_VALUE)) ttk.Button(mod, text写入, commandlambda: self.write_value(time)).grid(row3, column2, padx5) # 快捷操作区 quick ttk.LabelFrame(self.root, text快捷操作) quick.pack(fillx, padx10, pady8) ttk.Button(quick, text全部拉满, commandself.max_all).grid(row0, column0, padx5, pady5) self.btn_lock ttk.Button(quick, text锁定数值, commandself.toggle_lock) self.btn_lock.grid(row0, column1, padx5, pady5) self.btn_freeze_time ttk.Button(quick, text冻结时间, commandself.toggle_freeze_time) self.btn_freeze_time.grid(row0, column2, padx5, pady5) # 日志 self.log_text tk.Text(self.root, height6, statenormal) self.log_text.pack(fillboth, padx10, pady5) # ---------------- 进程扫描 ---------------- def scan_processes(self): candidates [] for proc in psutil.process_iter([pid, name]): try: name proc.info[name] or low name.lower() if any(k in low for k in self.PROC_KEYWORDS): candidates.append(f{name} (PID {proc.info[pid]})) except (psutil.NoSuchProcess, psutil.AccessDenied): continue candidates sorted(set(candidates), keylambda x: x.lower()) if candidates: self.combo_proc[values] candidates self.combo_proc.current(0) self.log(f扫描到 {len(candidates)} 个候选进程) else: self.combo_proc[values] [] self.combo_proc.set() self.log(未扫描到匹配进程请手动输入进程名或 PID) def on_combo_select(self, eventNone): text self.combo_proc.get() if not text: return name text.split(()[0].strip() self.entry_proc.delete(0, tk.END) self.entry_proc.insert(0, name) # ---------------- 附加逻辑 ---------------- def _do_attach(self, target): try: self.pm pymem.Pymem(target) self.process_name target self.lbl_status.config( textf状态: 已附加 {target} (PID {self.pm.process_id}), foregroundgreen ) self.log(f附加成功: {target} (PID {self.pm.process_id})) self.refresh_values() except Exception as e: self.pm None self.lbl_status.config(text状态: 附加失败, foregroundred) self.log(f附加失败: {e}) messagebox.showerror(错误, f无法附加进程:\n{e}) def attach_selected(self): text self.combo_proc.get() if not text: messagebox.showwarning(提示, 请先扫描并选择一个进程) return try: pid int(text.split(PID)[-1].strip( ())) self._do_attach(pid) except Exception: name text.split(()[0].strip() self._do_attach(name) def attach_manual(self): name self.entry_proc.get().strip() if not name: messagebox.showwarning(提示, 请输入进程名) return self._do_attach(name) def attach_by_pid(self): pid_str tk.simpledialog.askstring(附加 PID, 输入进程 PID:) if not pid_str: return try: pid int(pid_str.strip()) except ValueError: messagebox.showerror(错误, PID 必须是整数) return self._do_attach(pid) # ---------------- 数值读写 ---------------- def _read_by_type(self, addr, type_): if type_ float: return self.pm.read_float(addr) return self.pm.read_int(addr) def _write_by_type(self, addr, val, type_): if type_ float: self.pm.write_float(addr, float(val)) else: self.pm.write_int(addr, int(val)) def refresh_values(self): if not self.pm: return try: self.var_life.set(str(self.pm.read_int(self.ADDR_LIFE))) self.var_hint.set(str(self.pm.read_int(self.ADDR_HINT))) self.var_score.set(str(self.pm.read_int(self.ADDR_SCORE))) self.var_time.set(str(self._read_by_type(self.ADDR_TIME, self.TIME_TYPE))) except Exception as e: self.log(f读取失败: {e}) def write_value(self, kind): if not self.pm: messagebox.showwarning(提示, 请先附加进程) return try: if kind life: self.pm.write_int(self.ADDR_LIFE, int(self.entry_life.get())) self.log(f写入生命 {self.entry_life.get()}) elif kind hint: self.pm.write_int(self.ADDR_HINT, int(self.entry_hint.get())) self.log(f写入提示 {self.entry_hint.get()}) elif kind score: self.pm.write_int(self.ADDR_SCORE, int(self.entry_score.get())) self.log(f写入分数 {self.entry_score.get()}) elif kind time: self._write_by_type(self.ADDR_TIME, self.entry_time.get(), self.TIME_TYPE) self.log(f写入时间 {self.entry_time.get()}) self.refresh_values() except Exception as e: self.log(f写入失败: {e}) messagebox.showerror(错误, f写入失败:\n{e}) def max_all(self): if not self.pm: messagebox.showwarning(提示, 请先附加进程) return try: self.pm.write_int(self.ADDR_LIFE, 99) self.pm.write_int(self.ADDR_HINT, 99) self.pm.write_int(self.ADDR_SCORE, 999999) self.log(已拉满: 生命99, 提示99, 分数999999) self.refresh_values() except Exception as e: self.log(f操作失败: {e}) # ---------------- 锁定 ---------------- def toggle_lock(self): if not self.pm: messagebox.showwarning(提示, 请先附加进程) return if self.auto_running: self.auto_running False self.btn_lock.config(text锁定数值) self.log(已停止锁定) else: self.auto_running True self.btn_lock.config(text停止锁定) self.log(开始锁定生命和提示 (每 0.5 秒刷新)) self.auto_thread threading.Thread(targetself._lock_loop, daemonTrue) self.auto_thread.start() def _lock_loop(self): while self.auto_running and self.pm: try: self.pm.write_int(self.ADDR_LIFE, 99) self.pm.write_int(self.ADDR_HINT, 99) except Exception: pass time.sleep(0.5) # ---------------- 冻结时间 ---------------- def toggle_freeze_time(self): if not self.pm: messagebox.showwarning(提示, 请先附加进程) return self.freeze_time not self.freeze_time if self.freeze_time: self.btn_freeze_time.config(text停止冻结时间) self.log(f开始冻结时间 (地址 {hex(self.ADDR_TIME)})) threading.Thread(targetself._freeze_time_loop, daemonTrue).start() else: self.btn_freeze_time.config(text冻结时间) self.log(已停止冻结时间) def _freeze_time_loop(self): while self.freeze_time and self.pm: try: self._write_by_type(self.ADDR_TIME, self.TIME_FREEZE_VALUE, self.TIME_TYPE) except Exception: pass time.sleep(0.3) # ---------------- 日志 ---------------- def log(self, msg): t time.strftime(%H:%M:%S) self.log_text.insert(tk.END, f[{t}] {msg}\n) self.log_text.see(tk.END) if __name__ __main__: root tk.Tk() app LianLianKanTrainer(root) root.mainloop()python语言-连连看v4.92修改器源代码.ziphttps://download.csdn.net/download/qq_32257509/93805406
延伸阅读

更多相关文章

2026/11/6 1:33:46

6步走通 lego 开源贡献:ACME 证书客户端的参与开发指南

6步走通 lego 开源贡献:ACME 证书客户端的参与开发指南 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego lego 是一个用 Go 编写的 ACME 客户端与库,帮你的站点自动…

2026/11/6 1:33:46

Rabbitmq Management管理界面介绍

一、Overview Connections Channels Exchanges Queues and Streams Admin这些菜单分别对应RabbitMQ的整体状态、客户端连接、消息通道、交换机、队列以及系统管理等功能Rabbitmq中一条完整的消息传递流程通常如下生产者 ↓ Connection ↓ Channel ↓ Exchange ↓ Binding ↓ Qu…

2026/11/6 1:38:46

Bejeweled 3 经典模式 —— 穷举暴力试错版 v4(真零延迟)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:38:46

python语言-连连看3.2修改器代码QZQ

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:38:46

python语言-连连看v4.92修改器代码QZQ-2026-9-19

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:33:46

6步走通 lego 开源贡献:ACME 证书客户端的参与开发指南

6步走通 lego 开源贡献:ACME 证书客户端的参与开发指南 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego lego 是一个用 Go 编写的 ACME 客户端与库,帮你的站点自动…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑