【第13章】ゲームを作ろう
2021.10.31
 今まで堅苦しいプログラムばかり作ってきましたが、ちょっと楽しいプログラムを作ってみましょう。そう、ゲームのプログラムです。コンピュータゲームというと「ゲームばかりやってないで勉強しなさい」とお父さんお母さんに叱られたとかオンラインゲームで課金し過ぎてお金がなくなったとかあまりいい話を聞きませんがそれはゲームで遊ぶ側の話です。そのゲームのプログラムを作るということになると話は違ってきます。ゲームのプログラム1つ作る過程でプログラミングの高度なテクニックや様々なアルゴリズムを学ぶことができます。筆者はゲームを作りながらコンピュータの勉強をすることは否定しません。ということでこのカテゴリーでも実際にゲームのプログラムを作ってみたいと思います。とはいっても 残念ながらTiny BASIC for Windowsでテキスト画面のみでは、画面いっぱいに敵戦闘機が飛び回るとか、クエストクリアしたら美少女が微笑むようなゲームは無理ですが、ストリングと計算式のみでも知育ゲームやアドベンチャーゲームのようなものはできます(なんかこの筆者、美少女のたとえが多くね?・・・汗)。

[乱数]
  ゲームで必須なものは乱数です。乱数とは、規則性のない数の並びのことです。たとえば2、3、4、6なら12の約数を小さい順に並べたものとわかりますが、4、7。2、9だとまったく規則性がありません。ゲームでは敵がどこから襲ってくるかわからない、どこに何が隠れているかわからないなど、ランダムに何かが出てくるという場があります。これを実現かるのが乱数であり、Tiny BASICにはこの乱数を発生させる機能があります。それが次のRNDです。次のプログラムを実行してみてください。
  FOR I=0 TO 10
   R=RND
   PRINT R
  NEXT I
 実行結果はこのようになります。



図13_1.乱数を発生する

 RNDは0以上1未満の乱数を発生する関数(後述)です。ただしひとつ注意することがあります。上のプログラムを何回か実行してみてください。おわかりと思いますが乱数とはいってもコンピュータで発生させる場合ある計算式にしたがって発生させるので、同じプログラムを繰り返し実行すると、発生する数の順番はいつも同じになってしまいます。これではたとえばシューティングゲームに使うにしても、敵が出てくる場所と順番がいつも同じになってしまい、面白みが半減ですね。これを回避するには、次のようにRANDOMIZEという一文をRNDの前に入れます。これはコンピュータの内部時計を用いて、乱数発生の計算式の初期化を行なうものです。
  RANDOMIZE
  FOR I=0 TO 10
   R=RND
   PRINT R
  NEXT I
 これで数回実行してみましょう。今度は発生する数の順番はバラバラになったはずです。では、これで1から10までの整数をランダムに発生させる方法を考えてみましょう。RNDで発生する数は0以上1未満ですから
  RANDOMIZE
  R=RND*10+1
で 1 から 10 までの数がランダムで得られます。さらに
  RANDOMIZE
  R=INT(RND*10)
とすると、発生した数の小数点以下が切り捨てられ1から10までの整数がランダムで得られます。INTはInteger(整数の意味)の省略形でINT(数値)で( )内の数値の小数点以下を切り捨てて整数化する関数です。次のプログラムで試してみてください。結果は図13_2のようになります。
  RANDOMIZE
  FOR I=1 TO 10
   R=INT(RND*10+1)
   PRINT R
  NEXT I
  END

図13_2.1から10の整数をランダムに発生させる

[数当てゲームのプログラム] 
 それでは、これまでの知識を使って簡単なゲームを作ってみましょう。コンピュータが隠した 1 から 100 までの整数を当てるゲームです。次のプログラムを見てください。
  1:CLS
  2:RANDOMIZE
  3:PRINT "***** 数当てゲーム *****"
  4:PRINT "今からコンピュータが隠した数を当ててください"
  5:PRINT "数は 1 から 100 の整数のみです"
  6:REM 数を発生させる
  7:R=INT(RND*100)+1
  8:REM 数を当てる
  9:DATAOK=0
 10:WHILE DATAOK=0
 11: NUMOK=0
 12: WHILE NUMOK=0
 13:  INPUT " 1~100で数を当ててください",NUM
 14:  IF NUM=>1 AND NUM<=100 THEN
 15:    NUMOK=1
 16:  END IF
 17: WEND
 18:REM 正解判定
 19: IF NUM=R THEN
 20:  PRINT "正解です。おめでとうございます"
 22:  DATAOK=1
 23: ELSE
 24:  IF NUM 25:    PRINT "小さすぎます"
 26:  ELSE
 27:    PRINT "大きすぎます"
 28:  END IF
 29: END IF
 30:WEND
 31:END
