レトロな軟着陸ゲーム

 先日『ほこ×たて』というテレビ番組で、オセロプログラム同士の最強対決をやっていたのを見ました。二十代の頃の私は、ソフトウェア開発会社でコンピュータ・プログラムを作っていましたが、ゲームプログラムは実務では作ったことがありませんでした。仕事に関係のない、趣味の範疇(はんちゅう)でポケット・コンピュータ(ポケコン)をいじっていました。当時、工学社や(株)ソフトバンクの『ポケコン・ソフトウェア・ライブラリ』という本を買って、その本に掲載されているプログラム・リスト(ペーパーウェアとも呼ばれていました。)をポケコンの小さなキーボードで打ち込んでいました。そのペーパーウェアには、ゲーム分野のプログラムも少なくはありませんでした。私が、コンピュータゲームに凝りだしたのはその頃からです。ポケコンは乾電池で動いたので、こんな安上がりなゲーム機は、当時は他にありませんでした。任天堂からは当時LCDゲームが売られていましたが、まだファミコンはありませんでした。
 そのポケコンを買う以前に、私は東京上野の国立博物館の展示室で、IBM5550パーソナルコンピュータを見たことがありました。コンピュータの本体に、ブラウン管のディスプレイ装置と、漢字やかな入力もできる英文タイプライター風のキーボード装置と、熱転写プリンター装置が付いて、そのシステムのセット全部で当時の金銭価格は百万円を軽く越えていました。当時学生だった私には手の届かない高価な代物でした。そのパソコン・システムの展示は、入館者が見るだけではなく、キーボードに触ったり、パソコン上でゲームを選んで、それを遊ぶことができました。通常はジャンケンゲームと月面軟着陸ゲームができました。ただし、今から三十年以上前の話です。物珍しさに触ってばかりいる入館者が多くて、私がそれに触れる機会はいつもそう簡単にはまわってきませんでした。
 当時のコンピュータゲームのプログラムは、どれも現代のそれと比べものにならないほどシンプルでした。びっくりするほど簡素なものが多かったので、同じような名前のゲームでも、今の人が見たら全く別物に思われることでしょう。当時のジャンケンゲームなどは、「番号を入力してください。(1−グー 2−チョキ 3−パー)?_ 」と黒地に白文字でディスプレイ装置にコンピュータからのメッセージが示されます。それに従って、1か2か3のキーを押します。すると例えば、「ジャンケンポン! コンピュータはグーを出しました。あなたはチョキです。コンピュータの勝ちです。あなたの負けです。」などと、ディスプレイ画面に文字だけで表示されました。プログラムの仕組みがいくらかインチキっぽいのですが、私などは、コンピュータに勝てなくて、すなわち、機械に人間が勝てなくて、本当に悔しい思いをしました。
 もちろん、こうしたジャンケンゲームでは、コンピュータ側があらかじめサイコロを振って(つまり、1から3までの数字の乱数で)正直に決めておくことができます。しかし、勝ち負け引き分けの確率は均一になってしまいます。コンピュータが人間より強いと思わせたい時は、コンピュータが勝つ確率だけを上げなければなりません。そこで、その一つの方法として、コンピュータが後出しジャンケンをできるようにするのです。人間の側が数字で選んだ、その手に負けない手(勝つか引き分けの手)を、コンピュータの手だとしてしまうのです。コンピュータの側が、ゲームの裏側でそのような操作をするように、あらかじめプログラムで指示しておきます。卑怯かもしれませんが、トランプのソリティアや麻雀ゲームなどでは、そうしたゲームの裏側でのコンピュータ側の操作が、人間の側に感づかれずに行われていることもあるようです。
 一方、月面軟着陸ゲームについては、現代の携帯電話ゲームのようなカラフルで、グラフィカルな絵がありませんでした。「高度:50 速度:−20 燃料:200  噴射する燃料は?_ 」というコンピュータからのメッセージの一行で、月着陸船の状況が、言葉のみでディスプレイ装置に示されます。噴射する燃料を数字で入力すると、高度と速度と燃料の数値が変化します。その変化した値が、さらに一行分の同じフォーマットのメッセージで画面に追加されてゆきます。月着陸船の高度が月面に十分に近くなって、適度な噴射燃料の消費により着地速度も十分に減速されていれば、月面の軟着陸は成功します。しかし、大抵は、着陸船の降下中に燃料がなくなったり、着地時の落下速度が速すぎたりして、月面に激突してしまいます。軟着陸に失敗してしまうと、そこでゲームオーバーとなります。ディスプレイ装置の画面上に表された高度と速度と燃料の数値だけを頼りにして、その時その時の、噴射に必要な消費燃料の量を判断して、それを数値でキーボード入力していきます。グラフィカルなイメージや絵が全く無いために、そこは人間の頭の想像力で補ってあげる必要がありました。
 現代のヴァーチャルな、かつグラフィックスをふんだんに使ったコンピュータゲームからすると、何て原始的なのだろう、と思われるかもしれません。コンピュータ自体も、当時は簡素だった、と言うか、今から比べると高価なわりには遥(はる)かに機能の低い機械でした。私がIBM5550で見た月面軟着陸ゲームは、上述のポケコン版のペーパーウェアにもありました。もともとそれはポケコンのBASIC言語で書かれていたので、私はハンドヘルド・コンピュータ用に書き直して、PC−8201で動くように移植しました。それをさらに、HTMLアプリケーションとしてウィンドウズ上で動くように、プログラムを作りかえてみました。参考のために、そのソースプログラムであるVBスクリプトの中身(プログラム・リスト)を以下に示しておきます。
 なお、このプログラムのコピーと改変は自由ですが、このプログラムを動作させて生じたいかなる損失にも私の側は責任を持たないことをあらかじめ断っておきます。いちおうの免責事項です。このプログラムはウィンドウズXP上では動作することが確認されていますが、プログラムのコピーと改変と動作に関しては自己責任でお願いします。

<HTML>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=shift-JIS">
<HEAD>
<TITLE>軟着陸ゲーム Classic</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.meter   {font-size:14pt; text-align:center;}
  INPUT.kinbox {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt; ime-mode:inactive;}
  INPUT.btnbox {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>
</HEAD>

<SCRIPT LANGUAGE = "VBScript">
'//--------------------------------------------------------------
'//
'//                                           by Kuroda Kunio
'//
'//   『軟着陸ゲーム Classic』
'//
'//--------------------------------------------------------------
Option Explicit

  Const Grav = 5 '重力 m/(s*s)
  Dim Hei, Vec, Fue

Call ResizeTo(260, 260)

Sub Window_onLoad()
  Hei = 500 '高度の初期値
  Vec = -50 '速度の初期値
  Fue = 120 '燃料の初期値
  Call MeterDisplay()
  Call Message("降下開始!", "black") '状況の初期設定
End Sub


Sub Use_OnClick()
  Dim CsmFue

  If Param(3).style.color <> "black" Then
     Param(3).style.color = "black"
     Call Window_onLoad()
     Exit Sub
  End If

  CsmFue = CInt(keyin.value)

  If CsmFue > Fue Or CsmFue < 0 Then '消費燃料の入力補正
     Call Message("消費燃料の誤り!", "black")
     Exit Sub
  End If

  '燃料・高度・速度の更新
  Fue = Fue - CsmFue
  Hei = Hei + Vec + (CsmFue - Grav) \ 2
  Vec = Vec + (CsmFue - Grav)
  Call MeterDisplay()

  If Hei <= 0 Then
     If Abs(Hei) < 5 And Abs(Vec) < 5 Then
        Call Message("着陸成功!!", "blue")
     Else
        Call Message("着陸失敗。さようなら。", "red")
     End If
  Else
     Call Message("降下中", "black")
  End If
End Sub


Sub MeterDisplay()
  param(0).InnerText = Hei
  param(1).InnerText = Vec
  param(2).InnerText = Fue
End Sub


Sub Message(mes, col)
  param(3).InnerText = mes
  param(3).style.color = col
End Sub

</SCRIPT>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="kinbox" type="text" name="keyin" size=5 value=5> 
<INPUT CLASS="btnbox" type="button" name="Use" value="押す"><BR>
<BR>
<DIV CLASS=meter id=param></DIV>

</BODY>
</HTML>

 以上のプログラムは、テキスト・データなので、『メモ帳』で開いた空のウィンドウにコピー&ペイストできます。さらに、メニューの「ファイル」の「名前を付けて保存」を選んで、ファイル保存のためのダイアログを開きます。適当なファイル名にHTMLアプリケーションの拡張子.HTAを.TXTの代わりに付けてファイル保存します。すると、そのファイルは、HTMLアプリケーションのプログラムとして実行することができます。私のこのお粗末な説明でわかる人は、やってみるといいと思います。
 このプログラムの操作の手順は簡単です。プログラムを実行すると、画面上に一つのウィンドウが開きます。そのウィンドウ上で、消費燃料の右の四角い枠に、その燃料の噴射したい量を数字で入れて、その右の「押す」ボタンをマウスでクリックします。すると、着陸船の高度と速度と燃料の数値が変化します。うまく軟着陸できれば、そのウィンドウ内の下のほうにメッセージが示されます。軟着陸に失敗した場合も、それなりのメッセージが同様に示されます。
 「高度」は、降下中の着陸船の、地面からの高さを表します。「速度」は、着陸船の降下速度を示します。マイナスは下方へ、プラスは上方へのその時の着陸船の移動速度を表し、0(ゼロ)は空中での停止状態を表します。「燃料」は、その時に着陸船の燃料タンクに入っている燃料の量を表します。「消費燃料」は、軟着陸の目的で減速するのに使われる、着陸船の燃料の噴射量を指定してください。噴射量は0(ゼロ)以上の数値です。着陸船に残っている燃料の値を超えると、数値の設定のやり直しになります。また、着陸船降下中の燃料噴射量が0(ゼロ)の場合は、当然のことながら、着陸船に重力(G)がはたらいて地面に引っ張られます。降下する速度が増しますので、注意してください。
 上に示したVBスクリプトのプログラムが読める人は、それを読んでみてください。それほど難解なプログラムではないことがわかると思います。どうしたら軟着陸が成功するのかも、運が良ければわかるかもしれません。どうしたら軟着陸に成功するかは、ここでは、あえて記述しないことにします。簡単に正解がわかると、この手のゲームは面白味が半減してしまうからです。
 先に述べたジャンケンゲームもそうなのですが、コンピュータが何らかのメッセージや数値(もしくは数字)を示して、人間がその具体的状況を想像しながら、コンピュータからのメッセージに答えていくという形式のゲームなのだと思います。そのようなコンピュータとのやりとりが、レトロっぽく私には思われました。見た目が味気ないかもしれませんが、一度はまってしまうと、すぐには止められなくなると思います。