もし○○なら…
次のように入力して実行してみてください。
screen 0, 640, 480
HP = 200
;5回連続攻撃
repeat 5
mes "主人公は70のダメージ!"
HP = HP – 70
mes "現在のHPは" + HP + "です\n"
loop
<実行結果>
主人公は70のダメージ!
現在のHPは130です
主人公は70のダメージ!
現在のHPは60です
主人公は70のダメージ!
現在のHPは-10です
主人公は70のダメージ!
現在のHPは-80です
主人公は70のダメージ!
現在のHPは-150です
この主人公はよほどの強敵に遭遇してしまったらしく、 ボコボコにされてしまいます。
ダメージを受ける処理を5回ループさせている… というのはわかりますね?
「現在のHPは○○です」というメッセージの最後に「\n」と書いてあります。
これは「改行」を意味します。何も書かなくても改行になりますが、これを入れると一行空けることができます。
さて、主人公が弱いのは仕方ないとして、HPがマイナスになってしまうのはプログラム的にどうかと思います。
そこで、HPがマイナスにならないようにしてみたいと思います。
考え方としては、HPから70を引いたあとに、 もしHPが0より小さくなっていたら変数HPに0を代入します。
HSPでは、「もし○○だったら△△する」という処理は
if (○○){ △△ } |
という書き方をし、これを通称 if文(イフブン)と呼びます。
今回のプログラムはこのように書きます。
screen 0, 640, 480
HP = 200
;5回連続攻撃
repeat 5
mes "主人公は70のダメージ!"
HP = HP – 70
;HPをマイナスにしない
if(HP < 0){
HP = 0
}
mes "現在のHPは" + HP + "です\n"
loop
HP < 0というのはHPが0より小さい・・・
つまりマイナスだということですね。
ここに書いた条件が成り立てば、その下の{ }の中に書いた処理を実行します。
これで、HPが0より小さくなることは無いですね。
条件に影響するのはあくまで{ }内の処理であって、
それ以降のプログラムは何事もなかったように実行されます。
今回の例でいえば、HPがプラスだろうがマイナスだろうが
「現在のHPは○○です」という表示は行われます。
ちなみに、今回は「○より小さかったら」という条件でしたが、
条件の書き方は次のようになります。
書き方 | 意味 |
○ < □ | ○が□より小さい(未満) |
○ > □ | ○が□より大きい |
○ <= □ | ○が□以下(≦とおなじ) |
○ >= □ | ○が□以上(≧とおなじ) |
○ = □ | ○と□が同じ |
○ ! □ | ○と□が違う(≠とおなじ) |
もし ○○じゃなかったら…
さらに追加して、現在のHPを表示したあとに、
まだHPが1以上なら「まだ生きている」と表示し、
そうじゃなかったら(HPが0)「もう死んでいる」と表示するようにしてみましょう。
前半の仕様は問題ないですね。
:
:
;判定
if(HP < 0){
HP = 0
}
mes "現在のHPは" + HP + "です\n"
;生死の判定
if(HP >= 1){
mes "まだ生きている\n"
}
loop
これで良いでしょう。
「HP >= 1」 は 「HP > 0」と書いても同じです。
さて、問題はこの次です。
if文の条件が成り立たなかった場合の処理は次のように書きます。
:
:
mes "現在のHPは" + HP + "です\n"
;生死の判定
if(HP >= 1){
mes "まだ生きている\n"
}else{
mes "もう死んでいる\n"
}
loop
elseは「○○じゃなかったら」という意味です。
これで、仕様通りに動くはずです。
ちなみに、elseはif文のオプション機能なので、
ifを使わずにelseだけ使うことはできません。
【メモ】
上のプログラムは、elseを使わずに実装することもできます。
if(HP >= 1){
mes "まだ生きている"
}
if(HP = 0){
mes "もう死んでいる"
}
と書けばいいですね。
ただし、今回のように必ずどちらかの処理を行う場合は、条件を2つ書くより
elseを使った方がシンプルで、間違いがないと思います。
ループの強制終了
現状では、主人公が生きてようが死んでようが、必ず5回攻撃してきます。
さすがにもう死んでいるのに攻撃されるのは惨いので、
途中で死んでしまった場合はループを終了させるようにしましょう。
ループを終了させたいときはbreak命令を使います。
:
:
;生死の判定
if(HP >= 1){
mes "まだ生きている\n"
}else{
mes "もう死んでいる\n"
break
}
loop
breakは「ループを終了しなさい」という命令です。この命令もよく使うのでしっかり覚えておいてください。
たとえばゲームでは、タイトル画面で何かボタンを押すと次の画面に切り替わると思います。
これは、タイトルの絵を表示した後に永久ループさせ、ボタンが押されたらbreak という作り方をします。
今回のポイント
- 「もし○○だったら△△する」という処理は
if(○○){
△△
}
と書く。 - 「もし○○だったら△△する。そうじゃなかったら××する」という処理は
if(○○){
△△
}else{
××
}
と書く。 - ループを途中で終了させる場合はbreakと書く。