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

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

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

●アスキーアートのシューティングゲームです。
●UFOの攻撃を避けながらビームを発射し、UFOと戦います。
●プレイヤーのキャラクタとUFOの横位置が同じになると、UFOはビームを発射してきます。
●プレイヤーは←→キーでキャラクタを移動できます。
●↑キーを押すとビームが発射され、UFOを攻撃できます。
●ビーム同士が当たると、ビームは消滅します。
●キャラクタにビームが当たるか、Escキーを押すと終了です。
  ≫ソースファイルのダウンロード: game02.C
【問題】
●キャラクタの開始位置を変更してみよう。
●すでにビームが出ていても、ビームを打てるように変更してみよう。

/********************************/
/*  アスキーアート              */
/*  シューティングゲーム        */
/*                              */
/*  敵UFO   キャラクター: M  */
/*             ビーム: $        */
/*                              */
/*  プレイヤー キャラクター: A  */
/*             ビーム: |        */
/*                              */
/*  キー操作   左右移動: ←,→  */
/*             ビーム発射: ↑   */
/*             終了: Esc        */
/********************************/
#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 ( yAb>=0   ) buf[yAb][xAb]='|';     // | 配置

        for( i=0; i<YMAX; i++ )
          {
            printf("%.*s",XMAX,&buf[i][0]);    // 画面1行表示
          }
        fflush(stdout);

        if ( xM==xAb && yM==yAb )              // M,| 当り
          { Beep(784,1000); break; }           // 終了

        if ( xA==xMb && yA==yMb )              // A,$ 当り
          { Beep(330,1000); break; }           // 終了

        if ( xAb==xMb && abs(yAb-yMb)<=1 )     // |,$ 当り
          {
             Beep(588,100);
             yAb=-1; yMb=YMAX;                 // ビーム消滅
          }

        if ( xM==0 || xM==79 ) dxM=-dxM;       // M 両端で反転
        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