/********************************/
/* アスキーアート */
/* シューティングゲーム */
/* */
/* 敵UFO キャラクター: M */
/* ビーム: $$$ */
/* */
/* プレイヤー キャラクター: A */
/* ビーム: ||| */
/* */
/* キー操作 左右移動: ←,→ */
/* ビーム発射: ↑ */
/* 終了: Esc */
/* */
/* UFOは離れたら戻ってくる */
/********************************/
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define XMAX 80
#define YMAX 24
void main( )
{
char buf[YMAX][XMAX]; // 文字配列(フィールド)
int xM=30,yM=0; // キャラクタM 位置
int dxM=1; // キャラクタM 移動量(左右)
int xMb,yMb=YMAX; // キャラクタM ビーム$ 位置
int xA=40,yA=YMAX-1; // キャラクタA 位置
int xAb,yAb=-1; // キャラクタA ビーム| 位置
int i,j; // 文字配列添字
while( 1 )
{
system("cls"); // 画面消去
memset(&buf[0][0],' ',XMAX*YMAX); // 文字配列クリア
buf[yM][xM]='M'; // M 配置
buf[yA][xA]='A'; // A 配置
if ( yMb<YMAX )
{
buf[yMb][xMb]='$'; // $ 配置
if ( xMb>1 ) buf[yMb][xMb-1]='$';
if ( xMb<XMAX ) buf[yMb][xMb+1]='$';
}
if ( yAb>=0 )
{
buf[yAb][xAb]='|'; // | 配置
if ( xAb>1 ) buf[yAb][xAb-1]='|';
if ( xAb<XMAX ) buf[yAb][xAb+1]='|';
}
for( i=0; i<YMAX; i++ )
{
printf("%.*s",XMAX,&buf[i][0]); // 画面1行表示
}
fflush(stdout);
if ( yM==yAb ) // M,|
{
if ( xM>=xAb-1 && xM<=xAb+1 ) // M,| 当り
{ Beep(784,1000); break; } // 終了
}
if ( yA==yMb ) // A,$
{
if ( xA>=xMb-1 && xA<=xMb+1 ) // A,$ 当り
{ Beep(330,1000); break; } // 終了
}
if ( abs(yAb-yMb)<=1 ) // |,$
{
if ( xAb>=xMb-2 && xAb<=xMb+2 ) // |,$ 当たり
{
Beep(588,100);
yAb=-1; yMb=YMAX; // ビーム消滅
}
}
if ( xM==0 || xM==79 ) dxM=-dxM; // M 両端で反転
else if ( xM-xA> 15 ) dxM=-1; // M,A 右に離れた
else if ( xM-xA<-15 ) dxM= 1; // M,A 左に離れた
xM+=dxM; // M 位置更新
if ( yMb<YMAX ) yMb+=1; // $ 1行下へ
if ( yAb>=0 ) yAb-=1; // | 1行上へ
if ( kbhit( )!=0 ) // キーが押された
{
j=getch( ); // キー番号
if ( j==27 ) break; // Esc(終了)
if ( j== 0 ) j=getch( ); // 特殊キー
if ( j==75 ) // ←
{
xA-=3; // M 3桁左へ
if ( xA<0 ) xA=0; // 左端
}
else if ( j==77 ) // →
{
xA+=3; // M 3桁右へ
if ( xA>=XMAX ) xA=XMAX-1; // 右端
}
if ( j==72 && yAb<0 ) // ↑,|なし
{ xAb=xA; yAb=yA-1; } // | 発射
}
if ( xA==xM && yMb>=YMAX ) // A,M x同位置,$なし
{ xMb=xM; yMb=1; } // $ 発射
Sleep(50);
}
}
|