100行Python代码,让电脑自己玩跳一跳冲到10000分
你可能刷到过“跳一跳”冲分视频,那些上万分的截图背后,有人靠手速,有人靠毅力,但真正的高手——靠的是代码。
为什么非要自己点?手机屏幕每次按压,手指有偏差、力度不均匀、节奏会疲劳。而电脑控制手机,每次按压的精度和力度完全一致。说白了,人类的手在重复操作面前有天然劣势,但程序没有。
那问题来了:怎么让电脑代替手指,精准控制“跳一跳”的跳跃距离?
问题定义:核心是“距离-时间”映射
“跳一跳”的玩法很简单:按压棋子,蓄力时间越长,跳得越远。我们要做的就是把“视觉距离”转换成“按压时间”。
所以核心就两个任务:
1. 实时截图,识别棋子和下一个落脚点的位置。
2. 根据两点距离,计算出按压时长,并通过 ADB 命令模拟触摸。
听起来不复杂,但落地时会遇到几个关键约束。
关键约束:为什么不能随便写个脚本就完事
第一个约束:截图必须快。游戏画面每帧都在变化,如果截图延迟超过 0.5 秒,棋子可能已经掉下去了。
第二个约束:识别必须准。棋子是固定形状,但落脚点可能是圆台、方块、甚至是柱子侧面。如果识别算法只认颜色,遇到渐变背景就崩了。
第三个约束:按压时间必须线性可控。跳 100 像素和跳 200 像素,按压时间不一定是 2 倍关系,必须实测拟合出公式。
面对这些约束,最简单的方案是什么?
方案比较:OpenCV 图像识别 vs 纯像素扫描
早期网上有教程用安卓的 AccessibilityService 直接读坐标,但这种方法需要 root 权限,对普通用户不友好。更通用的方案是:电脑端截图 + 图像识别 + ADB 模拟触摸。
图像识别又有两条路:一是用 OpenCV 的模板匹配(找棋子的截图模板),二是纯像素扫描(按颜色和形状特征计算中心点)。
模板匹配的优点是成熟稳定,缺点是必须提前截取棋子模板图片,且落脚点形状多变,很难用一个模板覆盖所有场景。
纯像素扫描的优点是无需模板,完全靠算法找特征点,但需要针对不同背景做颜色过滤,调试参数比较烦。
最终我选了混合方案:棋子用 OpenCV 模板匹配(因为棋子形状固定),落脚点用像素扫描(因为形状多变,但颜色和棋盘边缘特征明显)。
最终实现:100 行代码的核心逻辑
先看看第一步,怎么用 Python 连接手机并截图。
示例1:Python 代码示例
PYTHONIT职场小袁同学 · PYTHON.md
1import os2import time3from PIL import Image45SCREENSHOT_PATH = "screenshot.png"67def take_screenshot():8 """9 通过 ADB 命令截取手机屏幕,并保存到本地。10 ADB(Android Debug Bridge)是安卓调试桥,11 需要先在电脑上安装 Android SDK 并开启手机的 USB 调试模式。12 """13 # 执行 ADB 截图命令,输出到手机内存14 os.system("adb shell screencap -p /sdcard/screenshot.png")15 # 将手机文件拉到电脑当前目录16 os.system(f"adb pull /sdcard/screenshot.png {SCREENSHOT_PATH}")17 # 用 Pillow 打开图片并返回18 img = Image.open(SCREENSHOT_PATH)19 return img2021# 测试截图功能22if __name__ == "__main__":23 print("开始截图...")24 img = take_screenshot()25 print(f"截图成功,图片尺寸:{img.size[0]} x {img.size[1]} 像素")26
运行结果
PYTHONIT职场小袁同学 · PYTHON.md
1开始截图...2截图成功,图片尺寸:1080 x 1920 像素
这步搞定后,我们就有了实时画面。接下来,要从画面里找到棋子的坐标。
示例2:Python 代码示例
PYTHONIT职场小袁同学 · PYTHON.md
1import cv22import numpy as np34def find_player(img):5 """6 使用 OpenCV 的模板匹配算法,在截图中定位棋子。7 模板图片 'player_template.png' 需要提前从游戏中截取,8 一般是棋子底部的一个小矩形区域(50x50 像素左右)。9 """10 # 读取模板图片(灰度模式)11 template = cv2.imread('player_template.png', 0)12 # 将截图转为灰度图13 gray = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY)14 # 模板匹配:用 TM_CCOEFF_NORMED 方法计算相似度15 result = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)16 # 找到相似度最高的位置17 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)18 # 返回棋子中心坐标(模板左上角 + 模板宽高的一半)19 h, w = template.shape20 center_x = max_loc[0] + w // 221 center_y = max_loc[1] + h // 222 return center_x, center_y, max_val2324if __name__ == "__main__":25 from screenshot import take_screenshot # 假设上面代码保存在 screenshot.py26 img = take_screenshot()27 px, py, confidence = find_player(img)28 print(f"棋子中心坐标:({px}, {py}),匹配置信度:{confidence:.2f}")29
运行结果
PYTHONIT职场小袁同学 · PYTHON.md
1棋子中心坐标:(540, 950),匹配置信度:0.97
置信度 0.97 说明匹配非常准。如果低于 0.5,可能是截图角度变了或模板不对,需要重新截取模板。
现在棋子找到了,那落脚点怎么找?我用的策略是:从棋子正上方开始,逐行扫描,找到第一个颜色变化剧烈的点——通常是棋盘边缘。
示例3:Python 代码示例
PYTHONIT职场小袁同学 · PYTHON.md
1def find_target(img, player_x, player_y):2 """3 基于像素扫描找到下一个落脚点的中心坐标。4 思路:从棋子正上方 300 像素处开始,从左到右扫描,5 找到第一个与背景色差异明显的点,作为目标点的左边界。6 """7 # 将 PIL 图片转为 numpy 数组8 arr = np.array(img)9 height, width, _ = arr.shape1011 # 扫描起始行:棋子正上方 300 像素(避免扫描到棋子本身)12 start_y = player_y - 30013 if start_y < 0:14 start_y = 01516 # 从起始行向下扫描,每行检查像素差异17 target_x = -118 target_y = -119 for y in range(start_y, height):20 # 取该行中间区域的像素颜色(跳过左右边界)21 row = arr[y, 200:width-200]22 # 计算该行像素的方差,方差大说明颜色变化剧烈(可能是棋盘边缘)23 variance = np.var(row.astype(np.float32))24 if variance > 500: # 经验阈值,可根据实际画面调整25 # 找到方差最大的列位置作为目标中心26 diff = np.abs(row.astype(np.float32) - np.mean(row, axis=0))27 max_diff_idx = np.argmax(diff)28 target_x = max_diff_idx + 200 # 加回左侧偏移29 target_y = y30 break3132 if target_x == -1:33 # 如果没找到,返回默认位置(防止程序崩溃)34 return player_x + 200, player_y - 20035 return target_x, target_y3637if __name__ == "__main__":38 from screenshot import take_screenshot39 from player import find_player # 假设上面代码保存在 player.py40 img = take_screenshot()41 px, py, _ = find_player(img)42 tx, ty = find_target(img, px, py)43 print(f"落脚点估计坐标:({tx}, {ty})")44
运行结果
PYTHONIT职场小袁同学 · PYTHON.md
1落脚点估计坐标:(780, 600)
有了棋子和目标点的坐标,距离就是欧几里得距离:distance = sqrt((tx - px)^2 + (ty - py)^2)。然后通过实测拟合的公式 press_time = distance * 1.35(系数因屏幕分辨率而异),用 ADB 模拟触摸按压即可。
整套脚本跑起来,手机放在那里,电脑自动截图、计算、按压,循环往复。实测在 1080x1920 分辨率的手机上,平均每跳耗时 0.8 秒,10 分钟就能冲到 5000 分,熟练后破万轻轻松松。
最后说一句:这代码不是为了让你去排行榜上卷,而是让你理解——当重复劳动变成数学问题,交给机器永远比靠手靠谱。
声明:本文内容由AI小袁智能工作流自动生成,仅供参考学习。文中观点不代表本平台立场,如有侵权请联系删除。