第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ゴールドよりも多ければポーション取得を行い、そうでない場合は「冷やかしなら帰りな!」と表示するという分岐です。
もう一つ、体力の回復でもif文は使われています。例えばプレイヤーの最大体力が「150」としましょう。そして現在の体力が「100」、ポーションの回復量が「100」とします。
ここでポーションを使ったら体力が「200」になりますか?いいえ、最大体力より多くなることはありません。ここでif文が登場します
「現在の体力 + ポーションの回復量」が最大体力を上回っている場合は現在の体力を最大体力にして、そうでないならば現在の体力を「現在の体力 + ポーションの回復量」にします。
これ以外にもストーリーの分岐や名前を空白にしていないかの分岐など様々な分岐がゲームには存在しておりif文も同様に使われています。
if文の文法
GDScriptにおいてif文の文法は以下の通りです。( note の仕様上<処理>の手前に空白を置いていますがタブです)
if <条件式> :
<条件式が真の時の処理>
ここで新しく条件式という言葉が出てきました。条件式は真か偽かを出力する式です。(真は成立すること、偽は成立しないことを表します。)条件式が真の時に<条件式が真の時の処理>を実行します。
では実践をしてみましょう。
スクリプトをアタッチしたらいつも通り余分なコメントを削除します。
extends Node2D
func _ready():
pass
まずは純粋なif文を書いていきます。
extends Node2D
func _ready():
if 100 == 100 :
print( "if文の中の処理です" )
以下が実行結果です。
if文のなかにある<条件式が真の時の処理>が実行されました。なぜ実行されたのか条件式を見てみましょう。
条件式の中には「 100 == 100 」と書いてありますね。これは「100 と 100 は等しい」という意味を表します。当然正しいため「 100 == 100 」は真となります。(注意すべきは「 = 」は代入、「==」は等しいという意味です)
ではさらに次を実行してみましょう。
extends Node2D
func _ready():
if 100 == 0 :
print( "if文の中の処理です" )
以下が結果です。
何も出力されていません。これは「 100 == 1 」という条件式を見ればすぐにわかると思います。「100 は 1 と等しい」という意味で結果は等しくない、つまり偽を表します。
条件式で変数を用いても問題ありません。
実際にvalue変数を用いてソースコードを書いてみます。
extends Node2D
func _ready():
#変数宣言
var value = 100
if value == 100 :
print( "valueは100です。" )
以下が実行結果です。
「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ではありません。" )
実行結果は以下のようになります。
今回は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ではありません。" )
まとめると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」を代入した実行結果は以下の通りです。
もちろん、別の値に変更すれば結果もそれに伴って変わります。
今回は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)
実行結果
同じ条件式を使っているのに別々の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)
実行結果は同じです。
ブロックは途中でインデント(空白)を変えることはできません。実際に変えようとするとエラーが起きます。
次のように最初からインデントが2つある場合も1つに変えることはできません。(インデントを一気に2つ付けるのはソースコードが見づらくなるのでおすすめしません)
インデントを変えることができるタイミングは「 : 」が付いているかどうかです。いままでも「func _ready()」や「if文」にも文末に「 : 」が付いています。
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 以上です。" )
実行結果は以下のようになります。
このように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 以上です。" )
実行結果
if文はあらゆる場所で使われます。今後も多く出るので条件式を意識してどういう場合に真か偽かを意識しながらソースコードを書いていきましょう。
真偽の値
これまで何度か「真」と「偽」の文字を見てきました。実は真と偽は直接表すことができます。
真は「true」で偽は「false」です。ここでは「そういうものがある」と覚えていただければ幸いです。
以下はサンプルのソースコードと実行結果です。
extends Node2D
func _ready():
if true :
print(" true なので実行される。")
if false :
print(" false なので実行されない。")
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)
例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)
例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)
elif文も多くの場所で使われています。知っていて当然なのですが、初めてのGodotの最終目標「じゃんけんゲーム」では使う予定がないため、おまけとさせていただきました。本来は必要な知識です。
次
前
この記事が気に入ったらサポートをしてみませんか?