jag

snake_c

public

Small snake game in C

Star0
Watch0

Commit 86b7b847c237

tarball

Jaglekon <58274093+Jaglekon@users.noreply.github.com>2026-03-24 22:13 UTC

1 file changed+122-48
settings scaffold
Modified file: snake.c+122 additions−48 deletions
@@ -32,6 +32,8 @@
3232
3333 typedef enum { NEW_GAME, SETTINGS, EXIT, MAIN_MENU } main_menu;
3434
35+typedef enum {HEIGHT_S, WIDTH_S, SPEED_S, BACK_S, SETTINGS_MENU} settings;
36+
3537 typedef enum {
3638 NO_DIRECTION = -1,
3739 UP = 0,
@@ -132,71 +134,139 @@ int main(int argc, char *args[]) {
132134 /* Menu */
133135
134136 bool menu = true;
137+ bool setting = false;
138+ bool change_menu = true;
135139
136140 main_menu selected_menu = NEW_GAME;
137-
138- too_small = draw_menu(selected_menu, init_size);
141+ settings selected_setting = HEIGHT_S;
139142
140143 while (menu) {
141144
142145 bool pressed_enter = false;
143146 bool changed_selected = false;
144147
145- char string[1000] = {};
146- ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);
147-
148148 direction arrow = NO_DIRECTION;
149149
150+ char string[1000] = {};
151+ ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);
150152
151- if (true) {
152153
153- ioctl(STDOUT_FILENO, TIOCGWINSZ, &current_size);
154+ ioctl(STDOUT_FILENO, TIOCGWINSZ, &current_size);
154155
155- if (current_size.ws_col != init_size.ws_col ||
156- current_size.ws_row != init_size.ws_row) {
157- init_size = current_size;
158- changed_selected = true;
159- }
156+ if (current_size.ws_col != init_size.ws_col ||
157+ current_size.ws_row != init_size.ws_row) {
158+ init_size = current_size;
159+ changed_selected = true;
160160 }
161161
162- if (length_string > 0 && !too_small) {
162+
163+ if (length_string > 0) {
163164 string[length_string] = '\0';
164165
165166 arrow = read_direction(string, false);
166167
168+ if (string[0] == '\n')
169+ pressed_enter = true;
170+
171+ if (toupper(string[0]) == 'Q')
172+ goto end_of_program;
173+ }
174+
175+ if (!setting) {
176+
177+ if (!too_small) {
178+ switch (arrow) {
179+ case UP:
180+ selected_menu = (selected_menu + (MAIN_MENU - 1)) % MAIN_MENU;
181+ changed_selected = true;
182+ break;
183+ case DOWN:
184+ selected_menu = (selected_menu + 1) % MAIN_MENU;
185+ changed_selected = true;
186+ break;
187+ default:
188+ break;
189+ }
190+ }
191+
192+ if (changed_selected || change_menu) {
193+ too_small = draw_menu(selected_menu, init_size);
194+ change_menu = false;
195+ }
196+
197+ if (pressed_enter && !too_small) {
198+ switch (selected_menu) {
199+ case NEW_GAME:
200+ menu = false;
201+ break;
202+ case SETTINGS:
203+ setting = true;
204+ change_menu = true;
205+ break;
206+ default:
207+ goto end_of_program;
208+ break;
209+ }
210+ }
211+ } else {
212+
213+ char *setting_string[] = {
214+ "HEIGHT",
215+ "WIDTH",
216+ "SPEED",
217+ "BACK"
218+ };
219+
220+
167221 switch (arrow) {
168- case UP:
169- selected_menu = (selected_menu + (MAIN_MENU - 1)) % MAIN_MENU;
170- changed_selected = true;
171- break;
172- case DOWN:
173- selected_menu = (selected_menu + 1) % MAIN_MENU;
174- changed_selected = true;
175- break;
176- default:
177- break;
222+ case UP:
223+ selected_setting = (selected_setting + (SETTINGS_MENU - 1)) % SETTINGS_MENU;
224+ changed_selected = true;
225+ break;
226+ case DOWN:
227+ selected_setting = (selected_setting + 1) % SETTINGS_MENU;
228+ changed_selected = true;
229+ break;
230+ default:
231+ break;
178232 }
179233
180- if (toupper(string[0]) == 'Q')
181- goto end_of_program;
234+ if (changed_selected || change_menu) {
235+
236+ uint8_t i;
182237
183- if (string[0] == '\n')
184- pressed_enter = true;
185- }
238+ printf("\033[2J\033[H");
239+
240+ for (i = 0; i < SETTINGS_MENU; i++) {
241+
242+ if (i == selected_setting)
243+ printf("\033[32m");
186244
187- if (changed_selected)
188- too_small = draw_menu(selected_menu, init_size);
245+ printf("%s\033[0m", setting_string[i]);
189246
190- if (pressed_enter) {
191- switch (selected_menu) {
192- case NEW_GAME:
193- menu = false;
194- break;
195- default:
196- goto end_of_program;
197- break;
247+ if (i < SETTINGS_MENU - 1)
248+ printf("\n\n");
249+ }
250+ fflush(stdout);
251+
252+ change_menu = false;
198253 }
254+
255+
256+ if (pressed_enter) {
257+ switch (selected_setting) {
258+ case BACK_S:
259+ setting = false;
260+ change_menu = true;
261+ break;
262+ default:
263+ break;
264+ }
265+ pressed_enter = false;
266+ }
267+
199268 }
269+
200270 nanosleep(&mili100, NULL);
201271 }
202272
@@ -243,26 +313,28 @@ int main(int argc, char *args[]) {
243313
244314 /* input handling */
245315
246- if (!too_small) {
316+
247317 char string[1000] = {};
248318 ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);
249319
250320 if (length_string > 0) {
251321 string[length_string] = '\0';
252322
253- if (!paused)
254- tmp_direction = read_direction(string, true);
323+ if (!too_small) {
324+ if (toupper(string[0]) == 'P' || string[0] == '\n') {
325+ paused = !paused;
326+ if (paused)
327+ draw_board(board, current_size, true, paused);
328+ }
329+
330+ if (!paused)
331+ tmp_direction = read_direction(string, true);
332+ }
255333
256334 if (toupper(string[0]) == 'Q')
257335 run = false;
258-
259- if (toupper(string[0]) == 'P' || string[0] == '\n') {
260- paused = !paused;
261- if (paused)
262- draw_board(board, current_size, true, paused);
263- }
264336 }
265- }
337+
266338
267339 /* game logic */
268340
@@ -327,6 +399,8 @@ end_of_program:
327399 tcsetattr(STDIN_FILENO, TCSANOW, &old);
328400 printf("\033[?25h\n\n");
329401
402+
403+ printf("\033[32m");
330404 return 0;
331405 }