网站首页 > 技术教程 正文
数据我们已经获取到了,接下来 没有什么能阻止我们实现外挂了~
我们先在我们的游戏中,定义一个[11][19]的byte类型数组 用以存储数据
byte m_szGameData[11][19];
然后再写一个 ReadGameData() 函数 用以读取数据
bool CKyodaiPluginDlg::ReadGameData()
{
HWND hGameWnd = GetGameHwnd();
ZeroMemory(m_szGameData, 11 * 19);
if (!hGameWnd)
{
return false;
}
DWORD dwPid = false;
GetWindowThreadProcessId(hGameWnd, &dwPid);
HANDLE hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
if (!hGameProcess)
{
MessageBox(L”打开进程失败”);
return false;
}
if (!ReadProcessMemory(hGameProcess, (LPVOID)0x00199F68, m_szGameData, sizeof(m_szGameData), NULL))
{
return false;
}
}
上面这段代码大家都很熟悉了,就不做讲解了(若想了解更多,请关注我的博客 http://www点dbgpro点com)
接下来就是要怎么消除的问题了,如下图,是否可以消除无非就是三种情况,两个在同一条线上,这也就一条线可以消除,要要门就是2条线段可以消除,最多只能有3条线
我们要判断x1,y1 x2,y能否消除 我们要先构建2个点x3y3,x4y4 如果 x1y1能到达x3y3(也就是说他们直接的数据都是0) 并且x3y3能到达x4y4 并且 x2y2能到达x4y4则 可以消除
//判断两个点之间是不是连通的
bool CLLK_WGDlg::LineIsNull(int nRow, int nCol, int nRow2, int nCol2)
{
if (nRow2 == nRow && nCol2 != nCol)
{
int nColMax = max(nCol2,nCol);
int nColMin = min(nCol2,nCol);
for (int y = nColMin; y <= nColMax;y++)
{
if (m_szGameData[nRow][y] != 0)
{
return false;
}
}
return true;
}
else if (nCol == nCol2 && nRow != nRow2)
{
int nRowMin = min(nRow,nRow2);
int nRowMax = max(nRow,nRow2);
for (int x = nRowMin; x <= nRowMax;x++)
{
if (m_szGameData[x][nCol] != 0)
{
return false;
}
}
return true;
}
else if (nRow2 == nRow && nCol2 == nCol) // 2点为同一点的情况
{
return true;
}
else
{
return false;
}
return true;
}
bool CLLK_WGDlg::IsClear(int nRow, int nCol, int nRow2, int nCol2)
{
//先把两个点的数据拿出来
byte data1 = m_szGameData[nRow][nCol];
byte data2 = m_szGameData[nRow2][nCol2];
//把两个点的数据置0 是为了两个贴在一起的能消除
m_szGameData[nRow][nCol] = 0;
m_szGameData[nRow2][nCol2] = 0;
int nTmpRow1 = nRow;
int nTmpRow2 = nRow2;
for (int nTmpCol = 0; nTmpCol < 19;nTmpCol++)
{
if (LineIsNull(nTmpRow1, nTmpCol, nTmpRow2, nTmpCol) && LineIsNull(nTmpRow1, nTmpCol, nRow, nCol) && LineIsNull(nTmpRow2, nTmpCol, nRow2, nCol2))
{
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return true;
}
}
int nTmpCol1 = nCol;
int nTmpCol2 = nCol2;
for (int nTmpRow = 0; nTmpRow < 11;nTmpRow++)
{
if (LineIsNull(nTmpRow, nTmpCol1,nTmpRow, nTmpCol2) && LineIsNull(nTmpRow,nTmpCol1,nRow, nCol) && LineIsNull(nTmpRow,nTmpCol2, nRow2, nCol2))
{
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return true;
}
}
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return false;
}
我们再添加一个函数 ClearOne 用于消除一对
void CKyodaiPluginDlg::ClearOne()
{
ReadGameData();
for (int nRow = 0; nRow < 11; nRow++)
{
for (int nCol = 0; nCol < 19; nCol++)
{
if (m_szGameData[nRow][nCol] == 0)
{
continue;
}
for (int nRow2 = 0; nRow2 < 11; nRow2++)
{
for (int nCol2 = 0; nCol2 < 19; nCol2++)
{
if ((nRow2 != nRow || nCol2 != nCol) && m_szGameData[nRow][nCol] == m_szGameData[nRow2][nCol2] && IsClear(nRow, nCol, nRow2, nCol2))
{
SelectChess(nRow, nCol);
SelectChess(nRow2, nCol2);
return;
}
}
}
}
}
}
clearOne中 如果判断可以消除 则调用SelectChess
可以消的算法有了,我们双击单消按钮,然后添加代码如下
void CKyodaiPluginDlg::SelectChess(int nRow, int nCol)
{
HWND hGameWnd = GetGameHwnd();
if (hGameWnd)
{
int nPosXBase = 5;
int nPosYBase = 165;
int xPos = (nCol + 1) * 30 + nPosXBase;
int yPos = (nRow + 1) * 35 + nPosYBase;
::PostMessage(hGameWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(xPos, yPos));
::PostMessage(hGameWnd, WM_LBUTTONUP, 0, MAKELPARAM(xPos, yPos));
}
}
上面代码中5,165是第一个图片的位置,30,35是每一格图片的大小
接着,我们在按钮消除一对的响应函数中 增加如下调用一下 ClearOne
//消除一对
void CKyodaiPluginDlg::OnBnClickedBtnremove()
{
ClearOne();
}
接着我们运行游戏 测试一下....本篇文章到此结束(若想了解更多,请关注我的博客 http://www点dbgpro点com)...QQ连连看写辅助系列未完待续...
QQ连连看写辅助系列每篇都有源代码,若想获取源代码请私信我。
猜你喜欢
- 2024-10-06 《寅虎九月运势燃爆!一路开挂逆袭》,好运连连!
- 2024-10-06 又好看,操作又简单 又好看又简单的手工作品
- 2024-10-06 好消息!语文老师、数学老师又有新教学工具可以用,学生会超喜欢
- 2024-10-06 CSGO:正义会迟到,但终究会降临——关于反作弊系统
- 2024-10-06 超方便的 Python 自动唤醒窗口截图脚本
- 2024-10-06 半夜,火车上遇见能“看事”的。 在火车上遇见的奇葩事
- 2024-10-06 新手学Python必看的几个练手小项目,轻松不枯燥哦
- 2024-10-06 腾讯连连小程序发布2.0版本,优化IoT场景使用体验
- 2024-10-06 我以为是个正经程序猿,结果是个中二段子精
- 2024-10-06 C语言项目实战:《连连看》基础项目!460 行源码注释,干货满满
你 发表评论:
欢迎- 05-05从virsh当中学习QEMU/KVM启动命令
- 05-05Win10 BCD文件损坏怎么修复?(bcd文件损坏win7)
- 05-05亚马逊春节假期期间的店铺管理设置
- 05-051分钟总结常用k8s常用诊断教程(k8s常见故障)
- 05-05VisiPics重复图片查找软件中文汉化教程
- 05-05微服务的发布实现方式1灰度实现(微服务实现原理)
- 05-05轻松掌握Java多线程 - 第二章:线程的生命周期
- 05-05德拉诺之王邪DK报告:PVE向小测试及分析
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)