unit DDPUnit;

interface

uses windows, Messages;
procedure Start();
procedure AutoPlay(pa, pb: TPoint);
procedure clearone; // 实现单消
procedure addSpeed; // 去掉消除动画,实现加速
procedure subSpeed; //回复原来速度

type // 定义两个数据类型
  twoXy = array [1 .. 2] of TPoint;
  QP_Array = Array [1 .. 8, 1 .. 25] of byte; //存储棋盘数据

var
  ChessData: QP_Array; //棋盘数据
  sitBase: array [0 .. 3] of Dword = (
    坐0号桌时棋盘基址,
    坐1号桌时棋盘基址
    坐2号桌时棋盘基址
    坐3号桌时棋盘基址
  );
Function TestChess(qp1: QP_Array): bool;
Function GetPoint(): twoXy;
function GetSitNum(): Dword;

// 当前棋盘数组
implementation

// 游戏开局
procedure Start();
var
  Gameh: HWND;
begin
  Gameh := FindWindow(nil, '对对碰角色版');
  // 模拟鼠标单击
  SendMessage(Gameh, Messages.WM_LBUTTONDOWN, 0, $0180017A); // 按下
  SendMessage(Gameh, Messages.WM_LBUTTONUP, 0, $0180017A); // 抬起
end;

Function GetSitNum(): Dword;
var
  Gameh: HWND;
  GamePid: Dword;
  GameProcess: THandle;
  SitNum: Dword;
  readByte: Dword;
begin
  Gameh := FindWindow(nil, '对对碰角色版');

// 找进程ID
  GetWindowThreadProcessId(Gameh, GamePid);
  // 获取进程句柄
  GameProcess := OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE, False,
    GamePid);
  // 读出座位号
  ReadProcessMemory(GameProcess, Pointer(座位号基址), @SitNum, 4, readByte);
  // 显示座位号
  Result := SitNum;
end;

procedure AutoPlay(pa: TPoint; pb: TPoint);
var
  Gameh: HWND;
  lparam: Dword;
  p1, p2: TPoint;
begin
  Gameh := FindWindow(nil, '对对碰角色版');
  p1.x := 272 + 48 * (pa.x - 1);
  p1.y := 100 + 48 * (pa.y - 1);
  p2.x := 272 + 48 * (pb.x - 1);
  p2.y := 100 + 48 * (pb.y - 1);
  if Gameh <> 0 then
  begin
    lparam := p1.x + p1.y shl 16;
    SendMessage(Gameh, WM_LBUTTONDOWN, 0, lparam); // 鼠标按下
    SendMessage(Gameh, WM_LBUTTONUP, 0, lparam); // 鼠标抬起

lparam := p2.x + p2.y shl 16;
    SendMessage(Gameh, WM_LBUTTONDOWN, 0, lparam); // 鼠标按下
    SendMessage(Gameh, WM_LBUTTONUP, 0, lparam); // 鼠标抬起

end;
end;

procedure clearone; // 实现单消
var
  pxy: twoXy;
begin
  pxy := GetPoint();
  AutoPlay(pxy[1], pxy[2]);
end;

// 更新棋盘数据
procedure upDataChess(); // 读出棋盘数组
var
  Gameh: HWND;
  GamePid: Dword;
  Gamehprocess: THandle;
  readByte: Dword;
begin
  Gameh := FindWindow(nil, '对对碰角色版'); // 获取游戏窗口句柄
  GetWindowThreadProcessId(Gameh, GamePid); // 获取进程ID
  Gamehprocess := OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE, False,
    GamePid); // 获取进程句柄
  ReadProcessMemory(Gamehprocess, Pointer(sitBase[GetSitNum]), @ChessData, 200,
    readByte); // 根据坐位号码 读出相应棋盘数据
end;

// 获取交换点
Function GetPoint(): twoXy; // 获取可交换的2个点
var
  x, y, t1: byte;
  qp: QP_Array;
begin
  /// 
  for x := 1 to 8 do // 1-8列
    for y := 1 to 7 do // 遍历某列
    begin
      upDataChess; // 更新棋盘数据
      qp := ChessData;
      t1 := qp[x][y];
      qp[x][y] := qp[x][y + 1];
      qp[x][y + 1] := t1; // 交换相临棋子
      if TestChess(qp) then
      begin
        Result[1].x := x;
        Result[1].y := y;
        Result[2].x := x;
        Result[2].y := y + 1;
        exit;
      end;

