見出し画像

第10章 サイコロを作ろう(乱数)

 乱数という言葉を聞いたことがありますか?もしかしたらゲームの解説動画などで聞いたことがあるかもしれません。今回はそんな乱数を使ってサイコロを作っていきます。

1.乱数とは
2.「%」という演算子
3.サイコロを作る

乱数とは

 乱数とはランダムに決まる数値のことです。CPUの行動、RPGのランダムイベント、ルーレットなど様々な使用用途があります。

 GDScriptでは「randi()」を使用して整数の乱数を作ることができます。「randi()」は戻り値が乱数の関数です。(範囲は0〜4294967295です)

extends Node2D

func _ready():
	
	#変数宣言
	var random
	
	# randi()で乱数を生成
	random = randi()
	
	print(random)

画像1

 確かに見たことない数字が生成されました。ただし、もう一度実行するとどうでしょうか。

画像2

 全く同じ数字が出力されてしまいました。これはゲームを実行するたび、シード値が元に戻ってしまうからです。(シード値とは乱数の元となる値です)

 そのシード値を変更するためには「randomize()」を使用します。

extends Node2D

func _ready():
	
	#変数宣言
	var random
	
	# randmize()でシード値を変更
	randomize()
	
	# randi()で乱数を生成
	random = randi()
	
	print(random)

 1度目の実行結果

画像3

 2度目の実行結果

画像4

 「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度目の実行結果

画像5

 2度目の実行結果

画像6

 このように%で乱数の結果を 0 から 9 までという10通りにすることができました。


サイコロを作る

 それでは今から乱数と「%」を用いてサイコロを作っていきます。

 まずは「Dice」というプロジェクトを作成します。

画像7

 プロジェクトを開いて2Dシーンを作成します。「Main.tscn」で保存します。ノード名もMainに変更します。

画像8

 ボタンからシグナルを受け取るために「Main」ノードにスクリプトをアタッチします。

画像9

  「Main」ノードの子に「Sprite」ノードを追加します。ノード名を「Dice」にします。

画像10

 次の画像をプロジェクトにインポートします。(dice.png)

画像11

画像12

 インポートができたら先ほどの「Dice」ノードに画像を設定します。

画像13

 設定ができたらインスペクタから「Animation」という場所をクリックしてください。

画像14

 「Hframe」を 6 にしてください。「Hframe」とは画像を縦に何分割するかを決めている値です。 2 であれば 2分割、 3 であれば 3分割です。
 今回はサイコロなので縦に 6分割します。

画像15

 「Main」シーンにサイコロを振るようの「Button」を追加します。

画像16

 「Dice」「Button」をそれぞれ位置を調整しましょう。

画像17

 「Button」ノードの「pressed」シグナルを、「Main」ノードのスクリプトに接続しましょう。

画像18


 ここからはコードのみの説明です。まずは乱数を格納する変数を用意しましょう。 6 で割った余りを代入します。

extends Node2D

func _ready():
	pass


func _on_Button_pressed():
	
	#サイコロの値
	var dice

    #シード値を変更
    randomize()
	
    #乱数を生成する
	dice = randi() % 6
	

 そうしたら、今度は分割された画像を指定します。指定するためには「Sprite」の「frame」という値を変更します。分割された画像は以下のように番号付けされています。

画像19

 「Sprite」の「frame」に関する公式ドキュメントです。

 さっそく「Dice」のframeを変えていきましょう。

extends Node2D

func _ready():
	pass


func _on_Button_pressed():
	
	#サイコロの値
	var dice

	#シード値を変更
	randomize()
	
	#乱数を生成する
	dice = randi() % 6
	
	#フレームの番号を変える
	get_node("Dice").frame = dice

 それではシーンを実行してください。

画像20

 右にあるボタンを押すとランダムにサイコロの目が決まります。

画像21

 シーンを実行しなおしてもシード値を変えているため結果がかわります。

画像22

 これでサイコロは完成です。短いプログラムでも簡単に1つのアプリを作ることができました。ここまで完成させた読者なら、もしかしたら一人で「丁半」というゲームを作ることができるかもしれませんね。「丁か半か!」というセリフとともにギャンブルをするゲームです。

 今回は「Sprite」の「frame」というものがありました。前回もshow()、hide()などの機能を使っています。Godotにはすさまじい数の機能が備わっているため「こんな機能が欲しいから作る」という前に、Godotにその機能は備わっているかを確認していくほうが開発効率はグンッと上がります。。

 次回はいよいよ最後のじゃんけんゲームを作っていきます。次は何も知識を入れることなく、最初からストレートで作っていきます。今までの知識を使えば簡単にできるため緊張することはありません。



この記事が気に入ったらサポートをしてみませんか?