見出し画像

第7章 プログラミング(if編)

 お昼時に食事代3000円があったら何を食べますか?3000円もあったら筆者はおいしいステーキを食べますね。もちろんそれは財布の中に3000円があった場合です。もしそうでないなら簡単な定食で済ませます。

 ここでお金がどれくらい財布に入っているかの分かれ道ができました。この分かれ道を分岐と呼び、if文を使うとコンピューターで分岐を扱うことができます

1.if文の役割と使われている場所
2.if文の文法
3.if-else文の文法
4.比較演算子
5.ブロックでまとめる
6.if文の階層
7.真偽の値
ex.elif文の文法

if文の役割と使われている場所

 冒頭で申し上げた通り、if文の役割は分岐です。この分岐という言葉をどこかで聞いたことがある人もいるかもしれません。

 if文はゲームの中で言えばアイテムを買うときや、体力を回復するときに使います。
 例えば一個100ゴールドのポーションを買おうとします。ここで手持ちのゴールドが100ゴールドよりも多いか、そうでないかで分岐が発生します。100ゴールドよりも多ければポーション取得を行い、そうでない場合は「冷やかしなら帰りな!」と表示するという分岐です。

画像1

 もう一つ、体力の回復でもif文は使われています。例えばプレイヤーの最大体力が「150」としましょう。そして現在の体力が「100」、ポーションの回復量が「100」とします。

 ここでポーションを使ったら体力が「200」になりますか?いいえ、最大体力より多くなることはありません。ここでif文が登場します
 「現在の体力 + ポーションの回復量」が最大体力を上回っている場合は現在の体力を最大体力にして、そうでないならば現在の体力を「現在の体力 + ポーションの回復量」にします。

画像2

 これ以外にもストーリーの分岐や名前を空白にしていないかの分岐など様々な分岐がゲームには存在しておりif文も同様に使われています。

if文の文法

 GDScriptにおいてif文の文法は以下の通りです。( note の仕様上<処理>の手前に空白を置いていますがタブです)

if <条件式> :
   <条件式が真の時の処理>

 ここで新しく条件式という言葉が出てきました。条件式は真か偽かを出力する式です。(真は成立すること、偽は成立しないことを表します。)条件式が真の時に<条件式が真の時の処理>を実行します。

 では実践をしてみましょう。

 スクリプトをアタッチしたらいつも通り余分なコメントを削除します。

extends Node2D

func _ready():
	pass

 まずは純粋なif文を書いていきます。

extends Node2D

func _ready():
	if 100 == 100 :
		print( "if文の中の処理です" )

 以下が実行結果です。

画像3

 if文のなかにある<条件式が真の時の処理>が実行されました。なぜ実行されたのか条件式を見てみましょう。

 条件式の中には「 100 == 100 」と書いてありますね。これは「100 と 100 は等しい」という意味を表します。当然正しいため「 100 == 100 」はとなります。(注意すべきは「 = 」は代入、「==」は等しいという意味です)

 ではさらに次を実行してみましょう。

extends Node2D

func _ready():
	if 100 == 0 :
		print( "if文の中の処理です" )
	

 以下が結果です。

画像4

 何も出力されていません。これは「 100 == 1 」という条件式を見ればすぐにわかると思います。「100 は 1 と等しい」という意味で結果は等しくない、つまりを表します。

 条件式で変数を用いても問題ありません。

 実際にvalue変数を用いてソースコードを書いてみます。

extends Node2D

func _ready():
	
	#変数宣言
	var value = 100
	
	if value == 100 :
		print( "valueは100です。" )
	

 以下が実行結果です。

画像5

 「value == 100」は「valueは100と等しい」という意味になります。valueには100が入っているのでとなり print("valueは100です") という処理が実行されました。

if-else文の文法

 では条件式に当てはまらない、つまり偽の時に処理したい場合もあるはずです。その時に使えるのがif-else文です。

if-else文の文法は次のようになります。

if <条件式> :
   <条件式が真の時の処理>
else :
    <条件式が偽の時の処理>

 上半分はif文の文法と全く同じです。違うのは下半分のelseの部分です。elseは<条件式>がになったときに<条件式が偽の時の処理>を処理する役割があります。

 実際に書いてみると以下のようになります。valueに代入している値を10に変えていることに注意してください。

extends Node2D

func _ready():
	
	#変数宣言
	var value = 10 #---------10に変えてます!!!--------
	
	if value == 100 :
		print( "valueは100です。" )
	else:
		print( "valueは100ではありません。" )

 実行結果は以下のようになります。

画像6

 今回はvalueが「10」のため「value == 100」という条件式が偽となりelseの処理が行われました

 当然、valueに代入する値を「100」にするとelseの処理は実行されません。

extends Node2D

func _ready():
	
	#変数宣言
	var value = 100
	
	if value == 100 :
		print( "valueは100です。" )
	else:
		print( "valueは100ではありません。" )

画像7

 まとめるとifは真の時、elseは偽の時に行われるということです。


比較演算子

 前回(第6章)では四則演算子を紹介しましたが、演算子はほかにもたくさんあります。条件式で使われる演算子の一つに比較演算子があります。

 先ほどから登場していた「==」は比較演算子です。他の演算子を下に書きます。

a == b   : a は b と等しい
a != b    : a は b と等しくない
a < b     : a は b より小さい( a と b が等しければ偽 )
a > b     : a は b より大きい( a と b が等しければ偽 )
a <= b     : a は b 以下( a と b が等しくても真)
a >= b     : a は b 以上( a と b が等しくても真)

 ソースコードで実際に書いてみます。

extends Node2D

func _ready():
	
	#変数宣言(代入する値は自由に変えてもらって大丈夫です)
	var a = 100
	var b = 100
	
	# a == b
	if a == b :
		print("a は b と等しい")
	
	# a != b
	if a != b :
		print("a は b と等しくない")
	
	# a < b
	if a < b :
		print("a は b より小さい")
	
	# a > b
	if a > b :
		print("a は b より大きい")
	
	# a <= b
	if a <= b :
		print("a は b 以下")
	
	# a >= b
	if a >= b :
		print("a は b 以上")

 aに「100」、bに「100」を代入した実行結果は以下の通りです。

画像8

 もちろん、別の値に変更すれば結果もそれに伴って変わります。

 今回はaに「100」、bに「100」を代入したため「a == a」「a <= b」「a >= b」が真となりました。


ブロックでまとめる

 今までif文1つにつき1個の処理をしていきました。ですが複数の処理をしたいときに1つのif文で1個の処理を書いていたら大変なことになります。

extends Node2D

func _ready():
	
	#変数宣言
	var gold = 1000
	var potion_price = 100
	
	print( "現在の手持ちゴールド:" , gold)
	
	#ポーションを買うときのメッセージ
	if gold >= potion_price :
		print("まいどあり!")
	if gold >= potion_price :
		print("このポーションは良く効くよ!!")
	
	#ポーションを買ったためgoldが減る
	if gold >= potion_price :
		gold = gold - potion_price
	
	print( "現在の手持ちゴールド:" , gold)

 実行結果

画像9

 同じ条件式を使っているのに別々のif文で処理をしています。これは面倒なんて騒ぎではありません。まだ3つだけで済んでいますが、これがもっと多くなると見たくもなくなります。

 こんな時に使えるのはブロックです。ブロックは複数の処理をまとめることです。

 実際の構文は以下の通りです。(if文で解説しますが他の文法でも同じです)

if <条件式>:
   <ブロックの処理1>
   <ブロックの処理2>
   <ブロックの処理3>
   …

 ブロックを使うと上であったソースコードが綺麗にまとまります。

extends Node2D

func _ready():
	
	#変数宣言
	var gold = 1000
	var potion_price = 100
	
	print( "現在の手持ちゴールド:" , gold)
	
	#ポーションを買う
	if gold >= potion_price :
		
		# メッセージ
		print("まいどあり!")
		print("このポーションは良く効くよ!!")
		
		# ポーション代を引く
		gold = gold - potion_price
	
	print( "現在の手持ちゴールド:" , gold)

 実行結果は同じです。

