Member 13565402 Ответов: 1

У меня возникли проблемы с выводом пожалуйста помогите


Помогите мне решить эту проблему, потому что в выводе она непосредственно показывает game over

Что я уже пробовал:

#ifndef BLOCK_H
#define BLOCK_H
#include "Coordinates.h"

class Block{
	private:
		Coordinates coordinates;
		int block[4][4];
		int blockShape;
		int arr[22][13];
		int board[22][13];
		int x=4;
		int y=0;
		bool gameover=false;
	public:
		
		Block(){}
		int blocks();
		bool makeBlock();
		void moveBlock(int x2, int y2);
		bool rotateBlock();
		void destructBlock();
		void collidable();
		bool isCollide(int x2, int y2);
		
};
#endif
#include <iostream>
#include <vector>
#include "Block.h"
#include "Board.h"
using namespace std;

int shapeOfBlocks[4][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 } 
	}
};

bool Block::makeBlock()
{
	x=4;
	 y=0;
	int blockShape=0;
	for(int i=0; i<4; i++)
	{
		for(int j=0; j<4; j++)
		{
			block[i][j]=0;
			block[i][j]=shapeOfBlocks[blockShape][i][j];
		}
	}
	 for(int i=0; i<4; i++)
    {
        for (int j=0; j<4; j++)
        {
            board[i][j+4]=arr[i][j+4]+block[i][j];

            if (board[i][j+4]>1)
            {
                gameover=true;
                return true;
            }
        }
    }
    return false;
}

void Block::moveBlock(int x2, int y2)
{
	int x=4, y=0;
	
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            board[y+i][x+j]-=block[i][j];
        }
    }
    x=x2;
    y=y2;

    for(int i=0; i<4; i++)
    {
        for (int j=0; j<4; j++)
        {
            board[y+i][x+j]+= block[i][j];
        }
    }
    Board obj;
	obj.display();
}

bool Block::rotateBlock()
{
    vector<vector<int>> temp(4, vector<int>(4, 0));

    for (int i=0; i<4; i++)
    { 
        for (int j=0; j<4; j++)
        {
            temp[i][j]=block[i][j];
        }
    }

    for (int i=0; i<4; i++)
    { 
        for (int j=0; j<4; j++)
        {
            block[i][j]=temp[3-j][i];
        }
    }

    if (isCollide(x, y))
    { 
        for (int i=0; i<4; i++)
        {
            for (int j=0; j<4; j++)
            {
                block[i][j]=temp[i][j];
            }
        }
        return true;
    }

    for (int i=0; i<4; i++)
    {
        for (int j=0; j<4; j++)
        {
            board[y+i][x+j]-=temp[i][j];
            board[y+i][x+j]+=block[i][j];
        }
    }
    Board obj;
    obj.display();

    return false;
}

void Block::collidable()
{
	for (int i=0; i<21; i++)
    {
        for (int j=0; j<12; j++)
        {
            arr[i][j]=board[i][j];
        }
    }
}

bool Block::isCollide(int x2, int y2)
{
	for (int i=0; i<4; i++)
    {
        for (int j=0; j<4; j++)
        {
            if ((block[i][j] && arr[y2 + i][x2 + j])!=0)
            {
                return true;
            }
        }
    }
    return false;
}

void Block::destructBlock()
{
    if (!isCollide(x, y+1))
    {
        moveBlock(x, y+1);
    }
    else
    {
    	Board obj;
        collidable();
        makeBlock();
        obj.display();
    }
}
#ifndef BOARD_H
#define BOARD_H
#include "Block.h"
class Board{
	private:
		Block block;
		int board[22][13];
		int arr[22][13];
		int GAMESPEED=20000;
		int x=4;
		int y=0;
	public:
		Board(){}
		int gameOver(); 
		void gameLoop(); 
		void display();
		void initGame(); 
		void userInput(); 
		
};
#endif

#include <iostream>
#include <vector>
#include <conio.h>
#include "Board.h"
using namespace std;

int Board::gameOver()
{
	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;
}

void Board::gameLoop()
{
    int time = 0;
    initGame();

    while (!gameover) 
    { 
        if (kbhit()) 
        {
            userInput();
        }

        if (time < GAMESPEED)
        {
            time++;
        }
        else 
        {
            block.destructBlock();
            time = 0;
        }
    }
}

void Board::display()
{
    system("cls");

    for (int i = 0; i < 21; i++) 
    {
        for (int j = 0; j < 12; j++) 
        {
            switch (board[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)) 
            {
                board[i][j] = arr[i][j] = 9;
            }
            else
            {
                board[i][j] = arr[i][j] = 0;
            }
        }
    }

    block.makeBlock();

    display();
}

void Board::userInput()
{
	char key;

    key = getch();

    switch (key)
    {
    case 'd':
        if (!block.isCollide(x+1, y))
        {
            block.moveBlock(x+1, y);
        }
        break;
    case 'a':
        if (!block.isCollide(x-1, y))
        {
            block.moveBlock(x-1, y);
        }
        break;
    case 's':
        if (!block.isCollide(x, y+1))
        {
            block.moveBlock(x, y+1);
        }
        break;
    case ' ':
        block.rotateBlock();
    }
}

#ifndef COORDINATES_H
#define COORDINATES_H
class Coordinates{
	private:
		int x;
		int y;
	public:
		Coordinates(){}
		Coordinates(int a,int b);
		void setX(int x);
		void setY(int y);
		int getX();
		int getY();
};
#endif

#include <iostream>
#include "Coordinates.h"
using namespace std;

Coordinates::Coordinates(int x, int y):x(x),y(y){}

void Coordinates::setX(int x)
{
	x=4;
}
void Coordinates::setY(int y)
{
	y=0;
}
int Coordinates::getX()
{
	return x;
}
int Coordinates::getY()
{
	return y;
}

Rick York

Вы не включили ту часть, где создается экземпляр платы и вызывается gameLoop. Как бы то ни было, здесь нет кода, где установлен gameover, поэтому мы не можем вам помочь в данный момент.

Пожалуйста, обратите внимание, как был пересмотрен ваш вопрос. Сначала идет описание вашей проблемы, а ваш код переходит в раздел "Что я пробовал".

Member 13565402

gameover установлен для обоих классов

Member 13565402

извините за это в частном разделе их также есть вариация bool под названием game over of class board

1 Ответов

Рейтинг:
0

Patrice T

Вы показываете какой-то код, который не является полным, мы не можем запустить его, чтобы воспроизвести проблему.
Отладчик - это единственный инструмент, который может вам помочь.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.