「跳一跳」還能這麼玩?

2021-02-24 我可是工程師

近日,微信版本升級,小程序增加新類目「小遊戲」,已上線的「跳一跳」,在朋友圈還是引起不小的圍觀的。向來沒有多少遊戲天分的人,看著圈裡的三位數得分真是望塵莫及。

 

最近什麼最火?人工智慧啊!之前有關注自動化測試,一琢磨,我可是工程師啊,可以用程序來玩跳一跳。三思1秒鐘,可行,開始行動。

可行性初探:

根據我玩「跳一跳」個位數得分的經驗,猜測遊戲的策略是,通過控制觸屏的時間長短,讓玩偶獲得不同的跳躍爆發力和跳躍距離,跳到敦子上。

 

疑問有二,其一,「跳一跳」遊戲場景是三位空間的,遊戲進行到後續,會不會轉變視角,即屏幕上測量的距離和三維空間的距離是否一致?其二,觸屏的時間長短,和跳躍距離的遠近,之間是什麼關係?

 

屏幕距離,容易操作,可以用尺子直接量,沒尺子怎麼辦?畫一個!

 

觸屏時間的控制,如果我能控制的好,得分就不是個位數了,所以還是打算交給程序來代勞。

首先,我們需要一些工具,讓電腦能控制手機,此類工具或框架,在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()

 

 

人工智慧,一種新方法:

未完待續,Level3級別「跳一跳」自動玩法稍後更新,人工智慧,是一種新方法,小遊戲純屬娛樂,歡迎關注公共號。

 

 





