Bean For Programmer(2)一个幽默的标准转弯。
2007 八月 9
记得前些日子我说有一个Bean For Programmer计划,不知道有没有人当真。现在这个计划已经有了一些小小的进展,能够读取地图了。换句话说,计划已经完成了0.01%—–很可观的数字。不过在此不着重谈这个,现在要说的是一个规则的实现方法。Bean For Programmer计划中详细地写出了规则:其中一条是:“8、主程序控制3个(或更多)棋子,并通知参赛机器人比赛开始并提供当前地图、棋子信息和位置”。问题来了,如何“向机器人提供当前地图”?或许有一种非常简单的方法:向机器人发送一个包含地图路径的信息。但是假如为了公平竞赛,不允许将地图保存在磁盘上而是单独提供一个EXE来保存地图该怎么办呢?下面我来演示一下:
1.建立一个保存地图的EXE(简称地图EXE),定义一个20*20(实际需要可能不止如此)的数组,里面包含两个值:1或0(为了以后丰富地图方便,我们把它声明为byte而不是Boolean):
Map: Array[1..20, 1..20] Of byte;
2.运行OllyDBG并定位到保存Map值的地方。
3.复制地址。
4.机器人部分:
HANO:=FindWindow(Nil, 'Bean for programmer'); //找窗口(地图EXE标题为'Bean for programmer) If HANO=0 Then//寻找窗体, Begin MessageBox(0, '没有找到目标程序', '我敬爱的Bean', mb_ok); Exit End; FromH:=$00454DA0;//开始地址 GetWindowThreadProcessId(HANO, @Dw1); HANS:=OpenProcess(PROCESS_VM_READ, True, Dw1); //打开进程 For i:=1 To 400 Do Begin inc(FromH); If ReadProcessMemory(HANS, pointer(FromH-1), lpBuffer, 1, lpNumberOfBytesRead) Then//对地图EXE的内存数据 s:=s+IntToStr(lpBuffer^);//这样我们就获得了包含地图EXE中Map数组的值。 End;
5.根据s画出地图。下面我截取了地图EXE和机器人端画出的地图。
(1)机器人端
(2)地图EXE端
我们可以发现两幅地图完全一样,OK,大功告成。
相关日志
No comments yet


