介绍#
没有完成入门任务的参考上一篇安装入门
Sparring Sorcerers は、Cairo のデータ構造とアルゴリズムのタスクである Think Cairo の最初の記事であり、所有権と配列操作を解決します。2 人の魔法使いで構成されるチーム同士の戦闘を行う必要があります。
sorcerer.cairo には、魔法使いを定義する sorcerer があり、魔法使いは attack、health、talent の属性を持ち、new と with_talent の 2 つのインスタンス生成メソッドがあります。また、attack と health を取得するためのメソッドもあります。health が 0 の場合は失敗の bool を返します。
sorcerer_duel.cairo と sorcerer_battle.cairo は、自分で実装する必要があります。
第 I 部:シンプルな決闘#
第 1 部では、sorcerer_duel.cairo の duel (ref sorcerer1: Sorcerer, ref sorcerer2: Sorcerer) という決闘関数を記述する必要があります。各ラウンドでは、sorcerer1 が先攻で、sorcerer2 が後攻です。どちらかのライフが終了した場合、戦闘を停止します。戻り値はありません。
機能を実装するために cairo のloop{}
を使用します。これは、他のプログラミング言語の while に似ています。この部分は非常に簡単で、ループ内で相手の攻撃力を減らすたびにライフが減少し、どちらかのライフが 0 になるとループが終了します。ただし、ライフは負の値にならないように注意する必要があります。
第 II 部:タレントメカニック#
第 2 部では、魔法使いに新しいタレントを追加する必要があります。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 を判断します。Guardian である場合、戦闘中にライフの変更をスキップし、Talentless に変更します。
最後に、Venomous であるかどうかを判断し、attack を + 1 します(damage ではありません)。ここでは、sorcerer.attack を直接変更する必要があります。
enum の比較方法に注意してください。
mut キーワード、その他の部分は一般的なプログラミング言語と同様です。
ループ内の条件判定文は「;」で終わる必要があるため、loop 内で condition を使用できないというエラーが発生する可能性があります。
第 III 部:チームバトル#
第 3 部では、チームバトルを行う必要があります。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 で取り出し、変更した後に再度追加する必要があります。
また、テストケースに基づいてコードを調整する必要があります。ローカルでパスした後でも、オンラインでより厳格なテストが行われるため、コードを改善する必要があります。
テストケースがパスしない場合は、デバッグを使用して原因を一つずつ調べることをお勧めします。
总结#
本当に難しい内容が始まりますので、忍耐力を持ち続けてください。行き詰まった場合は、他のドキュメントを参照してください。例えば、https://github.com/starkware-libs/cairo/tree/main/corelib/src や https://book.cairo-lang.org/ などです。最終的には、素晴らしい成果を得ることができるので、頑張ってください。