Created
August 9, 2019 08:55
-
-
Save Yoosuke/3e82dc36fa27d83db9e066be0909d023 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// PH18_c.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 | |
#include <stdio.h> | |
// _getch();を利用する為 | |
#include <conio.h> | |
//system(cls)を利用する為 | |
#include <stdlib.h> | |
//memset()関数を利用する為 & memcopy()関数を利用する為 | |
#include <string.h> | |
//time()関数を利用する為 | |
#include <time.h> | |
//bool型を利用する為 | |
#include <stdbool.h> | |
//定数フィールド | |
#define FIELD_WIDTH 12 | |
#define FILED_HEIGHT 22 | |
#define MINO_WIDTH 4 | |
#define MINO_HEIGHT 4 | |
//MINOTYPEを列挙型で定義 | |
enum MINO_TYPE{ | |
MINO_TYPE_I, | |
MINO_TYPE_O, | |
MINO_TYPE_S, | |
MINO_TYPE_Z, | |
MINO_TYPE_J, | |
MINO_TYPE_L, | |
MINO_TYPE_T, | |
MINO_TYPE_MAX | |
}; | |
enum MINO_ANGLE{ | |
MINO_ANGLE_0, | |
MINO_ANGLE_90, | |
MINO_ANGLE_180, | |
MINO_ANGLE_270, | |
MINO_ANGLE_MAX | |
}; | |
int minoX = 5; | |
int minoY = 0; | |
int type = rand() % MINO_TYPE_MAX; //rand() % 7の場合割ったあまりの数 0 ~ 6の数値を返す | |
int angle = rand() % MINO_ANGLE_MAX; | |
//minoShapesにminoの型を定義 | |
char minoShapes[MINO_TYPE_MAX][MINO_ANGLE_MAX][MINO_WIDTH][MINO_HEIGHT] = { | |
//MINO_TYPE_I | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,1,0,0, | |
0,1,0,0, | |
0,1,0,0, | |
0,1,0,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
0,0,0,0, | |
1,1,1,1, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,0,1,0, | |
0,0,1,0, | |
0,0,1,0, | |
0,0,1,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
1,1,1,1, | |
0,0,0,0 | |
} | |
}, | |
//MINO_TYPE_O | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
1,1,0,0, | |
1,1,0,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
1,1,0,0, | |
1,1,0,0, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,0,1,1, | |
0,0,1,1, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
0,0,1,1, | |
0,0,1,1 | |
}, | |
}, | |
//MINO_TYPE_S | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
0,1,1,0, | |
1,1,0,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
1,0,0,0, | |
1,1,0,0, | |
0,1,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,0,1,1, | |
0,1,1,0, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,0,1,0, | |
0,0,1,1, | |
0,0,0,1 | |
}, | |
}, | |
//MINO_TYPE_Z | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
0,1,1,0, | |
0,0,1,1 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
0,0,0,0, | |
0,1,0,0, | |
1,1,0,0, | |
1,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
1,1,0,0, | |
0,1,1,0, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,1, | |
0,0,1,1, | |
0,0,1,0, | |
0,0,0,0 | |
}, | |
}, | |
//MINO_TYPE_J | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
0,1,0,0, | |
0,1,0,0, | |
1,1,0,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
1,0,0,0, | |
1,1,1,0, | |
0,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,0,1,1, | |
0,0,1,0, | |
0,0,1,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,0,0,0, | |
0,1,1,1, | |
0,0,0,1 | |
} | |
}, | |
//MINO_TYPE_L | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
0,1,0,0, | |
0,1,0,0, | |
0,1,1,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
0,0,0,0, | |
1,1,1,0, | |
1,0,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,1,1,0, | |
0,0,1,0, | |
0,0,1,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,0,0,1, | |
0,1,1,1, | |
0,0,0,0 | |
} | |
}, | |
//MINO_TYPE_T | |
{ | |
//MINO_ANGLE_0 | |
{ | |
0,0,0,0, | |
1,1,1,0, | |
0,1,0,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_90 | |
{ | |
0,0,1,0, | |
0,1,1,0, | |
0,0,1,0, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_180 | |
{ | |
0,0,0,0, | |
0,0,1,0, | |
0,1,1,1, | |
0,0,0,0 | |
}, | |
//MINO_ANGLE_270 | |
{ | |
0,0,0,0, | |
0,1,0,0, | |
0,1,1,0, | |
0,1,0,0 | |
} | |
} | |
}; | |
char fieldBuffer[FILED_HEIGHT][FIELD_WIDTH]; //レイヤー構造の上層 | |
char field[FILED_HEIGHT][FIELD_WIDTH];//レイヤー構造の下層 | |
//Mino Writing Method | |
void minoWrite(int minoY, int minoX, int type, int angle) { | |
//フィールドバッファの配列にミノの配列の0,1の値を入れている | |
for (int j = 0; j < MINO_HEIGHT; j++) | |
for (int i = 0; i < MINO_WIDTH; i++) | |
fieldBuffer[minoY + j][minoX + i] |= minoShapes[type][angle][j][i]; | |
} | |
//FiledSet LayerSet Method | |
void filedSet(void) { | |
//fieldの領域をall->0で確保 memset(アドレス値, セットしたい値, サイズ); | |
memset(field, 0, sizeof(field)); | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
// 000000000000 | |
//field の配列の初期値を0で初期化 | |
for (int j = 0; j < FILED_HEIGHT; j++) { | |
if (j == 0 || j == FILED_HEIGHT - 1) { | |
for (int i = 0; i < FIELD_WIDTH; i++) | |
j == 0 ? field[j][i] = 0 : field[j][i] = 1; | |
} | |
else { | |
for (int i = 0; i < FIELD_WIDTH; i++) | |
i == 0 || i == FIELD_WIDTH - 1 ? field[j][i] = 1 : field[j][i] = 0; | |
} | |
} | |
} | |
void display() { | |
system("cls"); | |
for (int j = 0; j < FILED_HEIGHT; j++) { | |
for (int i = 0; i < FIELD_WIDTH; i++) { | |
printf(fieldBuffer[j][i] ? "■" : " "); | |
} | |
printf("\n"); | |
} | |
} | |
//ブール型の関数でミノとフィールドの値が両方とも1だったらtrueを返す | |
bool isHit(int _minoX, int _minoY, int _minoType, int _minoAngle) { | |
for (int i = 0; i < MINO_HEIGHT; i++) | |
for (int j = 0; j < MINO_WIDTH; j++) | |
if (minoShapes[_minoType][_minoAngle][i][j] | |
&& field[_minoY + i][_minoX + j]) | |
return true; | |
return false; | |
} | |
void resetMino() { | |
minoX = 5; | |
minoY = 0; | |
type = rand() % MINO_TYPE_MAX; //rand() % 7の場合割ったあまりの数 0 ~ 6の数値を返す | |
angle = rand() % MINO_ANGLE_MAX; | |
} | |
int main(){ | |
time_t timer = time(NULL); | |
//フィールド領域の生成 | |
filedSet(); | |
while (1) { | |
//メモリコピーでフィールドの値をフィールドバッファにセットしている | |
memcpy(fieldBuffer, field, sizeof(field)); | |
//ミノを描画 | |
minoWrite(minoY, minoX, type, angle); | |
if (_kbhit()) { | |
switch (_getch()) { | |
case 'a': | |
if (!isHit(minoX-1, minoY, type, angle)) | |
minoX -= 1; | |
break; | |
case 's': | |
if (!isHit(minoX, minoY + 1, type, angle)) | |
minoY += 1; | |
break; | |
case 'd': | |
if (!isHit(minoX + 1, minoY, type, angle)) | |
minoX += 1; | |
break; | |
case 0x20: | |
if (!isHit(minoX, minoY, type, (angle + 1) % MINO_ANGLE_MAX)) | |
angle = (angle + 1) % MINO_ANGLE_MAX; | |
break; | |
} | |
display(); | |
} | |
//現在時刻と比較して現在時刻でなかったら処理する | |
if (timer != time(NULL)) { | |
//現在時刻をtimer変数に入力している | |
timer = time(NULL); | |
//フィールドバッファを表示している | |
display(); | |
if (!isHit(minoX, minoY + 1, type, angle)) { | |
minoY += 1; | |
} | |
else { | |
memcpy(field, fieldBuffer, sizeof(fieldBuffer)); | |
resetMino(); | |
} | |
} | |
//コンソールへのchar入力受付関数で入力待ち状態を作る | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment