都说了我没有开挂,只是用了一点点辅助

作者:Vic_wkx日期:2025/11/27

最近有点游戏荒,不知道玩啥,于是重拾儿时的快乐,下载了植物大战僵尸!

游戏还是当年的游戏,但我已经不是当年那个我了。

我变秃了,也变强了!唉,捋着额头上稀疏的秀发,空叹年华似水流...

现在再玩这个游戏的时候,我的眼界和格局都不是当年年幼的我能够比拟的了。以前玩的时候只顾着打僵尸,而现在的我想的是,怎么收购这家游戏公司?

不好意思吹过头了!现在玩的时候,想的是怎么让游戏过程更丝滑,身为程序员,我现在可以借助一点小小的帮助。

比如在种向日葵的时候,发现种起来非常地不丝滑:

种一朵向日葵,需要把鼠标移动到卡片槽,点一下,再移回草地上,点击种植。不仅速度慢,还容易点歪。在编程的 IDE 里面用惯了快捷键的我,已经快不会用鼠标了。

那么,有没有什么选中向日葵卡片的快捷键呢?很可惜植物大战僵尸里没有提供这样的设置。

遇到困难,我们应该——知难而退!不对,是迎难而上!

既然游戏里没有提供,那我们就自己给它提供一个。于是我去 GitHub 上逛了一圈,找到了 AutoHotkey 这个好东西。

自定义选中向日葵的快捷键

AutoHotkey,直译为 “自动快捷键”,顾名思义,它有两个基本功能,一是用来写自动化脚本,二就是用来自定义快捷键。

AutoHotkey Github 地址:github.com/AutoHotkey/…

首先在它的 releases 里下载最新的安装包,我下的是 AutoHotkey_2.0.19_setup.exe

安装好之后,文件夹的内容长这样:

其中,WindowSpy.ahk 是 AutoHotkey 这个软件自带的一个脚本,双击运行:

这个脚本有一个作用:查看鼠标当前所在的位置坐标。在 Mouse Position 这一栏,Screen 的值会随着鼠标的移动而变化。比如,将鼠标移动到卡片槽里的向日葵的位置,可以看到这里的坐标显示 208, 110,这个坐标我们待会自己写脚本时需要用到。

接下来我们就开始写自己的脚本,新建一个文件,名字就叫 HelloWorld.ahk,顺便提一下,.ahk 后缀是 AutoHotkey 脚本的专用后缀。在脚本中写入以下内容:

1#Requires AutoHotkey v2.0+
2#SingleInstance Force
3
41:: {
5    ; 保存当前鼠标位置,记录为 StartX  StartY
6    MouseGetPos(&StartX, &StartY)
7    
8    ; 移动到目标位置并点击,最后一个参数表示移动速度,0 表示瞬间移动
9    MouseMove(208, 110, 0)
10    Click()
11    ; 停留 100ms 确保点击被处理,尝试了下如果不停留一会,点击有时会失效
12    Sleep(100)
13    
14    ; 移动回原始位置
15    MouseMove(StartX, StartY, 0)
16}
17

简单解释一下:

  • #Requires AutoHotkey v2.0+ 指定脚本需要 AutoHotkey v2.0 或更高版本才能运行,我下载的是 AutoHotkey_2.0.19,可以看出已经是 v2.0 以上了。
  • #SingleInstance Force 表示当尝试启动脚本的另一个实例时,强制关闭旧实例并启动新实例。在写脚本的过程中,我们需要频繁地修改和重新运行脚本,所以这个设置非常有用。如果不写这一行的话,运行另一个实例时会有这个弹窗提示:

  • 1::{} 表示定义快捷键为 1,当点击 1 的时候执行 {} 中的内容。一些常见的键:^ 表示 Ctrl,+表示 Shift,! 表示 Alt,# 表示 Windows 键,可以自由组合,比如 ^+1 表示 Ctrl + Shift + 1
  • 这个脚本的作用是,点击快捷键 1,将鼠标从当前位置快速移动到指定位置,执行一次点击,然后再移动回来。

