游戏挂机机器人框架

非动作类游戏,一般对实时性要求不高,一般有几种事件:

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>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值