Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement