使用 Python 击败 2012 年奥运会谷歌涂鸦
前几天,我受到Reddit上的一个故事的启发,这个故事讲述了一个人创建了一个Python脚本来自动玩奥运障碍谷歌涂鸦。Python脚本只是将正确的键盘命令传递给游戏,使游戏在1.5秒内完成,获得金牌。问题是他的脚本是专门用于Windows的,所以我开始尝试创建一个可以在Kubuntu上运行的Linux版本。
经过一番研究,我发现了一个不错的插件,它通过名为uinput的Python发送键盘命令。为了安装它,我必须将以下行添加到/etc/apt/sources.list。
deb http://ppa.launchpad.net/tuomasjjrasanen/tjjr/ubuntu precise main deb-src http://ppa.launchpad.net/tuomasjjrasanen/tjjr/ubuntu precise main
然后可以通过以下命令删除uinput。
sudo apt-get update sudo apt-get install python-uinput
uinput站点上的示例非常简单,但我要做的第一件事是找出应用于哪些键的常量。为此,我使用了一些示例代码并使用dir().然后是循环遍历类中所有可用名称并将它们打印出来的情况。
#!/usr/bin/envpython import uinput events = (uinput.KEY_E) device = uinput.Device(events) methods = dir(device) for method in methods: print method
从这段代码中,我能够看到我需要的键在哪里uinput.KEY_RIGHT,右键、uinput.KEY_LEFT左键和uinput.KEY_SPACE空格键。我最初打算让脚本在我需要跳过障碍时左右按运行和空格键。在这个脚本的初始测试期间,我意识到左右箭头被“按下”的速度如此之快,以至于不需要按下空格键。下面的脚本在1.0秒内运行Google涂鸦障碍(仅使用箭头键),获得三颗星。
#!/usr/bin/envpython #包括uinput和时间 import uinput, time def run(): events = (uinput.KEY_RIGHT, uinput.KEY_LEFT, uinput.KEY_SPACE) device = uinput.Device(events) print '3' time.sleep(1) print '2' time.sleep(1) print '1' time.sleep(1) print 'go!' s = time.time() while time.time() - s < 1: device.emit(uinput.KEY_RIGHT, 1) #按右键 device.emit(uinput.KEY_RIGHT, 0) #松开右键 device.emit(uinput.KEY_LEFT, 1) #按左键 device.emit(uinput.KEY_LEFT, 0) #松开左键 run()
请注意,此脚本还使用时间包来确保运行此脚本与确保Googledoogle获得焦点之间存在延迟。当您运行脚本时,您应该立即点击Google涂鸦。这很重要,因为如果您运行python脚本并且什么都不做,所有键盘命令都将转储到终端中。
作为对此的扩展,然后我尝试调整脚本以在篮球Google涂鸦上获得满分。这有点困难,因为需要在正确的时间按下空格键才能进球。此外,当按键之间所需的持续时间随着分数的增加而变化时。
经过一些实验,我设法想出了以下代码,它的得分为38(如果一切顺利)。我发现由于某种原因,该代码仅在首次将涂鸦加载到页面上时才起作用,但由于这只是用于个人娱乐的丢弃脚本,所以我并不担心。我还注意到我的一个朋友发布的分数比我用这个脚本所能得到的分数要高,所以时间必须稍微偏离。
#!/usr/bin/envpython #包括uinput和时间 import uinput, time def play(): events = (uinput.KEY_RIGHT, uinput.KEY_LEFT, uinput.KEY_SPACE) device = uinput.Device(events) print '3' time.sleep(1) print '2' time.sleep(1) print '1' time.sleep(1) print 'go!' timediff = 0 s = time.time() while timediff <= 28: if timediff < 5.5: sleep = 0.25 elif timediff >= 5.5 and timediff < 9.5: sleep = 0.4 elif timediff >= 9.5 and timediff < 12.5: sleep = 0.41 elif timediff >= 12.5 and timediff < 21: sleep = 0.74 else: sleep = 0.80 time.sleep(sleep) device.emit(uinput.KEY_SPACE, 1) device.emit(uinput.KEY_SPACE, 0) timediff = time.time() - s play()
我还没有考虑过为其他2012年伦敦奥运会Google涂鸦做这个,但我把它留给读者作为练习。发表评论,让我知道你的进展情况:)