第10講 プログラムソースを複数のファイルに分割して、プログラムをわかりやすくする
第9話 ロールプレイングゲーム風アクションゲームのプログラムソースを複数ファイルに分割その2
make.cppのコード
#include"main.h"
void make() { //まけ ゲームオーバーを描く社員(関数)
  SetFontSize(35); //フォントサイズを35に変更
  DrawFormatString(20, 100, kiiro, "(>_<)"); // 文字を描画する
  DrawFormatString(20, 200, kiiro, "ゲームオーバーです"); // 文字を描画する
  DrawFormatString(20, 250, kiiro, "ゲーム初期画面に戻るときはQを"); // 文字を描画する
  DrawFormatString(20, 295, kiiro, "そのままゲームを再開するときには"); // 文字を描画する
  DrawFormatString(20, 340, kiiro, "Zを押してください。"); // 文字を描画する
  //ゲーム再開
  if (CheckHitKey(KEY_INPUT_Z) != 0) {
    syokika();
    m = 1;
  }
  //ゲーム初期化画面へ
  if (CheckHitKey(KEY_INPUT_Q) != 0) {
    syokika();
    m = 0;
  }
}

saisyonogamen.cppのコード
#include"main.h"
void saisyonogamen() {
  SetFontSize(36); //フォントサイズを36に変更
  DrawFormatString(100, 60, siro, "ゲームモード"); // 文字を描画する
  DrawFormatString(100, 100, siro, "A:初級 B:中級 C:上級"); // 文字を描画する
  DrawFormatString(100, 200, kiiro, "ゲームを始めるには"); // 文字を描画する
  DrawFormatString(100, 240, kiiro, "AまたはBまたはCを押して"); // 文字を描画する
  DrawFormatString(100, 280, kiiro, "ゲーム級を選んでから"); // 文字を描画する
  DrawFormatString(100, 320, kiiro, "Zを押してください。"); // 文字を描画する
  if (CheckHitKey(KEY_INPUT_A) != 0) { //ゲームの難易度を初級に設定する
    mh = 4; //ハイエナの速さを4に設定
    ht = 1000; //竜の炎のタイミング1秒に設定
    hh = 8; //ヒーローの速さを8に設定
  }
  if (CheckHitKey(KEY_INPUT_B) != 0) { //ゲームの難易度を中級に設定する
    mh = 6; //ハイエナの速さを6に設定
    hh = 8; //ヒーローの速さを8に設定
    ht = 500; //竜の炎のタイミング1秒に設定
  }
  if (CheckHitKey(KEY_INPUT_C) != 0) { //ゲームの難易度を上級に設定する
    mh = 8; //ハイエナの速さを10に設定
    hh = 10; //ヒーローの速さを10に設定
    ht = 250; //竜の炎のタイミング1秒に設定
  }
  if (mh == 0) { //ゲームの難易度を初級に設定する
    mh = 4; //ハイエナの速さを4に設定
    ht = 1000; //竜の炎のタイミング1秒に設定
    hh = 8; //ヒーローの速さを8に設定
  }
  if (CheckHitKey(KEY_INPUT_Z) != 0) m = 1; //ゲーム開始
}

syokika.cppのコード
#include"main.h"
void syokika() {
  siro = GetColor(255, 255, 255); //白色に出席番号を割り振りその番号を箱siroに収納
  hai = GetColor(220, 220, 220); //灰色に出席番号を割り振りその番号を箱kiiroに収納
  kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
  hx = 40, hy = 42; //ヒーローの hx:横位置 hy:縦位置
  mx1 = 480, my1 = 48; //猛獣(ハイエナ1)の mx1:横位置 my1:縦位置
  mx1_houkou = -1; //猛獣(ハイエナ1)の最初の方向
  my2_houkou = 1; //猛獣(ハイエナ2)の最初の方向
  mx2 = 560, my2 = 140; //猛獣(ハイエナ2)の mx2:横位置 my2:縦位置
  mx3 = 200, my3 = 408; //猛獣(ハイエナ3)の mx3:横位置 my3:縦位置
  mx3_houkou = 1; //猛獣(ハイエナ3)の最初の方向
  kagiarunasi = 1; //地図上に鍵がある状態にしている。
}

ugoki.cppのコード
#include"main.h"
void ugoki() {
  syujinkou = LoadGraph("画像/h00.png"); //主人公の出席番号を収納
                     //1本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx <= 573 - hh && hy >= 32 && hy <= 53) hx += hh;
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 40 + hh && hy >= 32 && hy <= 48) hx -= hh;
  //1本目の道路の途中にあるくぼみには入れるようにする
  if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 280 && hx <= 293 && hy >= 40 && hy <= 130 - hh) hy += hh;
  if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 280 && hx <= 293 && hy >= 40 + hh && hy <= 130) hy -= hh;
  //2本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 560 && hx <= 573 && hy >= 40 && hy <= 410 - hh) hy += hh;
  if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 560 && hx <= 573 && hy >= 40 + hh && hy <= 410) hy -= hh;
  //2本目の道路の途中にあるくぼみには入れるようにする
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 520 + hh && hx <= 573 && hy >= 180 && hy <= 210) hx -= hh;
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 520 && hx <= 573 - hh && hy >= 180 && hy <= 210) hx += hh;
  //3本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 40 + hh && hx <= 573 && hy >= 390 && hy <= 420) hx -= hh;
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 573 - hh && hy >= 390 && hy <= 420) hx += hh;
  //3本目の道路の途中にあるくぼみには入れるようにする
  if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 340 && hx <= 363 && hy >= 360 && hy <= 410 - hh) hy += hh;
  if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 340 && hx <= 363 && hy >= 360 + hh && hy <= 410) hy -= hh;
  //4本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 40 && hx <= 50 && hy >= 115 && hy <= 240 - hh) hy += hh;
  if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 40 && hx <= 50 && hy >= 115 + hh && hy <= 240) hy -= hh;
  if (CheckHitKey(KEY_INPUT_DOWN) != 0 && hx >= 40 && hx <= 50 && hy >= 290 && hy <= 424 - hh) hy += hh;
  if (CheckHitKey(KEY_INPUT_UP) != 0 && hx >= 40 && hx <= 50 && hy >= 290 + hh && hy <= 424) hy -= hh;
  //5本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 40 + hh && hx <= 273 && hy >= 280 && hy <= 310) hx -= hh;
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 273 - hh && hy >= 280 && hy <= 310) hx += hh;
  //6本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hy >= 190 && hy <= 210 && hx >= 40 + hh && hx <= 436) hx -= hh;
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hy >= 190 && hy <= 210 && hx <= 436 - hh) hx += hh;
  //7本目の道路内に動きを限定
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && hx >= 40 + hh && hx <= 433 && hy >= 120 && hy <= 130) hx -= hh;
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && hx >= 40 && hx <= 433 - hh && hy >= 120 && hy <= 130) hx += hh;
  if (hx >= 430 && hx <= 440 && hy >= 180 && hy <= 210)kagiarunasi = 0; //鍵を拾う
  //ゲームクリアであるかを判定し、ゲームクリアの場合ゲームクリアの画面を出す
  if (hx >= 265 && hx <= 275 && hy >= 280 && hy <= 310) {
    m = 3;
    return;
  }
  DrawGraph(hx, hy, syujinkou, true); //ヒーローの hx:横位置 hy:縦位置に従いヒーローを描く
  DeleteGraph(syujinkou); //ヒーローの出席番号を収納する箱(ハンドル)の削除
  moujyu = LoadGraph("画像/m00.png"); //もうじゅう ハイエナの出席番号を収納
  if (mx1 <= 100)mx1_houkou *= houkougae; //ハイエナ1の方向変え
  if (mx1 >= 500)mx1_houkou *= houkougae; //ハイエナ1の方向変え
  mx1 += mh * mx1_houkou; //ハイエナ1を自動的に動かす
              //ゲームオーバーであるかを判定し、ゲームオーバーの場合ゲームオーバーの画面を出す
  if (hy >= my1 - 8 && hy <= my1 + 8 && hx >= mx1 - 8 && hx <= mx1 + 8) {
    m = 2;
    return;
  }
  DrawGraph(mx2, my2, moujyu, true);  //ハイエナ2の mx2:横位置 my2:縦位置
  if (my2 <= 100)my2_houkou *= houkougae; //ハイエナ2の方向変え
  if (my2 >= 360)my2_houkou *= houkougae; //ハイエナ2の方向変え
  my2 += mh * my2_houkou; //ハイエナ2を自動的に動かす
              //ゲームオーバーであるかを判定し、ゲームオーバーの場合ゲームオーバーの画面を出す
  if (hy >= my2 - 8 && hy <= my2 + 8 && hx >= mx2 - 8 && hx <= mx2 + 8) {
    m = 2;
    return;
  }
  DrawGraph(mx3, my3, moujyu, true); //ハイエナ3の mx3:横位置 my3:縦位置
  if (mx3 <= 100)mx3_houkou *= houkougae; //ハイエナ3の方向変え
  if (mx3 >= 500)mx3_houkou *= houkougae; //ハイエナ3の方向変え
  mx3 += mh * mx3_houkou; //ハイエナ3を自動的に動かす
              //ゲームオーバーであるかを判定し、ゲームオーバーの場合ゲームオーバーの画面を出す
  if (hy >= my3 - 8 && hy <= my3 + 8 && hx >= mx3 - 8 && hx <= mx3 + 8) {
    m = 2;
    return;
  }
  DrawGraph(mx1, my1, moujyu, true);  //ハイエナ1の mx1:横位置 my1:縦位置
  DeleteGraph(moujyu); //ハイエナの出席番号を収納する箱(ハンドル)の削除
}