end; // end for
  for y := 1 to 8 do
    for x := 1 to 7 do
    begin
      upDataChess; // 更新棋盘数据
      qp := ChessData; //
      t1 := qp[x][y];
      qp[x][y] := qp[x + 1][y];
      qp[x + 1][y] := t1; // 交换相临的2点

if TestChess(qp) then
      begin // 如果交换后的棋盘 存在 三个相同的棋子相连
        Result[1].x := x;
        Result[1].y := y;
        Result[2].x := x + 1;
        Result[2].y := y;
        exit;
      end;

end; // end for

end; // end Function

Function TestChess(qp1: QP_Array): bool; // 测试交换过的棋盘 内是否有 三个相同棋子相连 3
var
  r1, x, y: byte;
begin

Result := False;

for y := 1 to 8 do // 1-8行坐标
  begin
    r1 := 1;
    for x := 1 to 7 do // Y列坐标
    begin

if qp1[x][y] = qp1[x + 1][y] then
      begin
        r1 := r1 + 1; // 累计相同棋子数
        if r1 >= 3 then
        begin
          Result := true;
          exit;
        end;
      end
      else
        r1 := 1; // 初始化累计 1
    end;
  end;
  /// //
  // 遍历 1-8 列 看是否有 3子 相连的
  for x := 1 to 8 do //
  begin
    r1 := 1;
    for y := 1 to 7 do // 列坐标
    begin
      if qp1[x][y] = qp1[x][y + 1] then
      begin
        r1 := r1 + 1; // 累计 相同的棋子数
        if r1 >= 3 then
        begin
          Result := true;
          exit;
        end; //
      end
      else
        r1 := 1; // 如果相临棋子 不同,则初如化累计值
    end;
  end;
end; // End Function

var
  NewSpeed: array [1 .. 5] of byte = ($90,$90,$6A,$01,$90);
  OldSpeed: array [1 .. 5] of byte = ($EB,$02,$33,$C9,$51);
  SleepBase: Dword = $0041E74D;
procedure addSpeed();
var
  Gameh: HWND;
  GamePid: Dword;
  GameProcess: THandle;
  WriteByte: Dword;
begin
  Gameh := FindWindow(nil, '对对碰角色版');
  if Gameh <> 0 then
  begin
    GetWindowThreadProcessId(Gameh, GamePid);
    GameProcess := OpenProcess(windows.PROCESS_ALL_ACCESS, False, GamePid);
    WriteProcessMemory(GameProcess, Pointer(SleepBase), @NewSpeed[1], 5,
      WriteByte);
  end;
end;
procedure subSpeed;
var
  Gameh: HWND;
  GamePid: Dword;
  GameProcess: THandle;
  WriteByte: Dword;
begin
  Gameh := FindWindow(nil, '对对碰角色版');
  if Gameh <> 0 then
  begin
    GetWindowThreadProcessId(Gameh, GamePid);
    GameProcess := OpenProcess(windows.PROCESS_ALL_ACCESS, False, GamePid);
    WriteProcessMemory(GameProcess, Pointer(SleepBase), @OldSpeed[1], 5,
      WriteByte);
  end;
end;
// End Procudure
end.

转载于:https://www.cnblogs.com/heimirror/archive/2010/09/03/1817472.html

