第7講 ブロック崩しその5(得点のカウントと表示・ゲームはじめの画面とゲームの切り替え・ゲームクリアとゲームオーバー画面表示)
第5話 ゲーム完成
第4話問題解答例
#include "DxLib.h"
void maru(); //bar(バー)区別するためにボールをmaruとする maru用の変数はmx等と表す。
void sikaku(); //bar(バー)と区別するためにblock(ブロック)をsikaku(しかく)とする。sikaku用の位置を表す変数はsy、sxとする。
void bar(); //bar(バー)の位置を計算して、その位置にバーを描く仕事する社員(関数)
void syokika(); //
//しょきか 最初はブロックがすべて存在している状態にする。
//将来的には、ブロックの層数やボールの速さなどを決める(設定する)仕事も担当する
void atarihantei(); //あたりはんてい ブロックへの当たりの判定を行いブロックに対応するa[?][?]に0を代入する
void main(); //ゲームを進行させる社員
void saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
void make(); //まけ ゲームオーバーを描く社員(関数)
void kachi(); //かち ゲームクリアを描く社員(関数)
int arunasi[4][10]; //あるなし ブロックが ある:1 ない:0 とする
int mx , my ; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする。
int sx = 0, sy = 100; //sikaku(しかく)すなわちブロックの横位置と縦位置、初期位置の決定
int bx = 0, by = 960; //bar(バー)の横位置と縦位置、初期位置の決定
const int houkougae = -1; //ほうこうがえ 方向チェンジ
int mx_houkou ; //mxの最初の方向
int my_houkou ; //myの最初の方向
int kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
int aka = GetColor(255, 0, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
int midori= GetColor(0, 255, 0); //緑色に出席番号を割り振りその番号を箱midoriに収納
int ao = GetColor(0, 0, 255); //青色に出席番号を割り振りその番号を箱aoに収納
int siro = GetColor(255, 255, 255); //白色に出席番号を割り振りその番号を箱siroに収納
int mizuiro = GetColor(0, 200, 200); //水色に出席番号を割り振りその番号を箱mizuiroに収納
int tokuten = 0; //とくてん ゲームの得点をカウントする箱(変数)
int kosu = 40; //ブロック個数
int m; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 1000, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  syokika();
  //しょきか 最初はブロックがすべて存在している状態にする。
  //将来的には、ブロックの層数やボールの速さなどを決める(設定する)仕事も担当する
  m = 0; //ゲームの状態 0:ゲーム始め 1:ゲーム 2:ゲームオーバー 3:ゲールクリア
  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策  
  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    if (m == 0)saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
    if (m == 1)main(); //ゲームを進行させる社員
    if (m == 2)make(); //まけ ゲームオーバーを描く社員(関数)
    if (m == 3)kachi(); //かち ゲームクリアを描く社員(関数)
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
void make() {
  SetFontSize(65); //フォントサイズを65に変更
  DrawBox(0, 0, 800, 1000, ao, true); //背景を青にする
  DrawFormatString(100, 100, siro, "(>_<)"); // 文字を描画する
  DrawFormatString(100, 300, siro, "ゲームオーバーです"); // 文字を描画する
  SetFontSize(32); //フォントサイズを65に変更
  DrawFormatString(20, 500, kiiro, "ゲームを再開するときはZキーを押してください。"); // 文字を描画する
  if (CheckHitKey(KEY_INPUT_Z) != 0) {
    syokika();
    m = 1;
  }

}
void kachi() {
  SetFontSize(65); //フォントサイズを65に変更
  DrawBox(0, 0, 800, 1000, mizuiro, true); //背景を水色にする
  DrawFormatString(100, 100, kiiro, "ヾ(^v^)k"); // 文字を描画する
  DrawFormatString(100, 300, kiiro, "ゲームクリアです"); // 文字を描画する
  SetFontSize(32); //フォントサイズを65に変更
  DrawFormatString(20, 500, siro, "ゲームを再開するときはZキーを押してください。"); // 文字を描画する
  if (CheckHitKey(KEY_INPUT_Z) != 0) {
    syokika();
    m = 1;
  }

}
void main() {
  maru(); //ボールの位置を計算して、その位置にボールを描く社員
  atarihantei();
  sikaku(); //ブロックの位置を計算して、その場所にブロックを描く社員 将来的には当たったら消えるようにする仕事も担当する
  bar(); //バーの位置を計算して、その場所にバーを描く社員
  SetFontSize(32); //フォントサイズを32に変更
  DrawFormatString(400, 800, siro, "ゲームスコア:%d", tokuten); // 文字を描画する
}
void saisyonogamen() {
  DrawBox(0, 0, 800, 1000, siro, true); //背景を白にする
  int gazou; //"画像/02.png"の出席番号を収納する箱(整数型変数)
  gazou = LoadGraph("画像/02.png"); //"画像/02.png"の出席番号を収納
  DrawGraph(200, 200, gazou, false); //"画像/02.png"を描く
  if (CheckHitKey(KEY_INPUT_Z) != 0) m = 1; //ゲ−ムを始める
}
void syokika() {
  int i, j;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 10; j++) {
      arunasi[i][j] = 1;
    }
  }
  mx = 10;
  my = 950;
  mx_houkou = -1;
  my_houkou = 1;
}
void atarihantei() {
  int i, j;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 10; j++) {
      if (arunasi[i][j] >0) {
        if (mx >= 80 * j && mx <= 80 * (j + 1) && ((my >= 40 * i + 94 && my <= 40 * i + 106) || (my >= 40 * (i + 1) + 94 && my <= 40 * (i + 1) + 106))) {
          arunasi[i][j] = 0;
          my_houkou *= houkougae;
          tokuten += 10;
          
kosu--;
          
if (kosu == 0)m = 3;
        }
      }
    }
  }
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 10; j++) {
      if (arunasi[i][j] >0) {
        if (my >= 40 * i+100 && my <= 40 * (i + 1)+100 && ((mx >= 80 * j - 4 && mx <= 80 * j + 4) || (mx >= 80 * (j + 1) - 4 && mx <= 80 * (j + 1) + 4))) {
          arunasi[i][j] = 0;
          mx_houkou *= houkougae;
          tokuten += 10;
          
kosu--;
          if (kosu == 0)m = 3;

        }
      }
    }
  }
}
void maru() { //ボールの位置を計算して、その位置にボールを描く社員
  DrawCircle(mx, my, 10, kiiro, true); //ボールを描く
  if (mx == 10)mx_houkou *= houkougae;
  if (mx == 790)mx_houkou *= houkougae;
  if (my >= -2 && my<=2)my_houkou *= houkougae;
  if (mx >= bx && mx <= bx + 60 && my == 950)my_houkou *= houkougae;
  //if (my == 950)my_houkou *= houkougae;
  
if (my >= 1000)m = 2;
  mx += 2 * mx_houkou;
  my += 6 * my_houkou;
}
void sikaku() {
  int i, j,a;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 10; j++) {
      a = (10 * i + j) % 3;
      if (arunasi[i][j] == 1) {
        if (a == 0)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, aka, true);
        if (a == 1)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, midori, true);
        if (a == 2)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, ao, true);
      }
    }
  }
}
void bar() {
  if (CheckHitKey(KEY_INPUT_RIGHT) != 0 && bx+60 <= 800) {
    bx = bx + 8;
  }
  if (CheckHitKey(KEY_INPUT_LEFT) != 0 && bx >= 0) {
    bx = bx - 8;
  }
  DrawBox(bx, by, bx + 60, by + 20, siro, true);
}
コピペ用添付ファイル

    if (m == 0)saisyonogamen(); //さいしょのがめん ゲームの初期画面を描く社員(関数)
    if (m == 1)main(); //ゲームを進行させる社員
    if (m == 2)make(); //まけ ゲームオーバーを描く社員(関数)
    if (m == 3)kachi(); //かち ゲームクリアを描く社員(関数)


        if (a == 0)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, aka, true);
        if (a == 1)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, midori, true);
        if (a == 2)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, ao, true);
などは、switch文を使って書くこともできます。
switch文は次のように使います。
  switch(m){
   case 0:
     A;
     break;
   case 1:
     B;
     break;
   case 2:
     C;
     break;
   ・
   ・
  default:
    break;
}
これは、
mの値の0のときはA;を
mの値の1のときはB;を
mの値の2のときはC;を
      ・
      ・
default: はいずれでもないときを意味します。
尚、今回の事例
   case 0:
     A;
     break;
では、
break;以外の命令文はひとつとなっていますが、
いくつでも入れられます。
ではみなさん、switch文を使って書き換えてみましょう。




第4話へ  第6話へ
a

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

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