Member 13565402 Ответов: 2

Пожалуйста, я хочу простую консольную игру 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

Вы должны сказать, в чем заключается настоящая проблема. "Не работает" не помогает нам помочь вам

2 Ответов

Рейтинг:
5

Patrice T

Цитата:
Я хочу учиться...у меня есть проблемы

Это потому, что вы не учитесь, делая личный проект.
Это все равно что пытаться научиться вождению, выиграв NASCAR или Formula 1 Grand Price, это не работает.
Это все равно что пытаться научиться писать, получив Пулитцеровскую премию.
Цитата:
у меня есть проблемы

Это лучшее, что вы можете нам сказать, это не информативно, это точная причина, по которой все здесь просят о помощи.

Итак, забудьте о своем собственном проекте на данный момент и учитесь с помощью книг и учебников, делайте все упражнения, пока не поймете концепции. Это самый легкий путь.

Вот ссылки на справочники книг по Си и Си++ авторов этих языков. Обратите внимание, что C является предком C++, поэтому знание C всегда полезно с C++.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity-да.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Язык Программирования C++ [^]


Рейтинг:
2

Richard MacCutchan

Вы уже дважды публиковали этот вопрос и получили некоторые предложения. Лучшим использованием вашего времени было бы изучение C++ от начала до конца.