見出し画像

第11章 じゃんけんゲームを作ろう

 いよいよ最後の章です。今までの復習なので前置きなしで進めていきます。「もうバッチリ!」という人にはもしかしたら退屈に思うかもしれません。

1.プロジェクトの作成
2.シーンとノードを追加
3.スクリプトとシグナルの接続

プロジェクトの作成

 まずはプロジェクトの作成をしましょう。筆者は「じゃんけんゲーム」というプロジェクト名にしました。

画像1


シーンとノードの追加

 次はシーンとノードの作成です。

 2Dシーンを作成して「Main」という名前でシーンを保存しましょう。また「Main」をメインシーンに設定してもオッケーです。

画像2

  以下の画像を保存してください。

じゃんけん

 Spriteノードを追加して保存した画像を割り当ててください。ノードの名前は「Player」にしてください。

画像4

 さらに縦に3分割してください。さらにゲーム画面上で左側に配置してください。(紫色の枠がゲーム画面上です)

画像5

 同様のSpriteノードを右側に配置します。ノード名は「Cpu」にします。

画像6

 「Button」ノードを3つ追加していきます。「Gu」「Tyoki」「Pa」という名前にします。

画像7

 テキストも同様に変更します。

画像8

 「Label」ノードを追加してください。ノード名は「Result」です。

画像9

 「Player」ノード(画像)の少し上に「Result」ノードを配置してください。Textは「Result」です。

画像10

 「Main」ノード(ルートノード)にスクリプトをアタッチして、「Gu」「Tyoki」「Pa」の「pressed」シグナルを接続してください。

画像11

 残りはスクリプトの作業です。


スクリプトとシグナルの接続

 まずはじゃんけんの出す手を以下の変数で表現します。

gu  :グーの値を示す。(整数の 0 )
tyoki :チョキの値を示す。(整数の 1 )
pa  :パーの値を示す。(整数の 2 )

画像13

 上記の3つの変数はソースコード上で統一するので、ブロック外で変数宣言をします。

extends Node2D

# ----------------追加----------------
# じゃんけんの値
var gu    = 0
var tyoki = 1
var pa    = 2

func _ready():
	pass

func _on_Gu_pressed():
	pass

func _on_Tyoki_pressed():
	pass

func _on_Pa_pressed():
	pass

 ほかにも勝ち負けを変数で表現します。

win  :じゃんけんに勝った。(整数の 0 )
lose    :じゃんけんに負けた。(整数の 1 )
draw  :じゃんけんであいこになった。(整数の 2 )

 同様にソースコード上で統一するためにブロック外で変数宣言します。

extends Node2D

# じゃんけんの値
var gu    = 0
var tyoki = 1
var pa    = 2

# ----------------追加----------------
# 勝ち負けの値
var win   = 0
var lose  = 1
var draw  = 2

func _ready():
	pass

func _on_Gu_pressed():
	pass

func _on_Tyoki_pressed():
	pass

func _on_Pa_pressed():
	pass

 次に zyanken関数を用意します。引数は player_hand , cpu_handの2つです。戻り値は勝敗を表す値です。

zyanken( player_hand , cpu_hand )
 じゃんけんの勝ち負けを計算する関数
player_hand:プレイヤーが出した手
cpu_hand :CPUが出した手
戻り値   :勝敗を表す値
extends Node2D

# じゃんけんの値
var gu    = 0
var tyoki = 1
var pa    = 2

# 勝ち負けの値
var win   = 0
var lose  = 1
var draw  = 2

func _ready():
	pass


# ----------------追加----------------
# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	pass


func _on_Gu_pressed():
	pass

func _on_Tyoki_pressed():
	pass

func _on_Pa_pressed():
	pass

 まずは「あいこ」のパターンを作りましょう。

# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	
	# プレイヤーとcpuの出した手が同じ場合はあいこ
	if player_hand == cpu_hand :
		return draw

 次にプレイヤーが勝つパターンを if文で再現します。以下がプレイヤーが勝つパターンです。

パターン1:プレイヤーが「グー」で、CPUが「チョキ」
パターン2:プレイヤーが「チョキ」で、CPUが「パー」
パターン3:プレイヤーが「パー」で、CPUが「グー」

 まずパターン1を if文で再現します。

# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	
	# プレイヤーとcpuの出した手が同じ場合はあいこ
	if player_hand == cpu_hand :
		return draw
    
	# プレイヤーが「グー」で、CPUが「チョキ」
	if player_hand == gu:
		if cpu_hand == tyoki:
			return win

 同じようにパターン2、パターン3を実装します。

# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	
	# プレイヤーとcpuの出した手が同じ場合はあいこ
	if player_hand == cpu_hand :
		return draw
	
	# プレイヤーが「グー」で、CPUが「チョキ」
	if player_hand == gu:
		if cpu_hand == tyoki:
			return win
	
	# プレイヤーが「チョキ」で、CPUが「パー」
	if player_hand == tyoki:
		if cpu_hand == pa:
			return win
	
	# プレイヤーが「パー」で、CPUが「グー」
	if player_hand == pa:
		if cpu_hand == gu:
			return win

 「あいこ」「勝利」以外のパターンは負け以外にないため、最後は負けの値を戻り値にする。

# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	
	# プレイヤーとcpuの出した手が同じ場合はあいこ
	if player_hand == cpu_hand :
		return draw
	
	# プレイヤーが「グー」で、CPUが「チョキ」
	if player_hand == gu:
		if player_hand == tyoki:
			return win
	
	# プレイヤーが「チョキ」で、CPUが「パー」
	if player_hand == tyoki:
		if player_hand == pa:
			return win
	
	# プレイヤーが「パー」で、CPUが「グー」
	if player_hand == pa:
		if player_hand == gu:
			return win
	
	#残りは負けのパターン
	return lose

 これでじゃんけんを行う zyanken関数を作れました。次は画面を操作するための zyanken_draw関数を作成します。

 zyanken_draw関数の引数は player_hand , cpu_hand , result の3つです。

