保姆级教程:用Python+逻辑回归让Chrome小恐龙自己跑起来(附完整代码)
零基础实战用Python逻辑回归打造Chrome小恐龙自动跳跃AI每次在Chrome浏览器遇到网络中断时那个像素风的小恐龙游戏总让人忍不住玩上几局。但反复按空格键实在太累有没有办法让AI帮我们自动玩本文将用最简单的机器学习算法——逻辑回归实现这个有趣的项目。整个过程不需要高深的数学知识只要会基础Python语法就能跟着做。1. 环境准备与工具安装在开始之前我们需要准备几个Python库。打开终端或命令提示符依次执行以下安装命令pip install pillow pynput scikit-learn opencv-python这些库的作用分别是Pillow用于屏幕截图和图像处理pynput控制键盘按键scikit-learn提供机器学习算法包括逻辑回归opencv-python图像处理和分析提示建议使用Python 3.7或更高版本并创建一个新的虚拟环境来管理项目依赖。安装完成后我们可以通过以下代码测试环境是否配置正确import PIL import pynput import sklearn import cv2 print(所有库已正确安装)如果运行没有报错说明环境已经就绪。接下来我们需要了解游戏的基本机制。2. 游戏机制分析与数据采集策略Chrome小恐龙游戏的核心逻辑非常简单当恐龙前方出现障碍物仙人掌或飞鸟时玩家需要按下空格键让恐龙跳跃。我们的AI需要做的就是识别何时该跳。2.1 游戏画面特征分析观察游戏画面可以发现几个关键特征障碍物总是出现在屏幕右侧恐龙位置固定在最左侧背景简单主要由沙漠和云朵组成游戏速度会随时间逐渐加快基于这些特征我们可以确定只需要关注屏幕中间偏右的区域不需要处理全彩图像灰度图就足够图像分辨率可以适当降低以减少计算量2.2 数据采集方案设计我们需要收集两类图像数据需要跳跃的场景前方有障碍物不需要跳跃的场景前方无障碍物使用以下代码进行屏幕截图from PIL import ImageGrab import time import os # 创建保存图片的目录 os.makedirs(imgs/jump, exist_okTrue) os.makedirs(imgs/none, exist_okTrue) time.sleep(3) # 给3秒时间切换到游戏窗口 while True: # 截取屏幕并调整大小 img ImageGrab.grab().resize((480, 270)) # 保存图片 timestamp str(time.time()).replace(., ) img.save(fimgs/{timestamp}.jpg) time.sleep(0.1) # 每0.1秒截一张图采集数据时的小技巧尽量在不同游戏速度下截图同时收集仙人掌和飞鸟的障碍场景保持数据平衡两类图片数量相近3. 数据预处理与特征工程原始截图不能直接用于训练需要经过一系列处理才能转化为模型可用的特征。3.1 图像预处理流程我们采用以下处理步骤转换为灰度图裁剪关键区域只保留恐龙前方区域调整大小降低分辨率归一化像素值import cv2 import numpy as np def preprocess_image(img_path): # 读取并转换为灰度图 img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 裁剪关键区域x:200-400, y:100-200 cropped img[100:200, 200:400] # 调整大小 resized cv2.resize(cropped, (50, 25)) # 归一化 normalized resized / 255.0 return normalized.flatten() # 展平为1维数组3.2 构建训练数据集将收集的图片转换为特征矩阵X和标签yimport os jump_dir imgs/jump none_dir imgs/none X [] y [] # 处理需要跳跃的图片 for img_file in os.listdir(jump_dir): img_path os.path.join(jump_dir, img_file) features preprocess_image(img_path) X.append(features) y.append(0) # 0表示需要跳跃 # 处理不需要跳跃的图片 for img_file in os.listdir(none_dir): img_path os.path.join(none_dir, img_file) features preprocess_image(img_path) X.append(features) y.append(1) # 1表示不需要跳跃 X np.array(X) y np.array(y)注意确保两类图片数量大致相同避免类别不平衡问题。如果不需要跳跃的图片过多可以随机抽样一部分使用。4. 逻辑回归模型训练与评估有了准备好的数据现在可以训练我们的AI模型了。4.1 模型训练基础流程使用scikit-learn训练逻辑回归模型非常简单from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 创建并训练模型 model LogisticRegression(max_iter1000) model.fit(X_train, y_train) # 评估模型 train_score model.score(X_train, y_train) test_score model.score(X_test, y_test) print(f训练集准确率: {train_score:.2f}, 测试集准确率: {test_score:.2f})4.2 模型优化技巧如果准确率不理想可以尝试以下优化方法调整图像预处理参数尝试不同的裁剪区域调整图像大小增加对比度增强模型参数调优model LogisticRegression( C0.1, # 正则化强度 penaltyl2, # 正则化类型 solverliblinear, # 优化算法 max_iter2000 # 最大迭代次数 )数据增强对现有图像添加轻微噪声进行小幅旋转或平移调整亮度对比度5. 实现自动游戏系统模型训练好后我们需要将其集成到自动游戏系统中。5.1 实时预测与按键控制以下是自动游戏的核心代码import time import cv2 import numpy as np from PIL import ImageGrab from pynput.keyboard import Controller, Key keyboard Controller() time.sleep(3) # 给3秒时间切换到游戏窗口 while True: # 1. 截取当前屏幕 screen ImageGrab.grab() # 2. 预处理图像 img np.array(screen) img cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img img[100:200, 200:400] # 与训练时相同的裁剪区域 img cv2.resize(img, (50, 25)) img img / 255.0 features img.flatten().reshape(1, -1) # 3. 预测是否需要跳跃 pred model.predict(features) # 4. 执行跳跃动作 if pred 0: # 需要跳跃 keyboard.press(Key.space) keyboard.release(Key.space) time.sleep(0.1) # 防止连续触发 time.sleep(0.02) # 控制检测频率5.2 性能优化与调试技巧在实际运行中可能会遇到以下问题及解决方案反应延迟降低sleep时间但会增加CPU负载提前预测在障碍物距离恐龙稍远时就判断误判率高增加决策阈值使用predict_proba而非predict添加简单的后处理逻辑如连续3帧检测到障碍才跳跃CPU占用过高降低检测频率减小图像分辨率使用更高效的特征提取方法# 使用概率阈值决策的改进版本 proba model.predict_proba(features)[0][0] # 获取需要跳跃的概率 if proba 0.7: # 设置较高的阈值 keyboard.press(Key.space)6. 项目扩展与进阶方向虽然逻辑回归已经能实现基本功能但仍有改进空间。6.1 更复杂的模型尝试可以尝试以下更强大的模型支持向量机(SVM)from sklearn.svm import SVC model SVC(kernelrbf, probabilityTrue)卷积神经网络(CNN)from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model Sequential([ Conv2D(32, (3,3), activationrelu, input_shape(25,50,1)), MaxPooling2D((2,2)), Flatten(), Dense(64, activationrelu), Dense(1, activationsigmoid) ]) model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy])6.2 强化学习方案更高级的玩法是使用强化学习让AI通过试错自我学习# 伪代码示例 state get_game_state() action model.predict(state) reward execute_action_and_get_reward(action) model.update_based_on_reward(reward)6.3 跨平台适配当前方案针对Chrome浏览器设计但可以扩展适配其他浏览器的小恐龙游戏类似风格的跑酷游戏手机端游戏需要额外工具获取屏幕内容在实际测试中这个简单的逻辑回归模型能让小恐龙跑到2000分以上。虽然偶尔会撞上障碍物但对于一个不到100行代码的解决方案来说效果已经相当不错。