Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

essai solveur #4

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions game.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#include "game.h"

game *gameInit(int size, int cNb) {
if(size < 2 || cNb < 2) exit(1);
game *g = (game *)calloc(1, sizeof(game));
if(!g) exit(1);
g->size = size;
g->cNb = cNb;
g->cTab = rgbArrayGenRand(cNb);
while(rgbArrayHasDuplicate(g->cTab,cNb)) g->cTab = rgbArrayGenRand(cNb);
g->grid = gridInit(size);
gridInitColors(g->grid, g->cTab, cNb);
g->cPlayer = gridGetColor(g->grid, 0, 0);
g->turnCount = 0;
return g ;
}

void gameCopy(game* g1, game* g2) {
g2->cTab = g1->cTab;
g2->turnCount = g1->turnCount;
gridCopy(g1->grid,g2->grid);
g2->cPlayer = g1->cPlayer;
}

void gamePrint(game *g) {
printf("Color Flood :\nSize : %2d nb_Colors : %2d\n", g->size, g->cNb);
printf("Colors available :\n");
rgbArrayPrint(g->cTab, g->cNb);
printf("Board state:\n");
gridPrint(g->grid, g->cTab, g->cNb);
/* tests */
printf("Labels:\n");
gridPrintLabels(g->grid);
/* end tests */
printf("Player's color: %d\n", rgbColorToInt(g->cPlayer,g->cTab,g->cNb));
rgbPrint(g->cPlayer);
}

void gameFree(game *g) {
free(g->cTab);
gridFree(g->grid);
free(g);
}

void gamePlayTurn(game *g) {
char line[256];
int color;
printf("Enter new color: \n");
if (fgets(line, sizeof(line), stdin)) {
if (1 == sscanf(line, "%d", &color)) {
if(color < 0 || color > g->cNb-1 || rgbEqual(g->cPlayer, g->cTab[color])) {
printf("Not a valid color\n");
}
else {
gridSetColor(g->grid, g->cTab[color], 0, 0);
gridFloodFillColor(g->grid, 0, 0);
gridSetLabel(g->grid, gridGetMaxLabel(g->grid) + g->turnCount, 0, 0);
gridFloodFillLabel(g->grid, 0, 0);
g->cPlayer = g->cTab[color];
g->turnCount++;
}
}
}
}

bool gameOver(game *g) {
return gridIsUniform(g->grid);
}

game *gameImport(char *save) {

char buffer[256];
int size, colors;

FILE *fp = fopen(save,"r");
if(fp == NULL) {
printf("save not found\n");
exit(1);
}

/* FILE FORMAT :
* grid_size cNb
* R G B (cNb lines)
* 11 12 13 ....
* 21 22 23 ....
* .............
*/

fgets(buffer, sizeof(buffer), fp);
if(sscanf(buffer, "%d %d", &size, &colors) != 2) {
printf("Not a valid save file\n");
exit(1);
}

if(size < 2 || colors < 2) exit(1);
game *g = (game *)calloc(1, sizeof(game));
if(!g) exit(1);
g->size = size;
g->cNb = colors;
g->turnCount = 0;
g->cTab = rgbImport(fp, colors);
g->grid = gridImport(fp, size, g->cTab, colors);
g->cPlayer = gridGetColor(g->grid, 0, 0);

fclose(fp);

return g;
}

void gameExport(game *g) {

char name[100];
/* generate name from date */
sprintf(name, "save_%ju.data",time(NULL));
FILE *fp = fopen(name,"ab+");
if(fp == NULL) exit(1);

fprintf(fp, "%d %d\n", g->size, g->cNb);

rgbExport(fp, g->cTab, g->cNb);
gridExport(fp, g->grid, g->cTab, g->cNb);

fclose(fp);

}
97 changes: 97 additions & 0 deletions game.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#ifndef GAME_H
#define GAME_H

/**
* \file game.c
* \author LastButNotLeast
* \date Mars 2017
* \brief Gestion du jeu pendant une partie.
*/
#include <stdbool.h>
#include <stdio.h>
#include "rgb.h"
#include "grid.h"

/**
* \struct t_game
* \brief Structure de la partie
*/
typedef struct t_game {
grid *grid; /**< Grille du jeu */
int size; /**< Taille de la grille, ie nombre de cases sur un coté. (duplicate data, size in grid too)*/
int cNb; /**< Nombre de couleurs différentes*/
int turnCount; /**< Nombre de clic au cours de la partie*/
RGB *cTab; /**< Tableau contenant toutes les couleurs*/
RGB cPlayer; /**< Couleur du joueur, ie couleur de la case en haut à gauche (première case)*/
} game;

/**
* \fn gameInit(int size, int cNb)
* \brief Initialise une partie avec une grille qui contient un nombre donné de couleurs au hasard
*
* \param size : taille de la grille à générer ie nombre de cases d'un coté
* \param cNb : Nombre de couleurs différentes
* \return Le jeu généré.
*/
game *gameInit(int size, int cNb);

/**
* \fn gameCopy(game* g1, game* g2)
* \brief Copie la partie g1 dans la partie g2.
*
* \param g1 : le jeu à copier
* \param g2 : le jeu dans lequel on va copier
*/
int gameCopy(game* g1, game* g2);

/**
* \fn gamePrint(game *g)
* \brief Affiche la grille de jeu et d'autres informations
*
* \param g : le jeu
*/
void gamePrint(game *g);

/**
* \fn gameFree(game *g)
* \brief Supprime la partie
*
* \param g : le jeu
*/
void gameFree(game *g);

/**
* \fn gamePlayTurn(game *g)
* \brief Modifie la grille après que le joueur ait décidé d'une couleur
*
* \param g : le jeu
*/
void gamePlayTurn(game *g);

/**
* \fn gameOver(game *g)
* \brief Teste si la partie est terminée (victoire du joueur) ou si elle continue
*
* \param g : le jeu
* \return true si le jeu est terminé, false sinon
*/
bool gameOver(game *g);

/**
* \fn gameImport(char *save)
* \brief Importe une partie depuis un fichier existant
*
* \param save : le fichier
* \return le jeu généré
*/
game *gameImport(char *save);

/**
* \fn gameExport(game *g)
* \brief *Exporte une partie dans un fichier
*
* \param g : le jeu à exporter
*/
void gameExport(game *g);

#endif
Loading