zyanken_draw( player_hand , cpu_hand , result )
 じゃんけんの結果を画面上に表示する関数
player_hand:プレイヤーが出した手
cpu_hand :CPUが出した手
result     :勝敗の結果を表す値
戻り値   :なし
extends Node2D

# じゃんけんの値
var gu    = 0
var tyoki = 1
var pa    = 2

# 勝ち負けの値
var win   = 0
var lose  = 1
var draw  = 2

func _ready():
	pass


# じゃんけんの勝ち負けを計算する関数
func zyanken( player_hand , cpu_hand ):
	--- 省略---



# ----------------追加----------------
# じゃんけんの結果を表す関数
func zyanken_draw( player_hand , cpu_hand , result ):
    pass

func _on_Gu_pressed():
	pass

func _on_Tyoki_pressed():
	pass

func _on_Pa_pressed():
	pass

 player_hand と cpu_handをそれぞれの「Player」「Cpu」の「frame」に代入します。画像は「グー」「チョキ」「パー」の順番に並んでいるため、それぞれの番号と一致します。

画像14

# じゃんけんの結果を表す関数
func zyanken_draw( player_hand , cpu_hand , result ):
	
	# それぞれのframeに代入
	get_node("Player").frame	= player_hand
	get_node("Cpu").frame		= cpu_hand

 次に「result」を用いて「Label」に「Win」「Lose」「Draw」の文字列を代入します。( " をしっかり入力してください )

# じゃんけんの結果を表す関数
func zyanken_draw( player_hand , cpu_hand , result ):
	
	# それぞれのframeに代入
	get_node("Player").frame	= player_hand
	get_node("Cpu").frame		= cpu_hand
	
	# それぞれの勝敗に合わせたテキストを設定する
	if result == win:
		get_node("Result").text = "Win"
	if result == lose:
		get_node("Result").text = "Lose"
	if result == draw:
		get_node("Result").text = "Draw"

 これで zyanken_draw関数は完了です。

 最後は ボタンを押したときの処理を書いていきます。

 「Gu」のボタンを押したときの処理を書きます。まずは player_hand , cpu_hand , result の3つの変数を用意します。

func _on_Gu_pressed():
	
	# プレイヤーの手、CPUの手を表す変数
	var player_hand
	var cpu_hand
	
	# じゃんけんの勝敗を表す変数
	var result

 シード値を変えてからplayer_hand に gu を、cpu_hand に0~2の乱数を代入します。

func _on_Gu_pressed():
	
	# プレイヤーの手、CPUの手を表す変数
	var player_hand
	var cpu_hand
	
	# じゃんけんの勝敗を表す変数
	var result
	
	# シード値の変更
	randomize()
	
	# じゃんけんの手を代入
	player_hand = gu
	cpu_hand = randi() % 3

 zyanken関数を使って勝敗を result に代入します。その後、zyanken_draw関数で画面をアップデートしていきます。

func _on_Gu_pressed():
	
	# プレイヤーの手、CPUの手を表す変数
	var player_hand
	var cpu_hand
	
	# じゃんけんの勝敗を表す変数
	var result
	
	# シード値の変更
	randomize()
	
	# じゃんけんの手を代入
	player_hand = gu
	cpu_hand = randi() % 3
	
	# じゃんけん勝敗をresultに代入
	result = zyanken( player_hand , cpu_hand )
	
	# 画面をアップデート
	zyanken_draw( player_hand , cpu_hand , result )

 残りの「tyoki」「pa」のボタンを押したときも同様の処理を行います。player_hand に代入する値が違うことに注意してください。

func _on_Tyoki_pressed():
	
	# プレイヤーの手、CPUの手を表す変数
	var player_hand
	var cpu_hand
	
	# じゃんけんの勝敗を表す変数
	var result
	
	# シード値の変更
	randomize()
	
	# じゃんけんの手を代入
	player_hand = tyoki
	cpu_hand = randi() % 3
	
	# じゃんけん勝敗をresultに代入
	result = zyanken( player_hand , cpu_hand )
	
	# 画面をアップデート
	zyanken_draw( player_hand , cpu_hand , result )

func _on_Pa_pressed():
	
	# プレイヤーの手、CPUの手を表す変数
	var player_hand
	var cpu_hand
	
	# じゃんけんの勝敗を表す変数
	var result
	
	# シード値の変更
	randomize()
	
	# じゃんけんの手を代入
	player_hand = pa
	cpu_hand = randi() % 3
	
	# じゃんけん勝敗をresultに代入
	result = zyanken( player_hand , cpu_hand )
	
	# 画面をアップデート
	zyanken_draw( player_hand , cpu_hand , result )


 これで完成です。実行をしてみましょう。

画像15

画像16

画像17

 これでじゃんけんゲームは完成です。

 ここまでプログラミングができたら、ミニゲームのようなものは作ることができると思います。

 Godotには他にも音をだしたり、タイマーを測ったりするノードもあります。自分ですべて1から作る前に公式ドキュメントを見て、使えそうならガンガン使っていきましょう!

 全11章、ここまで本当にお疲れさまでした!!

 まだまだ作り足りない場合は公式ドキュメントの「最初のゲーム」がオススメです。おそらく今の読者の実力であればクリアできると思います。



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