游戏挂机机器人框架
2016-03-13 16:11
274 查看
非动作类游戏,一般对实时性要求不高,一般有几种事件:
1、快速的事件,几秒钟或者十几秒发生一次;
2、慢速事件,几分钟或者几十分钟触发一次,时间间隔相对固定;
3、定时事件,一般是中午12点或者晚上6点,发体力或者做活动;
4、集中事件,一般是活动,比如答题什么的,这种一般还是手动操作,没必要机器做:
1重复度不高,2时间较短,3复杂度高,当然非得要机器做也可以,等价于定时事件包含快速事件或慢速事件;
5、随机事件或突发事件
按键精灵9+大漠插件
一种框架是一个事件开一个线程,优点是无脑,缺点是每个线程需要绑定一次图形插件,且需要自定义互斥量结构(保护临界资源鼠标和键盘,实现某项操作时一般有连续的鼠标键盘操作,不能错序或者中断,当然如果你非要写个操作栈将当前状态入栈,类似linux进程切换一样,也是可以的)。
另一种框架开两个线程,类似不带操作系统的简单单片机程序,一个主循环,一个辅循环(单片机中断源)
,相当于一个监察者,一个执行者,监察者轮询事件容器中事件是否触发,若是其中有事件触发,则等待执行者当前事务完成,然后交给执行者去完成,执行者完成任务后若是没有接到下一个任务,则执行默认任务(快速事件)。
两个循环最好在两个线程,逻辑会比较清晰,如果非得要单线程,也是可以的。
//---------------------------------------------------------------------------------------------------------/
伪代码:
定义状态标识集合(一般将快速事件设置为默认状态,其余的事件各自定义)。
辅循环 (监察者):
while 1
获取当前时间
与定时事件时间比较
如果时间已到达
则等待状态标识回归默认状态(此处的等待实际是隐含的加锁,保护状态标识,确保只有一个事件在等待被处理,不会错过事件,且不会有双生产者修改状态标识,产生竞态,当然也可以写一个事件队列,然而对这个编程语言不是很了解,貌似是vb)将状态设置为此超时事件等待处理
与慢速事件超时时间相比较
如果时间已经超时
则等待状态标识回归默认状态,将状态设置为超时事件等待处理
检验随机事件触发条件
如果随机事件达到触发条件
则等待状态标识回归默认状态,将状态设置为随机事件等待处理
//-------------------------------------------------------------------------------------------------------------------------------
主循环(执行者):
While 1
While 当前状态标识为快速事件等待处理
执行快速事件
如果,当前状态标识为慢速事件等待处理
则处理事件,事件处理完成后,重新设置此事件的超时时间,将状态标识设置为默认状态
如果,当前状态标识为定时事件或者随机事件等待处理
则处理事件,事件处理完成后,将状态标识设置为默认状态
//------------------------------------------------------------------------------------------
以下是用按键精灵9+大漠插件+天天模拟器的《大富豪2》策略经营手游自动机器人
买卖股票属于快速事件(默认状态)
员工鼓励属于慢速事件(15分钟间隔)
挑战属于集中事件(定时事件包含慢速事件)(11点开始,8分钟一次)
1、快速的事件,几秒钟或者十几秒发生一次;
2、慢速事件,几分钟或者几十分钟触发一次,时间间隔相对固定;
3、定时事件,一般是中午12点或者晚上6点,发体力或者做活动;
4、集中事件,一般是活动,比如答题什么的,这种一般还是手动操作,没必要机器做:
1重复度不高,2时间较短,3复杂度高,当然非得要机器做也可以,等价于定时事件包含快速事件或慢速事件;
5、随机事件或突发事件
按键精灵9+大漠插件
一种框架是一个事件开一个线程,优点是无脑,缺点是每个线程需要绑定一次图形插件,且需要自定义互斥量结构(保护临界资源鼠标和键盘,实现某项操作时一般有连续的鼠标键盘操作,不能错序或者中断,当然如果你非要写个操作栈将当前状态入栈,类似linux进程切换一样,也是可以的)。
另一种框架开两个线程,类似不带操作系统的简单单片机程序,一个主循环,一个辅循环(单片机中断源)
,相当于一个监察者,一个执行者,监察者轮询事件容器中事件是否触发,若是其中有事件触发,则等待执行者当前事务完成,然后交给执行者去完成,执行者完成任务后若是没有接到下一个任务,则执行默认任务(快速事件)。
两个循环最好在两个线程,逻辑会比较清晰,如果非得要单线程,也是可以的。
//---------------------------------------------------------------------------------------------------------/
伪代码:
定义状态标识集合(一般将快速事件设置为默认状态,其余的事件各自定义)。
辅循环 (监察者):
while 1
获取当前时间
与定时事件时间比较
如果时间已到达
则等待状态标识回归默认状态(此处的等待实际是隐含的加锁,保护状态标识,确保只有一个事件在等待被处理,不会错过事件,且不会有双生产者修改状态标识,产生竞态,当然也可以写一个事件队列,然而对这个编程语言不是很了解,貌似是vb)将状态设置为此超时事件等待处理
与慢速事件超时时间相比较
如果时间已经超时
则等待状态标识回归默认状态,将状态设置为超时事件等待处理
检验随机事件触发条件
如果随机事件达到触发条件
则等待状态标识回归默认状态,将状态设置为随机事件等待处理
//-------------------------------------------------------------------------------------------------------------------------------
主循环(执行者):
While 1
While 当前状态标识为快速事件等待处理
执行快速事件
如果,当前状态标识为慢速事件等待处理
则处理事件,事件处理完成后,重新设置此事件的超时时间,将状态标识设置为默认状态
如果,当前状态标识为定时事件或者随机事件等待处理
则处理事件,事件处理完成后,将状态标识设置为默认状态
//------------------------------------------------------------------------------------------
以下是用按键精灵9+大漠插件+天天模拟器的《大富豪2》策略经营手游自动机器人
买卖股票属于快速事件(默认状态)
员工鼓励属于慢速事件(15分钟间隔)
挑战属于集中事件(定时事件包含慢速事件)(11点开始,8分钟一次)
<span style="font-size:18px;">Set dm = createobject("dm.dmsoft") TracePrint dm.Ver() dm.SetPath "d:\dmtemp" hwnd = dm.GetMousePointWindow() //dm_ret = dm.SetWindowSize(hwnd, 1024, 768) //----------> I :normal;gdi;gdi2;dx2;dx3;dx //----------> II :normal;windows;windows2;windows3;dx;dx2 //----------> III:normal;windows;dx //---------------------- DimEnv cur_state DimEnv stock //Dimenv return_main Dimenv encourage DimEnv chanlenge DimEnv encourage_time Dimenv encourage_long DimEnv chanlenge_time DimEnv chanlenge_long encourage_long = 15*60*1000 chanlenge_long = 8*60*1000 stock = 1 //return_main = 2 encourage = 3 chanlenge = 4 cur_state = encourage //---------------------- Dim debug Dim issell issell = 1 debug = 0 If debug=1 Then dm_ret = dm.BindWindow(hwnd, "normal", "normal", "normal", 0) Else dm_ret = dm.BindWindow(hwnd, "normal", "windows", "normal", 0) End If Delay 1000 BeginThread stateM //股市按钮 47,836 //培养序列 286,842;146,763;252,761;405,168;355,763;; DimEnv now_time Sub stateM //MessageBox "inthethread" encourage_time = 99999999999 chanlenge_time = 99999999999 While 1 now_time = Plugin.GetSysInfo.GetTime TracePrint now_time If now_time >= encourage_time Then While cur_state <> stock Delay 1000 Wend If now_time >= encourage_time Then cur_state = encourage End If End If nhour = hour(now) If nhour = 11 Then If chanlenge_begain = 0 then While cur_state <> stock Delay 1000 Wend cur_state = chanlenge chanlenge_begain = 1 End if Else chanlenge_begain = 0 End If If chanlenge_begain = 1 and now_time >= chanlenge_time Then While cur_state <> stock Delay 1000 Wend cur_state = chanlenge End If Delay 1000 Wend End Sub Sub ret2main dm_ret = dm.FindPic(0,0,2000,2000,"培养ret.bmp|股票ret.bmp","000000",0.9,0,intX,intY) If intX >= 0 and intY >= 0 Then dm.moveto intX, intY dm.leftclick End If End Sub While 1 Call 鼓励 Call 挑战 Call 股票 Wend //挑战序列 364,840;161,312;334,761;248,520;;;;;;;; Sub 挑战 While cur_state = chanlenge call m_c(364,840) call m_c(161,312) call m_c(334,761) call m_c(248,520) chanlenge_time = Plugin.GetSysInfo.GetTime chanlenge_time = chanlenge_time + chanlenge_long TracePrint chanlenge_time cur_state = stock Wend Delay 2000 Call ret2main Delay 2000 End Sub Function m_c(a,b) dm.moveto a,b dm.leftclick Delay 3000 End Function Sub 鼓励 While cur_state = encourage call m_c(286,842) call m_c(146,763) call m_c(252,761) call m_c(405,168) call m_c(355,763) encourage_time = Plugin.GetSysInfo.GetTime encourage_time = encourage_time + encourage_long TracePrint encourage_time cur_state = stock Wend Delay 2000 Call ret2main Delay 2000 End Sub //股市按钮 47,836 Sub 股票 Call m_c(47,836) While cur_state=stock dm.moveto 293, 243 dm.leftclick Delay 2000 dm_ret = dm.FindColor(125,371,342,603,"edfcfd-884444",1.0,8,intX,intY) If intX >= 0 and intY >= 0 Then //MessageBox "找到" dm.moveto intX, intY If intY >= 599-15 Then dm.moveto 378,763 dm.leftclick End If End If Delay 2000 if issell=1 then dm_ret = dm.FindColor(125,371,342,603,"edfcfd-884444",1.0,6,intX,intY) If intX >= 0 and intY >= 0 Then //MessageBox "找到" dm.moveto intX, intY If intY <=372 Then dm.moveto 117,765 dm.leftclick End If End If End If Delay 1000 dm.moveto 205,241 dm.leftclick Delay 2000 dm_ret = dm.FindColor(125,371,342,603,"edfcfd-884444",1.0,8,intX,intY) If intX >= 0 and intY >= 0 Then //MessageBox "找到" dm.moveto intX, intY If intY >= 599-15 Then dm.moveto 378,763 dm.leftclick End If End If Delay 2000 if issell=1 then dm_ret = dm.FindColor(125,371,342,603,"edfcfd-884444",1.0,6,intX,intY) If intX >= 0 and intY >= 0 Then //MessageBox "找到" dm.moveto intX, intY If intY <=372 Then dm.moveto 117,765 dm.leftclick End If End If End If Delay 2000 Wend Delay 2000 Call ret2main Delay 2000 End Sub Sub OnScriptExit() dm_ret = dm.UnBindWindow() End Sub</span>
相关文章推荐
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- 游戏挂机机器人框架
- C++ decltype类型说明符
- codevs 3116 高精度练习之加法
- modeldriven<>和getModel的作用
- 数组的学习+冒泡排序
- grep文本搜索工具与正则表达式
- Ubuntu 16.04 LTS 将基于 Linux Kernel 4.4.4
- 关于YES、NO和TRUE、FLASE的区别
- java学习笔记知识点整理01
- 对某张表的索引监控记录
- java基础 抽象类和接口
- 蓝桥杯 算法提高 简单加法
- Right-BICEP 测试四则运算二程序
- Java NIO 选择器(Selector)的内部实现(poll epoll)