月面着陸
着陸態勢に入った宇宙船を無事に着陸させるゲーム。カーソルの左右上で移動/逆噴射して着陸地点'='にたどり着かせます。ただし、左右には慣性が、上下には重力が働くので注意が必要です。着陸地点以外に落ちると、また着陸地点でも落下速度が速すぎるとゲームオーバーです。逆噴射には燃料が必要で、燃料を使い切ってしまうと逆噴射できません。
プログラム
/********************************************************/
/* アプリケーションループ */
/********************************************************/
while( 1 ) {
/********************************************************/
/* 変数初期化 */
/********************************************************/
/* 位置 */
x = 10;
y = 10;
/* 速度 */
s = 0;
t = 0;
/* 燃料 */
f = 100;
/* ゲームフラグ */
a = 0;
/********************************************************/
/* スタート画面 */
/********************************************************/
/* 画面表示 */
cls();
locate( 3, 3 );
printstr( "GAME START" );
locate( 2, 8 );
printstr( "PUSH ANY KEY" );
/* キークリア待ち */
while( ( pad() & 0xff ) );
/* キー待ち */
while( !( pad() & 0xff ) );
/* キークリア待ち */
while( ( pad() & 0xff ) );
/********************************************************/
/* メインループ */
/********************************************************/
while( a == 0 ) {
/* パッドチェック */
p = pad();
if( p & PAD_LF )
s--;
if( p & PAD_RI )
s++;
b = 0;
if( ( p & PAD_UP ) && f > 0 ) {
b = 1;
t -= 2;
f--;
}
/* 位置、速度計算 */
t++;
x += s;
y += t;
/* 地形、残燃料表示 */
cls();
locate( 0, 0 );
siprintf( "FUEL%3d", f );
locate( 0, 8 );
printstr( "*** " );
locate( 0, 9 );
printstr( " * **** ***" );
locate( 0, 10 );
printstr( " ** *=* " );
/* 終了判定 */
if( scan( x / 10, y / 10 ) == '=' ) {
if( t < 10 )
a = 1;
else
a = 2;
}
if( scan( x / 10, y / 10 ) == '*' )
a = 2;
/* 宇宙船表示 */
locate( x / 10, y / 10 );
printstr( "A" );
if( b == 1 ) {
locate( x / 10, y / 10 + 1 );
printstr( "^" );
}
/* ウェイト */
wait( 500 );
}
if( a == 1 ) {
/********************************************************/
/* ゲームクリア */
/********************************************************/
/* 画面表示 */
cls();
locate( 5, 3 );
printstr( "CLEAR!!" );
locate( 2, 8 );
printstr( "PUSH ANY KEY" );
}
else {
/********************************************************/
/* ゲームオーバー */
/********************************************************/
/* 画面表示 */
cls();
locate( 5, 3 );
printstr( "CRASH!!" );
locate( 2, 8 );
printstr( "PUSH ANY KEY" );
}
/* キークリア待ち */
while( ( pad() & 0xff ) );
/* キー待ち */
while( !( pad() & 0xff ) );
}
ダウンロード
改良案
文字で宇宙船を表示しているため移動が1文字単位になっています。ドット単位で移動させるにはスプライトを使えば実現できます。スプライト対応に修正してみましょう。
逆噴射した時、地面に激突した時、無事に着陸した時に合わせて効果音をつけるとよりゲームらしくなるでしょう。
地形を変えたり燃料の初期値を少なくしたりすればいくつもゲームバランスも変わります。そうした面をいくつも用意して複数面構成のゲームにする事も出来るでしょう。