Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Yoosuke/729d682ad51b827862ee75801d91e81b to your computer and use it in GitHub Desktop.
Save Yoosuke/729d682ad51b827862ee75801d91e81b to your computer and use it in GitHub Desktop.
// Tetoris.cpp : アプリケーションのエントリ ポイントを定義します。
#include "stdafx.h"
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
//定数定義
#define FILED_WIDTH 12
#define FILED_HEIGHT 22
#define MINO_WIDHT 4
#define MINO_HEIGHT 4
enum {
MINO_TYPE_I,
MINO_TYPE_O,
MINO_TYPE_S,
MINO_TYPE_Z,
MINO_TYPE_J,
MINO_TYPE_L,
MINO_TYPE_T,
MINO_TYPE_END
};
enum {
MINO_ANGLE_0,
MINO_ANGLE_90,
MINO_ANGLE_180,
MINO_ANGLE_270,
MINO_ANGLE_END
};
//グローバル変数
char field[FILED_HEIGHT][FILED_WIDTH];//レイヤー構造の下層
char fieldBuffer[FILED_HEIGHT][FILED_WIDTH]; //レイヤー構造の上層
char mino[MINO_TYPE_END][MINO_ANGLE_END][MINO_HEIGHT][MINO_WIDHT];
char minoShapes[MINO_TYPE_END][MINO_ANGLE_END][MINO_HEIGHT][MINO_WIDHT];
int n = 0;
//ミノの初期値
int minoX = 5;
int minoY = 0;
int minoType = MINO_TYPE_I;
int minoAngle = MINO_ANGLE_0;
//現在時刻の取得
time_t t = time(NULL);//tに現在時刻を入力
//プロトタイプ宣言
bool isHit(int, int, int, int);
void resetMino();
void display();
//main関数
int main() {
//ミノの準備
memset(minoShapes, 0, sizeof(minoShapes));
FILE *fp;
errno_t error;
// error = fopen_s(&fp, "minoShapse.txt", "w"); //書き込み
error = fopen_s(&fp, "minoShapse.txt", "r");
if (error != 0) {
printf("ファイルを開けませんでした\n");
}
for (int i = 0; i < MINO_TYPE_END; i++) {
for (int j = 0; j < MINO_ANGLE_END; j++) {
for (int h = 0; h < MINO_HEIGHT; h++) {
for (int w = 0; w < MINO_WIDHT; w++) {
// fprintf_s(fp, "%d", minoShapes[i][j][h][w]); //書き込み
fscanf_s(fp, "%c", &(mino[i][j][h][w])); //読み込み
mino[i][j][h][w]=='1' ? minoShapes[i][j][h][w] = 1 : minoShapes[i][j][h][w] = 0;
}
}
}
}
fclose(fp);
//フィールドの準備
memset(field, 0, sizeof(field));
for (int i = 0; i < FILED_HEIGHT; i++)
field[i][0] = field[i][FILED_WIDTH - 1] = 1;
for (int i = 0; i < FILED_WIDTH; i++)
field[FILED_HEIGHT - 1][i] = 1;
//ゲーム処理
while (1) {
memcpy(fieldBuffer, field, sizeof(field));
for (int i = 0; i < MINO_HEIGHT; i++)
for (int j = 0; j < MINO_WIDHT; j++)
fieldBuffer[minoY + i][minoX + j] |= minoShapes[minoType][minoAngle][i][j];
if (_kbhit()) {
switch (_getch()) {
case's':
if (!isHit(minoX, minoY + 1, minoType, minoAngle))
minoY++;
break;
case'a':
if (!isHit(minoX - 1, minoY, minoType, minoAngle))
minoX--;
break;
case'd':
if (!isHit(minoX + 1, minoY, minoType, minoAngle))
minoX++;
break;
case 0x20:
if (!isHit(minoX, minoY, minoType, (minoAngle + 1) % MINO_ANGLE_END))
minoAngle = (minoAngle + 1) % MINO_ANGLE_END;
break;
}
display();
}
for (int i = 0; i < FILED_HEIGHT - 1; i++) {
bool lineFill = true;
for (int j = 1; j < FILED_WIDTH - 1; j++) {
if (!field[i][j])
lineFill = false;
}
if (lineFill) {
for (int k = i; k > 0; k--) {
memcpy(field[k], field[k - 1], FILED_WIDTH);
}
}
}
if (t != time(NULL)) {
t = time(NULL);
display();
if (!isHit(minoX, minoY + 1, minoType, minoAngle))
minoY++;
else {
memcpy(field, fieldBuffer, sizeof(fieldBuffer));
for (int i = 0; i < FILED_HEIGHT - 1; i++) {
bool lineFill = true;
for (int j = 1; j < FILED_WIDTH - 1; j++) {
if (!field[i][j])
lineFill = false;
}
if (lineFill) {
for (int k = i; k > 0; k--) {
memcpy(field[k], field[k - 1], FILED_WIDTH);
}
}
resetMino();
}
}
}
}
}
bool isHit(int _minoX, int _minoY, int _minoType, int _minoAngle) {
for (int i = 0; i < MINO_HEIGHT; i++)
for (int j = 0; j < MINO_WIDHT; j++)
if (minoShapes[_minoType][_minoAngle][i][j]
&& field[_minoY + i][_minoX + j])
return true;
return false;
}
void resetMino() {
minoX = 5;
minoY = 0;
minoType = rand() % MINO_TYPE_END;
minoAngle = rand() % MINO_ANGLE_END;
}
void display() {
system("cls");
for (int i = 0; i < FILED_HEIGHT; i++) {
for (int j = 0; j < FILED_WIDTH; j++)
printf(fieldBuffer[i][j] ? "■" : " ");
printf("\n");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment