xChar

介绍

没有完成入门任务的参考上一篇安装入门

Sparring Sorcerers 是 Cairo 的 数据结构与算法任务 Think Cairo 的第一篇,主要解决所有权和数组操作。需要编写2个法师组成的队伍对战。

sorcerer.cairo中是定义法师,法师有attack,health,talent属性,有new和with_talent2个生成实例的方法,还有获取attack和health,如果health为0失败的bool。

sorcerer_duel.cairo 和 sorcerer_battle.cairo 需要我们自己补充实现。

Part I: Simple Duels

第一部分需要编写 sorcerer_duel.cairo 中的决斗函数 duel(ref sorcerer1: Sorcerer, ref sorcerer2: Sorcerer),每回合由sorcerer1先手,sorcerer2后手,有任何一方生命结束停止战斗,没有返回值。

使用cairo中的loop{}来实现功能,类似其他编程语言的while,这部分很容易,在循环中每次生命值减少对方的攻击力,有一方生命为0终止循环。注意生命值不能变为负值。

Part II: The Talent Mechanic

第二部分需要给法师添加Talent,一共有3种新天赋,Venomous是每轮攻击力+1,Swift是如果对手的攻击力小于4,只会有1点伤害,Guardian可以抵挡第一次伤害。

注意函数 fn duel(ref sorcerer1: Sorcerer, ref sorcerer2: Sorcerer) 中的参数ref,有了ref可以直接修改传入的参数,改变函数外的状态。参考 https://book.cairo-lang.org/ch04-02-references-and-snapshots.html?highlight=snapshot#mutable-references

我的做法是把attack赋值到一个 mut 变量,命名damage,后面生命值减去damage,let mut damage1 = sorcerer1.attack;
这儿读取attack值用sorcerer1.attack()也可以,因为Sorcerer里实现了fn attack(self: @Sorcerer) -> u8 { *self.attack },@是获取快照,*是快照转为新变量。但需要引入use src::sorcerer::SorcererImpl;

先判断Swift,例如sorcerer2如果是Swift且sorcerer1攻击力大于4,damage = 1。
判断Guardian,如果是的话,在战斗时跳过生命值修改,并改成Talentless即可。
最后判断是Venomous,把attack+=1(不是damage),这儿需要直接修改sorcerer.attack。

需要注意enum的对比方法,
mut关键字,其他部分和一般编程语言类似
loop中的条件判断语句需要“;”结尾,否则会出现loop中不能使用condition的错误

Part III: Team Battles

第三部分是团战,需要创建2个数组Array,分别派出第一个法师出战,如果生命变为0就换下一个法师,至于攻击的先手后手,你需要对照测试用例 test/battle_test_3.cairo 去看。

同样函数的team array用了ref: fn battle(ref team1: Array<Sorcerer>, ref team2: Array<Sorcerer>),后续的操作会直接改变array。

基础思路是:每次battle都派出队伍里第一个sorcerer进行duel,如果生命为0就换下一人,直到任一方队伍人数为0且战斗的法师生命为0结束。

但是直接修改array里的元素,就算用了ref,也不会生效,需要把元素用 pop_front 弹出来后进行修改后再加回去。

还有很多细节需要根据测试用例进行调整,本地通过后线上还有更严格的测试,还需要完善代码。

如果测试用例不能通过,建议用debug一步一步查询原因。

总结

真正有难度的内容开始了,希望能你保持耐心,如果卡住了,多看看其他文档,例如
https://github.com/starkware-libs/cairo/tree/main/corelib/srchttps://book.cairo-lang.org/ ,最终能做出结果,会获得巨大的收获,加油。

Loading comments...