SAE11_2023/SAE_semestre1/main.c

237 lines
5.7 KiB
C
Raw Normal View History

2023-11-27 17:19:03 +01:00
#include <stdlib.h>
#include <time.h>
#include <ncurses.h>
#define CORP_SNAKE '-'
#define TETE_SNAKE 'B'
#define DU_MANGER '*'
#define CASE_VIDE ' '
char ** grille = NULL;
int nbLignes = 0;
int nbColonnes = 0;
int modeEvolueDansLequelLeSerpentPeutPasserATraversLesMursEtCeSansAvoirMalDuToutCeQuiEstTresPratiqueCarCaPermetDeJouerPlusLongtemps = 0;
struct uneCellule {
int ligne;
int colonne;
struct uneCellule * suiv;
};
typedef struct uneCellule uneCellule;
struct unSnake {
uneCellule * teteSnake;
uneCellule * queueSnake;
};
typedef struct unSnake unSnake;
struct uneDirection {
int ligne;
int colonne;
};
typedef struct uneDirection uneDirection;
unSnake creerSnake() {
unSnake snake;
uneCellule * teteSnake = malloc(sizeof(uneCellule));
uneCellule * queueSnake = malloc(sizeof(uneCellule));
uneCellule * milieuSnake = malloc(sizeof(uneCellule));
teteSnake->ligne = 1;
teteSnake->colonne = 4;
teteSnake->suiv = NULL;
milieuSnake->ligne = 1;
milieuSnake->colonne = 3;
milieuSnake->suiv = teteSnake;
queueSnake->ligne = 1;
queueSnake->colonne = 2;
queueSnake->suiv = milieuSnake;
snake.teteSnake = teteSnake;
snake.queueSnake = queueSnake;
return snake;
}
void ajouterEnTete (unSnake * snake, int ligne, int colonne,int * aMange, int * fail) {
uneCellule * nouvelleTete = malloc (sizeof(uneCellule));
nouvelleTete->ligne = ligne;
nouvelleTete->colonne = colonne;
nouvelleTete->suiv = NULL;
snake->teteSnake->suiv = nouvelleTete;
grille[(snake->teteSnake->ligne)][(snake->teteSnake->colonne)] = CORP_SNAKE;
snake->teteSnake = snake->teteSnake->suiv;
if ( modeEvolueDansLequelLeSerpentPeutPasserATraversLesMursEtCeSansAvoirMalDuToutCeQuiEstTresPratiqueCarCaPermetDeJouerPlusLongtemps) {
if( snake->teteSnake->ligne < 0) {
snake->teteSnake->ligne = nbLignes - 1;
}
else if( snake->teteSnake->ligne > nbLignes-1) {
snake->teteSnake->ligne = 0;
}
else if (snake->teteSnake->colonne < 0) {
snake->teteSnake->colonne = nbColonnes - 1;
}
else if ( snake->teteSnake->colonne > nbColonnes-1) {
snake->teteSnake->colonne = 0;
}
else if (grille[snake->teteSnake->ligne][snake->teteSnake->colonne] == CORP_SNAKE) {
*fail = 1;
}
}
else {
if( snake->teteSnake->ligne < 0 ||
snake->teteSnake->ligne > nbLignes-1 ||
snake->teteSnake->colonne < 0 ||
snake->teteSnake->colonne > nbColonnes-1)
*fail = 1;
}
if(!*fail) {
*aMange = (grille[snake->teteSnake->ligne][snake->teteSnake->colonne] == DU_MANGER) ? 1 : 0;
grille[snake->teteSnake->ligne][snake->teteSnake->colonne] = TETE_SNAKE;
}
}
void supprimerQueue(unSnake * snake) {
uneCellule * auxi;
auxi = snake->queueSnake;
grille[snake->queueSnake->ligne][snake->queueSnake->colonne] = CASE_VIDE;
snake->queueSnake = snake->queueSnake->suiv;
free(auxi);
}
void initGrille() {
int i , j = 0;
for (i = 0; i<nbLignes;i++) {
for (j=0;j<nbColonnes;j++) {
grille[i][j] = CASE_VIDE;
}
}
}
void afficherGrille(unSnake snake) {
int i , j = 0;
for (i = 0; i<nbLignes;i++) {
for (j=0;j<nbColonnes;j++) {
printw("%c",grille[i][j]);
}
}
}
void gererEvenement(unSnake * snake, int touche, int * fail, uneDirection * direction,int * aMange) {
if(direction->ligne == 0) {
if (touche == KEY_UP){
direction->ligne = -1;
direction->colonne = 0;
}
if (touche == KEY_DOWN) {
direction->ligne = 1;
direction->colonne = 0;
}
}
if (direction->colonne == 0) {
if (touche == KEY_LEFT) {
direction->colonne = -1;
direction->ligne = 0;
}
if (touche == KEY_RIGHT) {
direction->colonne = 1;
direction->ligne = 0;
}
}
ajouterEnTete(snake,snake->teteSnake->ligne + direction->ligne,snake->teteSnake->colonne + direction->colonne, aMange,fail);
if(!*aMange)
supprimerQueue(snake);
}
void genererDuManger(char ** grille) {
int ligne = 0;
int colonne = 0;
int done = 0;
srand(time(NULL));
while (!done){
ligne = rand() % (nbLignes-1);
colonne = rand() % (nbColonnes-1);
if(grille[ligne][colonne] == CASE_VIDE) {
grille[ligne][colonne] = DU_MANGER;
done = 1;
}
}
}
void printFail() {
move(nbLignes/2 - 5/2,nbColonnes/2 - 37/2);
printw(" _/_/_/_/ _/_/ _/_/_/ _/ \n");
move(1 + nbLignes/2 - 5/2,nbColonnes/2 - 37/2);
printw(" _/ _/ _/ _/ _/ \n");
move(2 + nbLignes/2 - 5/2,nbColonnes/2 - 37/2);
printw(" _/_/_/ _/_/_/_/ _/ _/ \n");
move(3 + nbLignes/2 - 5/2,nbColonnes/2 - 37/2);
printw(" _/ _/ _/ _/ _/ \n");
move(4 + nbLignes/2 - 5/2,nbColonnes/2 - 37/2);
printw("_/ _/ _/ _/_/_/ _/_/_/_/ \n");
}
int main (int argc, char * argv []) {
int i = 0;
int touche = 0;
int fail = 0;
unSnake snake = creerSnake();
uneDirection direction = {0,1};
int aMange = 1;
int nbCasesMangees = 0;
int delay = 0;
if (argc > 1) {
modeEvolueDansLequelLeSerpentPeutPasserATraversLesMursEtCeSansAvoirMalDuToutCeQuiEstTresPratiqueCarCaPermetDeJouerPlusLongtemps = 1;
}
initscr();
keypad(stdscr, TRUE);
noecho();
cbreak();
getmaxyx(stdscr,nbLignes,nbColonnes);
grille = malloc(nbLignes * sizeof(char *));
for (i=0;i<nbLignes;i++) {
grille[i] = malloc(nbColonnes*sizeof(char));
}
initGrille();
while (!fail) {
if (aMange){
genererDuManger(grille);
nbCasesMangees ++;
delay = 101 - nbCasesMangees;
delay = (delay < 60) ? 60 : delay;
timeout(delay);
}
afficherGrille(snake);
touche = getch();
gererEvenement(&snake,touche,&fail,&direction,&aMange);
erase();
}
timeout(5000);
erase();
printFail();
getch();
endwin();
return 0;
}