第14講 ブロック崩しその2

第8話 ブロック崩しの完成!
完成コード例(全文記載)
#include "DxLib.h"
void hajimennogamen(); //ゲームの最初の画面を担当する社員
void gamemain(); //ゲーム画面を担当する社員
void make(); //ゲームオーバー画面を担当する社員
void kachi(); //ゲームクリア画面を担当する社員
char m; //ゲームモードを決定する整数 0:ゲームの最初の画面 1:ゲーム画面 2:ゲームオーバー 3:ゲームクリア画面
int m_x,m_y; //ボール(丸)のx座標とy座標
int b_x,b_y; //barのx座標とy座標
int h; //画像に付けられた出席番号を収納する箱を用意
int siro = GetColor(255, 255, 255); //白色の出席番号収納する箱
int kiiro = GetColor(255, 255, 0); //黄色の出席番号収納する箱
int aka = GetColor(255, 0, 0); //赤色の出席番号を収納する箱
int midori = GetColor(0, 255, 0); //白色の出席番号収納する箱
int ao = GetColor(0, 0, 255); //青色の出席番号収納する箱
int mizuiro = GetColor(0, 255, 255); //水色の出席番号を収納する箱
int murasaki = GetColor(255, 0, 255); //紫色の出席番号収納する箱
int irosentaku[3]={ao,aka,midori};
char taisyoutonarukey_mae[100];
char jyu(int taisyoutonarukey);
const char mukikae=-1; //むきかえ 方向チェンジ
char muki[2]={1,1}; //むき [0]:xの方向 [1]:yの方向
void syokika(); //ゲームを最初の状態に戻す社員
char x_hayasa,y_hayasa; //x_hayasa:x方向の速さ y_hayasa:y方向の速さ
char b_nagasa; //バーの長さ
char arunasi[10][10]; //ブロックのあるなし 0:なし 1:あり
int tokuten; //ゲームスコアをカウントする変数
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(600, 800, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  m=0;
  syokika(); //ゲームを最初の状態に戻す

  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    if(m==0)hajimennogamen();
    if(m==1)gamemain();
    if(m==2)make();
    if(m==3)kachi();
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
void syokika(){
  m_x=25,m_y=750; //ボール(丸)のx座標とy座標の初期化
  b_x=0,b_y=760; //barのx座標とy座標の初期化
  char i,j;
  for(i=0;i<10;i++){
    for(j=0;j<10;j++){
      arunasi[i][j]=1;
    }
  }
  tokuten=0;
}
void hajimennogamen(){ //ゲームの最初の画面
  int gazou;
  gazou = LoadGraph("画像/06.png");
  DrawGraph(0, 0, gazou, true);
  if (jyu(KEY_INPUT_Q) != 0){
    x_hayasa=1;
    y_hayasa=3;
    b_nagasa=100;
    syokika();
    m=1;
  }
  if (jyu(KEY_INPUT_A) != 0){
    x_hayasa=2;
    y_hayasa=4;
    b_nagasa=50;
    syokika();
    m=1;
  }
  if (jyu(KEY_INPUT_Z) != 0){
    x_hayasa=6;
    y_hayasa=6;
    b_nagasa=30;
    syokika();
    m=1;
  }
}
void gamemain(){ //ゲーム画面
  if(m_y>810)m=2;
  
if(tokuten==1000)m=3;
  DrawCircle(m_x,m_y,10,kiiro,true);
  if(m_x<10 || m_x > 590)muki[0] *= mukikae;
  if(m_y<10)muki[1] *= mukikae;
  if(m_x >= b_x && m_x <= b_x + b_nagasa){
    if(m_y >= b_y -10 && m_y <= b_y) muki[1] *= mukikae;
  }
  char i,j;
  for(i=0;i<10;i++){
    for(j=0;j<10;j++){
      if(arunasi[j][i]==1){
        if(m_x >= 60 * j && m_x <= 60 * (j + 1)){
          if(m_y >= 70 + 20 * (i + 1) && m_y <= 70 + 20 * (i + 1) + 10){
            muki[1] *= mukikae;
            arunasi[j][i]=0;
            tokuten+=10;
          }
          if(m_y >= 70 + 20 * i - 10 && m_y <= 70 + 20 * i){
            muki[1] *= mukikae;
            arunasi[j][i]=0;
            tokuten+=10;
          }
        }
        if(m_y >= 70 + 20 * i && m_y <= 70 + 20 * (i + 1)){
          if(m_x >= 60 * i - 10 && m_x <= 60 + 20 * i){
            muki[1] *= mukikae;
            arunasi[j][i]=0;
            tokuten+=10;
          }
          if(m_x >= 60 * (i + 1) && m_x <= 60 + 20 * (i + 1) + 10){
            muki[1] *= mukikae;
            arunasi[j][i]=0;
            tokuten+=10;
          }
        }
      }
    }
  }
  m_x+=muki[0]*x_hayasa;
  m_y+=muki[1]*y_hayasa;
  if(CheckHitKey(KEY_INPUT_RIGHT)!=0 && b_x <= 600-b_nagasa)b_x += 5;
  if(CheckHitKey(KEY_INPUT_LEFT )!=0 && b_x >= 0)b_x -= 5;
  DrawBox(b_x,b_y,b_x+b_nagasa,b_y+10,siro,true);
  for(i=0;i<10;i++){
    for(j=0;j<10;j++){
      if(arunasi[j][i]==1){
        DrawBox(60*j,70+20*i,60*(j+1),70+20*(i+1),irosentaku[(10*i+j)%3],true);
      }
    }
  }
  SetFontSize(32); //フォントサイズを32に変更
  DrawFormatString(280, 400,mizuiro, "ゲームスコア:%d",tokuten); // 文字を描画する
}
void make(){ //ゲームオーバー画面
  int gazou;
  gazou = LoadGraph("画像/07.png");
  DrawGraph(0, 0, gazou, true);
  if (jyu(KEY_INPUT_RETURN) != 0){
    syokika();
    m=1;
  }
  if (jyu(KEY_INPUT_Z) != 0){
    m=0;
  }
}
void kachi(){ //ゲームクリア画面
  int gazou;
  gazou = LoadGraph("画像/08.png");
  DrawGraph(0, 0, gazou, true);
  
if (jyu(KEY_INPUT_RETURN) != 0){
    syokika();
    m=1;
  }
  if (jyu(KEY_INPUT_Z) != 0){
    m=0;
  }

}
char jyu(int taisyoutonarukey) { //taisyoutonarukey(たいしょうとなるキー)は、今対象としているキーの出席番号
  if (CheckHitKey(taisyoutonarukey) != 0) {
    if (taisyoutonarukey_mae[taisyoutonarukey] == 0) {
      taisyoutonarukey_mae[taisyoutonarukey] = 1;
      return 1;
    }
  }
  else {
    taisyoutonarukey_mae[taisyoutonarukey] = 0;
    return 0;
  }
  return 0;
}
コピペ用添付ファイル


やっとブロック崩しが完成しました。
次講では、基礎に戻り構造体ついて学びます。


第7話へ   第15講第1話へ

第2部目次に戻る  第1部目次に戻る

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

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