Python

Python

> 编程

从 2.49 版本起,除了 LeekScript,你还可以用 Python(或 JavaScript / TypeScript)来编写韭葱的 AI。AI 运行在一个安全且确定性的环境中,可以使用游戏完整的战斗 API,并且能和用其他任何语言编写的 AI 对战。

刚入门?跟着 Python 教程一步步学习,写出你的第一个 AI。

选择语言

AI 使用哪种语言,由其文件的扩展名决定:

| 语言 | 扩展名 | |---------|-----------| | LeekScript | (无) | | JavaScript | .js 或 .mjs | | TypeScript | .ts 或 .mts | | Python | .py |

语言可以在创建文件时选择(编辑器中的“新建 AI”按钮),也可以在注册时设为第一个 AI 的默认语言。重命名文件时改动扩展名,就会改变它的语言。

入口:turn()

每个回合,引擎都会执行你的 AI。有两种写法:

简单 AI:直接编写代码,每回合都会重新执行一遍:

有状态的 AI:定义一个 turn() 函数。文件主体只会执行一次(在这里声明你的类和需要跨回合保留的变量),之后每回合都会重新调用 turn():

战斗 API

游戏 API 以面向对象的形式提供,在 Python 中也保留了 camelCase(驼峰式)命名:me.setWeapon(...)、Fight.getNearestEnemy()。没有全局变量 me:你的实体要通过 Fight.me 获取。

和 LeekScript 不同,这里既没有全局函数,也没有“扁平”的常量(getNearestEnemy()、WEAPON_PISTOL……):整个 API 都通过下面这些对象来访问。

类的层级结构

API 返回的实体都带有具体类型:isinstance(enemy, Leek)、isinstance(enemy, Bulb)……

| 类 | 主要成员 | |--------|--------------------| | Entity | life、maxLife、tp、mp、strength、agility、wisdom、resistance、science、magic、level、name、cell、weapon、weapons、chips、effects、states、summons、alive、dead、isAlly()、isEnemy()、distance(cible) | | Me | Entity 的全部成员,外加各种动作:moveToward(cible)、moveAwayFrom(cible)、useWeapon(cible)、useChip(puce, cible)、setWeapon(arme)、say(message)、summon(puce, case, ia)、canUseWeapon(cible)、weaponCell(cible)、chipCells(puce, cible)、weaponTargets(case)…… | | Cell | x、y、empty、obstacle、entity、distance(cible)、pathLength(cible)、lineOfSight(cible)、path(cible) | | Weapon / Chip | cost、minRange、maxRange、area、launchType、maxUses、needsLos、features(Chip 另有 cooldown 和 currentCooldown) | | Effect | type、value、caster、turns、critical、item、target | | Feature | type、minValue、maxValue、turns、targets |

除了这些类,还有四个单例:

| 单例 | 作用 | 主要成员 | |-----------|------|--------------------| | Fight | 战斗 | me、turn、getNearestEnemy()、getFarthestEnemy()、getEnemies()、getAliveEnemies()、getAllies()、getAlliedTurret()…… | | Field | 地图 | cellFromXY(x, y)、getObstacles()、distance(a, b)、pathLength(a, b)、lineOfSight(a, b)、path(a, b) | | Registers | 跨战斗的持久存储 | get(clé)、set(clé, valeur)、delete(clé)、all() | | Debug | 在地图上做可视化标记 | mark(cases, couleur)、markText(cases, texte)、show(case)、clearMarks()、pause() |

常量

常量都归在各自所属的类下,分为两种形式:

编辑器的自动补全(Weapon.、Effect.、Entity.Stat.……)会列出所有可用的成员,还带有实时类型检查(Pyright)。

多个文件

用 Python 常规的 import,把你的 AI 拆分成多个模块:

只能访问你自己的文件。模块名遵循 Python 的规则:不能有连字符,请用下划线。不允许循环导入。

标准库

可以使用 Python 3.12 的标准库:math、itertools、collections、heapq、functools、random……不过,不能使用外部包(pip),访问系统的模块(文件、网络、进程)也无法使用。

运行环境

另见