【完全保存版】擬似乱数を使った簡単なバトルプログラムを作ってみよう!
この記事は、こちらのSolana Playgroundのチュートリアルである、「Boss Battle」というプログラムを解説したものです。
1 プログラムを確認しよう
まずは、プログラムを確認してみましょう。
1 擬似乱数の生成について
今回のポイントは、こちらのXorshiftによって、擬似乱数を生成しているということです。
敵に与えるダメージに使っています。
コードとしてはこの部分です。
こちらでは、元のXと、Xを左に13ビットシフトしたものとの排他的論理和を求めています。
排他的論理和とはこんなやつでしたね。
これを繰り返すことによって、擬似的な乱数を生成しています。
2 攻撃関数について
先ほどの疑似乱数の部分以外は、通常の関数です。
こちらの攻撃関数を見てみましょう。
まずは、「enemy_boss」というアカウントの「health」という値が0になっていないかを確認しています。
0の場合はエラーを返しています。
ちなみに、アカウントを見ると、PDAになっています。
私の記事をよく見ている方にとっては、おなじみかもですね。
次に、こちらで擬似乱数の引数に渡すために、Slotを取得しています。
Clockという構造体は、「anchor_lang::prelude」の中に入っています。
この中の「slot」を使用しています。
ちなみに、get関数は「Sysvar」トレイトに入っており、それを「Clock」という構造体に実装しているのですね。
こちらが、先ほどのXorshiftを使っている部分ですね。
こちらで、最大ダメージで割った余りを出しています。
最後に、「saturating_sub」関数でランダムに求めた値を引いています。
この関数を使うことで、10-20のようなマイナスになった場合でも0を返してくれています。
(より正確には、範囲内の数字の最小値で返してくれています。)
3 復活関数について
関数の名前はちょっと適当ですが、要はボスのHPを回復させるためのものですね。
こちらは、ただ単に最大値を入れているだけです。
2 Typescriptでのプログラムの実行
では、次にTypescriptの部分を見てみましょう。
1 復活関数の実行
まずは、respawn関数で敵のHPを全回復しています。
2 ログの表示
次に、「confirmAndLogTransaction」関数でログを表示しています。
最新のブロックを取得した上で、「confirmTransaction」で確認を行なっています。
それが完了したあと、ログを表示しています。
3 攻撃関数の実行
次に攻撃関数を行っています。
やっていることは復活関数と同じですね。
4 アカウント情報の取得
アカウント情報の取得は「fetch」関数で行います。
これを元に、敵のHPを取得します。
実行するとこのようになりました。