月面着陸ゲーム（プログラム関数電卓 CASIO fx-5800P BASIC用）

## 月面着陸ゲーム（CASIO fx-5800P用BASICソースコード）

ふと[**e-Gadget ブログ**](https://egadget.blog.fc2.com) （管理人：Krtyskiさん）を見つけ、昔持ってたポケットコンピュータが懐かしくなり夢中で記事を読みあさりました。気づけば手元にプログラム関数電卓fx-5800Pがｗ　7千円ちょい。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27292/d93082da-6c55-8cd0-2bbc-65abcee473db.jpeg width=50%>


ポケコン全盛期は月面着陸ゲームでよく遊んでましたので、ソースを探したのですがCASIO BASIC版は見つかりませんでした。そこで、[**北ソフト工房**](https://kitako.tokyo/lib/CTask.aspx?id=106)さん掲載のC言語ソースを参考にしてCASIO BASICへ移植してみました。

### 1. 月面着陸ゲーム　プレイ画面
①ゲーム起動画面。搭載燃料250。一度に50まで投入できます。燃料1で落下速度が0.1減速。適当にキーを押せばスタートです。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27292/aad51b80-9905-5647-fbdf-9515acde1687.jpeg width=50%>

②プレイ画面。1行目が着陸ゲージです。「E」が着陸船で、左端の「）」が月面です。途中の「）」は大気圏のつもりでしたがよく考えたら月に大気はありません。まあ目安になるかと思って残してあります。ALT（高度）とVEL（落下速度）およびF（燃料）がインジケーターです。ここでは燃料を25投入しています。EXEキーを押せば進みます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27292/0f2ceec8-a20d-865d-2df0-d314ee604efe.jpeg width=50%>

③月面に墜落してゲームオーバーしました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27292/c48b77c8-4cec-90d1-d25f-8260a833cbd6.jpeg width=50%>



### 2. 月面着陸ゲームソースコード　※fx-5800P BASIC用です
**注意1：** ソースは可読性UPのため<font color=red>**字下げして//でコメントを書いていますが、いずれもCASIO　BASICではエラーになります**</font>ので、実際にご利用される際には除去して下さい。

**注意2：** 使用燃料の入力には[**e-Gadget ブログ**](https://egadget.blog.fc2.com) の[入力ボックス](https://egadget.blog.fc2.com/blog-entry-134.html)を利用させていただいています。月面着陸ゲームをプレイするfx-5800PにはこのINPIというサブプログラムが必要になります。

```
"==MOON LANDER==”
"F:250, →1:-0.1V"
" MAX 50(1 SEC)"
"START?(ANY KEY)"◢

Do
   100→A     // 高度　初期値100
   100÷15→B  // ゲージ表示用変数（画面桁数-1）
   0→V       // 速度
   250→F     // 燃料
   While A > 0.1
            CLS            
            50→M   // 最大燃焼ユニット
            Locate 1,1,")...).........."  // 着陸ゲージ
			Int(A÷B+.5)→J  // 四捨五入
			If J≦0:Then 1→J:IfEnd　// ゲージ1以下はエラーになるので0の場合は１に
			Locate J,1,"E"　// 着陸船の描画
            Locate 1,3,"ALT:    ”:Locate 5,3,A // スペースはゴミ消し 
            Locate 9,3,"VEL:    ":Locate 13,3,V // スペースはゴミ消し
            Locate 1,4 "F:   ":Locate 3,4,F // Vの小数部がゴミるので空白で消す
            Locate 6,4,"→USE?"
            
            If F<M:Then F→M:IfEnd  // 残燃料が少ない場合
			// INPI呼び出して消費燃料の入力
            Do
        　　     13→X:4→Y:2→D:1→E
				Prog "INPI"
    			Z→R
            LpWhile Not(0≦R And R≦M)

            // 速度の計算
            V+1.62→V    // 重力加速度
            V-(r * 0.1)→V    // 燃焼
            // 残燃料の計算
            F-R→F
            // 高度の計算
            A-V→A
    WhileEnd
	Int(A/B+.5)→J
	If J≦0:Then 1→J:IfEnd
	Locate 1,1,")...).........."
	Locate 1,3,"ALT:    ”:Locate 5,3,A
	Locate 9,3,"VEL:    ":Locate 13,3,V
	
    If v>1.0
    Then
		Locate 1,2,"  xx Crash xx"
		Locate J,1,"x"
    Else 
		Locate 1,3,">> Congrats <<"
		Locate J,1,"G"
    IfEnd
	
    Locate1,4,"AGAIN(ANY QUIT(0"
    Do:Getkey→K:LpWhile K=0
LpWhile K=25
Cls:"BYE"
```
### 3．遊び方
月面着陸船エンジンの逆噴射で落下速度を調整しながら月面軟着陸を目指します。燃料（F）はたったの250しかありませんので使い所が難しく、しかも一度に使える燃料は50までです。
着陸判定：落下速度（V）1.0以下＆高度（A）0.1以下（※マイナス可）で成功となります。

### 4. 補足など
CASIO BASIC搭載機なら他の機種でも動作すると思います。その場合
- 画面サイズに合わせて、着陸ゲージの出力桁数と関係変数Bを調整してみて下さい
- キーコードが異なりますので、GetKey判定値を調整して下さい
- 「入力ボックス」サブルーチンは機種に合ったものを使って下さい

難易度を調整したい方は、燃料搭載量を増減してみて下さい。もし燃料200で着陸できたら神です。300にするとかなり余裕がでます。燃料250は結構いいゲームバランスだと思います。高度も上げられますがゲームが冗長になります。なお重力加速度1.62は月のリアルな数値なのでイジらないほうがいいと思います。

p.s.
当初もっと楽勝で完成すると思っていたのですが、パラメータ入力の対話操作実装で行き詰まりました。CASIO BASIC標準の入力コマンドでは画面が崩れてしまうためでかなり致命的でした。そこで困ったときは先人の知恵です。冒頭で引用したブログにこの問題を解決してくれる入力ボックスという素晴らしいサブプログラムが公開されていました。感謝ですね。