Skip to content
Snippets Groups Projects
Commit 6f6a3352 authored by remi.greub's avatar remi.greub
Browse files

jeu de puissance4 quasi entierement fonctionnelle (jouable sans partie...

jeu de puissance4 quasi entierement fonctionnelle (jouable sans partie graphique + petits bugs a corriger)
parent 591f4834
No related branches found
No related tags found
No related merge requests found
......@@ -2,11 +2,11 @@
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <puissance4.h>
#include "puissance4.h"
int main(int argc, char** argv){
if((argc) > 1 && (argc <= 3)){
if((argc < 2) || (argc > 3)){
printf("il manque des arguments\n");
return EXIT_FAILURE;
}
......@@ -18,8 +18,10 @@ int main(int argc, char** argv){
width = atoi(argv[2]);
}
init_puissance4(height, width);
//print_gameCells();
int win = Launch_puissance4();
printf("\nle winner c'est ça la : %d\n",win);
return EXIT_SUCCESS;
}
......
......@@ -29,3 +29,207 @@ struct cell **Create_grid2D(){
return cells;
}
void print_cells(struct cell **cell){
for(int i=0; i<game.height; i++){
for(int j=0; j<game.width; j++){
printf("%d, ", cell[i][j].symbol);
}
printf("\n");
}
}
void print_gameCells(){
print_cells(game.cells);
}
void init_puissance4(int height, int width){
game.players[1].check_win = 0;
game.players[1].score = 0;
game.players[1].symbol = CROSS;
game.players[0].check_win = 0;
game.players[0].score = 0;
game.players[0].symbol = CIRCLE;
game.curr_player = 0;
game.height = height;
game.width = width;
game.gamePlayed = height*width;
game.cells = Create_grid2D();
}
void cell_destroy(struct cell **cells, int height){
for(int i=0; i<height; i++){
free(cells[i]);
}
free(cells);
}
int kill_game(){
cell_destroy(game.cells, game.height);
return EXIT_SUCCESS;
}
/*void Show_grid(struct cell** cell){
//return 0;
}*/
int put_free_cell(int j_p, int i, symbol_t symbol){
if(game.cells[j_p][i].symbol == EMPTY){
//put the player's symbol
game.cells[j_p][i].symbol = symbol;
}else{
if(i<=game.height){
return put_free_cell(j_p, i+1, symbol);
}else{
return -1;
}
}
return i;
}
int Launch_puissance4(){
symbol_t winner=EMPTY;
int chiffre=0;
while(winner==EMPTY){
//print_grille();
print_gameCells();
printf("au tour de %d de jouer\n", game.curr_player);
printf("balance un chiffre entre 0 et %d\n", game.width);
scanf("%d",&chiffre);
game.gamePlayed -= 1;
int i = 0;
//verifier que put free cell fonctionne
if((i = put_free_cell(chiffre, 0, game.players[game.curr_player].symbol))<0){
//la grille est pleine genre... ou y a un bug de zinzin
if(Is_Grid_full()){
//la grille est pleine sa mere la pute
//print egalite mais y a probablement eu un bug
printf("y a un egalite mais probablement un bug aussi mdr\n");
//fin du jeu
return EQUAL; //jeu egal
}else{
//il y a un bug de zinzin
printf("ok la y a un bug de zinzin check ca \n");
//print la grille pour debug
print_gameCells();
//fin du jeu
return -1; //erreur
}
}
//check de la win
winner = Find_winner(game.cells, game.cells[chiffre][i]);
if( winner != EMPTY){
if(winner==CROSS){
//reset du jeu + mise a jour des scores (scores optionels)
printf("la croix a gagnée cette connasse\n");
//print joueur croix a gagné
//fin du jeu
return CROSS;
}
if(winner==CIRCLE){
//reset du jeu + mise a jour des scores (scores optionels)
//print joueur cercle a gagné
printf("le cercle a gagné cet enorme zgeg\n");
//fin du jeu
return CIRCLE;
}
}else{
//sois le jeu est plein, sois y a juste pas encore de winner
if(Is_Grid_full()){
//la grille est pleine
//print egalite
printf("y a un egalite dans les regles de l'art mash'allah\n");
//winner = EQUAL;
//fin du jeu
return EQUAL;
}
//y a juste pas encore de winner ducoup...
game.curr_player ^= 1; //switch de joueur
printf("au tour de %d de jouer\n", game.curr_player);
}
}
return winner;//boucle sa mere... jusqu'à ce que la grille soit pleine, ou que un winner a été détecté
}
bool Is_Grid_full(){
return game.gamePlayed == 0;
}
/***********************************
* function : Find_winner
* arguments : grid[][],
* cellule jouée,
* taille de grille (ex: 3 pour 3x3)
*
* return value : symbole -> gagnant ou EMPTY
* Cherche si il y a un gagnant,
* (cherche des suites de cases gagnantes)
* !!! Fonctionne avec CheckWin_in_a_direction !!!
***********************************/
symbol_t Find_winner(struct cell **grid, struct cell cellPlayed){
//int grid_len = game.height*game.width;
int k[4][2]={
{0,1},
{1,0},
{1,-1},
{1,1}
};
int k2[4][2]={
{0,-1},
{-1,0},
{-1,1},
{-1,-1}
};
symbol_t result;
for(int i=0; i<4; i++){
//à savoir, il est impossible que le cellPlayed soit empty !!
result = CheckWin_in_a_direction(k[i], grid, grid[cellPlayed.i_pos][cellPlayed.j_pos]);
if(result != EMPTY){return result;}
result = CheckWin_in_a_direction(k2[i], grid, grid[cellPlayed.i_pos][cellPlayed.j_pos]);
game.players[0].check_win = 0;
game.players[1].check_win = 0;
if(result != EMPTY){
return result; //si il trouve un winner, alors il stoppe la fonction :)
}
}
return EMPTY; // pas de winner pour l'instant
}
/***********************************
* function : CheckWin_in_a_direction
* arguments : grid[][],
* cellule jouée,
* taille de grille (ex: 3 pour 3x3)
*
* return value : symbole -> gagnant ou EMPTY si non
*
* Va chercher des suites de cases gagnantes
* recursivement, dans une seule direction
* à l'aide des var globale cross et circle
***********************************/
symbol_t CheckWin_in_a_direction(int dir[2], struct cell **grid, struct cell cell){
int x1 = cell.i_pos+dir[0];
int x2 = cell.j_pos+dir[1];
symbol_t result = EMPTY;
if(x1<game.height && x1>=0 && x2<game.width && x2>=0){
if(grid[x1][x2].symbol==cell.symbol){
if(cell.symbol == CIRCLE){
game.players[0].check_win += 1;
}else{
game.players[1].check_win += 1;
}
if(game.players[0].check_win>=3){
return CIRCLE; //circle win
}
else if(game.players[1].check_win>=3){
return CROSS; //cross win
}else{
result = CheckWin_in_a_direction(dir, grid, grid[x1][x2]);
}
}
}
return result;
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment