#include #include #include #include /*---定義---*/ #define FIELD_WIDTH 13 //フィールドの横幅 #define FIELD_HEIGHT 18 //フィールドの縦幅 #define ENEMY_YOKO 7 //敵群の横数 #define ENEMY_TATE 5 //敵群の縦数 #define PLAYER_MAX 1 //プレイヤーの最大残機 #define MY_BULLET_MAX_D 255 //自機弾の可能最大数(撃てる最大数はグローバル変数で設定しているので、これは単なるメモリ領域の確保用) #define LAYER_MAX 5 //レイヤーの枚数 //#define SCORE_ON_ENEMY 100 //敵を倒した時に増えるスコア //#define SCORE_ON_BULLET_TO_WALL -500 //弾を外した時に増えるスコア /*---グローバル変数---*/ //定義では後で値が変えられない //難易度変更などを行おうとするとどうしても必要になるグローバル変数 int MY_BULLET_MAX = 2; //自機弾の最大数 int SCORE_ON_ENEMY = 100; //敵を倒した時に増えるスコア int SCORE_ON_BULLET_TO_WALL = -500; //壁に弾が当たった時に増えるスコア int SPEED_ON_ENEMY = 500; //敵の移動単位速度 /*---画面表示レイヤーの定義---*/ int Layer_back[FIELD_HEIGHT][FIELD_WIDTH]; //背景レイヤ int Layer_enemy[FIELD_HEIGHT][FIELD_WIDTH]; //敵レイヤ int Layer_bullet[FIELD_HEIGHT][FIELD_WIDTH]; //弾レイヤ int Layer_jiki[FIELD_HEIGHT][FIELD_WIDTH]; //自機レイヤ int Layer_show[FIELD_HEIGHT][FIELD_WIDTH]; //表示レイヤ /*---構造体の定義---*/ struct OBJECT { int x; //X座標 int y; //Y座標 int s; //状態(0:死亡,消滅 1:生存,存在 2以上:体力(自機の場合残機)) }; /*---グローバル変数の定義---*/ struct OBJECT JIKI; //自機 struct OBJECT ENEMY[ENEMY_TATE][ENEMY_YOKO]; //敵機 struct OBJECT MyBullet[MY_BULLET_MAX_D]; //弾 /*----------------------------------------------*/ // 関数定義 /*----------------------------------------------*/ //初期化 void Initialize(void); void InitializeLayerBack(void); void InitializeLayerEnemy(void); void InitializeLayerBullet(void); void InitializeLayerJiki(void); void InitializeLayerShow(void); //表示 void ShowLayerPile(void); void ShowRefresh(void); void ShowTranslation(int num); void ShowInfoScore(void); void ShowClear(void); //特殊処理 void InputFromKeyboard(void); void ObjectCollision(void); int ScoreControl(int mode,int vary); void GameOver(void); void GameClear(void); void Error(void); //タイトル画面制御 void Title(void); void TitleShow(int status); int TitleSelect(void); void TitleSetOption(char buff); //自機 void JikiMove(char direction); void JikiShot(void); void JikiDeath(void); //敵機 void EnemyMove(void); void EnemyDeath(int x,int y); //自機弾 int MyBulletSearchEmpty(void); void MyBulletShoot(int num); void MyBulletMove(void); void MyBulletDeath(int x,int y); //タイマー int EnemyTimer(int timing); int MyBulletTimer(int timing); int ShowTimer(int timing); int EnemyBulletTimer(int timing); /*----------------------------------------------*/ // 関数群 /*----------------------------------------------*/ int main(void) { //初期処理 ShowClear(); Initialize(); ShowLayerPile(); Title(); //タイトル画面制御 while(1){ //画面更新タイマ if(ShowTimer(100)){ ShowLayerPile(); ShowRefresh(); //当たり判定を一番更新感覚が短いタイマと同期 ObjectCollision(); } //敵移動タイマ if(EnemyTimer(SPEED_ON_ENEMY)){ EnemyMove(); } //自機弾移動タイマ if(MyBulletTimer(100)){ MyBulletMove(); } if(kbhit()){ InputFromKeyboard(); } } return 0; } /*----------------------------------------------*/ // 初期化 /*----------------------------------------------*/ void Initialize(void) { int i,j; //使いまわすループカウンタ //レイヤ InitializeLayerBack(); InitializeLayerEnemy(); InitializeLayerBullet(); InitializeLayerJiki(); InitializeLayerShow(); //自機関連 JIKI.s = PLAYER_MAX; JIKI.x = FIELD_WIDTH/2; JIKI.y = FIELD_HEIGHT - 1; Layer_jiki[JIKI.y][JIKI.x] = 1; //敵機関連 for(i=0;i