From 004b0736690871e51643decf77288a5b86952094 Mon Sep 17 00:00:00 2001 From: David GAILLETON Date: Sat, 28 Mar 2026 20:32:16 +0100 Subject: [PATCH] some fix for game management + fix for ai (it's unbeatable) --- alcu.map | 11 +++++--- alum1 | Bin 27976 -> 28152 bytes map_gen.sh | 15 +++++++++++ src/ai.c | 11 +++----- src/main.c | 78 ++++++++++++++++++++++++++++++----------------------- 5 files changed, 72 insertions(+), 43 deletions(-) create mode 100755 map_gen.sh diff --git a/alcu.map b/alcu.map index 0b470c6..e7adaf8 100644 --- a/alcu.map +++ b/alcu.map @@ -1,5 +1,10 @@ -8 +2 +9 +10 5 -3 -2 +9 +8 2 +1 +8 +10 diff --git a/alum1 b/alum1 index 31f2243563bfd940a522601aac4897ed05cdb6d8..b3f7828df304cfc90961a0bea96eac829af59872 100755 GIT binary patch delta 6878 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 SB~Ts7^7sxH|5UhlJodlhBlR!< delta 6506 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 YFHP|Vbt#b=DLr3qck_qDwf6h|AJ^4@K>z>% diff --git a/map_gen.sh b/map_gen.sh new file mode 100755 index 0000000..ad8eaf3 --- /dev/null +++ b/map_gen.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ $# -lt 2 ]; then + echo "usage: bash map_gen.sh [size] [range]" + exit 1 +fi + +unset var +for i in $( seq 1 $1 ) +do + var+="\n$(( RANDOM % $2 + 1))" +done +var="${var}\n"; +echo -e $var | tail -n +2 + diff --git a/src/ai.c b/src/ai.c index e5fc61d..4e9ee81 100644 --- a/src/ai.c +++ b/src/ai.c @@ -15,15 +15,12 @@ static int best_to_take(int prev_should_start, int line) { int best; - if (prev_should_start) { + if (prev_should_start) best = 2; - while (best <= line - 2) - best += 2; - } else { + else best = 1; - while (best <= line - 4) { - best += 4; - } + while (best <= line - 4) { + best += 4; } return (best); } diff --git a/src/main.c b/src/main.c index c5840a7..0eea6fb 100644 --- a/src/main.c +++ b/src/main.c @@ -12,58 +12,70 @@ #include #include +#include #include #include "../libft/libft.h" #include "alcu.h" +#include "get_next_line.h" + +int check_char_int(char *str) { + int i; + + i = -1; + while (str[++i] && i < 100) + if (!(str[i] >= '0' && str[i] <= '9') && str[i] != '\n') + return (0); + + return (1); +} + +void player_turn(int *line) { + char *temp; + int choice; + + while (1) { + ft_putstr_fd("\nPlease choose between 1 and 3 items\n", 1); + temp = get_next_line(0); + if (temp && ft_strlen(temp) > 0) { + if (!check_char_int(temp)) { + free(temp); + continue; + } + choice = ft_atoi(temp); + free(temp); + if (choice > 0 && choice < 4) { + if (choice > *line) { + ft_putstr_fd("-\nInvalid choice\n", 1); + continue; + } + *line -= choice; + break; + } else { + ft_putstr_fd("-\nInvalid choice\n", 1); + continue; + } + } + } +} void game(int *lines, int size) { int ai_turn = 1; - int nb_read; int choice; for (int i = size - 1; i >= 0; i--) { while (lines[i] != 0) { - char buffer[100] = ""; - // ft_putstr_fd("Player : ", 1); - // char* choice = ft_itoa(i % 2 == 0 ? 1 : 2); - // ft_putstr_fd(choice, 1); - // ft_putstr_fd("\n", 1); + ft_putstr_fd("\n------------------------------\n", 1); if (!ai_turn) { print_board(lines, size); - ft_putstr_fd("\nPlease choose between 1 and 3 items\n", 1); - nb_read = read(0, buffer, sizeof(buffer)); - // char *temp = NULL; - if (nb_read > 0) { - choice = ft_atoi(buffer); - // temp = ft_itoa(choice); - // ft_putstr_fd(temp, 1); - if (choice > 0 && choice < 4) { - if (choice > lines[i]) { - ft_putstr_fd("-", 1); - ft_putstr_fd("\n", 1); - ft_putstr_fd("Invalid choice\n", 1); - i++; - // free(temp); - continue; - } - lines[i] -= choice; - } else { - ft_putstr_fd("-", 1); - ft_putstr_fd("\n", 1); - ft_putstr_fd("Invalid choice\n", 1); - i++; - // free(temp); - continue; - } - } + player_turn(&lines[i]); } else { print_board(lines, size); ft_putstr_fd("\n", 1); choice = ai(lines, size); ft_putstr_fd("AI play ", 1); ft_putnbr_fd(choice, 1); - ft_putstr_fd("\n\n", 1); + ft_putstr_fd("\n", 1); lines[i] -= choice; } ai_turn = ai_turn == 0;