第一关:友和敌
// 农民和差役聚集在森林里。 // 命令农民战斗,差役滚开! while (true) { var friend = hero.findNearestFriend(); if (friend) { hero.say("去战斗, " + friend.id + "!"); } // 寻找最近的敌人,然后让他们滚开。 var enemy = hero.findNearestEnemy(); if (enemy) { hero.say("滚开," + enemy.id + "!"); } }
第二关:似曾相识的味道
// 你可以把字符串连起来,或者把数字连接到字符串。 // 一起唱歌,使用字符串连接: // X potions of health on the wall! // X potions of health! // Take Y down, pass it around! // X-Y potions of health on the wall. var potionsOnTheWall = 10; var numToTakeDown = 1; while (true) { hero.say(potionsOnTheWall + " potions of health on the wall!"); // 唱出下一句: hero.say(potionsOnTheWall + "potions of health!"); // 唱出下一句: hero.say("Take" + numToTakeDown + "down,pass it around!"); potionsOnTheWall -= numToTakeDown; // 唱出最后一句: hero.say(potionsOnTheWall + "potions of health on the wall."); }
第三关:罪与罚
// 看起来食人魔酋长正在偷你的宝石啊! // 指挥两门火炮攻击敌人达成目标。 while (true) { var enemy = hero.findNearestEnemy(); if (enemy) { var enemyPos = enemy.pos.x + " " + enemy.pos.y; hero.say("敌人的位置在: " + enemyPos); } // 现在你遇到宝石攻击了 // 为什么不把宝石也拿走呢? // 找到宝石的位置并且 // 说出它作为火炮的目标。 var item = hero.findNearestItem(); if (item) { var itemPos = item.pos.x + "" + item.pos.y; hero.say("宝石的位置在:" + itemPos); } }
第四关:巫师之门
// 去'Laszlo'那里,并获得他的神秘数字。 hero.moveXY(30, 13); var las = hero.findNearestFriend().getSecret(); // 用'Laszlo'的数字加7,得到'Erzsebet'的数字。 // 去'Erzsebet'那里,并说出她的魔法数字。 var erz = las + 7; hero.moveXY(17, 26); hero.say(erz); // 将'Erzsebet'的数字除以4,得到'Simonyi'的数字。 // 去'Simonyi'那里,并告诉他他的数字。 var sim = erz / 4; hero.moveXY(30, 39); hero.say(sim); // 将'Simonyi'的数字乘以'Laszlo'的数字,得到'Agata'的数字。 // 去'Agata'那里,并告诉她她的数字。 var age = sim * las; hero.moveXY(43, 26); hero.say(age);
第五关:巫师出没
// 移动到'Zsofia'的身边,从她那里得到秘密数字。 hero.moveXY(18, 20); var zso = hero.findNearestFriend().getSecret(); // 将'Zsofia'的数字除以 4 来得到'Mihaly'的数字。 // 移动到'Mihaly'并说出他的魔法数字。 var mih = zso / 4; hero.moveXY(30, 15); hero.say(mih); // 把'Mihaly'的数字除以 5 来得到'Beata'的数字 // 移动到'Beata'并说出她的魔法数字。 var bea = mih / 5; hero.moveXY(42, 20); hero.say(bea); // 用'Mihaly'的数字减去'Beata'的数字,来得到 Sandor 的数字。 // 移动到'Sandor' 并说出他的魔法数字。 var san = mih - bea; hero.moveXY(38, 37); hero.say(san);
第六关:巫师天际层
// 移动到'Eszter'并从她那里得到神秘数字。 hero.moveXY(16, 32); var esz = hero.findNearestFriend().getSecret(); // 乘以3,减去2,得到'Tamas'的数字。 // 记住使用括号来确保计算顺序正确。 // 移到'Tamas'并说出他的魔法数字。 var tam = esz * 3 - 2; hero.moveXY(24, 28); hero.say(tam); // 然后继续 减去1然后乘4得到'Zsofi'的数字 // 移到'Zsofi'并说出她的魔法数字。 var zso = (tam - 1) * 4; hero.moveXY(32, 24); hero.say(zso); // 先将'Tamas'和'Zsofi'的数字相加,然后除以2得到'Istvan'的数字。 // 移到'Istvan'并说出他的魔法数字。 var its = (tam + zso) / 2; hero.moveXY(40, 20); hero.say(its); // 先将'Tamas'和'Zsofi'的数字相加,然后用'Zsofi'的数字减去'Istvan'的数字,再将两个结果相乘得到'Csilla'的数字。 // 移动到'Csilla'并说出她的魔法数字。 var csi = (tam + zso) * (zso - its); hero.moveXY(48, 16); hero.say(csi);
第七关:币屑
// 跟随硬币的轨迹来到红色 X 标记的出口。 while (true) { // 这能找到最近的物品。 var item = hero.findNearestItem(); if (item) { // 这将物品的pos,也就是坐标,存储在变量中。 var itemPosition = item.pos; // 将物品的 X 和 Y 坐标存入变量。 var itemX = itemPosition.x; var itemY = itemPosition.y; // 现在,使用moveXY移动到itemX和itemY: hero.moveXY(itemX, itemY); } }
第八关:白兔
// 跟随发光石通过陷阱。 while (true) { var item = hero.findNearestItem(); if (item) { // 使用 item.pos 将物品位置保存到一个新的变量中: var itemPosition = item.pos; // 使用 pos.x 和 pos.y 保存X和Y坐标: var itemX = itemPosition.X; var itemY = itemPosition.Y; // 使用 moveXY() 和 变量X、Y移动至坐标: if (item) { hero.moveXY(item.pos.x, item.pos.y); } } }
第九关:伪装者
// 食人魔伪装成了硬币或者宝石! while (true) { var enemy = hero.findNearestEnemy(); // 如果你看见了敌人,攻击它: if (enemy) { hero.attack(enemy); } var item = hero.findNearestItem(); // 如果你看见硬币或者宝石,移动到它的X和Y坐标: if (item) { hero.moveXY(item.pos.x, item.pos.y); } }
第十关:边地投弹
// pos属性是一个具有x和y属性的对象。 // pos.x是代表地图上水平位置的数字 // pos.y是代表地图上竖直位置的数字 while (true) { var enemy = hero.findNearestEnemy(); if (enemy) { var x = enemy.pos.x; // 得到敌人的y位置! var pos = enemy.pos; var y = pos.y; // ∆ 更改这个! // 说出x和y位置,用逗号隔开 hero.say(x + ',' + y); } else { hero.say("停止" + " " + "开火!"); } }
第十一关:叫阵
// 只有当 if 条件为真的时候,if 语句下面的命令才会执行。 // 在条件中,==表示"等于"。 if (2 + 2 == 4) { hero.say("嘿!"); } if (2 + 2 == 5) { hero.say("是的,你!"); } // 改变这里的条件,让英雄说 来打我啊! if (3 + 3 == 6) { // ∆ 让这个成立。 hero.say("来打我啊!"); } if (2 == 2) { // ∆ 让这个成立。 // 再添加一句嘲讽来引诱食人魔,来点有创意的! hero.say("你个废物!"); }
第十二关:濒危树瘤之战
// 只攻击"thrower"和"munchkin"两种类型的敌人。 // 别攻击"burl",遇到"ogre"快跑! while (true) { var enemy = hero.findNearestEnemy(); // 记住:别攻击"burl"类型! if (enemy.type == "burl") { hero.say("我不攻击树榴!"); } // "type"属性告诉你对象是什么类型。 if (enemy.type == "munchkin") { hero.attack(enemy); } // 使用"if"来来攻击"thrower"。 if (enemy.type == "thrower") { hero.attack(enemy); } // 如果是"ogre",使用moveXY逃跑去村口! if (enemy.type == "ogre") { hero.moveXY(40, 47); } }
第十三关:嘲弄
// 攻击矮人,呼叫斗士,忽略树精。 // 这个函数定义了英雄对敌人采取的行动。 function dealEnemy(enemy) { // 如果敌人的类型是"munchkin": if (enemy.type == "munchkin") { // 那么就攻击它: hero.attack(enemy); } // 如果敌人的类型是"brawler": if (enemy.type == "brawler") { // 那么就说些什么来呼叫斗士: hero.say("救我!"); } } while (true) { var enemy = hero.findNearestEnemy(); if (enemy) { dealEnemy(enemy); } else { hero.moveXY(30, 34); } }
第十四关:树精树林
// 不要攻击树精! // 函数可以返回一个值。 // 当函数被调用时,它将等于函数返回的值。 function shouldAttack(target) { // return false 如果没有`target` if (!target) { return false; } // return false 如果target.type == "burl" if (target.type == "burl") { return false; } // 否则 return true return true; } while (true) { var enemy = hero.findNearestEnemy(); // 在这里,我们使用shouldAttack()来决定是否应该进行攻击! // heroShouldAttack将被赋值为shouldAttack()返回的值! var heroShouldAttack = shouldAttack(enemy); if (heroShouldAttack) { hero.attack(enemy); } }
第十五关:盲距
// 告诉巫师,来袭食人魔的距离。 // 这个函数寻找最近的敌人,并返回距离。 function nearestEnemyDistance() { var enemy = hero.findNearestEnemy(); // 如果没有敌人,则该函数返回0。 var result = 0; if (enemy) { result = hero.distanceTo(enemy); } return result; } while (true) { // 调用nearestEnemyDistance()并 // 将结果保存在变量enemyDistance中。 var enemyDistance = nearestEnemyDistance(); // 如果enemyDistance大于0: if (enemyDistance > 0) { // 说出enemyDistance变量的值。 hero.say(enemyDistance); } }
第十六关:固定打击
// 你掉进陷阱里了!别动!你会受伤的!
// 这个函数检查敌人是否在攻击范围内。
function inAttackRange(enemy) {
var distance = hero.distanceTo(enemy);
// 几乎所有剑的攻击范围都是3。
if (distance <= 3) {
return true;
} else {
return false;
}
}
// 只有在触手可及的范围内才能攻击食人魔。
while (true) {
// 找到最近的敌人,并将其储存在一个变量中。
var enemy = hero.findNearestEnemy();
// 调用inAttackRange(enemy),将enemy作为参数
// 把结果保存于canAttack变量中
var canAttack = inAttackRange(enemy);
// 如果存储在canAttack中的结果是 true, 则发起攻击!
if (canAttack) {
hero.attack(enemy);
}
}
第十七关:金币猎手
// 为了让训练更有趣,Senick给你下了毒。
// 当你不移动时,毒是无害的。
// 该函数会检查硬币的距离是否小于20米。
function isCoinClose(coin) {
// 确定与`coin`之间的距离。
var distance = hero.distanceTo(coin);
// 如果距离小于20:
if (distance < 20) {
// 返回 true
return true;
} // 否则:
else {
// 返回 false
return false;
}
}
while (true) {
var item = hero.findNearestItem();
if (item) {
// 如果isCoinClose(item)返回true:
if (isCoinClose(item)) {
hero.moveXY(item.pos.x, item.pos.y);
}
}
}
第十八关:返回Agrippa
function enemyInRange(enemy) {
// 如果敌人的距离少于5米,则返回True值。
var distance = hero.distanceTo(enemy);
if (distance < 5) {
return true;
}
return false;
}
function cleaveOrAttack(enemy) {
if (hero.isReady("cleave")) {
hero.cleave(enemy);
} else {
hero.attack(enemy);
}
}
while (true) {
var enemy = hero.findNearestEnemy();
if (enemy) {
// 调用 enemyInRange 来检查敌人的距离。
if (enemyInRange(enemy)) {
cleaveOrAttack(enemy);
}
}
}
第十九关:金属探测器
// 大炮以硬币作为目标。 // 你就像是炮兵的测距仪。 // 编写函数。 function coinDistance() { // 找到最近的硬币, var coin = hero.findNearestItem(); // 如果有一枚硬币,返回到它的距离。 if (coin) { var distance = hero.distanceTo(coin); return distance; } // 否则,返回0(零)。 else { return 0; } } while (true) { var distance = coinDistance(); if (distance > 0) { // 说`distance`。 hero.say(distance); } }
第二十关:穿越
// 不要侮辱这个和平食人魔部落 while (true) { var item = hero.findNearestItem(); if (item) { // 如果item.type不等于 "gem" if (item.type != "gem") { // 然后跟随你的宠物。 hero.moveXY(pet.pos.x, pet.pos.y); } // 否则: else { // 移动到宝石的坐标。 hero.moveXY(item.pos.x, item.pos.y); } } }