C++ 魔法书: 第 2 卷
1
🧙‍♂️

函数的定义与调用

CodeCombat 第 31-35 关

📜 编写咒语 (定义)
✨ 施放咒语 (调用)
🔮

什么是函数 (Function)?

想象你是一个魔法师,每次战斗都要念一长串咒语:
"找敌人...检查距离...举起剑...用力挥下..."

太累了!不如把这一长串动作打包成一个新咒语,起名叫“超级攻击”

"函数就是你的自定义咒语:把复杂的代码打包,想用的时候只需叫它的名字!"
重复的代码 = 杂乱的卷轴
📜📜📜
⬇️ Function ⬇️
📦
整洁的包裹
🧬

C++ 函数解剖图

在 CodeCombat 的 C++ 中,我们这样定义函数:

  1. auto:自动推断类型(告诉电脑这是一个东西)。
  2. 函数名:给你的咒语起个名字。
  3. ():放参数的地方(目前是空的)。
  4. {}大括号包裹住魔法的具体步骤。

注意:函数必须写在 int main()上面

// 定义一个名为 attackEnemy 的函数 auto attackEnemy() { auto enemy = hero.findNearestEnemy(); if (enemy) { hero.attack(enemy); } }
🗣️

定义 (Define) vs 调用 (Call)

这是初学者最容易搞混的地方!

📝 定义 (Definition) = 写说明书
"这个魔法该怎么做?"
(电脑此时不会执行这些动作)
🪄 调用 (Call) = 下达命令
"现在,立刻做这个魔法!"
(电脑开始执行动作)
📘
定义
auto myFunc() {...}
调用
myFunc();
🚶

#31 乡村巡游者

任务: 在村庄里巡逻。因为要多次“找敌人并攻击”,所以我们把它写成一个函数。

// 1. 定义函数 (写在 main 外面) auto findAndAttackEnemy() { auto enemy = hero.findNearestEnemy(); if (enemy) { hero.attack(enemy); } } int main() { while(true) { hero.moveXY(35, 34); // 2. 调用函数 (重复使用!) findAndAttackEnemy(); hero.moveXY(60, 31); findAndAttackEnemy(); } return 0; }
👮
巡逻中...
🏘️

#32 村庄守卫

你可以定义多个函数来处理不同的情况。这里我们区分“普通攻击”和“强力劈斩”。

auto findAndCleaveEnemy() { auto enemy = hero.findNearestEnemy(); if (enemy) { if (hero.isReady("cleave")) { hero.cleave(enemy); } } } int main() { while (true) { hero.moveXY(35, 34); // 先试着大招,再普通攻击 findAndCleaveEnemy(); findAndAttackEnemy(); } return 0; }
⚔️ + 🌪️
多技能组合
🧠

#33 村庄守护神

函数内部可以包含复杂的逻辑!

在这个函数里,我们把 if/else 判断全放进去。主程序只需要“傻瓜式”调用 cleaveOrAttack() 即可。

auto cleaveOrAttack() { auto enemy = hero.findNearestEnemy(); if (enemy) { if (hero.isReady("cleave")) { hero.cleave(enemy); } else { hero.attack(enemy); } } }
📦
复杂逻辑已打包
💰

#34 造币厂 (The Mint)

这一关你需要自己从头写出 attackEnemy 函数。

提示: 模仿 pickUpCoin 的写法,但是把捡硬币的逻辑换成打敌人的逻辑。

auto pickUpCoin() { auto coin = hero.findNearestItem(); if(coin) { hero.moveXY(coin.pos.x, coin.pos.y); } } auto attackEnemy(){ // 在这里写代码:找到敌人 -> 攻击敌人 auto enemy = hero.findNearestEnemy(); if (enemy){ hero.attack(enemy); } }
🪙 🏃 👹
🎓

大法师结业口诀

"auto 定义在上方,
大括号内写逻辑,
主函数里来调用!"

"一次编写,到处使用 (DRY原则)"

🏆