プログラミング超初心者のための講座
 第10回 BASIC編「数当てゲームに挑戦 その4」(整理整頓)


さて第6回が始まりましたよ。 忘れ物はないですか?

これが前回作ったプログラムです。

10 CLS:C=0
20 A=VAL(RIGHT$(TIME$,1))+1
30 INPUT "数を入れてください(1-10)";B
35 C=C+1
40 IF B=A THEN PRINT "当たりです。":GOTO 70
50 IF B<>A THEN PRINT "はずれです。"
55 IF C>=5 THEN GOTO 65
60 GOTO 30
65 PRINT "GAME OVER"
70 INPUT "CONTINUE?(Y/N)";R$
80 IF R$ = "Y" THEN GOTO 10
90 IF R$ = "N" THEN END
100 GOTO 70

だんだん行数が増えてきて複雑でわかりにくくなってきましたね。
今回は整理整頓してみましょう。

鉄則はわかりやすく

だんだんプログラム長くなってくると、後から見たときに何をやっていたか忘れることも
よくある話です。自分で作っておいてわからないなんてこともよく聞きます。

そこで後から見たときにわかりやすくするのもテクニックの1つです。
そこでリマークという命令を覚えましょう。略してREMと書きます。

10 REM 表示します
20 PRINT "HELLO"
30 END

RUN
HELLO
OK

このプログラムでは10行がREMになっています。
これはプログラム的に見ると全く意味のないもので無視されます。
ところが人間が後から見ると非常にわかりやすいものなのです。
注釈のことなんですね。

ではREMを使ってこう直しました。

5 REM 初期化
10 CLS:C=0
20 A=VAL(RIGHT$(TIME$,1))+1
25 REM 入力
30 INPUT "数を入れてください(1-10)";B
35 C=C+1
39 REM 当たり判断
40 IF B=A THEN PRINT "当たりです。":GOTO 70
45 REM はずれ判断
50 IF B<>A THEN PRINT "はずれです。"
55 IF C>=5 THEN GOTO 65
60 GOTO 30
64 REM ゲームオーバー
65 PRINT "GAME OVER"
65 REM もう1回
70 INPUT "CONTINUE?(Y/N)";R$
80 IF R$ = "Y" THEN GOTO 10
90 IF R$ = "N" THEN END
100 GOTO 70

たしかに何をしているかはわかるようになりましたが、いまいちごちゃごちゃしてわかりにくいですよね。
そこで大がかりに作り直してみます。

行って帰ってこい

その前に1つ命令を覚えてください
GOTOは「〜にいけ」という命令でした。
GOSUBは「〜に行って帰ってこい」という命令です。

10 PRINT"HELLO"
20 GOSUB 50
30 PRINT"BASIC"
40 END
50 PRINT"WORLD"
60 RETURN

RUNするとこうなります。

HELLO
WORLD
BASIC
OK

40行はENDですから通常はそれ以降は実行されません。
GOTOなら行ったきりなので30行は実行されません。
GOSUBを使うと飛んできた元の場所へ帰っていきます。
GOSUBで飛んでRETURN文に当たると帰ってきます。

この命令を使うとプログラムがわかりやすくなります。

整列!

そういえば行番号がずいぶんめちゃくちゃになってきました。
そこで行番号を振り直す命令があります。
リナンバーです。略してRENUMと入力します。
たとえば

5 CLS
10 PRINT "HELLO"
13 PRINT "WORLD"
20 GOTO 55
28 END
55 PRINT"BASIC"
70 END

こんなめちゃくちゃなプログラムにリナンバーをかけると

RENUM
OK

LIST
10 CLS
20 PRINT "HELLO"
30 PRINT "WORLD"
40 GOTO 60
50 END
60 PRINT"BASIC"
70 END

となります。
賢いのはGOTOの先まで変えてくれているところです。

ブロック処理

ではごそっと!!作り替えてみました。

<変更前>
10 CLS:C=0
20 A=VAL(RIGHT$(TIME$,1))+1
30 INPUT "数を入れてください(1-10)";B
35 C=C+1
40 IF B=A THEN PRINT "当たりです。":GOTO 70
50 IF B<>A THEN PRINT "はずれです。"
55 IF C>=5 THEN GOTO 65
60 GOTO 30
65 PRINT "GAME OVER"
70 INPUT "CONTINUE?(Y/N)";R$
80 IF R$ = "Y" THEN GOTO 10
90 IF R$ = "N" THEN END
100 GOTO 70

<変更後>
10 REM ========== 初期化 ============================
20 CLS:C=0
30 A=VAL(RIGHT$(TIME$,1))+1
40 REM ========== 入力 ==============================
50 INPUT "数を入れてください(1-10)";B
60 C=C+1
70 REM ========== 判断 ==============================
70 IF B=A THEN GOTO 100
80 IF B<>A THEN GOSUB 130
90 GOTO 50
100 REM ========= 当たり処理 ========================
110 PRINT "当たりです!!"
120 GOTO 200
130 REM ========= はずれ処理 =======================
140 PRINT "はずれです。"
150 IF C>=5 THEN GOTO 170
160 RETURN
170 REM ========= ゲームオーバー =====================
180 PRINT "GAME OVER"
190 REM ========== もう1回 ==========================
200 INPUT "CONTINUE?(Y/N)";R$
210 IF R$ = "Y" THEN GOTO 10
220 IF R$ = "N" THEN END
230 GOTO 200

どうですか?長くなったでしょう?
しかしどちらがわかりやすいですか?
気がつきますか?すべてがブロックで考えることができるように直してあります。
メインとなる処理(以後メインルーチンと呼ぶ)と補助的な処理(以後サブルーチンと呼ぶ)に
分かれています。メインルーチンは40行から90行までです。なにもなければ
この間をグルグルとループします。あとのサブルーチンはみんなメインルーチンの下請けだと思ってください。
たとえばコンティニュー処理はコンティニューのことしか考えていません。
ほかからはコンティニューさせたければとにかくコンティニューのある行へとばせばいいわけです。
後のことは考えなくてもいいんです。
 

このへんの構造は他の言語にも考えが使えますからちゃんと理解しておいてください。

いかがですか?今までほぼまっすぐ進んでいたプログラムの流れが縦横無尽に飛びまくるようになります。

そのかわり、ブロックごとに考えられるので非常に理解しやすくなります。

まとめ

REMをつかって注釈文を入れる。
GOSUBは「行って帰ってこい」RETURNがあれば帰っていく
処理ごとにブロック化しておく。
 

では次回の講義をお楽しみに
さいなら

もどる



このページはNetscapeNavigator or Netscape Communicator 4.6で
きれいに見えるように作られています。そちらをお使いください。