双击这个脚本运行,看一下效果:

可以看到,只要点击键盘上的 1,就一键完成了选中向日葵并回到草坪上的操作,只需要种植就可以了。还可以轻松拓展,比如回到草坪上之后,直接再自动点击一下完成种植也是可以的。

啊,我的土豆雷居然被僵尸吃掉了!!!

自动收集阳光

长久以来,植物大战僵尸这款游戏都有一个痛点,那就是收集阳光实在是太累了。有没有什么办法自动帮忙收集阳光呢?

有的有的,兄弟们有的。

写一个这样的脚本就可以了:

1#Requires AutoHotkey v2.0+
2#SingleInstance Force
3
4; 设置悬停提示文本
5A_TrayMenu.Tip := "植物大战僵尸 - 阳光自动收集器"
6
7; 配置坐标
8firstCell := [500, 360]    ; 第一行第一列
9lastCell := [1500, 1000]    ; 第六行第九列
10
11; 生成6行9列的坐标网格
12SunGrid := GenerateSunGrid(firstCell, lastCell, 6, 9)
13
14; 热键:Q键开始收集阳光
15Q:: {
16    CollectAllSunshine(SunGrid)
17}
18
19; 生成坐标网格的函数
20GenerateSunGrid(startPos, endPos, rows, cols) {
21    grid := []
22    
23    ; 计算每个格子的步长
24    xStep := (endPos[1] - startPos[1]) / (cols - 1)
25    yStep := (endPos[2] - startPos[2]) / (rows - 1)
26    
27    Loop rows {
28        rowIndex := A_Index
29        currentRow := []  ; 创建新的一行
30        
31        Loop cols {
32            colIndex := A_Index
33            ; 计算当前格子的坐标
34            x := startPos[1] + (colIndex - 1) * xStep
35            y := startPos[2] + (rowIndex - 1) * yStep
36            ; 将坐标添加到当前行
37            currentRow.Push([Round(x), Round(y)])
38        }
39        
40        ; 将当前行添加到网格
41        grid.Push(currentRow)
42    }
43    
44    return grid
45}
46
47; 收集所有阳光的函数
48CollectAllSunshine(grid) {
49    ToolTip("开始收集阳光...", 500, 10)
50    
51    rows := grid.Length
52    cols := grid[1].Length
53    
54    ; 保存原始鼠标位置
55    MouseGetPos(&originalX, &originalY)
56    
57    ; 按行遍历所有格子
58    Loop rows {
59        rowIndex := A_Index
60        Loop cols {
61            colIndex := A_Index
62            
63            ; 获取当前格子坐标
64            currentPos := grid[rowIndex][colIndex]
65            x := currentPos[1]
66            y := currentPos[2]
67            
68            ; 显示当前点击位置
69            ToolTip("点击: 行" rowIndex " 列" colIndex " (" x "," y ")", 500, 30)
70            
71            ; 移动到目标位置并点击
72            MouseMove(x, y, 0)
73            Click()
74            
75            ; 停留,确保点击生效
76            Sleep(1)
77        }
78    }
79    
80    ; 返回原始位置
81    MouseMove(originalX, originalY, 0)
82    
83    ToolTip("阳光收集完成!", 500, 10)
84    SetTimer(() => ToolTip(), -2000) ; 2秒后清除提示
85}
86

简单解释一下:

  • Q:: {} 表示定义快捷键为 Q(Quickly!),点击 Q 键开始自动收集阳光。
  • 自动收集的原理是把界面上每个格子都点一下。界面上一共 6 行 9 列,通过前面介绍的 WindowSpy.ahk 脚本找到第一格的坐标和最后一格的坐标,然后通过步长计算出所有格子的坐标位置,记录到 grid 数组中。其中用到了 Loop 语法,表示循环语句,举个简单的例子:
