c++でテトリスを作ったのですがホールドとネクストの作り方がわかりません.教えてください.

実現したいこと

・ホールド機能と,ネクスト機能の作成

前提

visual studio 2022でテトリスを作ってます.
ホールド機能とネクスト機能を作ろうとしましたが,どのようにすればいいかわかりません.教えてください.

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

c++

#include <stdio.h> #include <windows.h> #include <conio.h> #include <stdlib.h> #include <time.h> #pragma warning(disable:4996) int canvas[21][12] = { 0 }; int field[21][12] = { 0 }; int x, y; int gameover = 0; int waittime = 1000; int g, oneline, twoline, threeline, fourline, score = 0,count=0; int block[7][4][4] = { { {0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0} }, { {0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0} }, { {0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0} }, { {0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0} }, { {0,0,0,0},{0,1,1,0},{0,1,0,0},{0,1,0,0} }, { {0,0,0,0},{0,1,1,0},{0,0,1,0},{0,0,1,0} }, { {0,0,0,0},{0,1,0,0},{1,1,1,0},{0,0,0,0} } }; void Initialize(void); void ShowGameField(void); void MoveBlock(int x2, int y2); int CheckOverlap(int x2, int y2); void AddCanvas(void); int CreateBlock(void); void ControlBlock(void); void DropBlock(void); int TurnBlock(); void CheckLines(); void* h = GetStdHandle(STD_OUTPUT_HANDLE); void HardDrop(); void Finish(); int main(void) { int time1 = 0; system("cls"); Initialize(); while (gameover != 1) { if (kbhit()) { ControlBlock(); } if (time1 < 20000) { time1++; } else { DropBlock(); time1 = 0; /*Sleep(300);*/ } } system("cls"); Finish(); return 0; } void Initialize() { int i, j; for (i = 0; i < 21; i++) { for (j = 0; j < 12; j++) { if (i == 20 || j == 0 || j == 11) { canvas[i][j] = 9; } else { canvas[i][j] = 0; } } } for (i = 0; i < 21; i++) { for (j = 0; j < 12; j++) { field[i][j] = canvas[i][j]; } } CreateBlock(); ShowGameField(); } void ShowGameField() { int i, j; SetConsoleTextAttribute(h, 0x3E); system("cls"); for (i = 0; i < 21; i++) { for (j = 0; j < 12; j++) { if (canvas[i][j] == 9) { printf("□"); } else if (field[i][j] == 1) { printf("■"); } else { printf(" "); } } printf("\n"); } printf(" score:%d", score); } void MoveBlock(int x2, int y2) { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { field[y + i][x + j] -= block[g][i][j]; } } x = x2; y = y2; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { field[y + i][x + j] += block[g][i][j]; } } ShowGameField(); } int CheckOverlap(int x2, int y2) { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (block[g][i][j] == 1) { if (canvas[y2 + i][x2 + j] != 0) { return 1; } } } } return 0; } void AddCanvas(void) { int i, j; for (i = 0; i < 21; i++) { for (j = 0; j < 12; j++) { canvas[i][j] = field[i][j]; } } CheckLines(); for (i = 0; i < 21; i++) { for (j = 0; j < 12; j++) { field[i][j] = canvas[i][j]; } } } int CreateBlock(void) { int i, j; int xx, yy; x = 4; xx = x; y = 0; yy = y; srand(time(0)); g = rand() % 7; if (CheckOverlap(xx, yy) != 1) { for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { field[i][j + 4] = canvas[i][j + 4] + block[g][i][j]; } } } else { gameover = 1; return 1; } return 0; } void ControlBlock(void) { char key; key = getch(); switch (key) { case 'a': if (!CheckOverlap(x - 1, y)) MoveBlock(x - 1, y); break; case 's': if (!CheckOverlap(x, y + 1)) MoveBlock(x, y + 1); break; case 'd': if (!CheckOverlap(x + 1, y)) MoveBlock(x + 1, y); break; case'w': HardDrop(); break; case' ': TurnBlock(); } } void DropBlock(void) { if (!CheckOverlap(x, y + 1)) { MoveBlock(x, y + 1); system("cls"); ShowGameField(); } else { AddCanvas(); CreateBlock(); ShowGameField(); } } int TurnBlock() { int i, j; int temp[4][4]; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { temp[i][j] = block[g][i][j]; } } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { block[g][i][j] = temp[3 - j][i]; } } if (CheckOverlap(x, y)) { for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { block[g][i][j] = temp[i][j]; } } return 1; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { field[y + i][x + j] -= temp[i][j]; field[y + i][x + j] += block[g][i][j]; } } ShowGameField(); return 0; } void CheckLines(void) { int i, j, k; int lines = 0; int linefull; while (1) { for (i = 0; i < 20; i++) { linefull = 1; for (j = 1; j < 11; j++) { linefull *= canvas[i][j]; } if (linefull == 1)break; } if (linefull == 0)break; lines++; for (j = 1; j < 11; j++) { canvas[i][j] = 0; } for (k = i; k > 0; k--) { for (j = 1; j < 11; j++) { canvas[k][j] = canvas[k - 1][j]; } } } switch (lines) { case 1: oneline++; score += 40; break; case 2: twoline++; score += 100; break; case 3: threeline++; score += 300; break; case 4: fourline++; score += 1200; break; default: break; } } void HardDrop() { while (!CheckOverlap(x, y + count+1)) { count++; } MoveBlock(x, y + count); system("cls"); ShowGameField(); count = 0; } void Finish() { printf("GAME OVER"); }

試したこと

補足情報(FW/ツールのバージョンなど)

コメントを投稿

0 コメント