Snake game

Hello guys im currently making a snake game.
If you have any suggestions improvements.

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
233
234
235
236
237
238
239
240
241
242
243
244

#include <iostream>

#include <conio.h>
using namespace std;

bool gameover;

const int width = 20;

const int height = 17;

int x, y, fruitX, fruitY, score;

int tailX[100], tailY[100]; //snake coordinates

int nTail;

enum eDirecton {STOP = 0, LEFT,RIGHT, UP, DOWN}; // Controls

eDirecton dir;

void Setup() {
gameover = false;

dir = STOP;

x = width / 2;

y = height / 2;

fruitX = rand() % width; //display fruit in a random place

fruitY = rand() % height; score = 0;

}

void Draw() {
system("cls");

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 << "#"; //walls

if (i == y && j == x)

cout << "*"; // snake tale

else if (i == fruitY && j == fruitX )

cout << "%"; // change it to change the fruit

else {

bool print = false;

for (int k = 0; k< nTail ; k++) {

if (tailX [k] == j && tailY [k] == i) {

cout << "*"; print = true;

}

}

if (!print) cout << " ";

}

if (j == width -1)

cout << "#";

}

cout << endl;

}

for (int i = 0; i< width+2; i++)

cout << "#";

cout << endl;

cout << "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':

gameover = true;

break;

}

}

}

void algorithm()
{

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;

}

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 +=10;

fruitX = rand() % width;

fruitY = rand() % height;

nTail ++;

}

}

int main()
{

Setup();

while (!gameover) {

Draw ();

Input ();

algorithm ();

}

return 0;

}
Last edited on
Improvement 1) indent your code properly.
Improvement 2) don’t use system("cls")
Improvement 3) don’t use _getch() or conio.h
Improvement 4) don’t use rand()
Improvement 5) don’t use so many globals


Ways to fix:
1) you probably have an auto indent button in your ide somewhere
2 & 3) use a lib like ncurses.h or termios.h to manipulate the console https://www.google.com/search?q=ncurses.h+tutorial
I’d also suggest instead of erasing the entire screen, only erase parts (it reduces the flicker by, like, 100%)
4) use the <random> library http://cplusplus.com/reference/random/?kw=random
5) 🤷‍♂️
I mean, that would be good, but honestly if you're just making a little console game like this for fun, using functions like getch isn't the end of the world.

Yes, the first two things I see are a lack of indentation, and inconsistent spacing.
1
2
3
if (x >= width) x =0;else if (x <0) x = width -1;

if (y >= height) y = 0; else if (y < 0) y = height - 1;
Saving a few lines of code does not improve readability. Just separate things statements to be on to their own lines. Especially statements that are separated by semi-colons (a small if statement you could get away with being on one line, but personally I think it's a bad habit).
1
2
3
4
5
6
7
8
9
if (x >= width)
    x = 0;
else if (x < 0)
    x = width - 1;

if (y >= height)
    y = 0;
else if (y < 0)
    y = height - 1;


On the other hand, having a bunch of double-spacing also does not helping readability.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case LEFT:

x--;

break;

case RIGHT:

x++;

break;

case UP:

y--;


- As highwayman said, globals should mostly be avoided; having too many just keeps the state of your game hard to keep track of. Pass the necessary variables of the game needed into, e.g. your draw function.
- Having a function called "algorithm" tells me just about nothing.

"prev2x"
You only use your prev2x and prev2y variables inside your for loop, so they could be defined there as well. In general, try to keep variables in the smallest scope possible. This goes back to minimizing the state you have to keep track of at once.
Last edited on
Thanks for the suggestions
By the way, I don't remember what rules the classic Snake game had, but I believe most versions of Snake don't kill you if you try to go 'backwards'.

By this I mean, if the snake is going up (w/ a length of 3+), and you press S (down), your game currently gets a game over. Personally, I think it would beneficial to ignore a key press if it would cause the snake to directly intersect with itself.

Other than that, your game seems to be bug free after playing it a few times.
Last edited on
@Ganado


By the way, I don't remember what rules the classic Snake game had, but I believe most versions of Snake don't kill you if you try to go 'backwards'.


Actually, yes, that would end the game. Anytime the snake head comes in contact with the body, the snake dies, thus ending the game. Some games also have the snake die if it contacts the edges (sides) of the screen.


Ah, guess I'm mistaken.
Well then I guess it's a feature not a bug. ;)
This isn't an English 101 essay. You don't need to type your code in 12pt double spaced Times New Roman font.

Just kidding lol. But seriously, fix the indentation
Topic archived. No new replies allowed.