




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 尊敬的各位评委 各位老师 你们好 我叫 来自班的 LZ 组合 我们组的题目是 连连 看辅助工具 在作品演讲之前 请允许我代表我们小组感谢黑马 IT 学院和 计算机学院能够提供给我这样一个展示自我的平台 谢谢 行行 礼礼 下面 开始我们组的品演示 首先 打开我们的连连看辅助 工具 因为在制作之前 我们小组考虑到不同系统的用户需求 所以制作了三个版本的 连连看辅助工具 并分别对应 W7 32 位操作系统 W7 64 位操作系统和 W8 64 位操作系统 由于我 的电脑是 W8 64 位操作系统 所以就只演示 W8 64 位版本的 接下来 让我们进入游戏 考虑到时间问题 所以只用练习 模式来演示 首先尝试 单消 功能 所谓单消 顾名思义 便是只消除一对棋子的意思 它是本游戏的基础 接下来的一 些中重要的功能都是围绕着它展开 然后 让我们尝试一下 秒杀 功能 秒杀 就是全屏清除 我们可以多尝试几个图 演示 演示 接下来 让我们尝试一下 自动挂机 功能 勾选 自动挂机 我们会发现游戏开始自动以一个一个的消除 同 时我们也可以通过移动下面的滑块来调节自动挂机的速度 这 就是我们的 挂机速度调节 功能 演示 演示 至于 去游戏倒 计时 功能 是取消游戏倒计时 让游戏无比流畅 而 无限 道具 功能 则是让游戏的道具增加 下面我给大家试一下 2 演示演示 接下来 自动开局 功能为了让游戏自动开始 窗口置顶 功能是将游戏页面放在桌面最上方 便于对游戏的操作 并使 游戏辅助工具更加稳定再加上先前 去游戏倒计时 功能都是 为了给游戏的自动挂机做铺垫 让挂机变得流畅 下面让我们 来试一下这两个功能 演示演示 讲解完了本工具的大体功能 让我们来和别人正式的玩一局 游戏时间 游戏时间 需自由发挥需自由发挥 带上所有的功能带上所有的功能 并突出功能特色 并突出功能特色 这真是完美的一次胜利 那它到底是怎样实现的哪 下面开始 进行 PPT 的讲解 这个辅助工具是由我们计算机科学与工程学院 班的 LZ 组 合制作 我们的口号是 理智成就自我 全组齐声 全组齐声 LZ 是 理智 的缩写 所以我们会用我们的理性和智慧去 处理每一件事 这虽然是我们小组第一次参加比赛 但我相信 这绝不会是最后一次 OK 下面让我们进入正题 我们的连连看辅助工具共有 8 项功能 包括 单消 秒杀 无限道具 自动开局 自动挂机 挂机速度调节 去游戏倒计 时 游戏窗口置顶 翻页 翻页 下面开始 单消 功能的详细介绍 首先让我们看看程序的流程图首先让我们看看程序的流程图 首先 我们读取棋盘的内存数据 3 然后判断是否有相同的棋子 接下来模拟鼠标点击 判断棋子的数量是否减少如果减少了 就更新棋盘数据 最后 结束单消 现在让我们来看看具体的代码 这是一段用来打开进程读取进程并将棋盘的内存数据存放到数 组中的程序 首先 我们定义一个字节型的数组因为棋盘是 11 行 19 列 所 以定义为 chessdata 11 19 然后定义一个 hWnd gameh 用来表示窗口句柄 FindWindow 是用来寻找窗口 ID 的函数 FindWindow LPCTSTR lpClassName pointer to class name LPCTSTR lpWindowName pointer to window name 这个函数拥有两个参数这个函数拥有两个参数 其中 lpClassName 参数指向类名 lpWindowName 指向窗口名 在本程序中不需要指向类名的参数 所以第一个参数为空 而 第二个参数指向窗口名 也就是之前定义过的 gameCaption 然后下一步我们需要定义一个 Double Word 类型的变量 processid 由于每个 word 为 2 个字节的长度 所以 processid 双 字节为 4 个字节 4 接下来我们要使用 GetWindowThreadProcessId 这个函数来找到 窗口的进程 这个函数同样拥有两个参数 DWORD GetWindowThreadProcessId HWND hWnd LPDWORD lpdwProcessId 其中第一个参数指向被查找的句柄其中第一个参数指向被查找的句柄 也就是也就是 Findwindow 的返回值的返回值 gameh 第二个参数是进程号的存放地址 我们可以指向刚刚定义的 processid hWnd in 向函数提供的 被查找窗口的句柄 lpdwProcessId out 进程号的存放地址 变量地址 接下来我们需要用 OpenProcess 这个函数获取进程的句柄并且 将句柄保存在 processH 中 OpenProcess 函数用来打开一个已存在的进程对象 并返回进 程的句柄 HANDLE OpenProcess DWORD dwDesiredAccess 渴望得到的 访问权限 标志 BOOL bInheritHandle 是否继承句柄 DWORD dwProcessId 进程标示符 这个函数拥有三个参数 第一个参数是访问权限这个函数拥有三个参数 第一个参数是访问权限 我们定义为 PROCESS ALL ACCESS 也就是对进程内存的全部操作权限 第二个是是否继承句柄 我们选择否 也就是 false 第三个 进程标示符 也就是进程号 我们已经通过 GetWindowThreadProcessId 得到了 也就是 processid 因此我们得到了进程的句柄 processH 5 然后我们需要定义一个同样是 Double Word 类型的变量 byread 再定义一个没有类型的指针 LPCVOID pbase 基础 这个指针存 放的是棋盘数据的首地址 其中这个 C 代表不能修改变量的意思 这个首地址是通过 CE CheatEngine61 cn 这个工具找到的 这 个基址是一个十六进制数字 0 x00189F74 然后再次定义一个没有类型的指针 LPVOID nbuffer 缓冲 用 来存放棋盘的数据 最后我们使用 ReadProcessMemory 这个函数 这个函数拥有 5 个参数 第一个是参数是进程的句柄 也就是 processH 第二 个参数是要读取内存的首地址 也就是我们之前定义的 pbase 第三个参数是我们存入内存数据的地址 我们将其存在 nuffer 中 第四个参数是要传送的字节数 因为棋盘是 11 19 所以我们 就传送 11 19 个数据 第五个参数是实际传送的字节数 函数 返回时报告实际写入多少 我们将其存在 byread 之中 BOOL ReadProcessMemory HANDLE hProcess PVOID pvAddressRemote PVOIDpvBufferLocal DWORD dwSize PDWORDpdwNumBytesRead 实际应用 hProcess in 远程进程句柄 被读取者 pvAddressRemote in 远程进程中内存地址 从具体何处读取 6 pvBufferLocal out 本地进程中内存地址 函数将读取的内容写 入此处 dwSize in 要传送的字节数 要写入多少 pdwNumBytesRead out 实际传送的字节数 函数返回时报告实 际写入多少 这样我们就完成读取棋盘数据的功能了这样我们就完成读取棋盘数据的功能了 然后我们开始寻找棋盘中相同的棋子 通过查找内存中相同的 数据我们找出相同的棋子 程序中的 for 循环是用来不断改变棋子的位子 其中 x1 y1 是棋 子 1 的位子 x2 y2 是棋子二的位子 x1 1 y1 1 代表第一行第一列的棋子 x1 2 y1 2 代表第二行 第二列的棋子 以此类推 如果棋子 1 与棋子 2 的内存数据相等 那么我们就模拟鼠标点 击 然后通过鼠标的模拟点击和棋子数量是否减少来决定单消 的程序是否结束 下面我们开始介绍模拟鼠标点击的程序 首先我们通过之前的 ReadProcessMemory 函数 将棋盘中剩余棋子的数量保存在 chessnum 中 然后将它的值赋给 l 通过 Findwindow 获得窗口句柄 并且将 其保存在 hwnd 中 然后定义一个整型变量 lparam 根据棋子 1 与棋子 2 的位子来给 lparam 赋值 因为第一行第一 7 列的鼠标坐标为 192 21 相邻棋子之间的间隔为 35 并且由于我们要用到的是 32 位的鼠标地址 我们我们将 x 左移 16 位 所以给 lparam 赋值为 lparam p1 y 35 192 16 p1 x 31 21 接下来我们开始使用这个 SendMassage 函数 该函数将指定的 消息发送到一个或多个窗口 此函数为指定的窗口调用窗口程 序 直到窗口程序处理完消息再返回 而我们就需要这个函数发送一个鼠标消息 这个函数拥有四个 参数 第一个是我们通过 Findwindow 找到的窗口的句柄 hwnd 第二个是消息的标识 志 符 我们模拟的是鼠标点击 所以就是 WM LBUTTONDOWN 和 WM LBUTTONUP 对应 的是鼠标的按下和抬起 第三个和第四个参数都是 32 位的特定 附加信息 我们使用第四个 也就是将第三个参数设为零 第 四个参数设为鼠标地址也就是我们之前定义的 lparam sendmessage hWnd 是接收消息的窗口的句柄 Msg 是消息标识符 wParam 是 32 位的特定附加信息 lParam 是 32 位特定附加信息 这样我们就可以模拟点击棋子这样我们就可以模拟点击棋子 1 了了 然后我们再次按照上面的 方法点击棋子二 通过下面 if 语句 判断如果棋子减少了 就 返回大于一的数 终止循环 如果棋子不变 就返回 0 让上 8 面的循环继续 知道棋子数发生变化为止 这样 我们的单消功能就完成了 下面我们开始讲解秒杀的程序 先看看流程图 首先我们需要执行单消这个程序 然后我们需 要判断棋子数是否为零 如果为零就退出循环结束程序 如果 不为零 就继续执行单消程序 下面开始讲解代码的实现 我们先将单消的函数进行封装 定义成 clearpair 函数 然后我们经行 while 循环 直到棋子数为零 才终止循环 此 时 我们也就完成了秒杀功能 下面我们开始介绍无限道具的程序 对于无限道具 我们只需要找到游戏道具的内存地址 并且将 其改写就 OK 了 下面开始讲解程序 程序前面我们已经讲解过 定义窗口名 获取窗口句柄 获取 进程句柄 唯一不同的是我们要用到 writeprocessmemory 函数 来写入进程 WriteProcessMemory 9 此函数能写入某一进程的内存区域 直接写入会出 Access Violation 错误 故需此函数 VC 声明 BOOL WriteProcessMemory HANDLE hProcess LPVOID lpBaseAddress LPVOID lpBuffer DWORD nSize LPDWORD lpNumberOfBytesWritten 参数 hProcess 由 OpenProcess 返回的进程句柄 如参数传数据为 INVALID HANDLE VALUE 即 1 目标进 程为自身进程 lpBaseAddress 要写的内存首地址 再写入之前 此函数将先检查目标地址是否可用 并能容纳待 写入的数据 lpBuffer 指向要写的数据的指针 nSize 要写入的字节数 返回值 非零值代表成功 该函数一共拥有 5 个参数 第一个参数是由 openprocess 返回的 10 进程句柄 第二个是要写入的首地址 也就是我们游戏道具的 首地址 要写入数据的指针 也就是我在上面定义的数组 a b c d e 第四个是要写入的字节数 我们都定义为 1 个字节 第五个是 返回值 我们把上面定义的 bywritesize 放到这里 存储返回值 由于道具是有两个内存地址控制 一个地址控制道具种类 一 个地址控制道具数量 例如第一个函数控制的是道具的数量 第二个控制的就是 重列 这个道具是否出现 这样我们就完成游戏道具内存的写入了 下面开始讲解自动挂机的功能 这个功能很简单 只需要在单消的基础上加入一个定时器函数 就行了 流程图也很简单 就是更新数据 然后定时器函数重 复单消 然后再次更新数据 下面开始讲解代码的实现 首先我们先定义两个常量 一个变 量 然后更新棋盘数据 通过 if 语句来判断此项功能是否被勾 选 如果被勾选 就再次更新棋盘数据 然后使用 settimer 这 个定时器函数 UINT PTR SetTimer HWND hWnd 窗口句柄 UINT PTR nIDEvent 定时器 ID 多个定时器时 可以通过该 ID 判断是 11 哪个定时器 UINT nElapse 时间间隔 单位为毫秒 TIMERPROC lpTimerFunc 回调函数 在 MFC 程序中 SetTimer 被封装在 CWnd 类中 调用就不用指 定窗口句柄了 所以这个函数就只有三个参数 第一个参数是 定时器的 ID 我们把它指向之前定义的 playID 第二个是时间 间隔 q 的值为 1000 所以时间间隔为 1s 第三个参数是回调函 数 我们这回调函数中放入单消的函数 在下面这个程序里面 了 这样就是每间隔 1s 就执行一次单消函数 所以就实现了自动挂 机的功能 下面开始介绍自动开局功能 首先 让我们看看流程图 我们需要先更新数据 然后判断棋子的数量 如果棋子数量为 零 那么我们就模拟鼠标点击 开始游戏 如果不为零的话就 重新更新棋盘数据 直到它为 0 为止 下面让我们看看程序的实现 首先通过 IF 语句来判断棋子数是否为零 如果为 0 就延时 1s 并获取窗口的句柄 并且模拟鼠标的点击 开始游戏 这样就完成自动开局的功能 12 下面开始介绍挂机速度调节功能 让我们看看流程图 首先 我们需要创建一个滑块 然后定义一个变量并且将变量传给 自动挂机里的时间标识 然后更新数据 下面让我们看看那代码的实现 首先 我们需要更新一下数据 然后将滑块的值赋给 m num 其中 this 是关键字 属于实体 entity 是一个指针右值 而后面的 m ctl slider GetPos 是滑块当前的位子的值 至于这个 pResult 0 是为了防止对未知的位子进行操作 增加 程序的稳定性 然后我们将滑块的值传递给 Q 通过滑块改变 Q 的值 就能改 变下面自动挂机函数的时间间隔 进而改变自动挂机的速度 下面是去游戏倒计时功能 这个功能和无限道具功能的代码类似 都是读取进程 然后写 入进程就行了 这里就不过多的解释了 13 下面是游戏窗口置顶功能 首先 我们要更新一下游戏数据 然后获取游戏窗口名 最后使用一下窗口置顶函数 让我们看看代码的实现 用 FINDWINDOW 找到窗口的句柄 然后使用 SetWindowPos 函数 这个函数一共有 7 个参数 第一 个参数是窗口的句柄 也就是我们之前定义的 gameh 第二个 参数是我们要把这个窗口放到哪 我们选择 HWND NOTOPMOST 将窗口置于所有非顶层窗口之上 第三个参数到第六个参数设定窗口的位子和大小 我们将其都 设为 0 第七个窗口是窗口尺寸和定位的标志 我们使用这三 个参数 组合成一个参数 分别是 SWP NOMOVE 维持当前 位置 忽略 X 和 Y 参数 SWP NOSIZE 维持当前尺寸 忽 略 cx 和 Cy 参数 SWP SHOWWINDOW 显示窗口 BOOL SetWindowPos HWND hWnd const CWnd pWndInsertAfter int x int y int cx int cy UINT nFlags 这样我们就完成了窗口置顶的设置 HWND NOTOPMOST 将窗口置于所有非顶层窗口之上 即 在所有顶层窗口之后 如果窗口已经是非顶层窗口则该标志不 起作用 x 14 以客户坐标指定窗口新位置的左边界 Y 以客户坐标指定窗口新位置的顶边界 cx 以像素指定窗口的新的宽度 cy 以像素指定窗口的新的高度 SWP NOMOVE 维持当前位置 忽略 X 和 Y 参数 SWP NOSIZE 维持当前尺寸 忽略 cx 和 Cy 参数 SWP SHOWWINDOW 显示窗口 下面开始对我们作品的优点进行总结 首先我们对大量的函数进行了封装 例如单消函数 模拟鼠标 点击函数等等 尽量简洁了函数 其次 我们添加了自动使用重列的函数 因为我们在游戏的时 候 很可能会遇到这种情况 提示请使用重列道具 此时 我 们不得不手动的去使用重列道具 因此我们在单消函数中添加了自动使用重列 这样就能在无解 的情况下自动使用重列 下面让我们来看看自动使用重列的代码 使用自动重列的条件 15 是棋子的数量在经过一次完整的单消循环后还没有变化 此时 就会模拟鼠标点击重列道具
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手指点画《大树》课件
- 油墨厂三辊机转速校准规定
- 四川省自贡市蜀光绿盛实验学校2025-2026学年七年级上学期9月月考英语试题(无答案)
- 学生食品安全培训小结课件
- 2025-2026学年山西省吕梁市汾阳中学高二(上)第一次月考数学试卷(含答案)
- 手工搬运安全培训课件
- 会议管理制度保密
- 连续性认知形成路径-洞察及研究
- 手写安全培训课件
- 注册化工工程师练习题:专业知识测练习题模拟及答案
- 西一线安全改造ge机组-运行维护手册中文版-中文volume i
- 抗菌药物敏感性试验(药敏试验)
- 听余映潮老师讲《咏雪》(课堂实录 )
- 华为TaiShan200-X6000服务器技术白皮书
- 地质勘查单位安全检查表-(修订本)
- 山东省装备制造业调整振兴规划在建重点项目表
- 中英-外研社五年级上册课文翻译(一年级起点)
- 氨基酸溶解性(共1页)
- GDX2包装机组工艺流程简介
- 张家口至涿州公路张家口段(含连接线)建设项目水资源论
- 组织与管理研究的主流理论 ppt课件
评论
0/150
提交评论