パソコンを始めたのは約40年前の中学生のとき。部活でシンクレア社のZX-81というパソコンを触ったのが最初でした。このマシンでプログラムを入力できるメモリ容量(RAM)はなんと1KB。今自分が使っているパソコンが8GBですから約800万分の1。30行を超すとオーバーする制限はあったもののここでBASICの基本動作を覚えました。
その頃、良く作っていたのがスキーゲーム。当時、カセットレコーダーがなくプログラムを保存できなかったので、数行で動くこのゲームは毎回、部活が始まる都度入力して遊びました。
その後、NEC PC-6001、通称パピコンを手に入れて本格的に勉強。
PC-6001のN60-BASICではこんな感じのプログラムでしたね。
10 SCREEN 1:CONSOLE ,,0,0:CLS
20 C=0:X=15
30 C=C+10
40 S=STICK(0):X=X+(S=7 AND X>1)-(S=3 AND X<30)
50 LOCATE X,3:PRINT "V"
60 LOCATE INT(RND(1)*28)+1,15:PRINT "###"
70 IF SCREEN(X,3)=32 THEN 30
80 PRINT "GAME OVER - SCORE=";C
さすがにRND関数の引数やSTICK関数一部命令文は忘れていたのでこちらを参考にしました。
■解説
10行:初期画面設定。SCREENで画面モードを、CONSOLEでクリック音OFFとファンクションキー表示OFFを設定しています。CLSは画面クリアですね。懐かしい表現。
20行:変数初期設定。Cはスコア、Xは自分の水平位置
30行:ここからメインルーチン。スコアを10ずつ加算します。
40行:ここは自分の水平位置を動かす処理を行います。STICK関数は本来ジョイスティック(コントローラー)の倒した方向を知るため関数ですが、引数は0でキーボードのカーソルキーの押しているボタンを検知できます。この関数は左キーを押すと7が、右キーを押すと3が返ります。一般的にはここでIF構文を使って、STICK関数の値を見てXの値を加算、減算するが当時のBASICはIF構文の処理が遅かったので、論理式という小技を使っています。論理式というのは括弧の中の条件文を満たしていると"-1"、満たしていないと"0"として扱われます。STICK関数の値S=7(左方向)の場合は-1を、S=3(右方向)の場合は+1をXに加算するという場合、X=X+(S=7)-(S=3)と表現します。ここではさらにXの動かせる範囲を1から30に制限するために、ANDでXの値をチェックする条件を追加しています。この論理式にすると可読性が落ちるが性能が目に見えてアップするのでこの小技はよく使っていました。
50行:座標(X,3)に自分"V"を表示。
60行:水平位置は1からの28の間のランダムな値で画面一番下の行(=15)に障害物の"###"を表示。この表示の瞬間、1行自動改行して画面全体が上にスクロールします。このゲームの肝とも言える部分ですね。
70行:自分"V"(スクロールしたので座標は(X,2))の真下の座標(X,3)にある文字が空白(文字コード=32)でない場合、障害物には衝突していないと判定して20行にジャンプします。ジャンプの命令は"GOTO"ですが、IF構文の場合、省略できるのが懐かしいですね。また、指定座標にある文字コードを調べる関数は"SCREEN"ですが、画面モードを指定するSCREEN命令と同じスペルなのが今では考えられないですね。
80行:70行でNGの場合、ここに来て"GAME OVER"とスコアを表示して終了します。
プレイするとこんな感じです。
youtu.be
下方向に進んでいるのと、自分のキャラクターの残像が残っている感じがシュプールのようだということで、このゲームは「スキーゲーム」で定着しましたたね。
当時はこれをいろいろ改造しました。
・障害物の大きさを段々大きくするようにした。
・スリープの代わりにFOR NEXTの空処理を入れてスクロール速度がだんだん速くなるようにした。
・「O-----O」のような2つのポールの間を通ったときにスコアが加算されるようにした。
・ジャンプ機能を付けた。
・前後にも動けるようにした。
などなど
その他、障害物の位置で単純なランダムとした場合、どうやっても逃げ切れないケースが発生するので、必ずすり抜ける抜け道ができるようにチェックする処理も入れたりしました。
今考えると、このときの改善、工夫がプログラムスキルを大幅にアップさせ、将来の仕事に繋がったと言えそうですね。
また、当時、デパートなどで展示してあるパソコンは自由に触れて、BASICプログラムを入力して動かすことができたので、いろんな機種でこのプログラムを動かして処理速度やキー感度をチェックしたりしていました。
このころのBASICは「方言」があり、それはメーカーが違う場合は当然で、同じメーカーでもモデルごとに少しずつ記述ルールや使える命令文が違っていて、その方言に合わせ修正する必要がありました。当時はネットがなくその方言を調べるのは容易ではなかったですね。しかし、「ベーマガ」こと電波新聞社のBASICマガジンには各機種の一般読者からの投稿されたプログラムが掲載されていたので、そこから読み解いていました。あのころ、そんな雑誌が300円だった(徐々に値上げしたが)のは神でしたね。
中には上記に出てきたSCREEN関数と同じ機能がないケースもあり、衝突判定のために障害物の位置情報をサイクリックな配列変数に入れて対応したりしていました。
この遊びが後にBASICからC言語に、そして社会人になってからC++, Perl, JavaScriptと仕事で言語が変わっていっても楽しくやれる原動力?になったようで、ここ1カ月はPythonの仕事を楽しんでいます。
自分にとってはこのスキーゲームは"Hello World"みたいなもので、エンジニア人生の原点とも言えます。
ありがとうスキーゲーム。
参考サイト:
PC-6001 - 「N6x BASIC リファレンス-コマンド一覧」
PC-6001 - 「N6x BASIC リファレンス−付録8:エラーメッセージ一覧表」
Windowsで動くPC-6001エミュレータはこちら参照。
ぱぴこんのこころ - PC6001V
ぱぴこんのこころ - PC6001V - 導入方法
PC-6001互換CGROM Ver.1.1: 808 Midway