第9講 テトリス開発(ゲームオーバー設定まで)
第2話 ブロックを↓で床に下ろしていく
ブロックを床に落としていくコード例
#include "DxLib.h"
#include<stdlib.h> //乱数を発生させるrand()を使うために必要
#include<time.h> //time()使用するために必要
void hajimennogamen(); //ゲームの最初の画面を担当する社員
void gamemain(); //ゲーム画面を担当する社員
void make(); //ゲームオーバー画面を担当する社員
void kachi(); //ゲームクリア画面を担当する社員
char m; //ゲームモードを決定する整数 0:ゲームの最初の画面 1:ゲーム画面 2:ゲームオーバー 3:ゲームクリア画面
int x=4,y=3; //整数型の箱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); //紫色の出席番号収納する箱
char taisyoutonarukey_mae[100];
char jyu(int taisyoutonarukey);
void chizusakusei(); //地図作成(壁建設)社員
char chizu[12][27]; //配置担当
void block(); //ブロックを描く社員
char p[4][4][4] = {
-1,0,1,2,
0,0,0,0,
-2,-1,0,1,
0,0,0,0,

0,1,1,0,
0,1,1,0,
-1,0,0,-1,
-1,0,0,-1,

0,0,0,1,
0,0,1,2,
-1,0,0,0,
-2,-1,0,0,

0,0,1,1,
-1,0,0,1,
-1,-1,0,0,
-1,0,0,1
};
char q[4][4][4] = {
0,0,0,0,
-1,0,1,2,
0,0,0,0,
-2,-1,0,1,

-1,-1,0,0,
0,0,1,1,
0,0,1,1,
-1,-1,0,0,

-2,-1,0,0,
1,0,0,0,
0,0,1,2,
0,0,0,-1,

-1,0,0,1,
1,1,0,0,
-1,0,0,1,
0,0,-1,-1
};
//sはブロックの種類 0:長方形 1:正方形 2:L字 3:N字
//kは回転状態 0:元の状態 1:90°回転 2:180°回転 3:270°回転
char s,k;
char t; //0:作動停止 1:作動
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(440, 540, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  m=1;
  
t=1; //0:作動停止 1:作動
  srand((unsigned) time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
  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 block(){
  int i,j;
  if (jyu(KEY_INPUT_DOWN) != 0)y++;
  for(i=0;i<4;i++)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
  for (i = 0; i < 12; i++) {
    for (j = 0; j < 27; j++) {
      if (chizu[i][j] == 2 + s) {
        if(s==0)  DrawBox(20 * i, 20 * j, 20 * (i + 1) - 1, 20 * (j + 1) - 1, kiiro, true);
        if(s==1)  DrawBox(20 * i, 20 * j, 20 * (i + 1) - 1, 20 * (j + 1) - 1, mizuiro, true);
        if(s==2)  DrawBox(20 * i, 20 * j, 20 * (i + 1) - 1, 20 * (j + 1) - 1, aka, true);
        if(s==3)  DrawBox(20 * i, 20 * j, 20 * (i + 1) - 1, 20 * (j + 1) - 1, ao, true);
      }
    }
  }
  
if(y>=23){
    t=1; //0:作動停止 1:作動
    y=3;
  }

}
void chizusakusei() {
  int gazou = LoadGraph("画像/kb00.png");
  int i,j;
  for (i = 0; i < 12; i++) {
    for (j = 0; j < 27; j++) {
      chizu[i][j] = 0;
    }
  }
  for (j = 0; j < 27; j++) {
    chizu[0][j] = 1;
    chizu[11][j] = 1;
  }
  for (i = 1; i < 11; i++) {
    chizu[i][0] = 1;
    chizu[i][26] = 1;
  }
  for (i = 0; i < 12; i++) {
    for (j = 0; j < 27; j++) {
      if (chizu[i][j] == 1) {
        DrawGraph(20 * i, 20 * j, gazou, true);
      }
    }
  }
  DeleteGraph(gazou);
}
void hajimennogamen(){ //ゲームの最初の画面
  int gazou;
  gazou = LoadGraph("画像/02.png");
  DrawGraph(0, 0, gazou, true);
  if (jyu(KEY_INPUT_RETURN) != 0) m=1;
}
void gamemain(){ //ゲーム画面
  chizusakusei(); //地図作成(壁建設)
  if(t==1){
    s=rand()%4; //sはブロックの種類 0:長方形 1:正方形 2:L字 3:N字
    k=rand()%4; //kは回転状態 0:元の状態 1:90°回転 2:180°回転 3:270°回転
    t=0;
  }

  block(); //ブロックを描く
}
void make(){ //ゲームオーバー画面
  int gazou;
  gazou = LoadGraph("画像/03.png");
  DrawGraph(0, 0, gazou, true);
  if (jyu(KEY_INPUT_RETURN) != 0) m=3;
}
void kachi(){ //ゲームクリア画面
  int gazou;
  gazou = LoadGraph("画像/04.png");
  DrawGraph(0, 0, gazou, true);
  if (jyu(KEY_INPUT_RETURN) != 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;
}
コピペ用添付ファイル

見事に、
この辺で下に動かすと、となっているでしょう。

本当に面白いですね。
では予告しておいたとおり、
次の課題は、
001 002 003 004
005 006 007 008
009 010 011 012
013 014 015 016
のいかなる場合でも正確に床に着いたという判定を行うことです。
ヒントは、for文とif文を組み合わせます。



第1話へ  第3話へ

002

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

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