見出し画像

【完全保存版】擬似乱数を使った簡単なバトルプログラムを作ってみよう!

この記事は、こちらのSolana Playgroundのチュートリアルである、「Boss Battle」というプログラムを解説したものです。

1 プログラムを確認しよう

まずは、プログラムを確認してみましょう。

1 擬似乱数の生成について

今回のポイントは、こちらのXorshiftによって、擬似乱数を生成しているということです。

敵に与えるダメージに使っています。

https://ja.wikipedia.org/wiki/Xorshift

コードとしてはこの部分です。

こちらでは、元のXと、Xを左に13ビットシフトしたものとの排他的論理和を求めています。

排他的論理和とはこんなやつでしたね。

https://wa3.i-3-i.info/word11664.html

これを繰り返すことによって、擬似的な乱数を生成しています。

2 攻撃関数について

先ほどの疑似乱数の部分以外は、通常の関数です。

こちらの攻撃関数を見てみましょう。

まずは、「enemy_boss」というアカウントの「health」という値が0になっていないかを確認しています。

0の場合はエラーを返しています。

ちなみに、アカウントを見ると、PDAになっています。

私の記事をよく見ている方にとっては、おなじみかもですね。

次に、こちらで擬似乱数の引数に渡すために、Slotを取得しています。

Clockという構造体は、「anchor_lang::prelude」の中に入っています。

この中の「slot」を使用しています。

https://docs.rs/anchor-lang/latest/anchor_lang/prelude/struct.Clock.html

ちなみに、get関数「Sysvar」トレイトに入っており、それを「Clock」という構造体に実装しているのですね。

https://docs.rs/anchor-lang/latest/anchor_lang/prelude/struct.Clock.html

こちらが、先ほどのXorshiftを使っている部分ですね。

こちらで、最大ダメージで割った余りを出しています。

最後に、「saturating_sub」関数でランダムに求めた値を引いています。

この関数を使うことで、10-20のようなマイナスになった場合でも0を返してくれています。
(より正確には、範囲内の数字の最小値で返してくれています。)

3 復活関数について

関数の名前はちょっと適当ですが、要はボスのHPを回復させるためのものですね。

こちらは、ただ単に最大値を入れているだけです。

2 Typescriptでのプログラムの実行

では、次にTypescriptの部分を見てみましょう。

1 復活関数の実行

まずは、respawn関数で敵のHPを全回復しています。

2 ログの表示

次に、「confirmAndLogTransaction」関数でログを表示しています。

最新のブロックを取得した上で、「confirmTransaction」で確認を行なっています。

それが完了したあと、ログを表示しています。

3 攻撃関数の実行

次に攻撃関数を行っています。

やっていることは復活関数と同じですね。

4 アカウント情報の取得

アカウント情報の取得は「fetch」関数で行います。

これを元に、敵のHPを取得します。

実行するとこのようになりました。

いいなと思ったら応援しよう!

ユウキ
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