Issue with main function

After running the code choosing 1 from the main menu will run the game and when the had touch the tail the program suppose to return main menu which does happen, but the true problem is when you repeat the same action again which is 1 from main menu the game will not run in game instead it stops in the menu and if chosen option 3 which is Exit game it's not happening program will return in the same menu.
what am I missing ?... please help !!!

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
231
232
  //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(10);
    }
    }
    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++;
        }
}
Your first major no-no is using 'goto' to implement backward jumps in the code.
What you should be using are while loops.

> 221 main();
The other absolutely mustn't do thing is calling main() recursively.

What you should be doing is setting your gameover flag and returning.
Okay.. so actually you're saying to eliminate 'goto' and replace it with while loops in to the main function ...then after in line 221.. instead to call 'main()' from a sub routine I can change it to 'gameOver = true' and return it to.. ?
Since 'logic()' is a function that returns a void I can't return nothing .. only if I change it to an integer like this 'int logic()' add a return 0 to end of function "--}" ..then I can 'return 1' fter 'gameOver = true'.

I'll try and debug it step by step,.... I really ned to understand what am I really doing.
Thank you for your contribution.. :)
Hello Mif,

Just as the "if" statement does not need an "else" the "return" does not always have to return something.

In the "logic" function", (line 221), when you call "main" just replace it with "return" and you will return to the next line after the function call.

In "main" you could use a do/while loop to replace the "goto" statement.

The global variables are nice, but could work against you because any function can change them and that becomes very hard to track down.

I have not run the program far enough to test this, but I am thinking that after a successful run you are not resetting the variables and on the second run you are using old values that makes appear as something that it should not.

Andy
Yep .. that's true. For the first time run, everything is working just fine... after the had touched the tail it goes to the main .. and only the second option work the 1 and the 3 seems like they are trying to do their job but instead returns to main..
I have a half hour now that I'm running the debug line with line.. and when I choose from main, option nr. 3 instead to exit .. the program run if else statement and jump to end of the main and reaches return 0 then right after is jumping at the line 217.. and from here at the end of the void logic() reach again main() and return to main function .. like a infinite loop.
The same thing happen if I press 1 from main menu .. it goes thru all void function and yes was taking me like 15 min to pass void draw() .. :).. and i the end reaches the same logic() function and return main()...

Okay for now I will thank you all for helping me to see what's really happening .. but since I'm not done with it .. I'll stick until it will be done ... I really need to see the light at the end of the tunnel ... :)

If someone has found a way to break this, will be so nice to share... for now I'll try to do what you guys told me to do.. hope that will work.
Topic archived. No new replies allowed.