第9講 テトリス開発(ゲームオーバー設定まで)
第9話 ゲームオーバー設定
を実現するコード例(全文記載)
#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,y; //整数型の箱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]; //配置担当
char chizumodosu[12][27]; //地図配置を元に戻す 1:可 0:不可
void block(); //ブロックを描く社員
char p[4][4][4] = { //x座標に加える数
-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] = { //y座標に加える数
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 hajimenojikoku; //始めの時刻を入れる整数型の箱
void syokika(); //初期化を行う社員
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=0;
t=0; //0:作動 1:作動停止
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(){ //ゲームの最初の設定を行う
srand((unsigned) time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
hajimenojikoku=GetNowCount(); //ゲーム起動時の時刻をゲット
int i,j;
for(i=0;i<12;i++){
for(j=0;j<27;j++){
chizumodosu[i][j]=1;
}
}
}
void block(){
int i,j,l;
y=(GetNowCount()-hajimenojikoku)/50;
for(i=0;i<4;i++){
//sはブロックの種類 0:長方形 1:正方形 2:L字 3:N字
//kは回転状態 0:元の状態 1:90°回転 2:180°回転 3:270°回転
if(chizumodosu[x+p[s][k][i]][y+q[s][k][i]]==1){
if(y+q[s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]] = 2 + s;
}
}
for(i=0;i<4;i++){
for (j = 0; j < 12; j++) {
for (l = 0; l < 27; l++) {
if (chizu[j][l] == 2 + i) {
if(i==0) DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, kiiro, true);
if(i==1) DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, mizuiro, true);
if(i==2) DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, aka, true);
if(i==3) DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, ao, true);
}
}
}
}
char h=1;
for(i=0;i<4;i++){
if(y+q[s][k][i]+1>0 && chizumodosu[x+p[s][k][i]][y+q[s][k][i]+1]==0){
h=0;
break;
}
}
if(h==0){
for(i=0;i<4;i++)chizumodosu[x+p[s][k][i]][y+q[s][k][i]]=0;
t=0; //0:作動 1:作動停止
hajimenojikoku=GetNowCount();
}
for(i=0;i<4;i++){ //ゲームオーバー設定
if(y+q[s][k][i]==1 && chizumodosu[x+p[s][k][i]][y+q[s][k][i]]==0){
m=2;
}
}
}
void chizusakusei() {
int gazou = LoadGraph("画像/kb00.png");
int i,j;
for (i = 0; i < 12; i++) {
for (j = 0; j < 27; j++) {
if(chizumodosu[i][j]==1){
chizu[i][j] = 0;
}
}
}
for (j = 0; j < 27; j++) {
chizu[0][j] = 1;
chizu[11][j] = 1;
chizumodosu[0][j] = 0;
chizumodosu[11][j] = 0;
}
for (i = 1; i < 11; i++) {
chizu[i][0] = 1;
chizu[i][26] = 1;
chizumodosu[i][0] = 0;
chizumodosu[i][26] = 0;
}
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;
syokika();
}
}
void gamemain(){ //ゲーム画面
chizusakusei(); //地図作成(壁建設)
if(t==0){
s=rand()%4; //sはブロックの種類 0:長方形 1:正方形 2:L字 3:N字
k=rand()%4; //kは回転状態 0:元の状態 1:90°回転 2:180°回転 3:270°回転
if(s==0){
if(k==0)x=1+rand()%8;
if(k==1)x=1+rand()%10;
if(k==2)x=2+rand()%8;
if(k==3)x=1+rand()%10;
}
if(s==1){
if(k==0)x=1+rand()%9;
if(k==1)x=1+rand()%9;
if(k==2)x=2+rand()%9;
if(k==3)x=2+rand()%9;
}
if(s==2){
if(k==0)x=1+rand()%9;
if(k==1)x=1+rand()%8;
if(k==2)x=2+rand()%9;
if(k==3)x=3+rand()%8;
}
if(s==3){
if(k==0)x=1+rand()%9;
if(k==1)x=2+rand()%8;
if(k==2)x=2+rand()%9;
if(k==3)x=2+rand()%8;
}
t=1;
}
block(); //ブロックを描く
}
void make(){ //ゲームオーバー画面
int gazou;
gazou = LoadGraph("画像/03.png");
DrawGraph(0, 0, gazou, true);
if (jyu(KEY_INPUT_RETURN) != 0){
m=1;
syokika();
}
if (jyu(KEY_INPUT_Z) != 0) m=0;
}
void kachi(){ //ゲームクリア画面
int gazou;
gazou = LoadGraph("画像/04.png");
DrawGraph(0, 0, gazou, true);
if (jyu(KEY_INPUT_RETURN) != 0){
m=1;
syokika();
}
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;
}
コピペ用添付ファイル
今回から
if (jyu(KEY_INPUT_RETURN) != 0){
m=1;
syokika();
}
としてあります。
syokika();によって初期化しておかないと、
ゲームの最初の状態に戻れないからです。
また、
ゲームの開発がある程度進みましたので、
m=0;
に戻しました。
次の課題は、←・→でブロックを動かすことです。
これも優秀な皆さんですから、
ノーヒントで十分ですね。
第8話へ 第10講第1話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