Capter 4 演算子
前のセクションで、足し算や掛け算の様な、いくつかの基本的な算術演算子を使いました。このチャプタではMoveが実装している演算子についてより詳しく見ていきましょう。
現在、Moveは次の算術演算子を実装しています。「足す:+
」「引く:-
」「掛ける:*
」「割る:/
」「剰余演算:%
」。以下はこれらを利用するサンプルです。
main() {
let a: u64;
a = 1 + 2;
a = 3 - 2;
a = 2 * 3;
a = 6 / 2;
a = 5 % 2;
return;
}
Moveはまた「大なり:>
」や「小なり:<
」「等しい:==
」「大なりイコール:>=
」「小なりイコール:<=
」「ノットイコール:!=
」といった比較演算子を実装しています。対応するサンプルを以下に示します。
main() {
let a: bool;
a = (1 == 1);
a = (1 == 2);
a = (1 != 2);
a = (1 != 1);;
a = (2 > 1);
a = (1 > 1);;
a = (1 >= 1);
a = (0 >= 1);
a = (1 < 2);
a = (2 < 1);
a = (1 <= 1);
a = (2 <= 1);
return;
}
それに加えて、いくつかのビット演算子やブール演算子もMoveに実装されています。それらは後のチャプタで詳細に見ていきます。
実習
私たちのゲームでは、城のシリアルナンバーは、現在のブロック高によってランダムに生成されます。
ランダムな数値を生成する最も基本的なアルゴリズムは剰余演算で実装されるものです。
次はC言語でシンプルな擬似乱数の生成を実装したサンプルです。
明らかに、この様なプログラムで生成される乱数のシーケンスはnext
の初期値に依存します。
static unsigned long next = 1;
int myrand(void) {
next = next * 1103515245 + 12345;
return ((unsigned)(next / 65536) % 32768);
}
上のプロシージャにちょっと手を入れてseed
をインプットすることでランダムな数を生成する次のプログラムをゲットできます。
int myrand(int seed) {
rand = seed * 1103515245 + 12345;
return ((unsigned)(rand / 65536) % 32768);
}
他の言語と同様の方法で、特定の範囲のランダム数を生成するために剰余演算を利用できます。詳細にはm
からn
の間の乱数を生成するには次の様にします。
myrand(seed) % (n - m + 1) + m;
- 上記の乱数生成プログラムを参考に。
Math
モジュールの中に、myrand()
という乱数を生成するプロシージャをつけ加えて、その機能を実装してください。 - 現在のブロック高をベースに、8桁のシリアルナンバー(107から 108-1の間の数)を生成します。publicプロシージャの
generateSerial()
をBuildCastle
モジュール内に付け加えて、その中からMath
モジュールのmyrand
プロシージャを呼んでください。- 現在のブロックの高さは、
Block
モジュールのget_current_height()
メソッドによって獲得できます。 Block
モジュールのアドレスは0x00
です。Math
モジュールとBlock
モジュールを正しい場所でインポートしてください。
- 現在のブロックの高さは、
main()
内でSerialNum
を定義して、generateSerial()
プロシージャで初期化してください。
Move Castle