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 edb90db..0000000 Binary files a/target/sanke and /dev/null differ