女神在我玩王者的时候约我看电影,可我又不能挂机坑队友。那就只能写一个帮我打王者荣耀的AI了

本文介绍了如何使用Python和深度学习模型开发一个自动玩王者荣耀的AI。通过收集游戏数据,预处理图像,训练ResNet和Transformer模型,实现游戏画面识别和操作预测。在模型训练完成后,利用pyminitouch将AI的决策发送到手机,实现自动玩游戏。

大家好,这里是为代码封神的封神榜(有点吹牛皮了,哈哈)。还是新人初来乍到,希望大家多多指教。

——————————————————
不知道兄弟们有没有遇到这样的情况,当你正在玩王者的时候,战局焦灼。结果这时候心仪已久的女神(之一)发来一条消息,问我有时间一起看电影吗?
在这里插入图片描述

我这暴脾气,这怎么能忍!
在这里插入图片描述
当场我就要夺门而出了,可是想到我也不能辜负一直陪我战斗的兄弟们啊。正纠结之时,瞥见了室友写了一半的Python作业,瞬间心生一计。

干脆自己写一个替我打王者荣耀的是AI算了,这样游戏女神两不误。在这里插入图片描述
那接下来看我操作吧!

该项目包括训练数据收集、数据处理、模型训练和模型应用完整开发流程。

该项目用后裔的100多局对战数据训练了一个模型作为演示,大家学会以后可以自己收集数据,训练自己的AI英雄。

接下来我们就来拆解下这个项目,我讲解项目的原则一贯是简洁、通俗,尽量做到小白也能看懂。

先来考虑下大致的实现思路,看到这个项目的第一眼我是比较懵的,完全不知道怎么搞。其实换个角度,想想我们玩游戏的过程,或许就能找到一些思路。

我们玩游戏的时候,大脑会根据当前的游戏画面来判断该进行什么样操作。游戏画面其实就是一张图片,如果把图片和图片对应的操作输入到算法模型,让算法自己去学习图片与操作之间的关系。当给出新的图片,如果算法能正确输出对应的操作,那我们就可以在游戏开始后,把游戏画面不断输入到算法模型中,算法模型不断产生对应操作并执行,这样便实现了程序自动玩游戏的功能。

所以,我们就把AI玩游戏的问题抽象成了计算机视觉(cv)的问题。那么要解决的核心问题有两个,第一,图片和图片的操作怎么收集,第二,用什么算法模型。

在后面的讲解中会解决这两个问题。

01 收集训练数据

收集训练数据就是我们在玩游戏的时候把游戏画面以及操作记录下来。

获取游戏画面

首先需要在 Windows 电脑上安装 scrcpy,它能将安卓手机投射到电脑,这样我们就可以在电脑上截取游戏画面了。

在这里插入图片描述

代码很简单,调用了“取图”函数,“窗口名称”参数是运行 scrcpy 的窗口名称。该函数会调用系统能力将当前窗口画面保存为图片

在这里插入图片描述

这个项目还有一大特点是变量名和函数名大量地使用中文名定义,虽然 Python3 支持这样做,但很少见,个人觉得英文名更好。

获取图片对应的操作

我们没办法直接获取手机上的触控事件和手势,只能通过电脑来中转,将手机上的操作转换为电脑上的键盘操作,比如:手机的上下左右移动,转为按键’w’、‘a’、‘s’、‘d’。

在这里插入图片描述

当然可以一个简单的王者荣耀游戏,但请注意由于时间和技术限制,这个游戏可能只包含基本的功能。下面是一个示例代码: ```python import random class Hero: def __init__(self, name, hp, attack): self.name = name self.hp = hp self.attack = attack def take_damage(self, damage): self.hp -= damage def is_alive(self): return self.hp > 0 class Game: def __init__(self, hero1, hero2): self.hero1 = hero1 self.hero2 = hero2 def play(self): while self.hero1.is_alive() and self.hero2.is_alive(): attacker = random.choice([self.hero1, self.hero2]) defender = self.hero2 if attacker == self.hero1 else self.hero1 damage = random.randint(1, attacker.attack) defender.take_damage(damage) print(f"{attacker.name}攻击了{defender.name},造成了{damage}点伤害") winner = self.hero1 if self.hero1.is_alive() else self.hero2 print(f"{winner.name}获得胜利!") # 创建两个英雄对象 hero1 = Hero("鲁班七号", 100, 20) hero2 = Hero("程咬金", 150, 15) # 创建游戏对象并开始游戏 game = Game(hero1, hero2) game.play() ``` 这段代码演示了一个简化版的王者荣耀游戏,其中包含了一个 `Hero` 类表示英雄,具有名称、生命值和攻击力等属性,还有 `take_damage()` 和 `is_alive()` 方法用于处理伤害和判断英雄是否存活。`Game` 类用于控制游戏的进行,随机选择英雄进行攻击,直到一方英雄死亡为止。 请注意这只是一个简单的示例,真正的王者荣耀游戏需要更复杂的逻辑和功能。希望这个示例能够助到你!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值