第10講 プログラムソースを複数のファイルに分割して、プログラムをわかりやすくする
第7話 ブロック崩しの社員をすべて独立させるその2
ソースコードを複数のファイルに分割するコード例
今話のコードもすべてコピペできます。
make.cppのコード
#include"main.h"
void make() {
  SetFontSize(65); //フォントサイズを65に変更
  DrawBox(0, 0, 800, 1000, ao, true);
  DrawFormatString(100, 100, siro, "(>_<)"); // 文字を描画する
  DrawFormatString(100, 300, siro, "ゲームオーバーです"); // 文字を描画する
  SetFontSize(32); //フォントサイズを32に変更
  DrawFormatString(20, 500, kiiro, "ゲームを再開するときはZキーを、"); // 文字を描画する
  DrawFormatString(20, 540, kiiro, "ゲーム初期画面に戻るときはQキー"); // 文字を描画する
  DrawFormatString(20, 580, kiiro, "を押してください。"); // 文字を描画する
  if (CheckHitKey(KEY_INPUT_Z) != 0) {
    syokika();
    m = 1;
  }
  if (CheckHitKey(KEY_INPUT_Q) != 0) {
    syokika();
    m = 0;
  }
}
maru.cppのコード
#include"main.h"
void maru() { //ボールの位置を計算して、その位置にボールを描く社員
  DrawCircle(mx, my, mo, kiiro, true); //ボールを描く
  if (mx >= mo - 6 && mx <= mo + 6)mx_houkou *= houkougae; //左の壁で反射
  if (mx >= 800 - mo - 6 && mx <= 800 - mo + 6)mx_houkou *= houkougae; //右の壁で反射
  if (my >= -4 && my <= 4)my_houkou *= houkougae; //天井の壁で反射
  if (mx >= bx && mx <= bx + b_y && my >= 944 && my <= 956)my_houkou *= houkougae; //バーで反射
  //if (my >= 944 && my <= 956)my_houkou *= houkougae; //ゲームクリアを確認するときに使う 無条件で跳ね返り
  if (my >= 1000)m = 2; //ゲームオーバー
  mx += mxh * mx_houkou; //mx:ボールの横位置 mxh:ボール横方向の速さ
  my += myh * my_houkou; //my:ボールの縦位置 myh:ボール縦方向の速さ
}
saisyonogamen.cppのコード
#include"main.h"
void saisyonogamen() {
  DrawBox(0, 0, 800, 1000, siro, true);
  int gazou;
  gazou = LoadGraph("画像/02.png");
  DrawGraph(200, 100, gazou, false);
  if (CheckHitKey(KEY_INPUT_A) != 0) {
    mxh = 1; //ボールの横方向の速さ
    myh = 4; //ボールの縦方向の速さ
    b_y = 120; //バーの横幅
  }
  if (CheckHitKey(KEY_INPUT_B) != 0) {
    mxh = 2; //ボールの横方向の速さ
    myh = 4; //ボールの縦方向の速さ
    b_y = 60; //バーの横幅
  }
  if (CheckHitKey(KEY_INPUT_C) != 0) {
    mxh = 4; //ボールの横方向の速さ
    myh = 6; //ボールの縦方向の速さ
    b_y = 30; //バーの横幅
  }
  if (b_y == 0) { //AまたはBまたはCを押し忘れている場合には、初心者モードに設定
    mxh = 1; //ボールの横方向の速さ
    myh = 4; //ボールの縦方向の速さ
    b_y = 120; //バーの横幅
  }
  if (CheckHitKey(KEY_INPUT_Z) != 0) m = 1;
}
sikaku.cppのコード
#include"main.h"
void sikaku() {
  int i, j, a;
  for (i = 0; i < s_t; i++) {
    for (j = 0; j < s_y; j++) {
      a = (10 * i + j) % 3;
      if (arunasi[i][j] == 1) {
        switch (a) {
        case 0: //赤のブロックを描く
          DrawBox(syh * j, sth * i + aki, syh * (j + 1), sth * (i + 1) + aki, aka, true);
          break;
        case 1: //緑のブロックを描く
          DrawBox(syh * j, sth * i + aki, syh * (j + 1), sth * (i + 1) + aki, midori, true);
          break;
        case 2: //青のブロックを描く
          DrawBox(syh * j, sth * i + aki, syh * (j + 1), sth * (i + 1) + aki, ao, true);
          break;
default:
          break;
        }
      }
    }
  }
}
syokika.cppのコード
#include"main.h"
void syokika() {
  int i, j;
  for (i = 0; i < s_t; i++) {
    for (j = 0; j < s_y; j++) {
      arunasi[i][j] = 1;
    }
  }
  mx = 400; //ボールの初期の横位置
  my = 920; //ボールの初期の縦位置
  mo = 10; //ボールの大きさ(半径)
  sx = 0; //sikaku(しかく)=ブロックの最初の横位置
  sy = 100; //sikaku(しかく)=ブロックの最初の横位置
  mx_houkou = 1; //ボールの横方向の最初の向き
  my_houkou = -1; //ボールの縦方向の最初の向き
  bx = 0; //バーの最初の横位置
  by = 960; //バーの最初の縦位置
  b_t = 20; //バーの縦幅
  bh = 8; //バーの速さ
  aki = 100; //天井からブロック上端までの距離
  kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
  aka = GetColor(255, 0, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
  midori = GetColor(0, 255, 0); //緑色に出席番号を割り振りその番号を箱midoriに収納
  ao = GetColor(0, 0, 255); //青色に出席番号を割り振りその番号を箱aoに収納
  siro = GetColor(255, 255, 255); //白色に出席番号を割り振りその番号を箱siroに収納
  mizuiro = GetColor(0, 200, 200); //水色に出席番号を割り振りその番号を箱mizuiroに収納
  tokuten = 0; //とくてん 0に初期化
  kosu = s_y*s_t; //ブロック個数 s_y:ブロック横数 s_t:ブロック縦数
  syh = 800 / s_y; //syh:ブロック横幅 s_y:ブロック横数
  sth = syh / 2; //sth:ブロック縦幅 ブロック縦幅
  bh = 8; //バーの速さ
}
atarihantei.hのコード
void atarihantei(); //あたりはんてい ブロックへの当たりの判定を行いブロックに対応するa[?][?]に0を代入する
bar.hのコード
void bar(); //bar(バー)の位置を計算して、その位置にバーを描く仕事する社員(関数)
gamemain.cppのコード
void gamemain(); //ゲームを進行させる社員
kachi.cppのコード
void kachi(); //かち ゲームクリアを描く社員(関数)
main.hのコード
#include"atarihantei.h"
#include"bar.h"
#include"maru.h"
#include"kachi.h"
#include"sikaku.h"
#include"syokika.h"
extern int arunasi[4][10]; //あるなし ブロックが ある:1 ない:0 とする
extern int mx, my; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする。
extern int sx, sy; //sikaku(しかく)すなわちブロックの横位置と縦位置
extern int bx, by; //bar(バー)の横位置と縦位置
extern int s_y, s_t; //ブロック横数と縦数
extern int syh, sth; //ブロック横幅と縦幅
extern int b_y, b_t; //バーの横幅と縦幅
extern int houkougae ; //ほうこうがえ 方向チェンジ
extern int mo; //ボールの大きさ
extern int mxh; //ボールの横方向の速さ
extern int myh; //ボールの縦方向の速さ
extern int bh; //バーの速さ
extern int mx_houkou; //mxの方向
extern int my_houkou; //myの方向
extern int kiiro; //黄色の出席番号収納する箱
extern int aka; //黄色の出席番号収納する箱
extern int midori; //緑色の出席番号収納する箱
extern int ao; //青色の出席番号収納する箱
extern int siro; //白色の出席番号収納する箱
extern int mizuiro; //水色の出席番号収納する箱
extern int tokuten; //とくてん ゲームの得点をカウントする箱(変数)
extern int kosu; //ブロック個数
extern int m; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲーむクリア
extern int aki; //天井からブロック上端までの空きの大きさ
make.hのコード
void make(); //まけ ゲームオーバを描く社員(関数)
maru.hのコード
void maru(); //bar(バー)区別するためにボールをmaruとする maru用の変数はmx等と表す
saisyonogamen.hのコード
void saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
sikaku.hのコード
void sikaku();
//bar(バー)と区別するためにblock(ブロック)をsikaku(しかく)とする。sikaku用の位置を表す変数はsy、sxとする。
syokika.hのコード
void syokika(); //しょきか 最初はブロックがすべて存在している状態にする。

ファイル構成
01

では次話の課題です。
第9講第7話で完成させたロールプレイングゲーム風アクションゲームの
プログラムソースを複数のファイルに分割しましょう。
今回の条件も、1つの社員に1つのファイルです。
ですが、分割に取りかかる前に
const int houkougae = -1; //ほうこうがえ 方向チェンジ
からconstを外すことを忘れないでください。
それから、ゲームを進行させる社員の社員名main()もgamemain()に変更することも。


第6話へ   第8話へ
a

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

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