一个基于HTML5 Canvas的回合制策略游戏,灵感来自经典游戏《世界征服者2》。
- 六边形地图系统 - 策略性更强的地形布局
- 多种单位类型 - 步兵、坦克、重型坦克、火炮、战斗机、轰炸机
- 回合制战斗 - 深度策略体验,包含地形加成和反击机制
- 经济系统 - 控制城市和地形获得收入
- 城市占领 - 步兵可占领中立或敌方城市
- 双AI观战模式 - 内置强力AI系统,可观战学习策略
- 强力AI玩家 - 基于博弈树搜索、影响地图和任务系统的高级AI
本游戏提供两套AI系统:
- 三层战略架构(防守/扩张/进攻/压制)
- 动作评分系统
- 智能单位招募
- Minimax搜索 - 博弈树搜索配合α-β剪枝
- 影响地图 - 量化分析地图态势和敌我优势区域
- 任务系统 - 自动生成防守、攻城、消灭、巡逻任务
- 静态评估 - 综合评估军事力量、经济实力、战略控制和战术态势
- 智能任务分配 - 为单位分配最适合的任务
- 动态兵力补充 - 根据战略需求智能招募单位
切换AI系统:在 game.js 第24行修改 useAdvancedAI 为 true(强力AI)或 false(标准AI)
-
打开游戏
- 双击
index.html或使用本地服务器
# Python 3 python -m http.server 8000 # 访问 http://localhost:8000
- 双击
-
观战控制
- 暂停/继续:点击⏸️按钮或按空格键
- 调速:选择速度(极慢/慢速/正常/快速/极速)
- 快捷键:数字键1-5快速切换速度
-
观察学习
- 观察AI的战略决策(防守/扩张/进攻)
- 学习单位配合和地形利用
- 分析经济管理和兵力调配
在 game.js 构造函数中修改AI难度:
new AdvancedAI(this, 0, 'hard') // 可选: easy, normal, hard在 game.js 第24行:
const useAdvancedAI = true; // true=强力AI, false=标准AI- 左键点击 - 选择地块/单位
- 结束回合 - 点击右上角"结束回合"按钮
- 移动 - 点击你的单位,然后点击目标地块
- 攻击 - 选择单位后,点击"攻击"按钮,再点击敌方单位
- 招募 - 在己方城市中点击"招募单位",选择要招募的单位类型
| 单位 | 费用 | 攻击 | 防御 | 移动 | 生命 |
|---|---|---|---|---|---|
| 步兵 | 100 | 5 | 3 | 2 | 10 |
| 坦克 | 300 | 10 | 8 | 3 | 15 |
| 火炮 | 250 | 12 | 2 | 1 | 8 |
| 战斗机 | 400 | 15 | 5 | 5 | 12 |
- 消灭所有敌方单位
- 占领所有城市
- 让敌人无力反击
world-conqueror/
├── index.html # 主HTML文件
├── styles/
│ └── main.css # 样式文件
├── js/
│ ├── config.js # 游戏配置和数值
│ ├── utils.js # 工具函数
│ ├── map.js # 地图生成系统
│ ├── unit.js # 单位系统
│ ├── player.js # 玩家系统
│ ├── combat.js # 战斗系统
│ ├── ai.js # 标准AI(规则驱动)
│ ├── ai-advanced.js # 强力AI(博弈树搜索)
│ ├── ui.js # UI控制器
│ ├── game.js # 游戏主循环
│ └── main.js # 入口文件
└── README.md # 说明文档
综合评估局势,权重分配:
- 军事力量(40%):单位战斗力×血量×价值
- 经济实力(30%):收入×3 + 金钱/100
- 战略控制(20%):基地×500 + 城市×100
- 战术态势(10%):地形优势 + 支援态势 + 威胁能力
- 量化每个地块的敌我势力对比
- 单位影响力随距离衰减(衰减系数0.7)
- 识别薄弱区域(敌方优势)和强势区域(己方优势)
- 为任务生成提供态势分析
自动生成优先级任务:
- 防守基地(优先级1000+):基地受威胁时
- 占领中立城市(优先级600+):扩张经济
- 攻击敌方城市(优先级500+):己方优势区域
- 消灭敌军(优先级400+):孤立的敌方单位
- 巡逻(优先级200+):薄弱区域防守
- 博弈树搜索深度2-3层
- Alpha-Beta剪枝优化性能
- 动作预排序提高剪枝效率
- 限制分支因子(每单位前3个动作)
- 按优先级排序任务
- 为每个任务查找合适的单位(类型匹配+距离最近)
- 标记已分配单位和任务,避免重复调度
- 执行任务:移动到防御位置/占领城市/攻击敌军/巡逻
根据任务需求动态招募:
- 基地:优先轰炸机(40%)>重型坦克>战斗机
下面列出的数值来自代码中的评估与配置(用于AI评估、影响力图与状态评分):
-
占领敌军空城(占领敌方城市且当前无敌方单位):
- 终态目标价值(Objective Value):+80 分(拥有城市时由
UnifiedEvaluator计入) - 步兵占领即时奖励:+40 分(
UnifiedEvaluator.evaluateAction中,步兵占领非己方城市时的即时评分) - 影响力地图中的城市战略值:敌方城市为 -20,己方城市为 +20(
InfluenceMap扩散时使用)
- 终态目标价值(Objective Value):+80 分(拥有城市时由
-
攻击敌军城市(进攻、削弱或准备占领敌方城市):
- 战术优先级:攻击城市通常会提高目标优先级(代码中对城市目标有额外权重,策略层在选择攻击/占领目标时会偏好城市)
- 致胜收益间接体现在占领后的 +80 目标价值与占领即时奖励 +40
-
占领中立城市(抢占中立点):
- 终态目标价值:+80 分(同上,拥有城市的 Objective Value)
- 影响力地图中中立城市基础值:+15(用于局部战略影响扩散)
- 扩张评估加分:安全的中立城市在
evaluateExpansionOpportunity中被计为 +25(视威胁情况而定)
-
防守城市(保住己方城市 / 驱逐威胁):
- 位置价值(Tile position):城市地块对单位位置价值有 +15 的基本加成(
getTilePositionValue) - 影响力地图中己方城市值:+20(用于控制/威胁判断)
- 位置价值(Tile position):城市地块对单位位置价值有 +15 的基本加成(
-
占领基地(Capture Base):
- 终态目标价值(Objective Value):+150 分(
UnifiedEvaluator中对己方基地计入) - 每回合收入:+200 金/回合(
CONFIG.INCOME.BASE) - 地块位置价值:基地在
getTilePositionValue中对单位位置有 +30 的加成 - 占领耐久与速率:
CAPTURE.BASE_DURABILITY = 20,CAPTURE.INFANTRY_CAPTURE_RATE = 5(步兵需 4 次占领动作完成占领) - 影响力地图中的基地值:己方基地 +50,敌方基地 -50,中立 +10(用于战略扩散)
- 终态目标价值(Objective Value):+150 分(
-
防守基地(Defend Base):
- 基地威胁评估范围:
evaluateBaseThreat返回 0–100 的威胁值;当 >80 时战略层会进入DEFEND模式并触发紧急防御逻辑 - 基地在影响与位置上提供更高价值(位置价值 +30,影响力值 +50),因此防守优先级明显高于普通城市
- 基地威胁评估范围:
注:README 中示例性文档可能还包含其它缩放或描绘(例如历史注记 基地×500 + 城市×100),但上面列举均以当前代码实现中的具体数值为准。
- 需要占领:招募步兵
- 需要防守:招募火炮
- 需要进攻:招募坦克/重型坦克
下面列出代码中用于评估攻击动作的评分规则与具体数值(来源:UnifiedEvaluator.evaluateAction 与相关实现):
-
单位基础价值(
UnifiedEvaluator.unitValues):INFANTRY: 30TANK: 60HEAVY_TANK: 90ARTILLERY: 50FIGHTER: 80BOMBER: 120
-
造成伤害的评分(按比例计入):
- 公式: (action.damage / defender.stats.health) * defenderValue
- 含义:对高价值单位造成相同比例伤害会产生更高评分
-
击杀奖励:
- 当攻击导致目标死亡时,额外奖励 = defenderValue * 0.3(即目标单位价值的 30%)
-
远程攻击奖励:
- 对于远程/无反击的攻击,额外奖励 = +20 分(代码中用于鼓励远程消耗敌方)
-
反击损失惩罚:
- 公式:- (action.counterDamage / attacker.stats.health) * attackerValue * epsilon
- 其中
epsilon= 1.8(UnifiedEvaluator.weights.epsilon),用于放大反击造成的损失惩罚
-
自身被击毙惩罚:
- 若攻击导致己方单位死亡,惩罚 = - attackerValue * 1.5
示例:若对一辆价值 60 的坦克造成 30 伤害(坦克最大生命假设为 60),则伤害评分≈(30/60)60 = 30 分;若该次攻击击杀该坦克,则再获得 +600.3 = +18 分;若己方单位在反击中损失血量,则按反击惩罚公式扣分。
注:以上均为当前代码实现使用的评分公式与常数;如果需要我可以把这些数值也显示到游戏 UI 的地块或战斗信息面板中。
在 js/config.js 中修改:
MAP_COLS: 20, // 列数
MAP_ROWS: 12, // 行数在 js/config.js 的 UNIT_TYPES 中添加:
NEW_UNIT: {
name: '新单位',
cost: 500,
attack: 20,
defense: 10,
movement: 4,
health: 20
}修改 js/config.js 中的:
STARTING_MONEY: 1000, // 起始金钱
STARTING_INDUSTRY: 50, // 起始工业
TURN_INCOME: 100 // 每回合收入- 规则驱动AI
- 强力博弈树AI
- 影响地图系统
- 任务生成与分配
- 双AI观战模式
- 玩家对战模式
- 更多单位类型(海军)
- 科技树系统
- 保存/加载游戏
- 音效和背景音乐
- 多人在线对战
- 战役模式
- 地图编辑器
- Minimax搜索:经典博弈树搜索算法,适用于零和游戏
- Alpha-Beta剪枝:显著减少搜索节点,提升性能
- 影响地图:受RTS游戏AI启发的空间分析技术
- 任务驱动架构:分层决策系统,战略→战术→行动
- 六边形坐标系统:轴坐标表示(Axial Coordinates)
- 战斗公式:平方根效能曲线模拟单位损伤
- 地形系统:攻击加成+防御加成,丰富战术选择
- 经济平衡:固定收入生成,避免随机性影响测试
- HTML5 Canvas - 游戏渲染
- 原生JavaScript - 无框架依赖,纯ES6+
- CSS3 - 现代化军事风格UI
- AI算法 - Minimax搜索、影响地图、任务系统
- 搜索深度限制:2-3层
- 分支因子控制:每单位前3-5个动作
- 动作预排序:优先搜索高价值动作
- Alpha-Beta剪枝:平均减少60-70%节点搜索
- 采样移动目标:不枚举所有可达格
- 标准AI:200-500ms/回合
- 强力AI:800-1500ms/回合(困难难度)
- 地图生成:100-200ms
- 战斗计算:<1ms
游戏使用轴坐标系统(Axial Coordinates)来表示六边形地图:
q- 水平轴r- 对角线轴
- 攻击伤害 = 攻击力 - 防御力/2
- 反击伤害 = 攻击力/2 - 防御力/3
- 所有伤害至少为1
欢迎提交问题和改进建议!
MIT License - 自由使用和修改
享受游戏,征服世界! 🌍⚔️