相關焦點

  • 跳一跳遊戲
    跳一跳是近期騰訊推出的一款微信小遊戲程序,比較簡單便捷有誘惑力,越來越受到網友們追捧,本著學習了解的態度我試了一下,談一下感受。
  • AI 玩跳一跳的正確姿勢,跳一跳 Auto-Jump 算法詳解
    (點擊上方藍字,快速關注我們)來源:肖泰洪 + 安捷 zhuanlan.zhihu.com/p/32636329最近,微信小遊戲跳一跳可以說是火遍了全國,從小孩子到大孩子仿佛每一個人都在刷跳一跳,作為無(zhi)所(hui)不(ban)能(zhuan)的AI程式設計師,我們在想,能不能用人工智慧(AI)和計算機視覺(CV)的方法來玩一玩這個遊戲?
  • 教程 | AI玩微信跳一跳的正確姿勢:跳一跳Auto-Jump算法詳解
    最近,微信小遊戲跳一跳可以說是火遍了全國,從小孩子到大孩子仿佛每一個人都在刷跳一跳,作為無(zhi)所(hui)不(ban)能(zhuan)的
  • 小程序遊戲 跳一跳
    amp; mini games小程序、小遊戲If you haven't heard about Tiao yi tiao, you are so out:如果你還沒有聽說過跳一跳外媒怎麼評論「跳一跳」:Chinese social media giant Tencent released a new feature
  • 微信推出「跳一跳」新模式:多人參與接龍
    也就是說可以多人作戰 PK,還能觀戰!遊戲可以選擇低、中、高三種難度,支持2-10人同時玩,每次每人跳一步,輪到誰跳誰就開始表演,失敗後只能圍觀,下一個人可以從失敗基座繼續,看誰堅持到跳到最後。跳一跳的多人模式是一種「接龍模式」。在遊戲中,所有玩家輪流進行一次跳躍,每次跳躍都有一定的時間限制。失敗者會被淘汰,看誰能堅持到最後。遊戲結束後,以跳的次數先後排名。
  • 每天1億多人玩「跳一跳」 小遊戲成為下一個風口?
    每天1億多人玩「跳一跳」 小遊戲成為下一個風口? 原標題:   現場  15日,2018微信公開課PRO上,4000多人聚集在廣州保利世貿博覽館玩「跳一跳」。幾乎同一時刻,育碧(UBISOFT)與微信共同宣布,雙方將在小遊戲上展開戰略合作,育碧旗下Ketchapp將在微信平臺上線數款小遊戲。
  • 《摺紙快跑》怎麼玩?好玩有趣的卡通風格跳一跳遊戲攻略
    點擊上方藍字「 龍蝦遊戲資訊」快速關注遊戲名稱:摺紙快跑-雙人競技跳一跳遊戲類型:動作反應類遊戲設備:手機遊戲簡介:《摺紙快跑》是一款類似微信跳一跳的摺紙風格的跳一跳動作挑戰類微信小遊戲>或 長按識別本文圖片中小程序碼為什麼還有人會做跳一跳?
  • 我用Python玩小遊戲「跳一跳」,瞬間稱霸了朋友圈!
    就這樣跳啊跳...擠地鐵跳,蹲馬桶跳,乘電梯跳,靜默的每 1 秒都不能浪費在辦公室,還要時刻警覺後面...以上是針對普通用戶,但對咱們程序猿來說用這套太 Low 了,接下來要說的是如何從技術層面去實現高分:在 Github 上面已經有人用 Python 來玩跳一跳這個遊戲了,想多少分就有多少分。
  • 微信「跳一跳」小遊戲已被玩壞,為刷榜甚至出現了「物理外掛」
    隨著微信v6.6.1的更新,一款叫「跳一跳」的小遊戲第一時間就佔領了大家的朋友圈,所有人都沉浸在前僕後繼的刷分之中~ 小編相信這個元旦假期
  • python微信跳一跳 小白 教程
    最近微信更新6.6.1後,推出微信小遊戲,跳一跳有當年Flappy Bird的感覺。
  • 整個朋友圈都在「跳一跳」~
    圖片來源:微信如果點了開始遊戲,就會自動讓你玩小遊戲——跳一跳。圖片來源:微信這個遊戲也非常簡單,長按屏幕蓄力,蓄力越久棋子跳得越遠,棋子落到立方體之外的地面就算輸。圖片來源:微信據觀察者網查詢,目前可用的小遊戲有以下15款:歡樂坦克大作戰、星途WeGoing、保衛蘿蔔迅玩版、廣東麻將、騰訊中國象棋、愛消除樂園、四川麻將、歡樂消消消、貴州麻將
  • AI|為你重新定義玩跳一跳的正確姿勢!
    最近,微信小遊戲跳一跳可以說是火遍了全國,從小孩子到大孩子仿佛每一個人都在刷跳一跳
  • 微信跳一跳|萬分大神實用攻略 教你輕鬆稱霸朋友圈
    最近微信更新了新功能,讓《跳一跳》這個小遊戲火了起來,小編我也是玩的無法自拔,在掌握了一些小技巧後,跳起來穩的一嗶~,別說什麼拿尺子量著玩,也別說什麼用一些小工具之類的
  • 程序丨揭密微信《跳一跳》小遊戲那些外掛
    作者:Hahn, 騰訊高級UI工程師商業轉載請聯繫騰訊WeTest獲得授權,非商業轉載請註明出處。
  • 「跳一跳」小遊戲上線,你的微信還好嗎?
    微信又雙叒叕更新了一剎那間朋友圈炸開了鍋微信一更新完(6.6.1版本)管不住手的網友們點了下
  • 微信跳一跳小遊戲有毒
    最後說說微信前天剛上線的小遊戲,這遊戲簡直有毒,昨天晚上我玩到1點,坑的是每次要重新玩,所以如果掉下去了得重新來,所以特好打發時間。微信派小編和我一樣 我一夜沒睡 我近 1000 好友,有 200 多人在玩,我才排名 100 要準備繼續玩了。
  • 「跳一跳」的小遊戲,我們為什麼停不下來
    跳格子的小遊戲,既沒有太多獎勵機制,也沒有什麼社交功能,更談不上所謂寓教於樂,只是簡單地重複一個動作,為什麼會讓這麼多人樂此不疲? 相對於王者榮耀、帝國時代這樣的大型遊戲,類似益智類、桌面類的小遊戲,我們其實也並不陌生。
  • 網紅遊戲【跳一跳】隱藏得分攻略!
    沒想到2018年第一篇文章居然是跳一跳!
  • 新版本的絕地求生還能「超級跳」?巧用跳窗技巧,在細節上戰勝敵人
    ,大家基本都選擇翻窗,很少人會跳窗了吧?甚至很多人不知道還能跳窗那麼跳窗有什麼實用技巧呢?來看看WJ的視頻介紹翻譯源:虎撲電競首先要說明的是,超級跳這個動作確實不好實現,不僅需要掌握一定的技巧而且還需要大量的練習除此之外,現在的超級跳僅僅只適用於翻越窗戶,並不能像以前那樣能夠讓你攀爬到更高的地方
  • 別玩「跳一跳」了,「歡樂球球」了解一下
    50次「歡樂球球」最近,微信小遊戲突然又在朋友圈裡火爆了起來,連玩遊戲苦手的我,都玩「歡樂球球」上了癮,還記得「跳一跳」流行的那段時間,大家只要打開微信,免不了來幾局「跳一跳」,看著排行榜裡幾百幾千分的大神,我看著我手下的笨小人十分憂愁,超過一百分是不可能的,這輩子都不可能的。