chizusakusei.hのコード
void chizusakusei(); //ちずさくせい 地図を作成する社員(関数)

gamemain.hのコード
void gamemain(); //ゲームを進行させる社員(関数)

kachi.h
void kachi(); //かち ゲームクリアを描く社員(関数)

main.h
#include "DxLib.h"
#include "chisakusei.h"
#include "gamemain.h"
#include "kachi.h"
#include "make.h"
#include "saisyonogamen.h"
#include "syokika.h"
#include "ugoki.h"
extern int m; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
extern int siro; //白色の出席番号収納する箱
extern int kiiro; //黄色の出席番号を収納する箱
extern int hai; //灰色の出席番号収納する箱
extern int haikeigazou, syujinkou, syuten; //はいけいがぞう しゅじんこう しゅうてん 背景画像と主人公とゴールの出席番号を入れる箱
extern int moujyu; //もうじゅう 猛獣(ハイエナ)の出席番号を収納する箱
extern int ryu; //りゅう 竜の出席番号を収納する箱
extern int kabe; //かべ 壁の出席番号を収納する箱
extern int kagi; //鍵(凸)の出席番号を収納する箱
extern int hono; //ほのお 炎の出席番号を収納する箱
extern int hx, hy; //ヒーローの hx:横位置 hy:縦位置
extern int mx1_houkou; //mx1の方向 猛獣(ハイエナ1)の方向
extern int my2_houkou; //my2の方向 猛獣(ハイエナ2)の方向
extern int mx3_houkou; //mx3の方向 猛獣(ハイエナ3)の方向
extern int houkougae; //ほうこうがえ 方向チェンジ
extern int mx1, my1; //猛獣(ハイエナ1)の mx1:横位置 my1:縦位置
extern int mx2, my2; //猛獣(ハイエナ2)の mx2:横位置 my2:縦位置
extern int mx3, my3; //猛獣(ハイエナ3)の mx3:横位置 my3:縦位置
extern int mh; //ハイエナの速さを収納する箱(整数型変数)
extern int ht; //竜の炎のタイミングを決める数を収納する箱(整数型変数)
extern int hh; //ヒーローの速さを収納する箱(整数型変数)
extern int kagiarunasi; //かぎあるなし 1:鍵がある 0:鍵なし
extern int hajimenojikoku; //始めの時刻を収納する箱
extern int genjikoku; //現在の時刻を収納する箱

make.h
void make(); //まけ ゲームオーバーを描く社員(関数)

saisyonogamen.h
void saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)

syokika.h
void syokika(); //しょきか ゲームの初期状態を設定する社員(関数)

ugoki.h
void ugoki(); //うごき キャラクターの動きを制御


以上で第10講を閉めると同時に、
C言語ゲームプログラミング入門第1部を終了します。
第11講は、第2部に引き継がれます。
前にも申し上げたとおり、
第11講以降では、シューティングゲームを題材にします。


第8話へ   第11講第1話へ
a

初心者のための excel 2016 マクロ VBA 入門講義 基
礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための]世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップ