在之前的课程里,你一直是玩家——指挥英雄通关。从这个单元开始,身份大转变:你将成为游戏设计师,亲手搭建地图、放置元素、设定规则,做出一个让别人来玩的游戏。这一章先打地基,搞清楚"什么是游戏""游戏由什么组成"。
游戏开发(Game Development)就是设计并创造一个游戏的全过程。在 CodeCombat 里,你写的代码不再是命令英雄移动,而是用来布置整个关卡世界:哪里有树、哪里站着玩家、玩家要完成什么任务、有哪些敌人来捣乱。换句话说,你写的程序"长出"了一个可以玩的世界。
玩家关心"我怎么赢";设计师关心"我怎么让玩家觉得好玩、有挑战又能赢"。本单元你要学会用设计师的眼光思考:先想清楚游戏要什么样,再用代码把它造出来。
玩家(Player)是真正操控游戏的人,也就是坐在屏幕前玩你游戏的那个人。在你的关卡里,玩家会用键盘(WASD、方向键)或鼠标点击来控制一个角色,那个被控制的角色叫玩家单位,用 spawnPlayerXY 生成。
除此之外,地图上还有许多非玩家单位(NPC,Non-Player Character)——它们不受玩家直接控制,而是按照游戏设定的规则自己行动,比如冲过来的食人魔、巡逻的弓箭手、原地不动的宝箱和树木。设计师的工作,就是安排好"玩家单位"和这些"非玩家单位"之间的关系。
| 类别 | 说明 | 例子 |
|---|---|---|
| 玩家单位 | 玩家用键鼠操控的角色 | 骑士、船长、勇士 |
| 敌方 NPC | 会主动攻击或干扰玩家 | 食人魔、投掷手、骷髅 |
| 友方/中立 NPC | 帮忙或不参与战斗 | 弓箭手、士兵 |
| 静态元素 | 不会动的布景或物品 | 树木、篱笆、宝石、宝箱 |
课程开篇就强调了三个最核心的概念,它们是任何游戏的骨架:
| 概念 | 定义 | 生活例子 |
|---|---|---|
| 目标 Goal | 玩家要取胜或推进必须达成的事 | 俄罗斯方块:消除尽量多的行 |
| 机制 Mechanic | 玩家与游戏交互的规则 | 超级玛丽:按键让角色跳跃 |
| 元素 Element | 屏幕上可以交互的对象 | 方块、金币、敌人、墙 |
要把元素准确摆到地图上,必须懂坐标系。CodeCombat 用的是直角坐标系:原点 (0, 0) 在屏幕的左下角,X 坐标向右增大,Y 坐标向上增大。把鼠标移到地图某处,就能看到那个位置的坐标,方便你决定元素该放哪。
计算机科学入门里你用 hero 指挥英雄;游戏开发里,你的大多数命令都发给 game 对象。game 代表整个游戏世界,所有"生成元素""设定目标"的方法都挂在它名下,比如 game.spawnXY()、game.addCollectGoal()。记住这个转变:以前指挥角色,现在搭建世界。
关卡 1 到 5("越过花园墙"到"宝石太棒了")是你的第一块拼图:学会把元素摆到地图上,并给游戏设第一个目标。
生成任何元素,最基础的方法就是 game.spawnXY()。它接收三个参数:第一个是元素类型字符串(如 "fence" 篱笆、"forest" 树木、"gem" 宝石),后两个是放置的 x、y 坐标。
# 用一排篱笆围出一道墙("越过花园墙"片段) game.spawnXY("fence", 39, 16) game.spawnXY("fence", 39, 20) game.spawnXY("fence", 39, 24) # ……继续往上摆,X 不变、Y 递增,就连成一道竖墙
光有布景还不够,得有玩家来玩。game.spawnPlayerXY() 生成一个由玩家用键鼠操控的角色。第一个参数是角色类型(如 "knight" 骑士、"captain" 船长、"duelist" 决斗者),后两个是出生坐标。
# 在 (5, 8) 处生成一名骑士供玩家操控 game.spawnPlayerXY("knight", 5, 8)
spawnPlayerXY 生成的是玩家能控制的角色,而 spawnXY("munchkin", …) 生成的敌人是不受玩家控制的 NPC。一个游戏通常只生成一个玩家角色。
有了角色,就该给玩家一个任务。移动目标是最简单的目标:用 game.addMoveGoalXY(x, y) 在地图上放一个红色十字标记,玩家只要把角色走到那个位置,游戏就胜利。
game.spawnPlayerXY("captain", 31, 22) game.addMoveGoalXY(31, 33) # 让玩家走到 (31,33)
收集目标要求玩家拾取地图上的物品(如宝石、宝箱)。用 game.addCollectGoal() 设定这个目标。注意一个设计逻辑:设了收集目标,就必须真的生成可收集的物品,否则玩家永远赢不了。
game.spawnPlayerXY("captain", 9, 18) game.addCollectGoal() # 目标:收集物品 game.spawnXY("gem", 25, 30) # 配套生成宝石供收集
| 关卡 | 核心技能 | 设计思路 |
|---|---|---|
| 1 越过花园墙 | spawnXY | 用多行 spawnXY 把篱笆排成墙,体会"坐标规律" |
| 2-3 地图布置 | spawnPlayerXY + addMoveGoalXY | 生成玩家,再放移动目标,组成最小可玩游戏 |
| 4 宝箱 | addCollectGoal | 设收集目标并生成宝箱/树木,搭出一个收集小游戏 |
| 5 宝石太棒了 | 综合 | 玩家 + 收集目标 + 多颗宝石,第一个完整目标游戏 |
立即访问 codecombat.cn 开启你的 CodeCombat 游戏开发之旅!
会摆元素、会设一个目标后,关卡 6-11("斩首鼠标"到"障碍魔法")带你认识更多目标类型,并学会生成各种不同的元素来配合这些目标。
击败目标要求玩家打败地图上的敌人。用 game.addDefeatGoal() 设定。设了它,自然要生成敌人(如 "munchkin" 食人魔仔)供玩家攻击。
game.addDefeatGoal() # 目标:击败敌人 game.spawnXY("munchkin", 40, 25) game.spawnXY("munchkin", 44, 25)
存活目标和别的目标都不同:玩家不用完成什么任务,只要在规定时间内保持存活就赢。用 game.addSurviveGoal(秒数) 设定,括号里的数字就是要撑过的秒数。
game.addSurviveGoal(20) # 目标:存活 20 秒
设计师要懂"什么目标配什么元素"。这一模块你会接触到许多新元素:陷阱、药水、各种兵种。它们让游戏从"静态摆设"变得有攻有守、有惊险有补给。
| 元素类型 | 英文 | 作用 |
|---|---|---|
| 火焰陷阱 | "fire-trap" | 踩到会受伤,制造危险路径 |
| 小/大药水 | "potion-small" / "potion-large" | 给玩家回血,提供补给 |
| 投掷手 | "thrower" | 远程攻击的敌人 |
| 士兵 / 弓箭手 | "soldier" / "archer" | 近战 / 远程单位 |
如果要一格一格摆篱笆做迷宫,会写到手酸。game.spawnMaze() 能自动生成一整片迷宫。第一个参数是构成迷宫的元素类型,第二个数字是迷宫的随机种子/编号——换一个数字,迷宫的布局就完全变了。
# "障碍魔法"片段:用篱笆生成迷宫,再放玩家和目标 game.spawnMaze("fence", 1) game.spawnPlayerXY("goliath", 36, 30) game.addMoveGoalXY(36, 30)
spawnMaze 和移动目标组合,就是经典的"走迷宫"玩法;换成第二个数字(种子)可以快速试出最有趣的迷宫布局。
| 关卡 | 核心目标 | 设计思路 |
|---|---|---|
| 6 斩首鼠标 | 击败 / 存活 | 生成玩家与一群敌人,设击败目标,靠点击攻击取胜 |
| 7 军队训练 | 存活 + 击败 | 多个敌人围攻,组合两种目标增加难度 |
| 8 陷阱地图 | 存活 + 移动 | 布置 fire-trap 和药水,让玩家在危险中找补给 |
| 9-10 兵种混战 | 存活 | 生成 thrower / soldier / archer,营造多兵种战场 |
| 11 障碍魔法 | 移动(迷宫) | spawnMaze 造迷宫 + 移动目标,玩家走出迷宫 |
到这里你已能搭出有目标、有元素的游戏。但所有单位都用默认设置,难度无法精细控制。关卡 12-16("森林入侵"到"生存时间")教你修改对象的属性,让游戏难度恰到好处。
属性(Property)是一个对象的特征——任何描述这个对象的信息。比如英雄的最大生命值、攻击伤害、移动速度,宝石的坐标,火焰喷射器的方向。属性以"键-值对"(key-value)的形式存在:键是属性名(如 maxHealth),值是具体数值(如 100)。
一把椅子有"颜色=红""高度=80厘米""材质=木头"等特征。每个特征就是一个属性键,对应的具体情况就是值。游戏单位也一样:maxHealth = 100 就是"最大生命值这个属性的值是100"。
要修改某个单位的属性,必须先能"指向"它。办法是用变量接住 spawn 方法返回的对象:
# 把生成的玩家存进变量 player,之后才能调整它 player = game.spawnPlayerXY("knight", 40, 10) player.maxHealth = 100 # 用 变量.属性 = 值 来修改
game.spawnXY(...) 然后想改属性,结果没有"把手"可抓。要改属性,必先用变量保存对象。
最常用来平衡难度的三个属性是:maxHealth(最大生命值)、attackDamage(攻击伤害)、maxSpeed(最大移动速度)。调大玩家的这些值会让游戏变简单,调大敌人的值会让游戏变难。
player = game.spawnPlayerXY("goliath", 12, 9) player.maxHealth = 1000 # 更耐打 player.attackDamage = 100 # 攻击更强 player.maxSpeed = 30 # 跑得更快
有些属性不是数值,而是字符串,用来控制元素的行为模式。例如火焰喷射器的 direction(喷射方向),以及敌人的 behavior(行为模式)。
# 设置火焰喷射器的喷射方向("森林入侵"片段) fs1 = game.spawnXY("fire-spewer", 12, 25) fs1.direction = "vertical" # 竖直方向喷火 # 设置敌人的行为模式("行为驱动"片段) skeleton1 = game.spawnXY("skeleton", 60, 48) skeleton1.behavior = "Scampers" # 四处乱窜
| behavior 值 | 含义 |
|---|---|
"Scampers" | 四处乱窜、躲避 |
"AttacksNearest" | 攻击最近的目标 |
"Defends" | 防守(如友方弓箭手) |
"generator"(生成器)是一种特殊元素:它会不停地生成敌人,制造源源不断的压力。通过设置它的 spawnType 属性,决定它生成哪种敌人——这正是"存活类"游戏的灵魂。
# "生存时间"片段:用生成器持续刷怪 generator = game.spawnXY("generator", 60, 40) generator.spawnType = "munchkin" # 持续生成食人魔仔
spawnType。写成 generator = game.spawnXY("generator", ...),下一行才能用 generator.spawnType = "..." 配置它。
| 关卡 | 核心属性 | 设计思路 |
|---|---|---|
| 12 森林入侵 | maxHealth / attackDamage | 用变量接住玩家,调高属性让其撑过来袭 |
| 13 火焰喷射 | direction | 多个 fire-spewer 设方向,造危险地形 + 收集 |
| 14 属性配置 | 综合属性 | 调玩家速度/血量/伤害,搭配 generator 等元素 |
| 15 行为驱动 | behavior | 给骷髅/食人魔/弓箭手设不同行为,造混战 |
| 16 生存时间 | spawnType + 存活目标 | 生成器持续刷怪 + 存活目标,经典防守游戏 |
addSurviveGoal(20),放一个 spawnType="munchkin" 的生成器,再调好玩家血量与伤害,一个完整的塔防式生存游戏就诞生了。
第17关"白手起家"没有任何初始代码,整张地图是空白的画布。这是对前面所有技能的终极检验:从零设计、构建、测试、改进一个属于你自己的游戏。
课程强调,真正的游戏开发遵循一套工程流程,写代码只是其中一环。千万别一上来就敲代码,先在纸上设计和规划。
| 步骤 | 做什么 |
|---|---|
| 1. 设计 Design | 在纸上写想法、画草图、列出游戏目标 |
| 2. 计划 Plan | 画流程图,想清楚每段代码怎么写 |
| 3. 实现 Implement | 在平台上把设计变成代码 |
| 4. 测试 Test | 运行游戏,检查是否能正常通关 |
| 5. 反馈 Feedback | 让同学试玩,收集优点与缺点 |
| 6. 改进 Improve | 根据反馈再打磨,让游戏更好玩 |
课程要求你的原创游戏至少包含:生成一个玩家、设定一个或多个目标、用障碍/敌人/收集物等元素增加难度。下面是一个从零搭建的骨架示例(仅展示结构,具体内容由你自由发挥):
# ① 生成玩家 player = game.spawnPlayerXY("knight", 15, 15) player.maxHealth = 100 # ② 设定目标(可多个) game.addSurviveGoal(20) # ③ 生成元素增加难度 game.spawnMaze("forest", 1) generator = game.spawnXY("generator", 60, 40) generator.spawnType = "munchkin" # …… 继续添加你自己的创意元素!
x = game.spawnXY(...),再 x.属性 = 值。"munchkin"、"fence" 必须准确且带引号。maxHealth 写成 maxhealth,大小写要一致。spawnType,或设置行写在了接住变量之前。恭喜你完成游戏开发1!你的身份从"玩家"升级成了"游戏设计师"。你学会了生成地图元素、设定多种目标、调整对象属性,并最终从零造出了属于自己的游戏。来回顾一下核心概念:
| 核心概念 | 关键点 | 对应模块 |
|---|---|---|
| 目标·机制·元素 | 游戏的三大支柱 | 第1章 基础 |
| game 对象 | 所有搭建命令的发起者 | 第1章 基础 |
| spawnXY | 按坐标生成布景/物品/敌人 | 关卡1-5 |
| spawnPlayerXY | 生成玩家可操控的角色 | 关卡1-5 |
| 移动/收集目标 | 走到点 / 捡齐物品 | 关卡1-5 |
| 击败/存活目标 | 消灭敌人 / 撑过时间 | 关卡6-11 |
| spawnMaze | 一行生成整片迷宫 | 关卡6-11 |
| 对象属性 | 键-值对,调难度的旋钮 | 关卡12-16 |
| 变量保存生成物 | 抓住对象才能改属性 | 关卡12-16 |
| 生成器 generator | 持续刷怪,存活游戏核心 | 关卡12-16 |
| 工程六步法 | 设计→计划→实现→测试→反馈→改进 | 白手起家 |
会设计、懂属性、能创造的你,已经是一名真正的游戏开发者。
发挥想象,造出独一无二的游戏世界吧,未来的游戏设计师!🎮🌲🛠️
加入 CodeCombat(codecombat.cn) 会员,即可解锁全部游戏开发关卡,在真实编程环境中边玩边学,亲手设计、构建并分享属于你自己的游戏作品!