1989年開業 情報工学部門 文部科学省登録番号 第22082号 公益社団法人日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム
 シューティングゲーム(アスキーアート)機能追加版

●アスキーアートのシューティングゲーム game02.C の機能追加版です。
●プレイヤーのキャラクタとUFOの横位置が一定以上離れると、UFOは反転して接近してきます。
●ビームの太さが3倍になっています。( ||| と $$$ )
  ≫ソースファイルのダウンロード: game02-5.C
【問題】
●UFOが接近してくる距離を変えてみよう。
●いろいろな機能を追加してみよう。

/********************************/
/*  アスキーアート              */
/*  シューティングゲーム        */
/*                              */
/*  敵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);
      }
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: info@saeki-pe.com