[プログラムの説明]

 プログラムスタート部分の1行目のCLSはCLear Screenの省略形で実行画面をすべて消去する命令です。2行目は今、説明した乱数の初期化です。3~5行目はプログラムと遊び方の説明です。
 7行目がコンピュータが隠す数を発生させるところですが、ここでは1から100までの数を発生させることにします。
 9行目と10、30行目のWHILE~WENDにより、以下の処理は正解が出るまで繰り返し実行されるようになっています。11行目と12、17行目のWHILE~WENDにより、プレイヤーが回答した数が1~100以外の数以外のときは回答入力がやり直しになるようになっています。
 19、29行目のIF~END IFは正解不正解の判定です。正解ならこのプログラムを終了するように、不正解なら回答した数が大きすぎか小さすぎかを表示するようにしています。

[関数]
 今まで何回かこの言葉を使ってきましたが、命令との違いについて説明してきませんでした。ここまでのレベルのプログラムではこの違いがわからなくてもとくに支障はありませんでしたが、コンピュータのコンピュータらしいプログラムを作るには、知っておいた方がいいことなのでここで説明します。


図13_3.数学の関数


図13_3.は中学校でも習う一次関数のグラフです。数学でいう関数とは伴って変わる数という意味です。プログラミング言語における関数はこの意味もありますがどちらかというと「マジシャンの箱」のようなものと考えてください。


図13_4.プログラミング言語の関数


 マジシャンの箱はステッキで触れると中から鳩や万国旗が出てきますが(ネタ古っ)もちろんタネも仕掛けもあるわけです。プログラミング言語の関数とは、何か材料を入れると加工されて完成品が出てくる箱だと思ってください。この箱に入れる材料のことを引数(ひきすう)、箱から出てくる完成品を戻り値(もどりち)といいます。。Tiny Basic for Windowsの関数では引数が不要なものもあります。今まで出てきたサンプルプログラム中にもすでに登場している関数もあります。

[Tiny Basic for Windowsの便利な関数](一部)

SQR(正の数) 平方根を求める
INT(数)     数の小数点以下を切り捨てて整数化する
RND       0以上1未満の乱数を得る(*1)
PI 円周率 3.14159265358979324 を得る(*2)
SIN(数)     正弦を得る(*3)
COS(数)     余弦を得る(*3)
TAN(数)     正接を得る(*3)


図13_5.弧度法(ラジアン)

(*1)正式な書き方はRND(数)。普通に乱数を発生させる場合、数は正の数。省略した場合は正の数が指定されたものとみなす。
(*2)関数というよりプログラミング言語が提供する定数(予約変数)。
(*3)数は弧度法(ラジアン、図13_5)で与える。

  

サンプルプログラム

A=5
B=SQR(A)
C=INT(B)
PRINT B,C

R=10
S=PI*R^2
PRINT S
END

実行結果

2.2360679774997897  2
314.159265358979324
OK

 これらは戻り値が数値の関数なので数値関数とか数学関数とよばれます。プログラミング言語の関数には戻り値がストリングのものもあります。
DATE$ コンピュータが管理しているカレンダーの現在の日付を yyyy/mm/dd形式で得る
TIME$ コンピュータが管理している時計の現在時刻を hh:mm:ss形式で得る

サンプルプログラム

NOW$=DATE$+" "+ TIME$
PRINT NOW$
END

実行結果

2021/11/25 23:16:09
OK

 これらの関数はプログラミング言語が提供しているものなので「組込関数」とよばれることもあります。

【だれでもピアノ】第2回レパートリーを増やそう
2021.10.26


↑画像をクリックすると動画で見られます
ピアノ完全初心者対象のピアノへの誘いです。
楽譜は小学校3年生の音楽の授業で習う程度の知識でOK
右手はド・レ・ミ・ファ・ソを第1・2・3・4・5指で
左手は1本の指でソだけで、弾ける曲を増やしましょうというものです。

【だれでもピアノ】第1回なにか1曲弾いてみよう
2021.10.26


↑画像をクリックすると動画で見られます
ピアノ完全初心者対象のピアノへの誘いです。
楽譜は小学校3年生の音楽の授業で習う程度の知識でOK
右手はド・レ・ミ・ファ・ソを第1・2・3・4・5指で
左手は1本の指でソだけで、弾ける曲を弾いてみましょうというものです。

- CafeNote -