Chrome暗藏的恐龍跳一跳,已經被AI輕鬆掌握了

2021-01-10 量子位

夏乙 郭一璞 發自 凹非寺

量子位 出品 | 公眾號 QbitAI

什麼!未連接到網際網路!!

明明是聯網狀態,為什麼我想訪問的頁面

無!法!打!開!

淡定。

作為一個Google Chrome瀏覽器的用戶,當你看到上面那個頁面時,不要沮喪。換個角度一想,牆內還能有更多的Play時間哦~

你有沒有注意到畫面裡那個小恐龍?

當你遇到打不開網頁的時候,只需要再點擊一下這個頁面(手機),或者按下空格(電腦),隨著小恐龍輕輕一跳——

一個新世界開啟了。

這個「恐龍跳一跳」其實是藏在Chrome瀏覽器裡好多年的一個彩蛋。小恐龍是一隻霸王龍(T-Rex)。

2013年Chrome開始用這個小恐龍的圖像代替令人煩惱的404頁面。2014年秋天,這隻恐龍被正式改造成一個橫版小遊戲。以彩蛋的方式隱藏在新版Chrome瀏覽器裡。

吶,如果你還不知道這個彩蛋,可以抓緊試一試。比方說——

訪問一個不翻牆就看不了的網頁

或者直接輸入:chrome://dino

或者訪問:https://chromedino.com/ (需翻牆)

後來,這個小遊戲也成了不少AI練手的對象。

比如最近就有人在YouTube上貼了一段視頻,展示了他如何用神經網絡+遺傳算法,讓一個AI系統獨秀於瀏覽器之中。

我們把精華的部分截取了一下,就是下面這段視頻。

動圖版:

速度已經快到飛起

總而言之,一句話,這個AI能輕鬆玩到2萬多分……

你能玩到幾分?大概率是玩不到這個成績的吧。畢竟在chromedino.com頁面上,人類玩家的歷史最高分是18842。

不過,上傳這段視頻的作者,並沒有詳細公布他用的方法,當然也沒有給出一個開源的地址。不過不要緊,也有別人公開分享了更多細節。

例如,GitHub上就有一個開源的代碼「IAMDinosaur」,同樣也是利用神經網絡+遺傳算法,來搞定恐龍跳一跳。

地址在此:https://github.com/ivanseidel/IAMDinosaur

美中不足,上面這個項目也沒有配上太詳盡的解讀。然而好消息是,最近有個國外的小哥Ravi Munde,列了一份非常詳盡的教程。

這個教程用的方法是強化學習中的Q-learning,比較適合入門練手,而且對硬體的要求不高。

量子位搬運這份教程如下。

Q-learning了解/複習一下

對動物來說,強化學習的能力是與生俱來的。拿兒童學步來舉例,如果小朋友努力的邁出第一步,就會獲得父母的鼓勵——可能是鼓掌叫好,也可能是一塊糖;但如果小朋友堅決不肯學習走路,那父母就不會給它糖吃了。強化學習就是依照這類激勵行為而設置的。

而在這個遊戲中,對我們的AI小恐龍來說,強化學習需要讓他在無監督的情況下,先認識到做出不同動作的結果,並且以獲得高分為最高激勵。

一個典型的強化學習閉環

Ravi Munde用Q-learning模擬了一個特殊函數,這個函數驅動AI在不同狀況下做出正確的選擇。

Q-learning是強化學習的一種無模型實現,根據Q值對每個狀態進行判斷此時如果採取行動,能獲得怎樣的獎勵。一個樣本Q表讓我們了解數據的結構。在恐龍跑酷遊戲中,狀態是當前的遊戲截圖,能採取的行動是跳或不跳[0,1]

一個樣本Q表

Ravi Munde決定用深度神經網絡來決定小恐龍何時起跳,而且要在最簡單的強化學習實現基礎上,引入不同參數來輔助它。

缺乏已標記的數據讓強化學習非常不穩定。為了獲得適用於這個遊戲的數據,Munde小哥決定,先讓小恐龍自己瞎跳幾千次,把每個動作的反饋記下來,然後從數據中隨機挑選一些來訓練模型。

但之後,Munde小哥發現,他訓練了一個倔強的模型——模型堅定的認為,跳,一定比不跳好。所以,為了讓模型在訓練時能在跳與不跳之間多嘗試一下,他引入了一個函數來決定行動的隨機性,然後再逐漸減小它的值來削減隨機性,最終讓模型去選擇最有可能獲得獎勵的行動。

讚譽分布(Credit Assignment)問題可能會讓模型陷入混亂——目前獲得的獎勵究竟來自於過去的哪個行為呢?在恐龍跑酷遊戲中,小恐龍跳到半空中後無法再次跳躍,但模型可能會在恐龍處於半空中時發出跳躍指令,這種情況就讓恐龍非常容易砸到仙人掌上。

在這種情況下,「砸到仙人掌上」這個負反饋實際上是此前上一次做出跳躍決定的結果,而不是剛剛恐龍在半空中時做出的跳躍結果所導致的。

在面臨這種問題的情況下,可以引入貼現因子(Discount Factor)γ來決定模型做出動作時看得多遠。γ間接解決了讚譽分布問題,在這個遊戲中,當γ=0.99時,模型認識到在無障礙時隨便跳會導致真的遇到障礙時自己正在半空中,無法繼續跳躍。

除了這兩個參數之外,後面就幾乎不需要任何參數了。

#game parametersGAMMA = 0.99 # decay rate of past observations original 0.99OBSERVATION = 50000. # timesteps to observe before trainingEXPLORE = 100000 # frames over which to anneal epsilonFINAL_EPSILON = 0.0001 # final value of epsilonINITIAL_EPSILON = 0.1 # starting value of epsilonREPLAY_MEMORY = 50000 # number of previous transitions to rememberBATCH = 32 # size of minibatchFRAME_PER_ACTION = 1

你需要準備的是

Python 3.6

Selenium

OpenCV

PIL

Chromium driver for Selenium

Keras

略微解釋一下這幾個工具。

構建這個AI模型,需要用Python編程。而遊戲是用JavaScript寫成的。所以,得藉助一些工具才能更好地溝通。

Selenium是一種流行的瀏覽器自動化工具,用於向瀏覽器發送操作指令,以及獲取各種遊戲參數。

接口的事情搞定了,還得想辦法獲得遊戲截屏。用Selenium也行,但是速度很慢,截屏和處理一次大約得1秒鐘。

用PIL和OpenCV能夠更好地完成截屏和圖像預處理,可以達到5fps的幀率。你可能覺得還是慢,但已經足夠對付這個遊戲了。

遊戲模塊

下面這個模塊,實現了Python和瀏覽器(使用Selenium)的溝通。

'''* Game class: Selenium interfacing between the python and browser* __init__(): Launch the broswer window using the attributes in chrome_options* get_crashed() : return true if the agent as crashed on an obstacles. Gets javascript variable from game decribing the state* get_playing(): true if game in progress, false is crashed or paused* restart() : sends a signal to browser-javascript to restart the game* press_up(): sends a single to press up get to the browser* get_score(): gets current game score from javascript variables.* pause(): pause the game* resume(): resume a paused game if not crashed* end(): close the browser and end the game'''class Game: def __init__(self,custom_config=True): chrome_options = Options() chrome_options.add_argument("disable-infobars") self._driver = webdriver.Chrome(executable_path = chrome_driver_path,chrome_options=chrome_options) self._driver.set_window_position(x=-10,y=0) self._driver.set_window_size(200, 300) self._driver.get(os.path.abspath(game_url)) #modifying game before training if custom_config: self._driver.execute_script("Runner.config.ACCELERATION=0") def get_crashed(self): return self._driver.execute_script("return Runner.instance_.crashed") def get_playing(self): return self._driver.execute_script("return Runner.instance_.playing") def restart(self): self._driver.execute_script("Runner.instance_.restart()") time.sleep(0.25)# no actions are possible # for 0.25 sec after game starts, # skip learning at this time and make the model wait def press_up(self): self._driver.find_element_by_tag_name("body").send_keys(Keys.ARROW_UP) def get_score(self): score_array = self._driver.execute_script("return Runner.instance_.distanceMeter.digits") score = ''.join(score_array) # the javascript object is of type array with score in the formate[1,0,0] which is 100. return int(score) def pause(self): return self._driver.execute_script("return Runner.instance_.stop()") def resume(self): return self._driver.execute_script("return Runner.instance_.play()") def end(self): self._driver.close()

