How to jump from a function to the main function !?

How to make the game return main menu when the had touch the tail ?

I tried to change "gameOver = true with gameOver = false" from the function "void logic()", but seems that the game will go on forever and some bug with the right side of the wall. And a second try was to change the "void logic()"
with an integer something like "int logic()" and add a return value "return 1" to the "end of game" detector and return 0 to the end function, and after I changed

while(!gameOver)
{
Draw();
input();
gameOver = logic();
Sleep(0);
}
from the main function... like someone related to do so.. but seems that is not working...
If someone know how to do it please help me figure out how to jump from it..
And no.. no is not 100% my entire project, I did copy some parts of code from somewhere else but yes I understand what i did.. thank you for your patience.. :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  //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, 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 -- [not 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 input()
{
    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\t    Game Over";
            Sleep(3000);
            gameOver = true;
        }
    }
}
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;
    }
    //for future, another option - hitting the walls game stops -- [not 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;

    }
        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();
        input();
        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 choose 1, 2 or 3 !";
        getch();
        goto menu;
    }
    return 0;
}
its automatic. For single threaded programs (the default, you would know if you made threads..)

in main, if you call foo:

main()
{
... foo();
^^ when foo ends, the next statement in main will be executed.
}

foo ends when it executes the last statement in the body OR if there is a return statement (return; for void functions allows you to exit early, or return value; for non void).

you don't need to DO anything

I will look to see if you did something wrong, didn't spot it yet. If foo had an infinite loop, main would never resume... things like that. The code is really challenging to read and deal with because of the globals and gotos. Things like that let you make cool, hard to find and really weird bugs that can take weeks to unravel. You probably should not do this to yourself unless you enjoy debugging those kinds of things. Probably, the logic() function has some path(s) that do not modify gameover global correctly. You need to ensure it actually sets this variable for every possible path that should end the game. check that loop at 160ish ... does it get IN the loop to set the value? can ntail == 0 preventing the loop and preventing the game end?
Last edited on
Thank you Jonnin... but I did mess a bit with this code and i found the problem...I just up declared the void functions and then switched the main function from last to first and then in
void logic() i changed this "gameOver = true" with this " main()".. and now if you play the Snake game whenever you tuch your had with your tail will return to main menu. Ofc. I need to make a brake and to put some message that the game will return to menu. thanks and this is how i did it.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
//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, LEFT, RIGHT, UP, DOWN};
eDirecton dir;

void setup();
void Draw();
void input();
void logic();

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();
        input();
        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 choose 1, 2 or 3 !";
        getch();
        goto menu;
    }
    return 0;
}

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 -- [not 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 input()
{
    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\t    Game Over";
            Sleep(3000);
            gameOver = true;
        }
    }
}
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;
    }
    //for future, another option - hitting the walls game stops -- [not 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)

            main();

    }
        if(x == fruitX && y == fruitY)
        {
            score += 1;
            fruitX = rand() % width;
            fruitY = rand() % height;
            nTail++;
        }
}
And yahhh another problem just came up... lol.. when returning to main menu if you press again option 1 for the game to start... the game will not start.. The program shows always the main menu so in code is stops going ahead and goes for a infinite loop in to function
int main().. and all of the other options works .... Need to figure out how to make a perfect loop. Probably the goto isn't so perfect I'll try to change that with a switch case statement.. hopefully will work. :)
Ohh.. so the first and the 3rd option that is EXIT doesn't seems to work . is just repeating the main menu.. Soo .. is half done .. I need to see what is wrong with the third option as well...
:\
Topic archived. No new replies allowed.