M@gelearn Ответов: 1

Как сделать так, чтобы игра возвращала главное меню, когда нужно было коснуться хвоста ?


//Author Me//
#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;
bool gameOver;
const int width = 49;
const int height = 15;
int x, y, fruitX, fruitY, score;
int tailX[500], tailY[500];
int nTail;
enum eDirecton {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirecton dir;
void setup()
{
    gameOver = false;
    dir = STOP;
    x = width / 2;
    y = height / 2;
    fruitX = rand() % width;
    fruitY = rand() % height;
    score = 0;
}
void Draw()
{
    //for balance speed directions -- [non active].
    //if(dir == LEFT || dir == RIGHT)
    //{
    //    Sleep(0);
    //}
    //if(dir == UP || dir == DOWN)
    //{
    //    Sleep(0);
    //}
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD Position;

    Position.X = 0;
    Position.Y = 0;

    SetConsoleCursorPosition(hOut, Position);

    cout << "\n\t     ooooO Snake Game ooooO\n\n";

    for(int i = 0; i < width + 2; i++)
        cout << "#";
    cout << endl;

    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            if(j == 0)
            cout << "#";
            if(i == y && j == x)
                cout << "O";
            else if(i == fruitY && j == fruitX)
                cout << "$";
            else
            {
                bool print = false;
                for(int k = 0; k < nTail; k++)
                {
                    if(tailX[k] == j && tailY[k] == i)
                    {
                        cout << "o";
                        print = true;
                    }
                }
                if(!print)
                cout << " ";
            }

            if(j == width - 1)
                cout << "#";
        }
        cout << endl;
    }
    for(int i = 0; i < width + 2; i++)
        cout << "#";
    cout << endl;
    cout << "\nAuthor: Me    Press 'x' to exit game      Score " << score << endl;
}
void imput()
{
    if(_kbhit())
    {
        switch(_getch())
        {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'w':
            dir = UP;
            break;
        case 's':
            dir = DOWN;
            break;
        case 'x':
            cout << "\n\n\t\t\tStopped by user !";
            Sleep(3000);
            system("cls");
            cout << "\n\n\n\n\n\n\n\n\n\n\n\t\t\t       Game Over";
            Sleep(3000);
            gameOver = true;
            break;
        }
    }
}
void logic()
{
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;

    for (int i = 1; i < nTail; i++)
    {
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;
    }

    switch(dir)
    {
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    default:
        break;
    }
    //Another option - hitting the walls will make the game stop -- [non active].
    //if(x > width || x < 0 || y > height || y < 0)
    //    gameOver = true;
    if(x >= width) x = 0; else if(x < 0 ) x = width - 1;
    if(y >= height) y = 0; else if(y < 0 ) y = height - 1;

    for(int i = 0; i < nTail; i++)
    {
        if(tailX[i] == x && tailY[i] == y)

            gameOver = true;//<--from here do something else to return main function. Not to exit console.. what should it be instead of 'gameOver = true' ?//
    }
        if(x == fruitX && y == fruitY)
        {
            score += 1;
            fruitX = rand() % width;
            fruitY = rand() % height;
            nTail++;
        }
}
int main()
{
    menu:
        system("cls");
    int a;

    cout << "\n\n\n\n\t\t\t ooooO Snake Game ooooO\n";
    cout << "\n\n\n\t\tMain menu\n\n";
    cout << "\t\t1. Play game\n";
    cout << "\t\t2. Game controls\n";
    cout << "\t\t3. Exit game\n";
    cout << "\n\t\tSelection ";
    cin >> a;

    if(a == 1)
    {
        setup();

    while(!gameOver)
    {
        Draw();
        imput();
        logic();
        Sleep(0);
    }
    }
    else if (a == 2)
    {
        system("cls");
        cout << "\n\n\n\n\t\t\t ooooO Snake Game ooooO\n";
        cout << "\n\n\n\tGame controls\n";
        cout << "\n\n\n\t\t\t   'a' = LEFT\n";
        cout << "\n\t\t\t   'd' = RIGHT\n";
        cout << "\n\t\t\t   'w' = UP\n";
        cout << "\n\t\t\t   's' = DOWN\n";
        cout << "\n\tWhile playing game 'x' = EXIT\n\n\n";
        cout << "\n\tPress any key to return Main menu";
        getch();
        goto menu;
    }
    else if(a == 3)
    {
        gameOver = true;
        cout << "\n\n\n\t\t\t\tExit game\n\n\n";
        Sleep(1500);
        system("cls");
    }
    else
    {
        cout << "\n\t\tNo such option press 1, 2 or 3 !";
        Sleep(2500);
        goto menu;
    }
    return 0;
}


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

Я пытался изменить это.
gameOver = true;
с
gameOver = false;
Но кажется, что в игре заходит какой-то баг вроде бы ... ну, это никогда не заканчивается, и правая боковая стенка постоянно меняется.

Пожалуйста, помогите мне понять, как перейти от логической функции к основной функции?

ZurdoDev

Вы написали этот код?

1 Ответов

Рейтинг:
6

OriginalGriff

Единственный способ выбраться из logic функция back to the main функция осуществляется через return утверждение (существует неявное return если ваш код достигает закрывающей фигурной скобки функции).

Так что обнаруживайте, когда вы "кусаете свой хвост" и возвращаетесь из функции. Это оставляет вас с одной проблемой: как сказать main функция это конец игры.

Способ, которым я бы это сделал, заключается в использовании возвращаемого значения: измените logic функция из "функции, возвращающей пустоту" в "функцию, возвращающую целое число":

int logic()
{
...
Теперь добавьте возврат к вашему детектору "конец игры" :
return 1;

И еще один до конца функции:
int logic()
{
...
return 0;
}
Тогда в вашем main функция, используйте logic значение:
while(!gameOver)
    {
        Draw();
        imput();
        gameOver = logic();
        Sleep(0);
    }
(Поскольку C++ не имеет логических значений, он рассматривает 0 как false, а все остальное-как true).


M@gelearn

Оооо.. правильно. Я думал, что это было что-то очень простое. Я не думал менять его с пустого на целое число. Это прекрасно работает.. благодарю вас так много. !! :)

OriginalGriff

Всегда пожалуйста!

Rick York

"Поскольку C++ не имеет логических значений"

Он имеет тип bool, который может быть только одним из встроенных значений true или false. https://en.cppreference.com/w/cpp/language/types-да.

Как это не логическое значение?