基于TensorFlow与强化学习的微信跳一跳AI实现指南

沈亦白
沈亦白
发布时间:2026-10-13| 2人浏览过
原创

本文详解如何利用TensorFlow构建卷积神经网络,结合ADB自动化截屏与点击,实现微信跳一跳游戏的AI自动通关。通过采集800组样本数据训练模型,解析从图像预处理、CNN架构搭建到参数优化的完整流程,帮助开发者掌握AI在游戏自动化中的应用。

作为Python和机器学习领域的初学者,在目睹了众多AI操控游戏的精彩案例后,我也产生了强烈的尝试欲望。

经过筛选,我发现微信跳一跳游戏非常适合作为入门项目。该游戏无需处理高频连续画面(因为截屏操作耗时较长)且操作逻辑简单,非常适合练手。由此诞生的AI程序目前稳定得分在100分以上,状态极佳时可达200分。

1. 硬件与环境准备:

Android手机及数据线 ADB(Android Debug Bridge)环境配置 Python运行环境(本示例基于版本3.6.1) TensorFlow框架(本示例基于版本1.0.0)

2. 核心原理概述

系统通过ADB指令模拟屏幕点击与截屏操作,采用双层卷积神经网络(CNN)作为核心训练模型。模型以截取的屏幕图像为输入,直接输出按压屏幕的时间长度(毫秒数)。

3. 训练策略与数据获取

初期曾尝试纯强化学习让AI自主探索,但发现成功率极低。考虑到每次截屏耗时巨大,该方法不可行,因此转而采用监督学习思路:利用人工操作数据作为训练样本,关键在于准确记录每次跳跃所需的按压时间。

具体数据采集方案为:准备两部手机,一部运行游戏,另一部运行自研App以监听屏幕按压时长。通过双机同步操作,获取“图像-按压时间”对应的训练数据对。

4. 代码实现细节

首先构建神经网络模型:

第一层卷积层:使用5*5卷积核,生成12个特征图(featuremap),输出尺寸变为96*96*12。 第一层池化层:采用4*4最大池化(max pooling),输出尺寸缩减为24*24*12。 第二层卷积层:使用5*5卷积核,生成24个特征图,输出尺寸变为20*20*24。 第二层池化层:采用4*4最大池化,输出尺寸缩减为5*5*24。 全连接层:将5*5*24展平后连接至32个节点,引入ReLU激活函数及0.4的Dropout率以防止过拟合。 输出层:32个节点连接至1个节点,该节点的值直接代表按压时间(单位:秒)。

# 输入:100*100的灰度图片,前面的None是batch size,这里都为1 
x = tf.placeholder(tf.float32, shape=[None, 100, 100, 1]) 
# 输出:一个浮点数,就是按压时间,单位s 
y_ = tf.placeholder(tf.float32, shape=[None, 1]) 
 
# 第一层卷积 12个feature map 
W_conv1 = weight_variable([5, 5, 1, 12], 0.1) 
b_conv1 = bias_variable([12], 0.1) 
# 卷积后为96*96*12 
 
h_conv1 = tf.nn.relu(conv2d(x, W_conv1) + b_conv1) 
h_pool1 = max_pool_4x4(h_conv1) 
# 池化后为24*24*12 
 
# 第二层卷积 24个feature map 
W_conv2 = weight_variable([5, 5, 12, 24], 0.1) 
b_conv2 = bias_variable([24], 0.1) 
# 卷积后为20*20*24 
 
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_4x4(h_conv2) 
# 池化后为5*5*24 
 
# 全连接层5*5*24 --> 32 
W_fc1 = weight_variable([5 * 5 * 24, 32], 0.1) 
b_fc1 = bias_variable([32], 0.1) 
h_pool2_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 24]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 
 
# drapout,play时为1训练时为0.6 
keep_prob = tf.placeholder(tf.float32) 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 
# 学习率 
learn_rate = tf.placeholder(tf.float32) 
 
# 32 --> 1 
W_fc2 = weight_variable([32, 1], 0.1) 
b_fc2 = bias_variable([1], 0.1) 
y_fc2 = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 
 
# 因输出直接是时间值,而不是分类概率,所以用平方损失 
cross_entropy = tf.reduce_mean(tf.square(y_fc2 - y_)) 
train_step = tf.train.AdamOptimizer(learn_rate).minimize(cross_entropy) 

其次,实现屏幕截图获取及数据预处理流程:

# 获取屏幕截图并转换为模型的输入 
def get_screen_shot(): 
  # 使用adb命令截图并获取图片,这里如果把后缀改成jpg会导致TensorFlow读不出来 
  os.system('adb shell screencap -p /sdcard/jump_temp.png') 
  os.system('adb pull /sdcard/jump_temp.png .') 
  # 使用PIL处理图片,并转为jpg 
  im = Image.open(r"./jump_temp.png") 
  w, h = im.size 
  # 将图片压缩,并截取中间部分,截取后为100*100 
  im = im.resize((108, 192), Image.ANTIALIAS) 
  region = (4, 50, 104, 150) 
  im = im.crop(region) 
  # 转换为jpg 
  bg = Image.new("RGB", im.size, (255, 255, 255)) 
  bg.paste(im, im) 
  bg.save(r"./jump_temp.jpg") 
 
  img_data = tf.image.decode_jpeg(tf.gfile.FastGFile('./jump_temp.jpg', 'rb').read()) 
  # 使用TensorFlow转为只有1通道的灰度图 
  img_data_gray = tf.image.rgb_to_grayscale(img_data) 
  x_in = np.asarray(img_data_gray.eval(), dtype='float32') 
 
  # [0,255]转为[0,1]浮点 
  for i in range(len(x_in)): 
    for j in range(len(x_in[i])): 
      x_in[i][j][0] /= 255 
 
  # 因为输入shape有batch维度,所以还要套一层 
  return [x_in] 

上述代码逻辑主要包含以下步骤:

最后,执行模型训练过程:

while True: 
 
  ………… 
 
  # 每训练100个保存一次 
  if train_count % 100 == 0: 
    saver_init.save(sess, "./save/mode.mod") 
 
  …………   
  
  sess.run(train_step, feed_dict={x: x_in, y_: y_out, keep_prob: 0.6, learn_rate: 0.00005}) 

训练数据直接从预先采集的文件中读取。由于样本量有限(目前收集了800张截图及对应的800个按压时间数据,存放于GitHub的train_data文件夹中),且过大的学习率会导致训练震荡,因此必须采用较小的学习率进行多次迭代学习。

5. 经验总结与优化建议

1. 样本分析显示,按压时间多分布在300ms至900ms之间。训练初期,无论输入如何变化,模型输出均稳定在600ms左右,一度令人怀疑方法可行性。但经过约半小时的训练后,模型开始显现效果,针对不同输入的输出差异逐渐增大。这提示我们需对卷积网络保持信心,并给予足够的训练耐心。

2. 由于人工最高仅能玩到100多分,导致高分段(物体间距更小)的数据缺失。因此,当游戏后期物体变小时,AI容易判断失误。理论上,若让AI自主探索(Self-Play)可突破此瓶颈,但受限于截屏耗时,目前难以实现。

3. 当前版本仍属初级阶段,存在诸多优化空间。例如:可识别左上角分数,若某次跳跃得分较高,则动态增大该次数据的学习率;或检测特殊物体(如超市音乐盒),执行停留数秒后再跳跃的策略等。

完整源码(含详细注释)不足300行,托管于GitHub: https://github.com/zhanyongsheng/LetsJump

更多相关技术内容,建议参考专题《微信跳一跳》进行深入学习。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。