script (⏱,💰)

script (⏱,💰)

NG#1 - 配列と所有権

介绍#

入門タスクを完了していない場合は、前のインストールガイドを参照してください。

Sparring Sorcerers は、Cairo のデータ構造とアルゴリズムのタスクである Think Cairo の最初の記事であり、所有権と配列操作を解決します。2 人の魔法使いのチームを作成して戦闘を行う必要があります。

sorcerer.cairo では、魔法使いが定義されており、魔法使いには 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 が後攻です。どちらかの健康が 0 になると戦闘が停止し、戻り値はありません。

機能を実装するために、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 内の条件判断文は「;」で終わる必要があるため、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 を直接変更します。

基本的なアイデアは、各バトルでチーム内の最初の sorcerer を duel に送り出し、体力が 0 になるまで次々と交代することです。どちらかのチームのメンバーが 0 になり、かつ戦闘中の魔法使いの体力が 0 になるまで戦闘は続きます。

ただし、array 内の要素を直接変更しても、ref を使用していても効果はありません。要素を pop_front で取り出し、変更した後に再度追加する必要があります。

また、テストケースに基づいてコードを調整する必要があります。ローカルでテストに合格した後でも、オンラインでより厳格なテストが行われるため、コードを改善する必要があります。

テストケースに合格しない場合は、デバッグを使用して原因を一つずつ特定することをお勧めします。

総括#

本当に難しい内容が始まりますが、忍耐力を持ち続けてください。行き詰まった場合は、他のドキュメントを参照してください。例えば、https://github.com/starkware-libs/cairo/tree/main/corelib/src や https://book.cairo-lang.org/ などです。最終的には、素晴らしい成果を得ることができるので、頑張ってください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。