恐龍智能體模塊

這個模塊在遊戲模塊的幫助下,用於控制小恐龍的動作。

class DinoAgent: def __init__(self,game): #takes game as input for taking actions self._game = game; self.jump(); #to start the game, we need to jump once time.sleep(.5) # no action can be performed for the first time when game starts def is_running(self): return self._game.get_playing() def is_crashed(self): return self._game.get_crashed() def jump(self): self._game.press_up() def duck(self): self._game.press_down()

遊戲狀態模塊

神經網絡直接使用這個模塊,來執行操作並獲取新的狀態。

'''get_state(): accepts an array of actions, performs the action on the agentreturns : new state, reward and if the game ended.'''class Game_sate: def __init__(self,agent,game): self._agent = agent self._game = game def get_state(self,actions): score = self._game.get_score() reward = 0.1*score/10 # dynamic reward calculation is_over = False #game over if actions[1] == 1: #else do nothing self._agent.jump() reward = 0.1*score/11 image = grab_screen() if self._agent.is_crashed(): self._game.restart() reward = -11/score is_over = True return image, reward, is_over #return the Experience tuple

預處理

遊戲修改

原始的遊戲相對複雜,比如遊戲速度會逐漸加快,障礙物會改變,還會出現雲朵、星星、地面紋理等。一次同時學習這麼多東西會消耗大量時間,甚至在訓練過程中引入不必要的噪音。

為此作者修改了遊戲的原始碼、簡化局面,去除了一些視覺元素(雲、歷史最佳成績等),還有讓恐龍的奔跑速度保持不變。

原圖

修改後

圖像處理

原始截圖的解析度為1200×300,包含三個通道。作者計劃使用4個連續的屏幕截圖作為模型的單一輸入,也就是1200×300×3×4。

問題是,這個小哥只有一個i7的CPU可用,所以他的電腦沒辦法在處理這個尺寸輸入的同時玩遊戲。所以,還得繼續用OpenCV的庫調正截圖大小、裁剪等。最終輸入圖像大小為40×20像素,單通道,並用Canny突出顯示邊緣。

def grab_screen(_driver = None): #bbox = region of interest on the entire screen screen = np.array(ImageGrab.grab(bbox=(40,180,440,400))) image = process_img(screen)#processing image as required return imagedef process_img(image): #game is already in grey scale canvas, canny to get only edges and reduce unwanted objects(clouds) # resale image dimensions image = cv2.resize(image, (0,0), fx = 0.15, fy = 0.10) #crop out the dino agent from the frame image = image[2:38,10:50] #img[y:y+h, x:x+w] image = cv2.Canny(image, threshold1 = 100, threshold2 = 200) #apply the canny edge detection return image

然後,堆疊4張圖創建單個輸入,也就是:40×20×4。請注意,這裡小恐龍也裁減掉了,因為整個學習過程,只需要知道障礙物和與邊緣的距離即可。

模型架構

現在輸入有了,用模型輸出來玩遊戲的方法也有了,只差模型架構。

小哥選擇把3個卷積層壓平,連接到一個512神經元的全連接層(dense layer)上。池化層直接被砍掉了,這個東西在圖像分類問題上很有用,但是玩Dino的時候神經網絡只需要知道障礙物的位置,池化層就起不了什麼作用了。

多層網絡架構

這個模型的輸出,形狀和可能的操作數量一樣。模型會預測各種操作的Q值,也叫discounted future reward,然後我們選數值最高的那個。

下面這段代碼,就能召喚一個用TensorFlow後端的Keras來搭建的模型:

