## 一、前言

### 2.2、监督学习

```from sklearn.linear_model import LogisticRegression # 逻辑回归模型
from sklearn.model_selection import train_test_split    # 数据集拆分
# 1、准备数据
X = [
# 天河区的坐标
[1, 1],
[1, 2],
[2, 0],
[3, 2],
[3, 3],
# 花都区的坐标
[7, 7],
[6, 7],
[7, 6],
[8, 6],
[8, 5]
]
y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
# 2、拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 3、定义模型
model = LogisticRegression()
# 4、填充数据并训练
model.fit(X_train, y_train)
# 5、评估模型
score1 = model.score(X_train, y_train)
score2 = model.score(X_test, y_test)
print(score1, score2)
# 6、预测
input = [
[4, 4]
]
pred = model.predict(input)
print(pred)```

Python快速构建神经网络

1. 玩游戏，收集一些需要跳的图片和一些不需要条的图片

1. 选择合适的分类算法，训练一个模型

1. 截取当前游戏画面，预测结果，判断是否需要跳跃

1. 如果需要跳跃，则用程序控制键盘，按下跳跃键

## 三、收集数据

`pip install pillow`

```import time
from PIL import ImageGrab   # 截图
time.sleep(3)
while True:
# 截图
img = ImageGrab.grab()
# print(img.size) # 960 540 480 270
img = img.resize((960, 540))
# 保存图片
img.save(f'imgs/{
str(time.time())}.jpg')
# 修改name
time.sleep(0.1)```

```import os
import cv2
# 所有图片的全路径
files = [os.path.join(jump_path, jump) for jump in os.listdir(jump_path)] + \
[os.path.join(none_path, none) for none in os.listdir(none_path)]
X = []
y = [0] * len(os.listdir(jump_path)) + [1] * len(os.listdir(none_path))
# 遍历jump目录下的图片
for idx, file in enumerate(files):
filepath = os.path.join(none_path, file)
X.append(x)```

`y`

`y`

## 四、训练分类模型

```import os
import cv2
import joblib
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
jump_path = os.path.join('imgs', 'jump')    # 需要跳的图片的根目录
none_path = os.path.join('imgs', 'none')    # 不需要跳的图片的根目录
# 所有图片的全路径
files = [os.path.join(jump_path, jump) for jump in os.listdir(jump_path)] + \
[os.path.join(none_path, none) for none in os.listdir(none_path)]
X = []
y = [0] * len(os.listdir(jump_path)) + [1] * len(os.listdir(none_path))
# 遍历jump目录下的图片
for file in files:
X.append(x)
# 2、拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 3、定义模型
model = LogisticRegression(max_iter=500)
# 4、训练模型
model.fit(X_train, y_train)
# 5、评估模型
train_score = model.score(X_train, y_train)
test_score = model.score(X_test, y_test)
print(train_score, test_score)
# 保存模型
joblib.dump(model, 'auto_play.m')```

1. 图像只有中间部分会对下一步操作有影响，因此可以选择对训练图片进行一些处理。把上面和下面部分设置为0。如果做了这个处理，那幺在实际应用时也要做同样的处理。

1. 这些图片如果移植到其它电脑可能不适用，因为分辨率等原因。所有可以选择使用更复杂的模型，比如CNN网络。

1. 因为手动收集数据比较麻烦，可以选择做一下数据增强。

## 五、自动玩游戏

`pip install pynput`

```from pynput import keyboard
from pynput.keyboard import Key
# 创建键盘
kb = keyboard.Controller()
# 按下空格键
kb.press(Key.space)```

```import time
import cv2
import joblib
import numpy as np
from PIL import ImageGrab
from pynput import keyboard
from pynput.keyboard import Key
time.sleep(3)
# 0、创建键盘
kb = keyboard.Controller()
# 1、加载模型
while True:
# 2、准备数据
ImageGrab.grab().resize((960, 540)).save('current.jpg')  # 保存当前屏幕截屏
x = [x]
# 3、预测
pred = model.predict(x)
print(pred)
# 如果需要跳，则按下空格
if pred[0] == 0:
kb.press(Key.space)```