第10章 サイコロを作ろう(乱数)
乱数という言葉を聞いたことがありますか?もしかしたらゲームの解説動画などで聞いたことがあるかもしれません。今回はそんな乱数を使ってサイコロを作っていきます。
1.乱数とは
2.「%」という演算子
3.サイコロを作る
乱数とは
乱数とはランダムに決まる数値のことです。CPUの行動、RPGのランダムイベント、ルーレットなど様々な使用用途があります。
GDScriptでは「randi()」を使用して整数の乱数を作ることができます。「randi()」は戻り値が乱数の関数です。(範囲は0〜4294967295です)
extends Node2D
func _ready():
#変数宣言
var random
# randi()で乱数を生成
random = randi()
print(random)
確かに見たことない数字が生成されました。ただし、もう一度実行するとどうでしょうか。
全く同じ数字が出力されてしまいました。これはゲームを実行するたび、シード値が元に戻ってしまうからです。(シード値とは乱数の元となる値です)
そのシード値を変更するためには「randomize()」を使用します。
extends Node2D
func _ready():
#変数宣言
var random
# randmize()でシード値を変更
randomize()
# randi()で乱数を生成
random = randi()
print(random)
1度目の実行結果
2度目の実行結果
「randomize()」を使用することで「randi()」の返す値が変化していることがわかると思います。
「%」という演算子
「randi()」の返す整数の範囲は 0 〜 4294967295 です。すさまじい範囲なのですがサイコロの目やルーレットの結果、CPUの行動の種類などが40億通りを超えることはないと思います。その時につかえるのが「%」という演算子です。
「%」は割った余りを計算する演算子です。なぜこれが乱数に使えるのかというと、例えば x を 10 で割った余りは 0 から 9 までしかないからです。( 10 以上であればまだ 10 で割ることができるため)
では「乱数を 10 で割った余り」も 0 から 9 までしかありません。
実際にソースコードに書くとこのようになります。
extends Node2D
func _ready():
#変数宣言
var random
# randmize()でシード値を変更
randomize()
# randi()で乱数(0 ~ 10)を生成
random = randi() % 10
print(random)
1度目の実行結果
2度目の実行結果
このように%で乱数の結果を 0 から 9 までという10通りにすることができました。
サイコロを作る
それでは今から乱数と「%」を用いてサイコロを作っていきます。
まずは「Dice」というプロジェクトを作成します。
プロジェクトを開いて2Dシーンを作成します。「Main.tscn」で保存します。ノード名もMainに変更します。
ボタンからシグナルを受け取るために「Main」ノードにスクリプトをアタッチします。
「Main」ノードの子に「Sprite」ノードを追加します。ノード名を「Dice」にします。
次の画像をプロジェクトにインポートします。(dice.png)
インポートができたら先ほどの「Dice」ノードに画像を設定します。
設定ができたらインスペクタから「Animation」という場所をクリックしてください。
「Hframe」を 6 にしてください。「Hframe」とは画像を縦に何分割するかを決めている値です。 2 であれば 2分割、 3 であれば 3分割です。
今回はサイコロなので縦に 6分割します。
「Main」シーンにサイコロを振るようの「Button」を追加します。
「Dice」「Button」をそれぞれ位置を調整しましょう。
「Button」ノードの「pressed」シグナルを、「Main」ノードのスクリプトに接続しましょう。
ここからはコードのみの説明です。まずは乱数を格納する変数を用意しましょう。 6 で割った余りを代入します。
extends Node2D
func _ready():
pass
func _on_Button_pressed():
#サイコロの値
var dice
#シード値を変更
randomize()
#乱数を生成する
dice = randi() % 6
そうしたら、今度は分割された画像を指定します。指定するためには「Sprite」の「frame」という値を変更します。分割された画像は以下のように番号付けされています。
「Sprite」の「frame」に関する公式ドキュメントです。
さっそく「Dice」のframeを変えていきましょう。
extends Node2D
func _ready():
pass
func _on_Button_pressed():
#サイコロの値
var dice
#シード値を変更
randomize()
#乱数を生成する
dice = randi() % 6
#フレームの番号を変える
get_node("Dice").frame = dice
それではシーンを実行してください。
右にあるボタンを押すとランダムにサイコロの目が決まります。
シーンを実行しなおしてもシード値を変えているため結果がかわります。
これでサイコロは完成です。短いプログラムでも簡単に1つのアプリを作ることができました。ここまで完成させた読者なら、もしかしたら一人で「丁半」というゲームを作ることができるかもしれませんね。「丁か半か!」というセリフとともにギャンブルをするゲームです。
今回は「Sprite」の「frame」というものがありました。前回もshow()、hide()などの機能を使っています。Godotにはすさまじい数の機能が備わっているため「こんな機能が欲しいから作る」という前に、Godotにその機能は備わっているかを確認していくほうが開発効率はグンッと上がります。。
次回はいよいよ最後のじゃんけんゲームを作っていきます。次は何も知識を入れることなく、最初からストレートで作っていきます。今までの知識を使えば簡単にできるため緊張することはありません。
次
前
この記事が気に入ったらサポートをしてみませんか?