Delphi 对对碰外挂 记录相关推荐

  1. [转载]关于QQ游戏外挂mouse_event不起作用的原因,及我的对对碰外挂程序.

    资源名称 关于QQ游戏外挂mouse_event不起作用的原因,及我的对对碰外挂程序. 作者: dongfa 适用语言: .NET 文件大小 2161 运行平台: Windows XP 上传者: sh ...

  2. vc6做对对碰外挂原理

    前段时间跟以前的同事玩 QQ 游戏对对碰,结果输的好惨,后来在网上看到了有对对碰的外挂,但还需要注册,就考虑既然别人可以写出来,我为什么就不能写出来呢?于是花了一个下午的时间仔细研究了一下,把外挂写了 ...

  3. 教你用VC6做QQ对对碰外挂程序

    前段时间跟以前的同事玩QQ游戏对对碰,结果输的好惨,后来在网上看到了有对对碰的外挂,但还需要注册,就考虑既然别人可以写出来,我为什么就不能写出来呢?于是花了一个下午的时间仔细研究了一下,把外挂写了出来 ...

  4. 刚写的QQ对对碰外挂

    新写了一个QQ对对碰游戏的外挂.支持NT系列系统,在XP, Win7系统都测试过可运行. 打开游戏后,使用本外挂,点开始挂机后可以自动进行游戏,自己可以进行做别的操作.外挂会自动智能判断一局游戏是否己 ...

  5. 基于C#实现QQ对对碰外挂 主要讲思路(原创)有更新

    0.首先还是先展示一下运行效果 1.做外挂的起因 玩过几次QQ对对碰游戏,感觉挺好玩.玩着玩着实然心血来潮,打算做一个外挂出现.简单想了一下,感觉可以实现:).然后就决定把它做出来.带着兴趣带着好奇心 ...

  6. VC6做QQ对对碰外挂程序

    前段时间跟以前的同事玩QQ游戏对对碰,结果输的好惨,后来在网上看到了有对对碰的外挂,但还需要注册,就考虑既然别人可以写出来,我为什么就不能写出来呢?于是花了一个下午的时间仔细研究了一下,把外挂写了出来 ...

  7. 用VC6做QQ对对碰外挂程序

    前段时间跟以前的同事玩QQ游戏对对碰,结果输的好惨,后来在网上看到了有对对碰的外挂,但还需要注册,就考虑既然别人可以写出来,我为什么就不能写出来呢?于是花了一个下午的时间仔细研究了一下,把外挂写了出来 ...

  8. QQ游戏外挂制作教程 (对对碰)

    这些日子,QQ游戏外挂是风光了一阵.俄罗斯方块,连连看,对对碰这些游戏的外挂层出不穷.其实这一类外挂的原理大体都是一样的.下面我就以QQ游戏对对碰外挂作为例子阐述一下QQ外挂的制作原理.       ...

  9. ~QQ新版对对碰游戏外挂的制作方法~

    这段时间休假在家,无聊的时候玩了会qq的对对碰游戏,以前用过网友阿东的qq对对碰外挂,但是阿东的外挂在对对碰游戏改版后好像不好使了,正好自己也想重新写一个,于是开始动手. 一.思路 1.获取游戏窗体句 ...

最新文章

  1. 新手vue构建单页面应用实例
  2. SpringBoot简单使用ehcache
  3. C++primer CH12智能指针
  4. 欢迎使用CSDN-markdown编辑器111
  5. Oracle新建用户并授权
  6. 算法题目——第K大的数
  7. SQLite内置表SQLITE_MASTER
  8. IntelliJ IDEA 2020 创建xml文件
  9. 埋点测试-移动端/PC端
  10. 【Nginx那些事】Nginx 配置文件说明
  11. 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
  12. python编写性别比例失衡_性别比例失衡加剧什么情况?什么原因导致这样的结果?...
  13. Java毕业设计教程源码分享——简易网盘
  14. Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
  15. 为什么保险公司一直不停地招人?
  16. 3D结构光摄像头深度算法介绍
  17. 33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作
  18. 史上最全!数据分析进阶教程,看这一篇就够了!
  19. 第十二届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组解析
  20. ID Ransomware帮你识别到底中了什么勒索软件

热门文章

  1. Flink 报错:unable to generate a JAAS configuration file
  2. Oracle数据库安装,以及使用plsql Dev连接数据库实例
  3. vue 实现Excel 导出
  4. EasyRecovery易恢复2023最新版数据恢复软件功能特色介绍
  5. 模型调参之网格搜索与随机搜索
  6. 带你入门学习Rxjava--上手教程
  7. 安装软件时内存还有很多却依然提示空间不足的解决办法
  8. 字幕滚动效果html,修改好的jquery滚动字幕效果实现代码
  9. 外链代发切勿用群发器
  10. idea使用大全 idea快捷键大全