Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.02 KB | None | 0 0
  1. // Tetoris.cpp : アプリケーションのエントリ ポイントを定義します。
  2. #include "stdafx.h"
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <stdbool.h>
  7. //定数定義
  8. #define FILED_WIDTH 12
  9. #define FILED_HEIGHT 22
  10. #define MINO_WIDHT 4
  11. #define MINO_HEIGHT 4
  12. enum {
  13. MINO_TYPE_I,
  14. MINO_TYPE_O,
  15. MINO_TYPE_S,
  16. MINO_TYPE_Z,
  17. MINO_TYPE_J,
  18. MINO_TYPE_L,
  19. MINO_TYPE_T,
  20. MINO_TYPE_END
  21. };
  22. enum {
  23. MINO_ANGLE_0,
  24. MINO_ANGLE_90,
  25. MINO_ANGLE_180,
  26. MINO_ANGLE_270,
  27. MINO_ANGLE_END
  28. };
  29. //グローバル変数
  30. char field[FILED_HEIGHT][FILED_WIDTH];//レイヤー構造の下層
  31. char fieldBuffer[FILED_HEIGHT][FILED_WIDTH]; //レイヤー構造の上層
  32. char mino[MINO_TYPE_END][MINO_ANGLE_END][MINO_HEIGHT][MINO_WIDHT];
  33. char minoShapes[MINO_TYPE_END][MINO_ANGLE_END][MINO_HEIGHT][MINO_WIDHT];
  34. int n = 0;
  35. //ミノの初期値
  36. int minoX = 5;
  37. int minoY = 0;
  38. int minoType = MINO_TYPE_I;
  39. int minoAngle = MINO_ANGLE_0;
  40. //現在時刻の取得
  41. time_t t = time(NULL);//tに現在時刻を入力
  42. //プロトタイプ宣言
  43. bool isHit(int, int, int, int);
  44. void resetMino();
  45. void display();
  46. //main関数
  47. int main() {
  48. //ミノの準備
  49. memset(minoShapes, 0, sizeof(minoShapes));
  50. FILE *fp;
  51. errno_t error;
  52. // error = fopen_s(&fp, "minoShapse.txt", "w"); //書き込み
  53. error = fopen_s(&fp, "minoShapse.txt", "r");
  54. if (error != 0) {
  55. printf("ファイルを開けませんでした\n");
  56. }
  57. for (int i = 0; i < MINO_TYPE_END; i++) {
  58. for (int j = 0; j < MINO_ANGLE_END; j++) {
  59. for (int h = 0; h < MINO_HEIGHT; h++) {
  60. for (int w = 0; w < MINO_WIDHT; w++) {
  61. // fprintf_s(fp, "%d", minoShapes[i][j][h][w]); //書き込み
  62. fscanf_s(fp, "%c", &(mino[i][j][h][w])); //読み込み
  63. mino[i][j][h][w]=='1' ? minoShapes[i][j][h][w] = 1 : minoShapes[i][j][h][w] = 0;
  64. }
  65. }
  66. }
  67. }
  68. fclose(fp);
  69. //フィールドの準備
  70. memset(field, 0, sizeof(field));
  71. for (int i = 0; i < FILED_HEIGHT; i++)
  72. field[i][0] = field[i][FILED_WIDTH - 1] = 1;
  73. for (int i = 0; i < FILED_WIDTH; i++)
  74. field[FILED_HEIGHT - 1][i] = 1;
  75. //ゲーム処理
  76. while (1) {
  77. memcpy(fieldBuffer, field, sizeof(field));
  78. for (int i = 0; i < MINO_HEIGHT; i++)
  79. for (int j = 0; j < MINO_WIDHT; j++)
  80. fieldBuffer[minoY + i][minoX + j] |= minoShapes[minoType][minoAngle][i][j];
  81. if (_kbhit()) {
  82.  
  83. switch (_getch()) {
  84. case's':
  85. if (!isHit(minoX, minoY + 1, minoType, minoAngle))
  86. minoY++;
  87. break;
  88. case'a':
  89. if (!isHit(minoX - 1, minoY, minoType, minoAngle))
  90. minoX--;
  91. break;
  92. case'd':
  93. if (!isHit(minoX + 1, minoY, minoType, minoAngle))
  94. minoX++;
  95. break;
  96. case 0x20:
  97. if (!isHit(minoX, minoY, minoType, (minoAngle + 1) % MINO_ANGLE_END))
  98. minoAngle = (minoAngle + 1) % MINO_ANGLE_END;
  99. break;
  100. }
  101. display();
  102. }
  103. for (int i = 0; i < FILED_HEIGHT - 1; i++) {
  104. bool lineFill = true;
  105. for (int j = 1; j < FILED_WIDTH - 1; j++) {
  106. if (!field[i][j])
  107. lineFill = false;
  108. }
  109. if (lineFill) {
  110. for (int k = i; k > 0; k--) {
  111. memcpy(field[k], field[k - 1], FILED_WIDTH);
  112. }
  113. }
  114. }
  115. if (t != time(NULL)) {
  116. t = time(NULL);
  117. display();
  118. if (!isHit(minoX, minoY + 1, minoType, minoAngle))
  119. minoY++;
  120. else {
  121. memcpy(field, fieldBuffer, sizeof(fieldBuffer));
  122. for (int i = 0; i < FILED_HEIGHT - 1; i++) {
  123. bool lineFill = true;
  124. for (int j = 1; j < FILED_WIDTH - 1; j++) {
  125. if (!field[i][j])
  126. lineFill = false;
  127. }
  128. if (lineFill) {
  129. for (int k = i; k > 0; k--) {
  130. memcpy(field[k], field[k - 1], FILED_WIDTH);
  131. }
  132. }
  133. resetMino();
  134. }
  135. }
  136. }
  137. }
  138. }
  139. bool isHit(int _minoX, int _minoY, int _minoType, int _minoAngle) {
  140. for (int i = 0; i < MINO_HEIGHT; i++)
  141. for (int j = 0; j < MINO_WIDHT; j++)
  142. if (minoShapes[_minoType][_minoAngle][i][j]
  143. && field[_minoY + i][_minoX + j])
  144. return true;
  145. return false;
  146. }
  147. void resetMino() {
  148. minoX = 5;
  149. minoY = 0;
  150. minoType = rand() % MINO_TYPE_END;
  151. minoAngle = rand() % MINO_ANGLE_END;
  152. }
  153. void display() {
  154. system("cls");
  155. for (int i = 0; i < FILED_HEIGHT; i++) {
  156. for (int j = 0; j < FILED_WIDTH; j++)
  157. printf(fieldBuffer[i][j] ? "■" : " ");
  158. printf("\n");
  159. }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement