Cout показывает только темный экран в консоли - PullRequest
0 голосов
/ 24 апреля 2020

Написание «Игры со змеями» для моих экзаменов. Я решил дать пользователю выбор размера поля, и теоретически на этом этапе оно должно что-то показывать, но функция «Графика» показывает только темный экран. Я подозреваю, что проблема может заключаться в том, что Graphics ссылается на определения высоты и ширины, может быть, каким-то образом он не видит, что я изменил эти определения, и считает это как ноль и ноль, так что размер поля равен нулю и нулю соответственно ... В любом случае я не знаю, кто-нибудь может помочь?

#include <iostream>
#include <stdlib.h>

bool GameOver;

struct GameData
{
    int x{ 0 };
    int y{ 0 };
    int Width;
    int Height;
    int AppleX;
    int AppleY;
    int Score;

};

enum SnakeDirection {Stop = 0, Up, Down, Left, Right};
SnakeDirection Way;

void EnterFieldSize() 
{
    GameData GMD;
     int Width{ 0 };
     int Height{ 0 };
    std::cout << "Enter field size (Min 10, Max 100): \n";
    std::cout << "Width: "; std::cin >> Width;
    std::cout << "Height: "; std::cin >> Height;
     GMD.Width = Width;
     GMD.Height = Height;
    if (Width < 10 || Width > 100) //Если ширина меньше 10 или больше 100, повторить ввод
    {
        std::cout << "Unaccetable width! Enter again:\n ";
        return EnterFieldSize();
    }
    if (Height < 10 || Height > 100)
    {
        std::cout << "Unaccetable height! Enter again:\n ";
        return EnterFieldSize();
    }
    return;

}
void Settings() 
{
    EnterFieldSize();
    GameData GMD;
    Way = Stop; 
    GMD.x = rand() % GMD.Width; и
    GMD.y = rand() % GMD.Height;
    GMD.AppleX = rand() % GMD.Height; 
    GMD.AppleY = rand() % GMD.Width;
    GMD.Score = 0 ;
    return;
}

void GameLogic()
{

}

void Graphics()   //This part doesn't show
{
    GameData GMD;
    system("cls");

    for (int i{ 0 }; i < GMD.Width; i++) //Upper border
    {
        std::cout << "#";
    }

    for (int i{ 0 }; i < GMD.Height; i++) //Side borders
    {
        for (int q{ 0 }; q < GMD.Width; q++)
        {
            if (q == 0 || q == GMD.Width)
                std::cout << "#"; std::cout << " ";
        }
        std::cout << std::endl;
    }


    for (int i = 0; i < GMD.Width; i++) //Lower border
    {
        std::cout << "#";
    }
    return ;
}

void Controller()
{

}




int main()
{
    std::cout << "Welcome to \"Snake\"\n";
    Settings();
    while (!GameOver)

    {
        Graphics(); // THis moment, console just dark screen
        GameLogic();
        Controller();

    }
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

У вас есть несколько переменных с именем GMD. Один в Settings, один в Graphics, один в EnterFieldSize. Это все разные переменные.

Две переменные в разных функциях - это разные переменные, даже если они имеют одинаковые имена. Ваша Settings функция изменяет одну переменную, но ваша Graphics функция использует совершенно другую переменную.

Вы должны объявить одну GMD переменную в main и передать ее в качестве ссылочного параметра всем функции, которые должны его использовать.

Возможно, вам нужно немного прочесть основы C ++. Передача параметров - базовый навык c практически во всех языках программирования, как и концепция область видимости переменной .

0 голосов
/ 24 апреля 2020

Это потому, что вы устанавливаете экземпляр GMD, задаете высоту и ширину и ничего не возвращаете. Вы можете решить эту проблему, установив метод с void на GMD, а затем вернуть этот экземпляр GMD в графическую функцию

Второй вариант - создать класс с переменной GMD и использовать тот же код

...