お題目
「マイコン」な時代
BASICってね
華麗なるゲームプログラムソース
私、PCに触れ始めて四半世紀あまり経ちますでしょうか。この25年(今では40年。。。)は、本当に日進月歩。目まぐるしく移り変わる技術進歩の中をかき分けるように過ごせた事は、本当に幸せに感じています。ただ、ここ5年~10年程は、Windowsの天下となって個人的には、これと言って技術的な進歩に感動する事は殆どなかったのですが、その更に前、各社のパソコン競争初期から、PC-XXと呼ばれる「パソコンと言えばNEC」というNEC天下となるまでの25~10年前の15年間は本当に感動の連続でしたね。そうそう、この頃は「パソコン」とか「PC」というより「マイコン」と呼ばれてた時代です。要するに、「マイ・コンピュータ」。自分のパソコンを持つ事自体がそれなりのステータスが有った頃ですね。
P6ファンの中では、伝説のまんがBASIC言語教本
「こんにちは、マイコン」
今読んでもその分かりやすさ、クオリティーは最高です。
ファミコンなんて。。
1980年代。私が小学校2年生の時です。ちょうど初代ファミコンが世の中にお目見えした年に、なぜかおやじが買ってきたPC-6001というパソコンを使い始めたのがPCに触れるきっかけです。当時は、ファミコンが買ってもらえず、その数倍も値の張るパソコンを買い与えたおやじのチョイスは、未だに謎です。しかも、その翌年には、その後継機であるPC-6001mkⅡを買ってきました。更に謎のチョイス(笑)
TOP画面にも使ったPC-6001Mk2の実機。
実家の屋根裏部屋から発掘してきました(笑)
この頃、ファミコンはスーパーマリオの登場で爆発的な人気を誇り、ファミコンは一家に1台あるのでは?と思えるくらいに普及してました。そんな中、ファミコンは何故か買ってもらう事はかないませんでした。ファミコンといえば、友達の家で親の白い目に負けずに友達がやるマリオが早く死ぬ(死なないと自分の番に回ってこないw)事を密かに願いつつ順番待ちをしたものですw ファミコンを買ってもらう事がなかった、この頃は、「ファミコンなんて。。」というハングリー精神旺盛な小僧でしたね。
小学生プログラマーができるまで1
ファミコンの無い我が家でのゲームと言えば、パソコンでプログラムを入力して「自分で作る」しか手段がありませんでした。とはいっても1から自作できる程、頭の良い小学生ではありません(笑)このころ、「マイコンBASICマガジン」というBASICというプログラム言語のソースが掲載された冊子がありました。この冊子に掲載されたプログラムソースを入力してゲームを楽しんでいたのです。まあ、我ながら小学生の時にプログラムを組んでゲームを楽しんでいたのは当時では本当に珍しかったと思います。というよりも、TVゲームが浸透した昨今、日曜日の昼間から入力したプログラムのデバッグをする小学生は今では皆無ですな。。(笑)
Basicマガジンで入力したのをいまだに鮮明に覚えてますw
小学生プログラマーができるまで2
そんな、「プログラム入力→デバッグ→ゲームを楽しむ」な日々を続けていくと、次第に変数や関数の持つ意味が、分かるようになってきます。殆ど覚えるとか理解するというより、体が覚えるに近い感覚ですがw んで、難しすぎるゲームは、どうやったら、無敵になるのか?とか、エンディングがあるゲームは、エンディングのプログラム部分をいきなり実行してみたりとかとか。。そんなことをしているうちに、ちょっとした文字列をキャラクターに見立てて、キーボードのカーソルで動かす程度の簡単なプログラムは自分でも組めるようになってましたwただ、根気の無い性分でしょうか?派手なタイトル画面を作っておしまい。エンディングだけ先に作って飽きた。なんて、まともに1本通して、自作できた物は無かったような気がしますw
プログラムだってエディターとかデバッガーなども当然ありません。
画面いっぱいにプログラムソースをひたすら記述するだけです(笑)
そういえば、「電車でGo!」が世の中にでまわる遥かか昔にPc-6001で、電車運転ゲームを電車好きだった弟の為につくったんです。結局、まっすぐの線路がパラパラマンガ風に動くだけで、とてもゲームにならなかった訳ですが。。特許だけでも申請しておけば。。。そんな夢も現実になりそうな時代だったんですね。
まともなゲームをつくったのは。。
それでも、中学生になる頃にはドラクエ風のRPGくらいは作れるようになりました。物語や、キャラクターデザインなどは、友達に頼んでスケッチを作ってもらい、かなり企画段階から気合が入ったものだったんですが。。。PC-8801MAで作成して、タイトル画面とマップと敵のデータが大きすぎて、お話が入る前に容量オーバーで断念。一応、MAP移動と戦闘はなんとなくできるRPGの物語なしなゲームでした。。OTZ
その後、高校は当時珍しかった情報処理科でした。が、バンドに走ってPCに熱中する機会は随分減りました。それでも、授業中にスロットゲームや競馬ゲームなどを作ってましたね。ただ、スロットゲームは実在のスロットに熱中してて、デザインがそのものだったので、先生にはかなり牽制の目をいただきましたが(笑)
大学、社会人となると、ゲームと言うよりは、実用と仕事のプログラムとして、ゲームを作る機会は無かったわけですが、立派な(?)プログラマーがこうやって世の中に排出された訳です(笑)
プログラムを作ってゲームを動かす事の感動(?)は、ぜひ他の未経験者の方にも味わってもらいたいですね。そんなことも、このHPで伝えられればな~と思ってます。
初期の頃のゲームはこんな感じのテキストをキャラクターに見立てたゲームでした。
スキーゲーム
プレイヤー「 i 」をスキーヤーに見立てて、ゲート # # をくぐるゲーム。
画面は、下から上へスクロールします。
BASICって言語は。。。
C、C++、COBOL、VB、BASIC・・これまで、数種類の言語でプログラムを組んできましたが、やっぱりBASICの楽しさは、他の言語の比になりませんね。手軽なコードで、グラフィックや音楽を制御でき、インタプリタで気軽に実行できますし、処理速度を除けば、ゲームを作るには絶好の入門言語です。(だから、BASICって言語なんでしょうけど(笑))
今でこそ、VBやVCなどのデバック機能テンコ盛りのデバッガをつかってテストなども楽々ですが、もちろん題材にしているPCー6001の時代にはそのような便利な物は一切なし。プログラムが止まった時点ではき出される、数少ないエラーメッセージとエラーの行を頼りに、プログラムソースとにらめっこをする為、解析能力・・・というよりも、プログラムソースを眺めてヤバそうな匂いのする箇所を自然と発見できる能力が身につくようになる。。。と今でも思ってます(笑)
BASIC花盛り
かつて、PC-6001やPC-6001mK2の時代。市販のゲームでさえALL BASICだったものもあるらしいです。小さなメモリを駆使していかに短く簡素で早いプログラムソースを書くかが、今とは比べ物にならないくらい重要だったんです。
また、当時はマイコンベージックマガジン(以後ベーマガ)を筆頭に冊子に掲載されたプログラムを入力してゲームを実行することが、あたりまえ(?)だったんです。そうなると掲載されるプログラムにも限界があります。300行もあれば、入力するのはかなりシンドイものがありました。
現存するベーマガの切り抜き、ソースは細かすぎて写真ではかすんでます(笑)
今でこそ、1行=1処理ということが、あたりまえですが、冊子に載せる為に、1行に複数の処理を連ねる為、とても見づらく、ソースも紙面ギッチリだったんです。もちろん、メモリももったいないし、当時はローマ時入力も漢字入力も無かったので、コメントなどはほぼ皆無でした。今では、考えられませんね(笑)
ちょっと思い出の品。。
今では、3次元処理やオンライン処理など、考えただけでも気が遠くなるような処理がテンコ盛り。私もいつからかゲームプログラマーとして挫折してましたが、小学生のころは本気でゲームプログラマーになりたいと思っていました。そんな訳で、色々とゲームを作ったり、授業中にフローチャートを良く書いていました。そんな紙の断片が引き出しの奥から出てきました。
恥ずかしいくらいに字が汚い(笑)
よく、飽きずに紙きれにアルゴリズムを書いては、ごちゃごちゃとしまい込んだもんです。むかし、エバンゲリオンに出てきたマギー内部の紙きれを見た時にちょっと、共感してしまいました(笑)
そんな、愛してやまない(?)BASICの初期。PC-6001時代ゲームってこうやって出来てるんだーってお話は、次のおはなしで。
おまけで、RPGを作った時のシナリオノート。シナリオは友達に頼んで作成してもらいました(笑)
さて、ここにわずか10行の文字があります。
=================================================
0 SCREEN3,2,2:COLOR1,2:FORI=1TO9:CLS:N=108:LINE-(255,130),3,BF
1 X=10:PRINTI"ホール スコア"J:PLAY"EG"
2 P=3:FORK=0TOI/2+1:L=RND(1)*176+25:LINE(L+X,N)-(L+20,130),4,BF
3 LINE(L,N)-STEP(30,0):LINE-(L+15,72):LINE-(L,N):PSET(X,130),2
4 M=0:PAINT(L+15,75),,1:NEXT:Y=130:LINE(250,131)-STEP(5,X),4,BF
5 Q=X:V=VAL(INKEY$):IFV=0THEN5
6 W=P:FORK=-VTOV:PSET(X,Y),P:Y=Y+K*2.1:X=X+V:P=POINT(X,Y)
8 IFX>255THENY=130:X=Q:K=V:P=W
9 PSET(X,Y),2:V=V+V*(P=1):PLAY"C64E64":NEXT:M=M+1:IFX<248GOTO5
10 J=J-4+M:NEXT:SCREEN1:PRINTJ
=================================================
これを見て、何が分かるでしょうか?
まあ、分かる人は、「BASICのプログラムソースだな。」って思うでしょうし、なんとなく「プログラム」って思う人も、また、唯一の日本語「ホール スコア」を見て、「ゴルフのなにか?」と思うかもしれません。このプログラムはこの10行で全てです。一部の関数でも無ければ、切りぬきでもありません。はてさて、このプログラム。わずか10行で一体なにが出来るのでしょうか。。実は、これ、ゴルフゲームのプログラムソースです。もちろん、私が組んだ訳ではなく、当時BASIC言語のゲームが掲載されていた、マイコンベーシックマガジン(以後ベーマガ)という冊子の1つのプログラムですがね。
何が華麗なのか?
まあ、プログラムの解説に入る前に、実際に動作させた画面は、こんな感じ。
ゲームは右端にあるカップに向かって左端から何打でカップINできるか?全てPar4の9ホールでが、次第に障害物となる木が増えます。ショットはキーボードの1~9で力を調整してうまくカップINしましょう。画面右端をボールが超えると、打ち直し(ペナルティー無し)。アンダーで周るのは至難の業!
やってみると意外と楽しい。いろいろなミニゲームが集まったゲームが最近の家庭用ゲーム機でも発売されていますが、下手なミニゲームよりよっぽど楽しい!ということで、もっと事細かく説明するとプログラムより長い説明になってしまうので、切り上げるますがね(笑)
んで、このプログラムのどこが、華麗なのか?美しいじゃありませんか(笑)
1.単純な命令を使いつつ処理が短い
2.ロジックが単純でわかりやすい
3.短いのに実行画面はグラフィカル
4.ゲームが楽しい
5.ゲームが終わった後の後処理も奇麗
たぶん、プログラムが分からない人やBASICが分からない人には、ピントこないと思いますが、まだ若干最適化する余地はあるのですが、プログラムの鏡です。ちょっと言いすぎたかな?(笑) 個人的には、PC6001の1行の入力制限がある中で、変数Nの使い方がグッときますw
と言う訳で、このプログラムの素晴らしさ(?)も解説もしちゃいます。でも、ただ単に解説ではつまらないので、「ゴルフゲームを作るぞ~!」って立場で、このプログラムを覗いて見ましょう!そういう意味でも、ものすごく分かり易くて良いプログラムですから♪
まずは、ゴルフって?
と言う訳で、早速プログラムを解説。。っとその前に本物のゴルフを想像してみましょう! あるゴルフ日和のことです。。
●ゴルフ場に到着
↓
○1ホール目
スタート地点に立つとホール全体が見えます。木がありますね♪
1打目を打ち打球の行く末を見守ります。
→ OBしたら2打目へ(実際はペナルティーですがw)
→ カップINしたら次のホールへ
↓
2打目を・・・
↓
○2ホール目
スタート地点に立つとホール全体が見えます。またも木がありますね♪
1打目を打ち打球の行く末を見守ります。
OBしたら2打目へ(実際はペナルティーですがw)
カップINしたら次のホールへ
;
●18ホール周ったらクラブハウスでスコアを見て一喜一憂。。
この一連の流をフローにすると。。
●ゴルフ場に到着
○Xホール目に移動
Y打目を打つ
→ OBだったら打ち直し
→カップINだったら、次のホール
次のショットへ
●18ホール周ったらホールアウト。
まあ、ゴルフってルールは実は単純♪打ってカップに入れるを18回繰り返す訳ですね。
では、プログラムではどうなのでしょう?もう一度、振り返ってさっきのプログラムを見てみます。
この10行のプログラムの概説は、
0行目訳:●ゴルフ場に到着♪
0 SCREEN3,2,2:COLOR1,2:FORI=1TO9:CLS:N=108:LINE-(255,130),3,BF
1~4行目訳:○Xホール目に移動、各ホールの描写と初期設定
1 X=10:PRINTI"ホール スコア"J:PLAY"EG"
2 P=3:FORK=0TOI/2+1:L=RND(1)*176+25:LINE(L+X,N)-(L+20,130),4,BF
3 LINE(L,N)-STEP(30,0):LINE-(L+15,72):LINE-(L,N):PSET(X,130),2
4 M=0:PAINT(L+15,75),,1:NEXT:Y=130:LINE(250,131)-STEP(5,X),4,BF
5~6行目訳:●Y打目を打つ
5 Q=X:V=VAL(INKEY$):IFV=0THEN5
6 W=P:FORK=-VTOV:PSET(X,Y),P:Y=Y+K*2.1:X=X+V:P=POINT(X,Y)
8行目:OBだったら打ち直し
8 IFX>255THENY=130:X=Q:K=V:P=W
9行目: →カップINだったら、次のホール 次のショットへ
9 PSET(X,Y),2:V=V+V*(P=1):PLAY"C64E64":NEXT:M=M+1:IFX<248GOTO5
10行目:●18ホール周ったらホールアウト。
10 J=J-4+M:NEXT:SCREEN1:PRINTJ
10行の中にももの濃ゆ~い(?)処理がギッチリです。でも、実際のゴルフで書いたフロートとっても似てます。処理のフローチャートを概要レベルで書くと実際のゴルフで書いたフロートと同じになります。
ちなみに、このソースをくっつけていかに少ない行で処理を書ききるか?というのも、BASICのテクニックとしてはGOODなんです♪
ちなみに、今回のプログラムの解析メモ。
ピントが合うと字が汚いのがばれてしまうので、あえてぼやけバージョンを(笑)
4.WindowsでBASIC使ってゴルフゲームを動かそう♪
エミュレートしてみよう♪
WindowsでもBasicは使えるんです。当然、色々やり方がありますが、手っ取り早いのはエミュレーターをダウンロードして使うのが一番楽チン♪
ただ、PC-6001のエミュレーターは、あるのですが、ROMイメージを入手しないといけないようですので、ちょっと、手間がかかります。そこで、誰でも利用できるN88Basicのエミュレーターを利用して、前の章で動かした「ゴルフゲーム」を動かしてみます。 早速下のリンクから
N88互換BASIC for Windows2.24 ダウンロードサイト(Vector)
ダウンロードして、インストールして、早速実行ですw
実行した画面
2枚のウィンドウが開くと思います。
(プログラム)と書いてあるウィンドウがプログラムを書くエディターで、裏の黒いウィンドウが実行画面です。早速エディターに次のプログラムを入力してみましょう!
10 PRINT "HELLO WORD"
入力できたら、実行ボタン(赤囲)のボタンを押してみます。
(実行画面)に「HELLO WORD」と表示されたら、正常に動いたことになります。
うーん。ちょっと、物足りない?
んじゃ、一度「ファイル」→「新規プログラム」を選択して、エディターを初期化したら、
以下のプログラムを入力してみます。
5 FOR I=0 TO 10
10 CLS
20 FOR N=1 TO 100
30 X=INT(RND(1)*640)
40 Y=INT(RND(1)*400)
50 C=INT(RND(1)*8)+1
60 PSET(X,Y),C
70 PSET(640-X,y),C
80 PSET(X,196-Y),C
90 PSET(640-X,196-Y),C
95 CIRCLE(X,Y),C*C,C
100 NEXT N
110 NEXT I
(実行画面)にランダムの点と円がちりばめられる画像が出たら正常終了です。
ま、こんな感じでグラフィックや文字を表示して、ゲームになってくわけですね。
さて移植ですw
さて、ココまでくれば、エディターは動かせるでしょうw 前のお話で、紹介したゴルフゲームのプログラムを入力しまします。ただ、P6BasicとこのエミュレーターのBasicでは、若干違うので、プログラムもすこーし違ってきます。また、スペックも違うので、変更点をw
①画面解像度が違うので、ホールを横に広くし、ミドルホールからロングホールに(Par6)
②ボールがドットだと見難いのでちょっと大きく
③ボールの加速度をナンチャッテで追加
④色の判定処理がちょっと違う
実行画面
などなど。。まあ、色々変数をいじってみると、面白いですよ。
で、こちらが、N88Basic移植版のプログラムソースです。
100 FOR I=1 TO 9 :REM ホール数(I)分9回ループ
110 REM--------ホール描写-----------
120 CLS :REM 画面のクリア
130 LINE(0,131)-(640,192),4,BF :REM 地面の描写
140 N=108 :REM 木の描写初期座標(高さ)
150 X=10:Y=130 :REM ボールの初期座標(X,Y)
160 PRINT I;"ホール スコア";J :REM ホールとスコア表示
170 P=0 :REM ボールの色初期化
180 FOR K=0 TO INT(I/1.2)+1 :REM ホールごとの木の描写数だけループ
190 L=RND(1)*580+25 :REM |木の出現位置のX座標をランダムでLに格納
200 LINE(L+X,N)-(L+20,130),6,BF :REM |木の幹を四画(BF)で描写
210 LINE(L,N)-(L+30,N),4 :REM |木の葉の底辺を線描写
220 LINE(L+30,N)-(L+15,72),4 :REM |木の葉の右辺を線描写
230 LINE(L+15,72)-(L,N),4 :REM |木の葉の左辺を線描写
240 PAINT(L+15,75),4,4 :REM |木の葉を塗りつぶす。(緑=4)
250 NEXT :REM ループ終了(木の描写)
260 M=0 :REM
270 LINE(X,129)-(X+1,130),7,BF :REM ボールの描写
280 LINE(634,131)-(640,141),0,BF :REM カップの描写
290 REM -------- キー入力-----------
300 Q=X :REM ボールの初期座標を保持
310 V=VAL(INKEY$) :REM キー入力結果(INKEY$)を数字に直してVに保管
320 IF V=0 THEN goto 300 :REM 入力結果が正しくない(1~9以外)は再度入力へ
330 REM -------- ボール描写 --------
340 W=P :REM ボールの色設定
350 FOR K=-V TO V :REM パワーの分ループ
360 FOR WA=0 TO 1000+K*40:NEXT :REM ボール移動(移動間隔を調整)
370 LINE(X,Y-1)-(X+1,Y),P,BF :REM ボールの描写(消す)
380 Y=Y+K*2.1 :REM 移動後のボールY軸の算出
390 X=X+V :REM 移動後のボールX軸の算出
400 P=POINT(X,Y) :REM 移動後のボールの行き先の色を取得
410 CO=HEX$(P) :REM 色をHEX(16進数)で換算
420 IF CO="0" THEN P=0 ELSE IF CO="FF00" then P=4 else P=6 :REM HEX→カラーコードに変換
430 IF X > 640 THEN Y=130:X=Q:K=V:P=W :REM OBの判定
440 LINE(X,Y-1)-(X+1,Y),7,BF :REM ボールの描写
450 IF P=0 THEN V=V+V(P=1) ELSE V=0 :REM ボールの次の移動先判定
460 NEXT :REM ループ終了(ボールのパワー)
470 M=M+1 :REM 打数追加
480 IF X < 633 GOTO 300 :REM カップイン判定
490 J=J-6+M :REM 総合得点換算(Par6)
500 NEXT :REM ホール数ループ
510 CLS :REM 画面クリア
520 PRINT "ホールアウト トータルスコア ";J :REM トータルスコア表示
移植後記
久々にBasicでプログラムを組みました(とはいっても移植ですがw)、ヤッパリ楽しいですねw
今回ちょっと、分かりづらいのが、ボールの移動先の色判定でしょうか(400~430)。元のプログラムと見比べてみると分かりますが、HEXで処理してるのでちょっと分かりづらくなってます。まあ、もう少し奇麗に書く書き方も有るような気がするのですが、ご勘弁をw
このプログラムをみると、ちょっとヒントになるかな?
色々な変数をいじってよりバランスよくしたり、バンカーやら、池やらコースの長さを変えたりなど、まだまだ工夫の余地はたくさんあるプログラムです。皆さんも興味があったら是非チャレンジしてみてください。
ちなみに、質問等は、答えられる範囲で、無期限、無責任、気が向いたらでよければ、お答えしますよ(笑)
これを期に是非プログラマーに片足突っ込んでみませんか?
ではではw