#model hyper parametersLEARNING_RATE = 1e-4img_rows , img_cols = 40,20img_channels = 4 #We stack 4 framesACTIONS = 2def buildmodel(): print("Now we build the model") model = Sequential() model.add(Conv2D(32, (8, 8), strides=(4, 4), padding='same',input_shape=(img_cols,img_rows,img_channels))) #20*40*4 model.add(Activation('relu')) model.add(Conv2D(64, (4, 4), strides=(2, 2), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same')) model.add(Activation('relu')) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dense(ACTIONS)) adam = Adam(lr=LEARNING_RATE) model.compile(loss='mse',optimizer=adam) print("We finish building the model") return model

開始訓練

接下來,就是見證奇蹟的時刻~~

也就是用一段代碼來訓練模型,這段代碼的任務是:

從無操作開始,得到初始狀態initial state(s_t)

觀察玩遊戲的過程,代碼中的OBSERVATION表示步數

預測一個操作的效果

在Replay Memory中存儲經驗

訓練階段,從Replay Memory裡隨機選擇一組,用它來訓練模型

如果game over了,就重開一局

更詳細的,可以看這段自帶注釋的代碼:

'''Parameters:* model => Keras Model to be trained* game_state => Game State module with access to game environment and dino* observe => flag to indicate wherther the model is to be trained(weight updates), else just play'''def trainNetwork(model,game_state): # store the previous observations in replay memory D = deque() #load from file system # get the first state by doing nothing do_nothing = np.zeros(ACTIONS) do_nothing[0] =1 #0 => do nothing, #1=> jump x_t, r_0, terminal = game_state.get_state(do_nothing) # get next step after performing the action s_t = np.stack((x_t, x_t, x_t, x_t), axis=2).reshape(1,20,40,4) # stack 4 images to create placeholder input reshaped 1*20*40*4 OBSERVE = OBSERVATION epsilon = INITIAL_EPSILON t = 0 while (True): #endless running loss = 0 Q_sa = 0 action_index = 0 r_t = 0 #reward at t a_t = np.zeros([ACTIONS]) # action at t #choose an action epsilon greedy if random.random() <= epsilon: #randomly explore an action print("Random Action") action_index = random.randrange(ACTIONS) a_t[action_index] = 1 else: # predict the output q = model.predict(s_t) #input a stack of 4 images, get the prediction max_Q = np.argmax(q) # chosing index with maximum q value action_index = max_Q a_t[action_index] = 1 # o=> do nothing, 1=> jump #We reduced the epsilon (exploration parameter) gradually if epsilon > FINAL_EPSILON and t > OBSERVE: epsilon -= (INITIAL_EPSILON - FINAL_EPSILON) / EXPLORE #run the selected action and observed next state and reward x_t1, r_t, terminal = game_state.get_state(a_t) last_time = time.time() x_t1 = x_t1.reshape(1, x_t1.shape[0], x_t1.shape[1], 1) #1x20x40x1 s_t1 = np.append(x_t1, s_t[:, :, :, :3], axis=3) # append the new image to input stack and remove the first one # store the transition in D D.append((s_t, action_index, r_t, s_t1, terminal)) D.popleft() if len(D) > REPLAY_MEMORY #only train if done observing; sample a minibatch to train on trainBatch(random.sample(D, BATCH)) if t > OBSERVE s_t = s_t1 t = t + 1 print("TIMESTEP", t, "/ EPSILON", epsilon, "/ ACTION", action_index, "/ REWARD", r_t,"/ Q_MAX " , np.max(Q_sa), "/ Loss ", loss)

將這個模型用到從Replay Memory裡隨機選擇的一批上:

def trainBatch(minibatch):for i in range(0, len(minibatch)): loss = 0 inputs = np.zeros((BATCH, s_t.shape[1], s_t.shape[2], s_t.shape[3])) #32, 20, 40, 4 targets = np.zeros((inputs.shape[0], ACTIONS)) #32, 2 state_t = minibatch[i][0] # 4D stack of images action_t = minibatch[i][1] #This is action index reward_t = minibatch[i][2] #reward at state_t due to action_t state_t1 = minibatch[i][3] #next state terminal = minibatch[i][4] #wheather the agent died or survided due the action inputs[i:i + 1] = state_t targets[i] = model.predict(state_t) # predicted q values Q_sa = model.predict(state_t1) #predict q values for next step if terminal: targets[i, action_t] = reward_t # if terminated, only equals reward else: targets[i, action_t] = reward_t + GAMMA * np.max(Q_sa) loss += model.train_on_batch(inputs, targets)

主體方法

調用下面的方法,就能啟動上面的訓練流程:

#argument: observe, only plays if true, else trainsdef playGame(observe=False): game = Game() dino = DinoAgent(game) game_state = Game_sate(dino,game) model = buildmodel() trainNetwork(model,game_state)

結果

這個模型,小哥用一周的時間訓練了200萬幀,其中前100萬幀用來調整遊戲參數修補bug,後100萬幀真正用來訓練。

現在,這個模型的最好成績是265分。從下面的得分和損失變化圖裡,能看出模型的loss在後100萬幀逐漸穩定,比較低,但是會隨時間波動。

遊戲得分

後100幀的損失(loss)

目前的局限

雖然這個模型後來表現還算可以了,但比人類還是差了一大截。

當然,別忘了這個小哥比較窮,他只有一個i7的CPU。

他認為,模型學得還不夠快,得分還不夠高,要怪這樣幾個因素:一是因為用CPU來學習,它總是掉幀;二是供這個AI來玩耍的圖像實在是太小了,只有40×20,在當前的模型架構下就可能導致了特徵的損失,還拖慢了學習速度。

如果改用GPU,說不定……

相關連結

用GPU究竟會不會改善,你們可以拿這份代碼來試試:

https://github.com/ravi72munde/Chrome-Dino-Reinforcement-Learning

原文地址:

https://medium.com/acing-ai/how-i-build-an-ai-to-play-dino-run-e37f37bdf153

One More Thing

其實嘛,讓AI搞定小恐龍這件事,本質上跟讓AI搞定Flappy Bird是一樣的。如果你想深入研究一下這件事,這裡再推薦兩篇。

機器學習玩轉Flappy Bird全書:六大「流派」從原理到代碼

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程

就醬~

— 完 —

相關焦點

  • 紅手指跳一跳怎麼用_紅手指跳一跳攻略
    紅手指跳一跳怎麼用?關於微信跳一跳高分神器紅手指跳一跳,想必還是有很多玩家不知道的,接下來隨小編一起看看吧!   紅手指跳一跳攻略  第一步:下載安裝紅手指跳一跳  第二步:註冊登錄紅手指,領取一臺雲手機  第三步:進入紅手指雲手機,在雲手機應用市場搜索「微信
  • 跳一跳催生外掛產業,手遊成下一個黑產受害者?
    然而近日媒體爆料跳一跳竟也催生龐大的外掛和代玩產業,在淘寶搜索框裡輸入「跳一跳」出現幾百相關結果,排在銷量第一的店鋪是定價「1.9元」的自動軟體,截止發稿時已達成9539次成功交易。除了外掛,代玩刷分也十分受歡迎。
  • 紅手指跳一跳iOS版使用教程 紅手指跳一跳怎麼玩
    導 讀 跳一跳是最近很火的一款遊戲,大家應該都在微信中玩過。從網上看到一些小夥伴會用紅手指這款腳本輔助,來讓自己在遊戲中獲得高分。
  • 輕鬆有趣「袋鼠跳」 既動體力又動腦(圖文)
    輕鬆有趣「袋鼠跳」 既動體力又動腦(圖文) 發布時間:2011年04月02日 來源:蒼南新聞網 蒼南新聞網4月2日消息:4月1日下午,鳳池學校的操場上熱鬧非凡,這是該校小學部低年段的同學們正輕鬆有趣地進行「袋鼠跳」活動。
  • 今天,你還「跳一跳」嗎?——從過氣網紅遊戲「跳一跳」談起丨語言...
    前段時間,一款名為「跳一跳」的微信小程序幾乎一夜之間刷遍了朋友圈和微博熱搜榜。一時間,1000分大神,跳一跳高分秘籍(如特殊方塊,聽音法,手指勻速移動法等),甚至是外掛程序層出不窮。跳一跳特殊方塊(圖片來源於網絡)有讀者也許略感疑惑,小編怎麼今天想起這款過氣網紅遊戲來了?難道其中還隱藏著什麼語言學現象?其實,今天我們想談的是這款小程序的名稱,從「跳一跳」來聊聊漢語中的動詞重疊(verbal reduplication)現象。
  • 微信跳一跳暴露的生活真相,比分數重要100000倍!
    新年這幾天,微信上一款叫「跳一跳」的遊戲刷屏了朋友圈。玩法非常簡單:只憑一根手指,按住屏幕,讓棋子從一個方塊跳到另一個方塊。按壓時間越長,棋子跳的距離就越遠。儘管入門不難,但是想拿高分,卻遠遠沒那麼簡單。為了讓榜單上的排名更靠前,網絡上還出現了這樣的神操作。
  • DNF是勇士就跳一千米,魚人之海無限模式開放,你跳了多少米
    魚人之海小遊戲可以說是我們玩家玩的比較頭疼的小遊戲了,經過這次的難度降低還好,我們都可以比較輕鬆的通關,而之前剛開放的時候那叫一個難啊,手殘黨能跳一個小時都看不到頂的,即使大觸玩家都要跳好幾遍才過關,不的不說我們勇士好久沒有練練自己的反應了,一點這樣的小考驗就敗下陣來,當然,還是要黑一波策劃
  • 到了月球後跳一跳會怎樣?太空人親口說出:跳之後差點沒命
    要知道,人類第一次飛出地球踏上太空還是在上個世紀的60年代,當時的人們無不為此驚呼,踏上月球的一小步這也意味著我們人類航天航空發展裡程碑上的一大步。而第一次踏上月球的國家也是美國,雖然後期俄羅斯、中國都相繼的成功送各自的太空人上天,但是不可否認的是美國確實是第一個。而且到現如今,月球仍然是我們人類唯一一個真正踏上去的星球。
  • 微信跳一跳輔助教程,跳出你想要的高分!
    近日,微信新上線的小程序遊戲「跳一跳」非常有趣,玩法簡單,上手很快,但是得高分很難,上個三位數就得辛辛苦苦跳半天。那麼如何才能跳出更高的高分,網上的各種攻略看得眼花繚亂,用下來效果也不好。今日就給大家詳細介紹一種簡單易懂的方法,教你如何用輔助腳本來刷新高分。首先介紹一下遊戲得分規則,跳一個方塊加1分。
  • 方舟:彈跳力超好普羅米骨頭迅猛龍,輕鬆一跳有兩個霸王龍的高度
    大家好,歡迎來到方舟生存進化的遊戲世界,今天小編給大家帶來的是普羅米修斯mod中的普羅米骨頭迅猛龍,它的彈跳力超好,輕鬆一跳有兩個霸王龍的高度。雖然原版迅猛龍也不醜,但是沒有對比就沒有傷害,一對比,原版迅猛龍low爆了。實力上,原版的迅猛龍因為血量的原因,所以沒有那麼強,我們只要稍加反抗,就能將迅猛龍弄死。而普羅米迅猛龍則將這些缺點都彌補了,比如說它的血量達到了5萬,無論我們怎麼反抗都弄不死它,最噁心的地方是骨頭迅猛龍還會無限擊退,小編曾試過,被迅猛龍從沙漠的一端推到沙漠的另一端(超級噁心的無限擊退)。
  • 鄭州「鳥媽」訓練愛鳥跳鋼管舞 已掌握6種動作
    鄭州「鳥媽」訓練愛鳥跳鋼管舞 已掌握6種動作 圖為鸚鵡  馬鳳梅與她的鸚鵡「小翠兒」居住在鄭州淮河路一老式家屬院。3月15日,記者來到馬鳳梅家採訪時,她正在給這只會跳舞的寵物鳥「小翠兒」餵食。馬鳳梅說,「小翠兒」吃飽了,才樂意給大家跳舞。
  • 除了跳一跳,這十款微信小遊戲也好玩到讓你欲罷不能
    不知道近期大家的朋友圈還有沒有被「跳一跳」這款遊戲刷屏,不得不說,微信的號召力實在是太強了。進入2018年後,微信正式推出了小程序中的小遊戲版塊,除了跳一跳之外,騰訊和第三方開發者陸續推出了不少輕量級的遊戲產品,今天我們就來為你推薦十款。
  • 微信跳一跳上面的字母英文ly有什麼含義
    導 讀 有很多人會在八卦的問,麼微信跳一跳字母意思是什麼?微信跳一跳上面的字母英文ly有什麼含義?
  • 公務員體測縱跳摸高最多測3次 一考生被指跳4次
    這是一場事關已經通過筆試的考生能否進入到招錄面試過程的重要一關。  「『縱跳摸高』當場測試不超過三次」,這個測試規則,考生們自然爛記於心。然而在測試現場,卻出現了一名考生連跳四次的一幕。  自稱知情人的小伍(化名)稱,他曾就此事致電福建省監獄管理局的工作人員諮詢此舉是否違規?從中他得知這位考生體能測試成績有效,並且裁判所認定的是第二次測試成績。
  • 月球上跳一跳很危險嗎?阿波羅太空人親口承認,跳了一下差點沒命
    杜克對此十分支持,沒想到杜克輕輕一跳,就跳上了兩米的高度,隨後失去平衡翻滾落地,而且是要命的背部著地。這輕輕的一跳,幾乎成為了杜克一生中最接近死亡的時刻。之所以會出現這樣的局面,是因為月球上是一個低重力的環境,任何一個人在月球上,都能取得比專業跳高運動員更好的成績,但如何落地就是個麻煩事了。
  • 還記得張小龍力薦的微信小遊戲「跳一跳」嗎?騰訊真的要辦比賽了
    「跳一跳」是微信一整個2018年的開局之作。 今年初的微信公開課上,微信之父張小龍人還沒出場,就先把自己的手機屏展示了出來。他打開了一局「跳一跳」遊戲,隨手打了967分。張小龍說,自己因為要演講而緊張了,沒發揮好。而他當時的最高水準是六千多分,「花了很多時間去練習」,獲得稱號「無聊大師」「立地成佛」。
  • 盤古團隊證實:微信小遊戲「跳一跳」改分漏洞仍在,這是最新攻略 |...
    1 月 2 日下午,著名安全團隊「盤古」的安全專家向雷鋒網宅客頻道證實,微信小遊戲「跳一跳」改分漏洞仍在,此前流傳的「微信已補漏洞」是指已經修補了微信小遊戲「跳一跳」的原始碼下載漏洞。為此,「盤古」旗下的移動安全威脅數據平臺 Janus 為雷鋒網出具了一份最新改分攻略:一、改分關鍵步驟電腦安裝抓包軟體,手機設置https代理到電腦通過抓包軟體,抓包拿到微信的sesseion_id將sesseion_id寫入改分腳本,提交改分請求二、詳細教程
  • 微信跳一跳各種刷分方法介紹 繪製函數圖形精準跳躍
    最近,微信小遊戲跳一跳火爆了朋友圈,幾乎每一個人都在苦惱著自己的分數與那幾個方格作鬥爭,看著朋友圈排行榜中那一個兩個望不可及的高分,只能默默的苦惱自己的手殘,但是這些分數依靠手動跳出來是很難的,下面小編給大家說說幾種常見的刷分方法。一、依靠節奏來跳
  • 方舟:隨便一跳就能上天的野人王,地球沒有引力了?牛頓大軍何在
    之前小編還覺得紅色精英野人的這把雙刀很帥,可是和紅色野人王的雙刀一對比,精英野人的刀還是別拿出來丟人現眼了(沒有對比就沒有傷害)。野人王的這把雙刀帥到爆炸,真想搶來自己用(可惜只能想一想)。野人王的個頭也比精英野人高了許多,看起來更加的高大威武,可惜野人王帶了個頭盔,看不到他的臉,有點小失望。
  • 掌握這些下跳性眼震知識點,眩暈診斷定位不再難
    垂直眼震(vertical nystagmus)主要有上跳性眼震(upbeat nystagmus,UBN)和下跳性眼震(downbeat nystagmus,DBN)兩類。是前庭醫學領域較為常見的神經眼科體徵。