1; 循环 5 
2Loop 5 {
3    MsgBox "这是第 " A_Index " 次循环"
4}
5

其中,A_Index 是内置变量,表示当前循环的次数(需要注意的是,这个值是从 1 开始的,有点反程序员的直觉,我猜测是为了受众更广而做的妥协。)

看一下运行效果:

非常地丝滑!而且这明显不是挂嘛,只是个小小的辅助,用来解放双手罢了。

还能做什么

AutoHotkey 这个脚本工具有很多潜力,听说被誉为 Windows 平台的自动化瑞士军刀。只要发挥想象力,在很多场景下都可以帮我们提高生产力。在不同的人手中可以发挥出不同的威力。

比如以我的格局和眼界,我给每一个卡片槽都定义了一个快捷键,1 表示第一个卡片槽,2 表示第二个卡片槽,以此类推。

再比如说,给植物浇水的时候,花洒需要用一次点一次,实在是不方便:

于是我给花洒设置了一个 W 的快捷键(Water a plant!),点一下键盘上的 W,鼠标就能自动移到花洒的位置,执行一次点击,然后再回到原位,这样浇起水来就相当丝滑了:

唉,就这点儿出息了,有种拿着瞬移的能力去送外卖的感 jio,不过无所谓,反正没什么大的追求,活着就是为了去码头整点儿薯条=,=


都说了我没有开挂,只是用了一点点辅助》 是转载文章,点击查看原文


相关推荐


Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
q***65692025/11/25

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 场地信息界面 单车信息界面 归还信息界面 共享单车界面 系统管理界面 看板展示 系统首页 个人中心界面 摘要 共享单车在城市出行中扮演着越来越重要的角色,与此同时,共享单车运营商需要有效地管理和分析大量的数据以提升用户体验和运营效率。本文提出了基于大数据技术的共享单车数据分析与辅助


底层视觉及图像增强-项目实践理论补充(十六-0-(22):HDR技术深度解析:从数学原理到LED显示工程实践):从奥运大屏,到手机小屏,快来挖一挖里面都有什么
AIminminHu2025/11/23

底层视觉及图像增强-项目实践理论补充(十六-0-(22):HDR技术深度解析:从数学原理到LED显示工程实践):从奥运大屏,到手机小屏,快来挖一挖里面都有什么 🔥 HDR技术深度解析:从数学原理到LED显示工程实践前言一、多曝光融合的数学本质与工程挑战1.1 数学原理:加权最大似然估计1.2 HDR的数学本质:超越8bit的亮度编码革命HDR编码的数学突破 1.3 去鬼影(Deghosting)1.4 LED显示中的工程实践 二、相机响应函数(CRF)的物理意义与LED启示


Python与C#:从哲学到细节的全面对比
码事漫谈2025/11/21

Python和C#都是现代、高级、面向对象的编程语言,拥有庞大的社区和广泛的应用。然而,它们源于不同的生态系统,秉承不同的设计哲学,因此在语法、执行模型和典型应用上存在显著差异。Python以其极简主义和灵活性著称,而C#则以其在强大类型系统和结构化框架下的优雅与一致性闻名。 下面,我们将从整体到细节,系统地剖析这两种语言的差异。 一、整体与哲学 设计哲学与起源 Python: 由Guido van Rossum创建,其核心哲学是**“优美胜于丑陋,明了胜于晦涩,简洁胜于复杂”。它是一种解


Vue高阶组件已过时?这3种新方案让你的代码更优雅
良山有风来2025/11/20

还记得那些年被高阶组件支配的恐惧吗?props命名冲突、组件嵌套过深、调试困难...每次修改组件都像在拆炸弹。如果你还在Vue 3中苦苦挣扎如何复用组件逻辑,今天这篇文章就是为你准备的。 我将带你彻底告别HOC的痛点,掌握3种更现代、更优雅的代码复用方案。这些方案都是基于Vue 3的Composition API,不仅解决了HOC的老问题,还能让你的代码更加清晰和可维护。 为什么说HOC在Vue 3中已经过时? 先来看一个典型的高阶组件例子。假设我们需要给多个组件添加用户登录状态检查: // 传


