Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
chtibizoux committed Jun 4, 2024
0 parents commit 7604a72
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build/
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Jeu de Nim

Simulation d'une partie de jeu de Nim entre un robot aléatoire et un robot qui connait la stratégie gagnante.

Ce jeu a été réalisé lors de ma première année de BUT, au sein de la [SAÉ](https://fr.wikipedia.org/wiki/Situation_d%27apprentissage_et_d%27%C3%A9valuation) 1 du premier semestre.

### Pour compiler le programme :
```shell
gcc -Wall nim.c -o build/nim
```
120 changes: 120 additions & 0 deletions nim.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <time.h>
#include <string.h>

typedef struct
{
char name[7];
int color;
} Player;

int RandomPlayer(int stick_number)
{
if (stick_number < 3)
{
return rand() % stick_number + 1;
}
return rand() % 3 + 1;
}

int IAPlayer(int stick_number)
{
if (stick_number % 4 == 0)
{
return 1;
}
return stick_number % 4;
}

void draw(int stick_number, int removed, Player player)
{
struct winsize sz;
ioctl(0, TIOCGWINSZ, &sz);

system("clear");

int XPos = sz.ws_col / 2 - 2 - strlen(player.name) / 2;
printf("\033[1;%dH\33[%dmJoueur %s\33[0m", XPos, player.color, player.name);

for (size_t i = 0; i < 2; i++)
{
int XPos = sz.ws_col / 2 - (stick_number + removed) * 3 / 2 + 1;
int YPos = sz.ws_row / 2 + i;
printf("\033[%d;%dH", YPos, XPos);
for (size_t i = 0; i < stick_number; i++)
{
printf(" | ");
}
printf("\33[90m");
for (size_t i = 0; i < removed; i++)
{
printf(" | ");
}
printf("\33[0m\n");
}
}

void end(Player player)
{
struct winsize sz;
ioctl(0, TIOCGWINSZ, &sz);

system("clear");

int XPos = sz.ws_col / 2 - 9 - strlen(player.name) / 2;
int YPos = sz.ws_row / 2 + 1;
int LastYPos = sz.ws_row - 2;
printf("\033[%d;%dHLe \33[%dmjoueur %s\33[0m a gagné !\033[%d;1H", YPos, XPos, player.color, player.name, LastYPos);
}

int main()
{
srand(time(NULL));

int stick_number = 20;

Player iaPlayer = {.color = 91, .name = "IA"};
Player randomPlayer = {.color = 94, .name = "Random"};

char firstPlayer[7];
while (strcmp(firstPlayer, "IA") && strcmp(firstPlayer, "Random"))
{
printf("Choisir le premier joueur (IA, Random): ");
scanf("%6s", firstPlayer);
}

// Hide cursor
printf("\e[?25l");

Player *actualPlayer = strcmp(firstPlayer, "IA") ? &iaPlayer : &randomPlayer;

while (stick_number > 0)
{
int removed;
if (strcmp(actualPlayer->name, "IA"))
{
actualPlayer = &iaPlayer;
removed = IAPlayer(stick_number);
}
else
{
actualPlayer = &randomPlayer;
removed = RandomPlayer(stick_number);
}

stick_number -= removed;

draw(stick_number, removed, *actualPlayer);
sleep(1);
}

end(*actualPlayer);

// Show cursor
printf("\e[?25h");

return EXIT_SUCCESS;
}

0 comments on commit 7604a72

Please sign in to comment.