#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] = { //ｘ座標に加える数
-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 hajimenojikoku; //始めの時刻を入れる整数型の箱
void syokika(); //初期化を行う社員
void kesu(); //そろった正方形を消す社員
int tokuten; //ゲームスコアをカウントする変数
int iro; //ブロックの色をランダムに選ぶ
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;
		}
	}
	tokuten=0;
}
void kesu(){
	char h=1,i,j,ik=25;
	for(i=25;i>0;i--){
		for(j=1;j<11;j++){
			if(chizumodosu[j][i]==1){ //地図配置を元に戻す1:可0:不可
				ik=i;
				h=0;
				break;
			}
		}
		if(h==0){
			break;
		}
	}
	if(ik<25){
		for(i=ik;i>0;i--){
			for(j=1;j<11;j++){
				if(chizumodosu[j][i]==0){
					chizu[j][i+(25-ik)]=chizu[j][i];
				}
				chizumodosu[j][i+(25-ik)]=chizumodosu[j][i];
			}
		}
		tokuten+=(25-ik)*100;
		if(tokuten>=2000)m=3;
	}
}
void block(){
	int i,j,l;
	y=(GetNowCount()-hajimenojikoku)/200;
	char h;
	if (jyu(KEY_INPUT_Z) != 0){
		h=1;
		for(i=0;i<4;i++){
			if(chizumodosu[x+p[s][k][i]-1][y+q[s][k][i]]==0){
				h=0;
				break;
			}
		}
		if(h==1)x--;
	}	
	
	if (jyu(KEY_INPUT_C) != 0){
		h=1;
		for(i=0;i<4;i++){
			if(chizumodosu[x+p[s][k][i]+1][y+q[s][k][i]]==0){
				h=0;
				break;
			}
		}
		if(h==1)x++;
	}

	if(jyu(KEY_INPUT_SPACE) != 0){
		h=1;
		for(i=0;i<4;i++){
			if(chizumodosu[x+p[s][(k+1)%4][i]][y+q[s][(k+1)%4][i]]==0){
				h=0;
				break;
			}
		}
		if(h==1)k=(k+1)%4;
	}
	
	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 + 7*s + iro;
		}
	}
	for(i=0;i<7;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);
					if(i==4)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, siro, true);
					if(i==5)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, midori, true);
					if(i==6)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, murasaki, true);
				}
			}
		}
	}
	for(i=0;i<7;i++){
		for (j = 0; j < 12; j++) {
			for (l = 0; l < 27; l++) {
				if (chizu[j][l] == 9 + 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);
					if(i==4)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, siro, true);
					if(i==5)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, midori, true);
					if(i==6)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, murasaki, true);
				}
			}
		}
	}
	for(i=0;i<7;i++){
		for (j = 0; j < 12; j++) {
			for (l = 0; l < 27; l++) {
				if (chizu[j][l] == 16 + 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);
					if(i==4)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, siro, true);
					if(i==5)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, midori, true);
					if(i==6)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, murasaki, true);
				}
			}
		}
	}
	for(i=0;i<7;i++){
		for (j = 0; j < 12; j++) {
			for (l = 0; l < 27; l++) {
				if (chizu[j][l] == 23 + 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);
					if(i==4)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, siro, true);
					if(i==5)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, midori, true);
					if(i==6)	DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, murasaki, true);
				}
			}
		}
	}

	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;
		kesu();
		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°回転
		iro=rand()% 7; //ブロックの色をランダムに設定
				
		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(); //ブロックを描く
	SetFontSize(28); //フォントサイズを32に変更
	DrawFormatString(240, 300, siro, "ゲームスコア："); // 文字を描画する
	DrawFormatString(300, 350, siro, "%d",tokuten); // 文字を描画する
}
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;
}