观用python玩跳一跳源码后感

项目地址:https://github.com/wangshub/wechat_jump_game

在没有看到跳一跳源码时,总感觉用python去玩跳一跳会很难。前天下午有两个时间的空闲时间,便去GitHub上找到了python玩跳一跳的源码,便开始琢磨玩跳一跳。

首先我是先在网上找到了跳一跳在GitHub的链接,然后用GitHubdesktop下载下来了(当然你也可以直接下下来)。用GitHubdesktop下载的话,可以先fork一下。这样就可以直接在应用里面直接找到了。用第二个方法有个好处,就是能查看到一个项目从头到尾的变化。这样就能更好地去观察源码的变化与学习它。下面是我截的一部分项目的变化记录。


源码下下来之后,就是查看源码。首先肯定是看readme.md等使用文档。这里有一些教我们怎么使用代码的方法,可以帮助学习它的人快速上手。


这里面是一些使用文档。我用的是3.6的版本,所以我用的是最后一个文件。当然这个项目最好是在dos窗口下进行。根据使用文档,我很容易地就跳出了三四百分,但是游戏不是我得重点,源码才是。

打开源文件之后,有点让我这种小白有点惊讶。仅73行的代码就实现了一个比较强大的功能。然后继续往下面看。

# -*- coding: utf-8 -*-
import os
import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from PIL import Image


def pull_screenshot():
    os.system('adb shell screencap -p /sdcard/autojump.png')
    os.system('adb pull /sdcard/autojump.png .')


def jump(distance):
    press_time = distance * 1.45
    press_time = int(press_time)
    cmd = 'adb shell input swipe 540 1514 540 1514 ' + str(press_time)
    print(cmd)
    os.system(cmd)


fig = plt.figure()
pull_screenshot()
img = np.array(Image.open('autojump.png'))
im = plt.imshow(img, animated=True)

update = True
click_count = 0
cor = []


def update_data():
    return np.array(Image.open('autojump.png'))


def updatefig(*args):
    global update
    if update:
        time.sleep(0.8)
        pull_screenshot()
        im.set_array(update_data())
        update = False
    return im,


def on_click(event):
    global update
    global ix, iy
    global click_count
    global cor

    ix, iy = event.xdata, event.ydata
    coords = [(ix, iy)]
    print('now = ', coords)
    cor.append(coords)

    click_count += 1
    if click_count > 1:
        click_count = 0
        cor1 = cor.pop()
        cor2 = cor.pop()

        distance = (cor1[0][0] - cor2[0][0])**2 + (cor1[0][1] - cor2[0][1])**2
        distance = distance ** 0.5
        print('distance = ', distance)
        jump(distance)
        update = True


fig.canvas.mpl_connect('button_press_event', on_click)
ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True)
plt.show()

这个程序的思路是先截图跳一跳的游戏截图,然后再点击图片中的初始位置与下一次落地位置,然后将距离转换为按压时间,实现整个跳跃的功能。一开始我想这样应该会挺难得,但是没想到其实不然。

源码首先是写了两个个adb的指令,这部分是获取跳一跳的当前屏幕截屏,这方面使用的是os库与adb指令。(小米手机在调试的时候要关闭mi优化,不然不能调试)。第二个方法是将传入一个距离将其转化为时间,然后再是一条adb按压指令实现跳跃。

后面就是python常用的两个库了。一个是matplotlib画图库与PIL图像处理标准库和numpy常用的数学库。先是用PIL库的方法将接收到的图片获取然后将它赋值给numpy库下的一个数组想法,在用matplotlib将图片给画出来。最后更具点击两点的位置用勾股定理求出两点间的距离。将这个距离传递给按压方法就可以将距离转化为时间按下下去实现跳跃。

看完之后对于我这种小白来说确实学到了不少,之前也接触过这些库中的大部分,但是无论无何都想不到有这种用法。应该还是项目经验太少,还有就是对于学过的很多东西理解也不够,这方面以后也有待加强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值