画像10


 ブロックは途中でインデント(空白)を変えることはできません。実際に変えようとするとエラーが起きます。

画像11

 次のように最初からインデントが2つある場合も1つに変えることはできません。(インデントを一気に2つ付けるのはソースコードが見づらくなるのでおすすめしません)

画像12


 インデントを変えることができるタイミングは「 : 」が付いているかどうかです。いままでも「func _ready()」や「if文」にも文末に「 : 」が付いています。

画像13


if文の階層

 if文も文法でありながら1つの処理です。つまりブロックの中に書くことができます。

extends Node2D

func _ready():
	
	var a = 100
	var b = 100
	var c = 100
	
	if a >= 100 :
		print( "a は 100 以上です。" )
		if b >= 100 :
			print( "b は 100 以上です。" )
			if c >= 100 :
				print( "c は 100 以上です。" )
	

 実行結果は以下のようになります。

画像14

 このようにif文の中にif文を書くことができます。

 もちろん 「b >= 100」が偽の時は「print("b は 100 以上です。")」の処理と同様に「if c >= 100 :」以降も出力されません。

extends Node2D

func _ready():
	
	var a = 10
	var b = 100
	var c = 100
	
	if a >= 100 :
		print( "a は 100 以上です。" )
		if b >= 100 :
			print( "b は 100 以上です。" )
			if c >= 100 :
				print( "c は 100 以上です。" )
	

 実行結果

画像15

 if文はあらゆる場所で使われます。今後も多く出るので条件式を意識してどういう場合に真か偽かを意識しながらソースコードを書いていきましょう。


真偽の値

 これまで何度か「真」と「偽」の文字を見てきました。実は真と偽は直接表すことができます

 真は「true」で偽は「false」です。ここでは「そういうものがある」と覚えていただければ幸いです。

 以下はサンプルのソースコードと実行結果です。

extends Node2D

func _ready():
	
	if true :
		print(" true なので実行される。")
	
	if false :
		print(" false なので実行されない。")

画像19

ex. elif文の文法

 実はif文、if-else文のほかにもう一つ条件分岐の文法があります。それがelif文です。elif文はif文で偽の時にもう一度分岐をすることができる文です。

 elif文の文法は以下の通りです。

if <条件式1>:
   <条件式1が真の時の処理>
elif <条件式2>:
   <条件式2が真の時の処理>
else :
   <これまでの条件式が偽の時の処理>

 if文で条件式が偽のときに、もう一度elif文で分岐をします。

 以下がソースコードと実行結果です。

例1

extends Node2D

func _ready():
	
	var level = 100
	var min_level = 1	# 最小レベル
	var max_level = 100	# 最大レベル
	
	#レベルを表示する
	if level == max_level :
		print("levelは最大です。:" , level)
	elif level < min_level :
		print("levelが不正な値です。(0以下):" , level)
	elif level > max_level:
		print("levelが不正な値です。(100より大きい):" , level)
	else:
		print("現在のlevel:" , level)

画像16

例2

extends Node2D

func _ready():
	
	var level = 10
	var min_level = 1	# 最小レベル
	var max_level = 100	# 最大レベル
	
	#レベルを表示する
	if level == max_level :
		print("levelは最大です。:" , level)
	elif level < min_level :
		print("levelが不正な値です。(0以下):" , level)
	elif level > max_level:
		print("levelが不正な値です。(100より大きい):" , level)
	else:
		print("現在のlevel:" , level)

画像17

例3

extends Node2D

func _ready():
	
	var level = 500
	var min_level = 1	# 最小レベル
	var max_level = 100	# 最大レベル
	
	#レベルを表示する
	if level == max_level :
		print("levelは最大です。:" , level)
	elif level < min_level :
		print("levelが不正な値です。(0以下):" , level)
	elif level > max_level:
		print("levelが不正な値です。(100より大きい):" , level)
	else:
		print("現在のlevel:" , level)

画像18

 elif文も多くの場所で使われています。知っていて当然なのですが、初めてのGodotの最終目標「じゃんけんゲーム」では使う予定がないため、おまけとさせていただきました。本来は必要な知識です。


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