C#.NET DateTime 最强入门到进阶:格式化、转换、UTC、时区全覆盖
唐青枫2025/11/19

简介 DateTime 是 System 命名空间中用于表示日期和时间的结构体,广泛用于处理时间相关的操作,如存储、计算、格式化等。 DateTime 结构概述 定义:System.DateTime 是一个值类型(struct),表示自公元 0001 年 1 月 1 日午夜 00:00:00(DateTime.MinValue)起经过的“刻度”(ticks,1 tick = 100 纳秒)数。 内部存储:一个 long 值(ticks)+ 一个 DateTimeKind 枚举,指示时间的


HTTP与HTTPS深度解析:从明文传输到安全通信
叁佰万2025/11/17

接续上文:https://blog.csdn.net/m0_73589512/article/details/154828521?spm=1001.2014.3001.5501 个人主页:叁佰万-CSDN博客 主题专栏:网络通信_叁佰万的博客-CSDN博客 目录 HTTP与HTTPS深度解析:从明文传输到安全通信 一、HTTP:万维网的“基础通信语言” 1. 核心工作原理:请求-响应模式 2. 核心结构:请求与响应的“格式规范” HTTP请求结构 HTTP响应结构 3. 关键


Bash 的 tail 命令
hubenchang05152025/11/16

#Bash 的 tail 命令 tail [OPTION]... [FILE]... 功能 查看文件的末尾。 类型 可执行文件(/usr/bin/tail),属于 coreutils。 参数 OPTION 选项: -c, --bytes=[+]NUM - 查看文件末尾的 NUM 字节,如果使用正号,则表示查看第 NUM 字节之后的内容 -f, --follow[={name|descriptor}] - 跟随文件,当文件内容增加时打印追加的内容 -F - 等价于 --follow=name


Python 的内置函数 max
IMPYLH2025/11/15

Python 内建函数列表 > Python 的内置函数 max Python 的内置函数 max() 是一个用于返回可迭代对象中最大元素或多个参数中最大值的实用函数。它支持多种数据类型和灵活的调用方式,是 Python 编程中常用的工具之一。 基本用法 单个可迭代对象: numbers = [3, 1, 4, 1, 5, 9, 2] print(max(numbers)) # 输出:9 多个参数: print(max(3, 1, 4, 1, 5)) # 输出:5 关键参数


IM 收件箱机制(三)
锅拌饭2025/11/14

在IM中,有了长连接之后,如何完成服务端与客户端的数据同步也是很重要的一环。 通常会有两种方案,一个是服务端直接转发,一个是收件箱机制。我们以消息类型的数据为例。 服务端直接转发: 是服务端收到消息A,存储完成后,直接将消息A的具体内容通过长连接通道发送给客户端B。我们把这种方式叫做服务端直接转发。 收件箱: 服务端收到消息后,不直接转发该消息给客户端,而是将消息id、消息所在会话id推送给客户端的消息收件箱,客户端发现消息收件箱有数据后,择机通过长连接 or 短连接拉取消息具体内容。 服务端直


C#.NET WebAPI 返回类型深度解析:IActionResult 与 ActionResult<T> 的区别与应用
唐青枫2025/11/13

简介 核心概念对比 特性IActionResultActionResult<T>引入版本ASP.NET Core 1.0ASP.NET Core 2.1主要用途表示HTTP响应(状态码+内容)类型化HTTP响应返回值类型接口(多种实现)泛型类内容类型安全❌ 无编译时检查✅ 编译时类型检查OpenAPI/Swagger需手动添加 [ProducesResponseType]自动推断响应类型适用场景需要灵活返回多种响应的

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读