From 60632fc2a7e09596e65ae3b205b1c8742fb8e7c8 Mon Sep 17 00:00:00 2001 From: David GAILLETON Date: Sat, 28 Mar 2026 19:34:30 +0100 Subject: [PATCH] add(ai) ai algorithm working --- Makefile | 3 +- alcu.map | 2 +- alum1 | Bin 21840 -> 27976 bytes inc/alcu.h | 3 +- src/ai.c | 65 +++++++++++++++++++++++++++++ src/main.c | 117 +++++++++++++++++++++++++++++------------------------ 6 files changed, 135 insertions(+), 55 deletions(-) create mode 100644 src/ai.c diff --git a/Makefile b/Makefile index 18cd429..f21d0e9 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,8 @@ SRC = main.c \ get_next_line.c \ fill_array.c \ check_input.c \ - print_board.c + print_board.c \ + ai.c SRCS = $(addprefix $(P_SRC), $(SRC)) OBJS = $(patsubst $(P_SRC)%.c,$(P_OBJ)%.o,$(SRCS)) diff --git a/alcu.map b/alcu.map index 1ec63ec..0b470c6 100644 --- a/alcu.map +++ b/alcu.map @@ -2,4 +2,4 @@ 5 3 2 -1 +2 diff --git a/alum1 b/alum1 index 2db180eb4ae9e9df8e95e8a8ab67c5ebfe4a227f..31f2243563bfd940a522601aac4897ed05cdb6d8 100755 GIT binary patch literal 27976 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 F{4WZTD#ri- delta 6475 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/03/28 17:22:33 by dgaillet #+# #+# */ +/* Updated: 2026/03/28 17:22:35 by dgaillet ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include "alcu.h" + +static int best_to_take(int prev_should_start, int line) { + int best; + + if (prev_should_start) { + best = 2; + while (best <= line - 2) + best += 2; + } else { + best = 1; + while (best <= line - 4) { + best += 4; + } + } + return (best); +} + +static int to_play(int prev_should_start, int line) { + int goal; + goal = best_to_take(prev_should_start, line); + if (line - goal < 3) { + return (line - goal) + 1; + } else { + return (1); + } +} + +static int should_start(int prev_should_start, int line) { + if (prev_should_start && line == 1) + return (!prev_should_start); + if (prev_should_start) + return (line % 4 != 1); + else + return (line % 4 != 0); +} + +int ai(int *gamestate, int nb_line) { + int prev_should_start; + int i; + + prev_should_start = 0; + i = -1; + while (++i < nb_line && gamestate[i] != 0) { + if (i == nb_line - 1 || gamestate[i + 1] == 0) { + if (gamestate[i] == 1) + return (1); + return (to_play(prev_should_start, gamestate[i])); + } + prev_should_start = should_start(prev_should_start, gamestate[i]); + } + return (1); +} diff --git a/src/main.c b/src/main.c index f53f90d..c5840a7 100644 --- a/src/main.c +++ b/src/main.c @@ -17,31 +17,86 @@ #include "../libft/libft.h" #include "alcu.h" -int main(int argc, char *argv[]) -{ - if (argc != 2) - { +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); + 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; + } + } + } 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); + lines[i] -= choice; + } + ai_turn = ai_turn == 0; + } + } + if (!ai_turn) + ft_putstr_fd("AI win ! It will replace you\n", 1); + else + ft_putstr_fd("You win ! Well done\n", 1); +} + +int main(int argc, char *argv[]) { + if (argc != 2) { ft_putstr_fd("ERROR", 2); return (1); } int fd = open(argv[1], O_RDONLY); - if (fd == -1) - { + if (fd == -1) { ft_putstr_fd("ERROR", 2); return (1); } int size = check_input(fd); - if (size < 0) - { + if (size < 0) { ft_putstr_fd("ERROR", 2); return (1); } + close(fd); fd = open(argv[1], O_RDONLY); - int* lines = fill_array(fd, size); + int *lines = fill_array(fd, size); if (!lines) return (1); @@ -51,49 +106,7 @@ int main(int argc, char *argv[]) // } // int player = 1; - 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("Please choose between 1 and 3 items\n", 1); - print_board(lines, size); - int nb_read = read(0, buffer, sizeof(buffer)); - char* temp = NULL; - if (nb_read > 0) - { - int 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 ; - } - } - } - } + game(lines, size); close(fd); free(lines); return (0);