一个AI独立完成的游戏自动化脚本
从2023年初,ChatGPT横空出世,AIGC逐渐成为一个耳熟能详的词语。过去两年,我每年都会写一篇关于AIGC相关的文章,表达一下我对其看法。
今年这篇文章拖到下半年才开始写,因为今年基本上全程在使用AI工具编写代码了,从最初的ChatGPT、Claude问答式编码,到后面的github copilot
、CLine
、Cursort
,AI编码工具已经经历了不少的迭代,现在基本上可以自动化创建文件、编写、修改代码。
最近沉迷玩一款放置游戏,但是里面有个机制需要人工手动操作,非常繁琐,本文将记录我是如何使用AI,零编码完成一个游戏自动化脚本的开发和使用。
背景
我最近在玩一篇数值类的放置游戏,这个游戏很简单,就是堆数值,放在那里自动推图,获得金币经验,升级变得更强,推更后面的图。
其中有个图鉴的功能,需要在某个关卡挂机消灭5000只怪,可以解锁当前关卡图鉴,得到一定的奖励。
这个功能比较恶心的地方在于:
- 你只能在线挂机,消灭的怪才会计数;
- 当你在这个关卡挂机获得图鉴后,需要手动点击”移动”下一个关卡,没有自动切换的功能
大概一个关卡需要消耗10分钟左右的时间,这就导致如果想玩这个放置游戏,你得保持在线,还得时不时回来点一下。
保持在线这个比较简单,可以在电脑上安装一个模拟器;但手动切换关卡这个就比较烦人了,如果不及时回来切关卡,获得图鉴的速度就会比别人慢,在我加的游戏群里面,甚至有人专门找其他人帮忙手动挂机刷图鉴的事情。
但实际上我又没有多少时间来盯着这个游戏,类似于定个闹钟收菜的事情,没啥意义。
在被这个机制恶心了一段时间之后,我决定写个脚本来自动化处理这个事情。
梳理一下我的原始需求:在mac上,每隔一段时间,模拟鼠标点击一下屏幕上的某个坐标,从而实现关卡切换的功能。
在此之前,我并没有在Mac上开发自动化脚本的经验,我也并不知道这个需求是否可行,按照之前的开发经验,我一般会
- 谷歌搜索类似的场景,了解可行的技术栈
- 了解某个技术方案的核心依赖,安装依赖,开发demo脚本
- 验证demo脚本,调试,完善功能
- 最终获得一个可行的脚本
但是这一次,基于之前在实际项目中使用AI的经验,我决定使用AI工具,零编码实现这个功能。
对话时间轴
在今年的开发工作中,我同步同时在使用多款AI编程工具,比如Cursor、CLine、Trae等,这次使用的AI工具是Kiro
,这是一个最近刚出来的AI编辑器,类似于Cursor,使用的模型是Claude Sonnet4.0
。
接下来,我整理了具体的聊天对话过程,主要涉及”用户问题“、“解决方案”,其中穿插的内容是当时的一些活动过程。
三种方案模拟点击
首先创建了一个感觉的工作目录,里面一个文件、一行代码都没有
用户问题: 我希望在mac上,可以让鼠标每隔一段时间,自动点击屏幕上的某个位置,我希望你能够编写一个脚本来实现,你可以使用python或者nodejs,或者mac自己的script语言
解决方案:
- 创建了三种不同实现:Python版本、Node.js版本、AppleScript版本
- 推荐使用AppleScript版本(Mac原生支持,无需依赖)
- 提供完整的使用指南和权限设置说明
Kiro在当前工作目录下,用三种语言创建了对应的脚本代码,然后问我想先试试哪种版本。
由于我更熟悉JavaScript,因此先试试NodeJs版本,看了下代码,里面使用了robotjs
这个库来模拟鼠标点击。
然后我发现虽然这个脚本可以模拟鼠标点击指定位置,但我实际上并不知道游戏界面上的切换按钮位置坐标,因此我需要添加一个新功能:获取屏幕任意一点位置坐标
获取鼠标位置的坐标
用户问题: 现在我选择了nodejs的版本,我希望再实现一个功能,当这个脚本启动的时候,我点击屏幕位置的时候,控制台会输出对应的坐标,我就可以通过这个方法来动态设置自动要点击的位置坐标
解决方案:
- 升级Node.js脚本,添加动态坐标获取功能
- 实现两种模式:坐标获取模式和自动点击模式
- 支持交互式命令控制和实时坐标显示
这时候Kiro在现有的js脚本里面,添加了先获取坐标,再模拟点击的功能,但是用起来体验有点奇怪,它给我的操作步骤是
- 启动脚本后,先在坐标获取模式下点击你想要自动点击的位置
- 看到坐标被正确识别后,输入 start 开始自动点击
- 如需调整位置,输入 stop 停止,然后重新点击设置新坐标
- 完成后输入 quit 退出
这个交互用起来体验很差,我需要让他改进,将坐标采集和模拟点击的任务分开,坐标采集之后得到具体的坐标,然后再将这个坐标传递给模拟点击的任务。
用户问题: 我感觉采集坐标和自动点击的任务放在一个脚本里面不太合适,我希望你拆分为两个脚本,一个采集鼠标点击的坐标,一个执行自动点击,采集鼠标点击坐标的任务,可以将坐标写到一个json文件中,自动点击任务的脚本会消费这个json文件里面的坐标
解决方案:
- 拆分为两个独立脚本:
coordinate_collector.js
(坐标采集器)和auto_clicker_simple.js
(自动点击器) - 使用JSON文件作为数据交换格式
- 坐标采集器支持坐标管理(查看、删除、重命名、清空)
- 自动点击器支持顺序点击和随机点击两种模式
Kiro自动将上面的任务进行了拆分,
- 采集坐标阶段:
node coordinate_collector.js
点击你想要自动点击的位置,坐标会自动保存并命名 - 执行点击阶段:
node auto_clicker_simple.js
程序读取保存的坐标,按你的设置自动点击
在采集过程中,由于涉及到打开模拟器,打开游戏等各种操作,需要点击鼠标的次数太多了,最后采集到的坐标很多,以至于我在采集坐标的文件里面都找不到实际上需要的那个坐标点。
因此我又加了一个需求,希望只采集某些特定的点击事件(比如我真是点击游戏界面上的那次点击)
用户问题: 鼠标点击时触发的次数太多了,我希望添加一个规则:只记录按下shift键,同时鼠标左键按下时的点击事件
解决方案:
- 尝试实现Shift+点击检测,但发现技术复杂性
- 改为使用空格键触发记录,后发现焦点问题
- 最终改为回车键触发记录的简单可靠方案
一通操作之后,我不知道是采用的robotjs
库有问题,还是mac系统权限的问题,并无法准确地在游戏界面,按了Shift或者空格之后,采集到坐标,我也没有过分纠结,当一个专业的甲方,回到第一个版本。
现在AI编程工具都提供了reset某一轮对话的状态,但是会丢失到后面的对话,类似于git reset
,我希望保留这轮对话,因此直接当甲方就行。
用户问题: 这个交互还是不太好,回到最初的版本,监听鼠标移动的坐标位置,改为鼠标点击的时候记录该坐标
解决方案:
- 恢复鼠标点击检测机制
- 通过鼠标位置稳定性检测来识别点击行为
- 添加防重复机制和智能过滤
回滚的好处是并不会原样回滚,Kiro自动加上了一些防重复的功能,减少了收集坐标的数量,但是我发现采集的坐标似乎不太准确,在外界显示器上获取到的坐标x一直为0。
外接显示器获取坐标不准确
这个问题需要让Kiro修复一下,但是我并不知道这个问题的原因是啥,我甚至没有去看这个js文件里面的代码。
为了提高效率,我去谷歌搜索一下可能的原因,看起来可能是使用了外接显示器的缘故,我先验证了一下使用单屏幕的时候,坐标获取是正常的,笔记本的左上角是(0,0)
。
用户问题: 采集的坐标好像有问题,第一个值一直是0,我使用了外接显示器,这里的坐标处理是否正常
解决方案:
- 识别多显示器环境下的坐标问题
- 添加调试功能和坐标验证机制
- 实现坐标修正和详细的调试信息输出
- 提供debug命令查看显示器配置和坐标一致性测试
Kiro改了两版代码,自己在跑命令行脚本进行验证,但始终没有得到正确的结果。
我意识到这个可能是使用的技术方案的问题,robotjs
这个库已经是六七年前的包了,一直没有更新过,因此决定用python版本再试试
我看了下python版本的脚本,代码比较简单,但是pyautogui
环境,我尝试自己安装pip3 installpyautogui
结果报错了,算了,还是不自己尝试了,都交给AI。
用户问题: 我需要你在当前目录下安装pyautogui,并实现自动控制鼠标点击某个坐标的效果
解决方案:
- 创建Python虚拟环境解决macOS的externally-managed-environment限制
- 安装pyautogui库及相关依赖
- 创建了三个核心脚本:
mouse_click.py
- 交互式鼠标点击工具simple_click.py
- 简单点击脚本get_mouse_position.py
- 鼠标位置监控器
- 添加安全机制(FAILSAFE)和启动脚本
由于之前的python版本只有最基础的那个文件,后面加的需求都没有改动(都在改js版本的代码),这一轮对话中,Kiro自动将之前的内容都用python版本实现了,同时环境也自动给我自动处理好了(需要创建python venv环境再安装)。有了参考代码,切换方案版本这些工作,比认为处理要方便太多。
运行了下get_mouse_position
这个脚本,发现外接显示器获取的坐标还是有问题。
用户问题: get_mouse_position 中,我使用了一个外接显示器,导致获取主屏幕的y轴时数据不对
解决方案:
- 分析多显示器环境下的坐标系统特点
- 改进
get_mouse_position.py
,添加显示器配置信息显示 - 实现屏幕区域判断功能,识别左侧、右侧、上方、下方显示器
- 添加坐标区域标识,帮助用户理解负坐标的含义
- 更新所有脚本以正确处理多显示器坐标
- 可选安装screeninfo库获取详细显示器信息
没想到这一轮对话,一下就解决了,python社区工具还是多啊
这个问题修复后,我发现切换版本的时候,点击坐标保存到JSON文件这个功能没有带过来,需要让Kiro补充一下
用户问题: 现在你统计的坐标和点击事件都正常了,但我希望获取鼠标位置的时候可以更方便一些,其中get_mouse_postion脚本的时候,我点击了鼠标之后,我希望你可以在一个本地的日志文件中记录这个坐标,方便我后续处理,而不用手动记忆
解决方案:
- 安装pynput库用于监听鼠标点击事件
- 改进
get_mouse_position.py
,添加智能模式和基础模式 - 实现自动坐标记录到JSON格式的日志文件
- 记录详细信息:时间戳、坐标、点击类型、屏幕区域
- 创建
view_coordinates.py
坐标日志查看器 - 支持坐标统计、导出为可执行脚本、清空日志等功能
现在,获取坐标的功能正常了,接下来只需要拿到这个坐标,实现模拟点击就行。
在我的原始需求中,我希望开个定时器,每隔一段时间点击一下切换按钮,我忘记python中怎么写循环了,不过不重要,让Kiro写。
用户问题: 在simple_click中,编写一个循环,每5分钟点击一次传入的坐标
解决方案:
- 重构
simple_click.py
,添加三种点击模式:- 单次点击
- 每5分钟循环点击
- 自定义间隔循环点击
- 实现详细的倒计时显示和状态信息
- 添加点击统计和运行时间记录
- 优雅的程序中断处理(Ctrl+C)
- 交互式坐标输入,无需修改代码
模拟点击前聚焦应用
我其实只想在这个脚本里面写一个定时器循环就行了,没想到kiro又给我提供了模式选择,看起来还不错,运行一下试试,结果发现鼠标移动到了模拟器上、游戏界面按钮对应坐标,触发了模拟点击,但是游戏界面并没有更新。
尝试了一下手动真实点击,发现区别在于模拟器应用没有处于聚焦状态,模拟的点击事件可能无法下发到模拟器上面。
不研究细节,将我的怀疑告诉它。
用户问题: 我在测试的时候发现一个问题,在simple_click中,我写的坐标实际上是一个应用,实际上需要这个应用处于聚焦状态下,点击应用内对应坐标的按钮才会真实生效,这个有什么解决思路吗
解决方案:
- 在
simple_click.py
中直接集成窗口管理功能 - 使用osascript调用macOS系统API获取运行中的应用列表
- 实现应用激活功能,确保目标应用处于聚焦状态
- 集成应用选择和激活功能到主脚本中
- 提供交互式应用选择界面
- 在每次点击前自动激活目标应用
再次运行,这次脚本查询了当前正在运行的应用,然后要我输入模拟点击前需要激活的应用,然后模拟点击,这次居然成功了!
游戏界面响应了模拟的点击,切换了关卡。这意味着,整个流程都已经跑通了。
在我没有手动去谷歌搜索方案的情况下,Kiro自动安装相关依赖,完成了这个需要激活窗口的全部工作。而我在使用了这个功能之后,在不看其源码的情况下,完全不知道它采用的什么方案。
接下来,我就开启了愉快的挂机模式,这个脚本会每隔一段时间,为我切换一个关卡,我就可以在外接显示器上,刷刷微博和B站。不用在时刻关心游戏的切换问题,而获取图鉴的速度得到了极大提升。
不过在一段时间的使用后,我发现了另外一个需求点:当我在使用鼠标时,如果触发了模拟点击,鼠标没有回到原位置,容易打断操作。继续提需求。
用户问题: 在simple_click中,我希望模拟模拟点击前,可以记录一下鼠标当前的位置,当一轮模拟点击完毕之后,恢复鼠标到之前的位置
解决方案:
- 改进所有点击函数,添加鼠标位置记录和恢复功能
- 在点击操作前记录当前鼠标位置
- 点击完成后自动恢复鼠标到原位置
- 区分初始位置和点击前位置,提供最佳用户体验
- 在程序异常退出时也能恢复鼠标位置
- 添加详细的位置记录和恢复日志
重新运行,发现现在效果比较完美了,触发模拟点击时,鼠标会短暂的离开当前界面,然后又回来,在这个过程中,我的游戏又自动切换了一个关卡。
最终效果
通过逐步迭代,Kiro为我成功实现了一个功能完整的自动鼠标点击工具,整体只花了我周五晚上一个半小时的时间。
具备以下特性:
- 多显示器环境完美支持 - 正确处理负坐标和超出主屏幕的坐标
- 智能坐标记录 - 自动记录鼠标点击坐标到日志文件
- 灵活的点击模式 - 支持单次、定时循环、自定义间隔点击
- 应用窗口自动管理 - 自动激活目标应用确保点击生效
- 用户操作无干扰 - 自动记录和恢复鼠标位置
- 完善的用户体验 - 详细日志、安全机制、优雅退出
工具完全满足了用户在macOS多显示器环境下进行定时自动点击的所有需求,同时保证了系统稳定性和易用性。
所有的代码都放在github上面了,这个项目,除了README.md里面的某一行备注之外,全部都是AI自动生成的。
后续展望
现在只是通过一个计时器,定时去点击某个坐标的位置。理论上,也可以将图像识别接进来,当模拟器界面上对应关卡状态显示为完成的时候,自动去点击切换;甚至可以模拟一条操作链路,解决这个放置游戏里面需要人重复操作的路径。
当然,我并不会长期玩这个游戏,这种纯数值类的游戏也没有啥可玩性,但通过这个契机,让我第一次完成了一个游戏的自动化脚本。
小结
我的博客在很早之前,就加上了一个AIGC
的tag,用来标识那些AI参与了创作的过程,目前,新写的大部分文章内容,基本上都是AI辅助或者直接主导了。
上面这个对话时间轴、最终效果总结,也是Kiro直接替我输出的,我只是在其基础上,记录了一下自己当时的想法和操作。
今年开始,在公司和个人的项目中,我也在使用了大量的AI编程工具,比如自动生成一个小功能函数,或者给已知模块编写测试用例。
现在的开发体验,比之前在传统的对话框里面一问一答、开发者自行复制粘贴代码的效率又得到了很大的提升。
这个自动点击的项目,实际上是我第一次用AI独立完成一个可以实际使用的项目,在这个过程中,我没有编写任何代码,甚至部分问题,我都没有给出思路,只需要逐步引导,描述出自己的需求,AI就可以实现真正生产可用的代码。
目前看起来,一个有代码经验的开发者,结合AI,理论上是可以创作出很多富有想象力的产品的。这也是程序员相比其他AI使用者,更有优势的一步,虽然目前AI无法百分之百还原我们描述的需求,但作为有代码开发经验的程序员,可以协助AI绕开死胡同;反过来,AI提供的解决方案,也可以给程序员更多的思路。
这与我之前设想的”10倍开发者“有了一些区别,以前我希望自己能够掌握更多技能,提高开发效率,但一个人的精力、时间都是有限的。AI编码目前看起来,是AIGC里面能够显著产生收益的一个方向。
接下来需要自己更熟练的使用AI工具,把这些工具当做自己的助手,而不是要事事亲为,古法编码。
你要请我喝一杯奶茶?
版权声明:自由转载-非商用-保持署名和原文链接。
本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。
