From 8b8160dcd7a36b43c92264c6b310496b09363e92 Mon Sep 17 00:00:00 2001 From: Aaro Saila Date: Sun, 14 Sep 2025 20:05:40 +0300 Subject: [PATCH] added commandline arguments and deleted target --- .gitignore | 2 +- src/args.c | 84 +++++++++++++++++++++++++++++++++++++++++++++ src/headers/args.h | 12 +++++++ src/main.c | 80 ++++++------------------------------------ src/term.c | 2 -- target/sanke | Bin 47424 -> 0 bytes 6 files changed, 107 insertions(+), 73 deletions(-) create mode 100644 src/args.c create mode 100644 src/headers/args.h delete mode 100644 src/term.c delete mode 100755 target/sanke diff --git a/.gitignore b/.gitignore index 5c030b8..9a161ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .clangd -target/ +target diff --git a/src/args.c b/src/args.c new file mode 100644 index 0000000..8f28d30 --- /dev/null +++ b/src/args.c @@ -0,0 +1,84 @@ +#include +#include +#include + +#include "args.h" + +extern char* version; + +static void handle_version() { + printf("Sanke version %s\n", version); + exit(0); +} + +static void set_width(Arguments* args, char* width_str) { + printf("width_str: %s\n", width_str); + int width = atoi(width_str); + if (width < 10) { + printf("Width must be between 10 and 50. Was %d.\n", width); + exit(0); + } + + args->width = width; +} + +static void set_height(Arguments* args, char* height_str) { + int height = atoi(height_str); + if (height < 10) { + printf("Width must be between 10 and 50. Was %d.\n", height); + exit(0); + } + + args->height = height; +} + +static void set_speed(Arguments* args, char* speed_str) { + int squares_per_second = atoi(speed_str); + if (squares_per_second < 1 || squares_per_second > 1000) { + printf("Speed must be between 1 and 1000. Was %d.\n", squares_per_second); + exit(0); + } + + args->sleep_ms = 1000 / squares_per_second; +} + +Arguments cmd_args(int argc, char** argv) { + Arguments args = { + .width = 15, + .height = 15, + .sleep_ms = 150 + }; + + for (int i = 1; i < argc; i++) { + if ( + strcmp(argv[i], "--version") == 0 + || strcmp(argv[i], "-v") == 0 + ) + { + handle_version(); + + } else if ( + strcmp(argv[i], "--width") == 0 + || strcmp(argv[i], "-w") == 0 + ) + { + set_width(&args, argv[i + 1]); + + } else if ( + strcmp(argv[i], "--height") == 0 + || strcmp(argv[i], "-h") == 0 + ) + { + set_height(&args, argv[i + 1]); + + } else if ( + strcmp(argv[i], "--speed") == 0 + || strcmp(argv[i], "-s") == 0 + ) + { + set_speed(&args, argv[i + 1]); + } + } + + return args; +} diff --git a/src/headers/args.h b/src/headers/args.h new file mode 100644 index 0000000..af71c98 --- /dev/null +++ b/src/headers/args.h @@ -0,0 +1,12 @@ +#ifndef ARGS_H_ +#define ARGS_H_ + +typedef struct { + int width; + int height; + int sleep_ms; +} Arguments; + +Arguments cmd_args(int argc, char** argv); + +#endif // ARGS_H_ diff --git a/src/main.c b/src/main.c index 18a78c2..374d918 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include "Board.h" @@ -11,21 +10,19 @@ #include "utils.h" #include "food.h" #include "BoardPiece.h" +#include "args.h" #define TERMIOS 1 #define DEBUG 0 -const char* VERSION = "1.1.9"; +const char* version = "1.1.9"; const char snake_vis = '#'; -void cmd_args(int argc, char** argv); -void empty_stdin_buffer(); -void get_int_or_minus_one(int* dst); struct termios set_termios(); int main(int argc, char** argv) { - cmd_args(argc, argv); + Arguments args = cmd_args(argc, argv); srand(time(NULL)); @@ -35,8 +32,8 @@ int main(int argc, char** argv) { #endif // TERMIOS // Game model init - const int board_w = 15; - const int board_h = 15; + const int board_w = args.width; + const int board_h = args.height; Board board = board_alloc(board_w, board_h); Snake snake = snake_alloc(board_w * board_h, 0, 0, 'd'); BoardPiece food = { .vis_char = '$' }; @@ -46,24 +43,11 @@ int main(int argc, char** argv) { // Screen init system("clear"); - int frame = 0; - int fps = 0; - - long second_start = time(NULL); - int frame_stamp = frame; +#if DEBUG + long long frame = 0; +#endif // DEBUG while (true) { - long second_check = time(NULL); - long elapsed_time = second_check - second_start; - if (elapsed_time >= 1) { - fps = frame - frame_stamp; - if (elapsed_time > 1) { - fps /= 2; - } - frame_stamp = frame; - second_start = time(NULL); - } - system("clear"); // Process input @@ -85,7 +69,6 @@ int main(int argc, char** argv) { board_clear(&board); board_draw_snake(&board, &snake); board_set_square(&board, food.x, food.y, food.vis_char); - printf("FPS: %d\n", fps); print_board(&board); printf("Score: %d\n", score); @@ -93,7 +76,6 @@ int main(int argc, char** argv) { if (snake_collides_with_tail(&snake)) { printf("GAME OVER\n"); - printf("Final score: %d\n", score); exit(EXIT_SUCCESS); } @@ -108,10 +90,10 @@ int main(int argc, char** argv) { printf("Frame: %d\n", frame); snake_print_info(&snake); board_piece_print_info(&food, "Food"); + frame++; #endif // DEBUG - frame++; - sleep_ms(150); + sleep_ms(args.sleep_ms); } #if TERMIOS @@ -121,48 +103,6 @@ int main(int argc, char** argv) { return 0; } -void cmd_args(int argc, char** argv) { - if (argc == 1) { - return; - } - - if ( - strcmp(argv[1], "--version") == 0 - || strcmp(argv[1], "-v") == 0 - ) - { - printf("Sanke version %s\n", VERSION); - exit(0); - } -} - -void empty_stdin_buffer() { - char ch; - while ((ch = getchar()) != '\n'); -} - -void get_int_or_minus_one(int* dst) { - char iBuf[100]; - char num[100]; - size_t i = 0; - - fgets(iBuf, 100, stdin); - - while (!isdigit(iBuf[i])) { - if (iBuf[i] == '\0') { - *dst = -1; - return; - } - i++; - } - - for (int j = 0; i < strlen(iBuf); i++, j++) { - num[j] = iBuf[i]; - } - - *dst = atoi(num); -} - struct termios set_termios() { struct termios attr; diff --git a/src/term.c b/src/term.c deleted file mode 100644 index 2fbc822..0000000 --- a/src/term.c +++ /dev/null @@ -1,2 +0,0 @@ -#include - diff --git a/target/sanke b/target/sanke deleted file mode 100755 index edb90dbdf4a06c97c7ded9933374c687f14ec01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47424 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 b4SF5omgVYSfP$X*Z+%d4d?SY;2NeGg*0u9l