Skip to content

Instantly share code, notes, and snippets.

@Yoosuke
Created August 9, 2019 08:55
Show Gist options
  • Save Yoosuke/3e82dc36fa27d83db9e066be0909d023 to your computer and use it in GitHub Desktop.
Save Yoosuke/3e82dc36fa27d83db9e066be0909d023 to your computer and use it in GitHub Desktop.
// 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