Пожалуйста, я хочу простую консольную игру C++ oop в тетрис, которую я хочу изучить...у меня есть проблемы
Пожалуйста, помогите мне преобразовать его в другой класс под названием Block.. Я уже сделал это, но код не работает должным образом
Что я уже пробовал:
#ifndef BOARD_H #define BOARD_H class Board{ private: int stage[22][13]; int block[4][4] = {} ; int field[22][13]; // coordinate int y = 0; int x = 4; bool gameover = false; int GAMESPEED = 20000; public: void gameLoop(); void display(); bool makeBlocks(); void initGame(); void moveBlock(int, int); void collidable(); bool isCollide(int, int); void userInput(); bool rotateBolck(); void spwanBlock(); int gameOver(); }; #endif
//#include <iomanip> #include <iostream> #include <vector> #include <random> #include <conio.h> using namespace std; #include "Board.h" int block_list[7][4][4] = { { { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } }, { { 0, 0, 0, 0 }, { 0, 1, 1, 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, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } }, { { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } }, { { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 } } }; void Board::gameLoop() { int time = 0; initGame(); while (!gameover) { if (kbhit()) { userInput(); } if (time < GAMESPEED) { time++; } else { spwanBlock(); time = 0; } } } void Board::display() { system("cls"); for (int i = 0; i < 21; i++) { for (int j = 0; j < 12; j++) { switch (field[i][j]) { case 0: std::cout << " " ; break; case 9: std::cout << "|"; break; default: std::cout << "#" ; break; } } std::cout << std::endl; } if (gameover) { system("cls"); gameOver(); } } void Board::initGame() { for (int i = 0; i <= 20; i++) { for (int j = 0; j <= 11; j++) { if ((j == 0) || (j == 11) || (i == 20)) { field[i][j] = stage[i][j] = 9; } else { field[i][j] = stage[i][j] = 0; } } } makeBlocks(); display(); } bool Board::makeBlocks() { x = 4; y = 0; int blockType = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = 0; block[i][j] = block_list[blockType][i][j]; } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { field[i][j + 4] = stage[i][j + 4] + block[i][j]; if (field[i][j + 4] > 1) { gameover = true; return true; } } } return false; } void Board::moveBlock(int x2, int y2) { //Remove block for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { field[y + i][x + j] -= block[i][j]; } } //Update coordinates x = x2; y = y2; // assign a block with the updated value for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { field[y + i][x + j] += block[i][j]; } } display(); } void Board::collidable() { for (int i = 0; i<21; i++) { for (int j = 0; j<12; j++) { stage[i][j] = field[i][j]; } } } bool Board::isCollide(int x2, int y2) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (block[i][j] && stage[y2 + i][x2 + j] != 0) { return true; } } } return false; } void Board::userInput() { char key; key = getch(); switch (key) { case 'd': if (!isCollide(x + 1, y)) { moveBlock(x + 1, y); } break; case 'a': if (!isCollide(x - 1, y)) { moveBlock(x - 1, y); } break; case 's': if (!isCollide(x, y + 1)) { moveBlock(x, y + 1); } break; case ' ': rotateBolck(); } } bool Board::rotateBolck() { std::vector<std::vector<int>> tmp(4, std::vector<int>(4, 0)); for (int i = 0; i < 4; i++) { //Save temporarily block for (int j = 0; j < 4; j++) { tmp[i][j] = block[i][j]; } } for (int i = 0; i < 4; i++) { //Rotate for (int j = 0; j < 4; j++) { block[i][j] = tmp[3 - j][i]; } } if (isCollide(x, y)) { // And stop if it overlaps not be rotated for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { block[i][j] = tmp[i][j]; } } return true; } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { field[y + i][x + j] -= tmp[i][j]; field[y + i][x + j] += block[i][j]; } } display(); return false; } void Board::spwanBlock() { if (!isCollide(x, y + 1)) { moveBlock(x, y + 1); } else { collidable(); makeBlocks(); display(); } } int Board::gameOver() { using namespace std; char a; cout << " ##### # # # ####### ####### # # ####### ######\n" ; cout << "# # # # ## ## # # # # # # # #\n"; cout << "# # # # # # # # # # # # # # #\n"; cout << "# #### # # # # # ##### # # # # ##### ######\n"; cout << "# # ####### # # # # # # # # # #\n"; cout << "# # # # # # # # # # # # # #\n"; cout << " ##### # # # # ####### ####### # ####### # #\n"; cout << "\n\nPress any key and enter\n"; cin >> a; return 0; }
#include <iostream> #include "Board.h" using namespace std; int main(){ Board board; board.gameLoop(); }
CHill60
Вы должны сказать, в чем заключается настоящая проблема. "Не работает" не помогает нам помочь вам