“跳一跳”是不是也毁了你的元旦小长假?

     来源:微信公众号     阅读:624 人

元旦小长假,很多人本来计划,早睡早起,整理心情,做一个2018规划。然而,微信突然推出一款叫做“跳一跳”的H5微信小游戏,“毁了”很多人的假期。

“跳一跳”是不是也毁了你的元旦小长假?

为了多跳几步,为了提升自己的排名,多少人彻夜奋战,整天沉迷于刷新排行榜不能自拔,但是大多分数还是停留在原地不动,短时间很难有提高,怎么办?接下来,话不多说,开始放大招了!

“跳一跳”是不是也毁了你的元旦小长假?

根据我玩“跳一跳”个位数得分的经验,猜测游戏的策略是,通过控制触屏的时间长短,让玩偶获得不同的跳跃爆发力和跳跃距离,跳到敦子上。

问题关键在于:
其一,“跳一跳”游戏场景是三位空间的,游戏进行到后续,会不会转变视角,即屏幕上测量的距离和三维空间的距离是否一致?
其二,触屏的时间长短,和跳跃距离的远近,之间是什么关系?

屏幕距离,容易操作,可以用尺子直接量,没尺子怎么办?画一个!

“跳一跳”是不是也毁了你的元旦小长假?

触屏时间的控制,如果我能控制的好,得分就不是个位数了,所以还是打算交给程序来代劳。

首先,我们需要一些工具,让电脑能控制手机,此类工具或框架,在APP开发,自动化测试领域用的很多,我们借鉴一下。

这里选择Total Control工具(使用Android系统),可以实现用户用电脑鼠标模拟触屏操控手机。然后选择Python脚本编程,可以实现用程序模拟鼠标点击Total Control界面。

经过一百多次试错,针对“跳一跳”不同的跳跃距离(屏幕测量),调整触屏时间(程序参数),得到以下数据:

“跳一跳”是不是也毁了你的元旦小长假?
 
最后我们来用Python画图,直观展现数据,规律还是很明显的,线性关系,以上两个疑问解决。

“跳一跳”是不是也毁了你的元旦小长假?

实现Level2级别“跳一跳”自动玩法:

根据任务分解和智能话程度,设定三个目标Level:

“跳一跳”是不是也毁了你的元旦小长假?

在第三阶段,自动识别出玩偶和墩子,在第二阶段,采用“人工打卡”方式,指出玩偶和墩子的位置。(在工程师的实际问题解决中,很多事情,尚未完全自动化的情况下,开发一些工具,提高效率,依然是非常可观的)

解决两个问题:

自动计算距离,替代直尺
简化操作流程,提高用户体验,“跳一跳”轻松玩


指出玩偶和墩子的位置,最直接就是用鼠标点两下,程序自动计算两个点的距离,然后通过线性公式,转化为触屏时间参数。

但是我们不能直接在Total Control虚拟屏幕上点击,因为会直接触发控制执行跳跃,所以需要再次处理下。首先对虚拟屏幕截图,然后在新截图上打点,需要Python程序处理图像视觉元素(使用Python wxPython库开发图形界面GUI程序)。

“跳一跳”是不是也毁了你的元旦小长假?

左边是Total Control软件显示的手机屏幕,右边是Python图形程序界面(图中两个点是用鼠标标记的玩偶和墩子距离)

直接上代码吧:

import wx

from pymouse import PyMouse

import win32api, win32con
import matplotlib.pyplot as plt
import numpy as np
import time

m = PyMouse()

x_dim, y_dim = m.screen_size()
#print x_dim, y_dim

x = int(x_dim/4)
y = int(y_dim*3/4)

#print x, y
t = {
   '6':'0.28',#
   '7':'0.31',#
   '8':'0.33',
   '9':'0.40',
   '10':'0.43',
   '11':'0.46',
   '11.5':'0.47',
   '12':'0.49',
   '13':'0.53',
   '14':'0.57',
   '15':'0.61',
   '16':'0.63',
   '17':'0.66',
   '18':'0.70',
   '19':'0.72',
   '20':'0.75',
   '20.5':'0.77',
   '21':'0.80',
   '22':'0.85',
   '23':'0.90',
   '24':'0.91',
   '25':'0.95',
    }

X = []
Y = []

for item in t.items():
   X.append(float(item[0]))
   Y.append(float(item[1]))
  
#print X,Y
Z1 = np.polyfit(X, Y, 1)
p1 = np.poly1d(Z1)

#print Z1

#print p1
# Z1[0] * X Z1[1]
# a * (Z1[0] * X Z1[1])
Y2 = []

for i in range(len(X)):
   Y2.append(Z1[0]*X[i] Z1[1])
   #print Y[i], Y2[i], Y2[i]-Y[i]

#plt.plot(X, Y, 'bo', X, Y2, 'g')
#plt.show()

def click(x, y, s):
   win32api.SetCursorPos((x,y))
   win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x,y,0,0)
   time.sleep(s)
   win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x,y,0,0)
   win32api.SetCursorPos((1000,100)) #
#----------------------------------------------------------------------
class MyApp(wx.App):

   def __init__(self, redirect=False, filename=None):
       wx.App.__init__(self, redirect, filename)
       self.frame = wx.Frame(None, wx.ID_ANY, title='Hello World')
       self.panel = wx.Panel(self.frame, wx.ID_ANY)
       self.button1 = wx.Button(self.panel, 1001, "OK")
       self.button1.SetPosition((210, 10))
       self.button2 = wx.Button(self.panel, 1002, "Refresh")
       self.button2.SetPosition((10, 10))

       self.pos = [[0,0],[0,0]]
       self.pos_n = 0
       self.pos_d = 0

       screen = wx.ScreenDC()
       size = screen.GetSize()

       print size
       bmp = wx.EmptyBitmap(size[0], size[1])
       mem = wx.MemoryDC(bmp)
       mem.Blit(0, 0, 515, 800, screen, 200, 180) #

       del mem  # Release bitmap
     
       #bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)
       self.cap = wx.StaticBitmap(self.panel, -1, bmp, (10, 40))
     
       # bind an event or two
       self.cap.Bind(wx.EVT_LEFT_DOWN, self.OnDrawDot)
       self.Bind(wx.EVT_BUTTON, self.OnOK, self.button1)
       self.Bind(wx.EVT_BUTTON, self.OnRefresh, self.button2)

       self.frame.Show()

    def OnOK(self, evt):
       if(self.pos_n == 2):
           print "OK"
           t_press = Z1[0] * self.pos_d Z1[1]
           print t_press
           click(x, y, t_press)
       else:
           print "NOK"

       time.sleep(2) #
       self.OnRefresh(evt)

   def OnRefresh(self, evt):

       print "Refresh"

       screen = wx.ScreenDC()
       size = screen.GetSize()
       bmp = wx.EmptyBitmap(size[0], size[1])
       mem = wx.MemoryDC(bmp)
       mem.Blit(0, 0, 515, 800, screen, 200, 180) #
       del mem  # Release bitmap
       self.cap.SetBitmap(bmp)
       self.pos = [[0,0],[0,0]]
       self.pos_n = 0

   def OnDrawDot(self, evt):
  
       # Draw a dot so the user can see where the hotspot is
       dc = wx.ClientDC(self.cap)
       dc.SetPen(wx.Pen("RED"))
       dc.SetBrush(wx.Brush("RED"))
       pos = evt.GetPosition()
       dc.DrawCircle(pos.x, pos.y, 4)
      
       #print pos.x, pos.y
       if(self.pos_n < 2):
           self.pos[0] = self.pos[1]
           self.pos[1] = [pos.x, pos.y]
           self.pos_n = self.pos_n 1

       print self.pos

       d = ((self.pos[0][0] - self.pos[1][0])**2 (self.pos[0][1]-self.pos[1][1])**2)**0.5
       self.pos_d = d / 12.75 #
       print d, self.pos_d

#----------------------------------------------------------------------
if __name__ == '__main__':
   app = MyApp()
   app.MainLoop()

注:图文来自互联网,由简理财整理提供,不代表本站观点,侵删

文章关键词: 跳一跳 python 微信小游戏

相关阅读: