290 lines
9.1 KiB
C
290 lines
9.1 KiB
C
|
#include<graph.h>
|
||
|
#include<stdio.h>
|
||
|
#include<stdlib.h>
|
||
|
#include <time.h>
|
||
|
#include "blocus.h"
|
||
|
|
||
|
|
||
|
#define posx 250
|
||
|
#define posy 100
|
||
|
#define taille_case 70
|
||
|
|
||
|
|
||
|
|
||
|
int main(void){
|
||
|
|
||
|
int case_click[9][9] = {0};
|
||
|
int game = 1;
|
||
|
int joueur = 1;
|
||
|
int last_case_x_j1, last_case_y_j1;
|
||
|
int last_case_x_j2, last_case_y_j2;
|
||
|
int sprite = 0;
|
||
|
int sprite2 = 0;
|
||
|
int placement1 = 0;
|
||
|
int placement2 = 0;
|
||
|
int solo = 0;
|
||
|
int multi = 0;
|
||
|
int x = 0, y = 0, i, j;
|
||
|
int mode_grille = 0;
|
||
|
int grille = 0;
|
||
|
int tx = 0, ty = 0;
|
||
|
int case_x = 0, case_y = 0;
|
||
|
int rouge;
|
||
|
int bleu;
|
||
|
int blocage;
|
||
|
int gagnant = 0;
|
||
|
int aleatoirex;
|
||
|
int aleatoirey;
|
||
|
int coordX, coordY;
|
||
|
int blocX, blocY;
|
||
|
int deplacementX, deplacementY;
|
||
|
|
||
|
|
||
|
/* Pointeurs de fichiers pour les sprites */
|
||
|
FILE *spriteRouge = fopen("rouge.bmp","r");
|
||
|
FILE *spriteBleu = fopen("bleu.bmp","r");
|
||
|
FILE *spriteBlocage = fopen("blocage.bmp","r");
|
||
|
if(spriteRouge == NULL){
|
||
|
printf("Le fichier 'rouge.bmp' est introuvable.\n");
|
||
|
} else{
|
||
|
printf("Le fichier 'rouge.bmp' est trouvé !\n");
|
||
|
fclose(spriteRouge);
|
||
|
}
|
||
|
if(spriteBleu == NULL){
|
||
|
printf("Le fichier 'bleu.bmp' est introuvable.\n");
|
||
|
} else{
|
||
|
printf("Le fichier 'bleu.bmp' est trouvé.\n");
|
||
|
fclose(spriteBleu);
|
||
|
}
|
||
|
if(spriteBlocage == NULL){
|
||
|
printf("Le fichier 'blocage.bmp' est introuvable.\n");
|
||
|
} else{
|
||
|
printf("Le fichier 'blocage.bmp' est trouvé.\n");
|
||
|
fclose(spriteBlocage);
|
||
|
}
|
||
|
|
||
|
|
||
|
creer_menu(&solo,&multi,&mode_grille,&grille);
|
||
|
initialiser_grille(grille);
|
||
|
|
||
|
/* Chargement des sprites du jeu*/
|
||
|
ChargerImage("spriteBlocage", case_x*taille_case, case_y*taille_case,70,70, 70, 70);
|
||
|
blocage = ChargerSprite("blocage.bmp");
|
||
|
if(blocage == -1){
|
||
|
printf("Erreur lors du chargement du sprite");}
|
||
|
ChargerImage("spriteBleu", case_x*taille_case, case_y*taille_case,70,70, 70, 70);
|
||
|
bleu = ChargerSprite("bleu.bmp");
|
||
|
if(bleu == -1){
|
||
|
printf("Erreur lors du chargement du sprite");}
|
||
|
ChargerImage("spriteRouge", case_x*taille_case, case_y*taille_case,70,70, 70, 70);
|
||
|
rouge = ChargerSprite("rouge.bmp");
|
||
|
if(rouge == -1){
|
||
|
printf("Erreur lors du chargement du sprite");}
|
||
|
|
||
|
|
||
|
while(game==1){
|
||
|
|
||
|
while(placement1!=1 || placement2 != 1){
|
||
|
|
||
|
if(SourisCliquee()){
|
||
|
x = _X;
|
||
|
y = _Y;
|
||
|
|
||
|
case_x = x / taille_case;
|
||
|
case_y = y / taille_case;
|
||
|
|
||
|
printf("case choisie : %d, %d\n", case_x, case_y);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* Premier tour */
|
||
|
|
||
|
if(case_x < grille && case_y < grille && case_click[case_x][case_y] != 1) {
|
||
|
|
||
|
if(sprite == 0 && case_click[case_x][case_y] != 3){
|
||
|
AfficherSprite(rouge, case_x*taille_case, case_y*taille_case);
|
||
|
sprite = 1;
|
||
|
last_case_x_j2 = case_x; /*j2 car il sera le deuxième à joueur sauf au placement pour pas le désavantager*/
|
||
|
last_case_y_j2 = case_y;
|
||
|
case_click[case_x][case_y]=2;
|
||
|
if(solo == 1){
|
||
|
CoordIA(grille, &coordX, &coordY);
|
||
|
AfficherSprite(bleu, (coordX-1)*taille_case, (coordY-1)*taille_case);
|
||
|
sprite2 =1;
|
||
|
placement1 = 1;
|
||
|
last_case_x_j1 = coordX-1;
|
||
|
last_case_y_j1 = coordY-1;
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
else if(multi == 1 && sprite2 == 0 && case_click[case_x][case_y] != 2){
|
||
|
AfficherSprite(bleu, case_x*taille_case, case_y*taille_case);
|
||
|
sprite2 = 1;
|
||
|
placement2 = 1;
|
||
|
last_case_x_j1 = case_x;
|
||
|
last_case_y_j1 = case_y;
|
||
|
case_click[case_x][case_y]=3;
|
||
|
ChoisirCouleurDessin(CouleurParNom("blue")); /*Affichage de l'indication de tour pour le joueur rouge en début de partie*/
|
||
|
RemplirRectangle(0,ty+1,tx,ty-100);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if(case_click[case_x][case_y] !=1 && case_click[case_x][case_y] !=2 && sprite == 1 && sprite2 == 1 && placement1!=1 && estAdjacent(last_case_x_j1, last_case_y_j1, case_x, case_y)) {
|
||
|
EffacerAncienSprite(last_case_x_j1*taille_case, last_case_y_j1*taille_case, taille_case, taille_case);
|
||
|
case_click[last_case_x_j1][last_case_y_j1]=0;
|
||
|
AfficherSprite(bleu, case_x*taille_case, case_y*taille_case);
|
||
|
last_case_x_j1 = case_x; /*recupère la coordonnée*/
|
||
|
last_case_y_j1 = case_y;
|
||
|
placement1=1;
|
||
|
case_click[case_x][case_y]=3;
|
||
|
}
|
||
|
else if(case_click[case_x][case_y] != 1 && case_click[case_x][case_y] !=3 && sprite == 1 && sprite2 == 1 && placement2!= 1 && estAdjacent(last_case_x_j2, last_case_y_j2, case_x, case_y)) {
|
||
|
EffacerAncienSprite(last_case_x_j2*taille_case, last_case_y_j2*taille_case, taille_case, taille_case);
|
||
|
case_click[last_case_x_j2][last_case_y_j2]=0;
|
||
|
AfficherSprite(rouge, case_x*taille_case, case_y*taille_case);
|
||
|
last_case_x_j2 = case_x;
|
||
|
last_case_y_j2 = case_y;
|
||
|
placement2=1;
|
||
|
case_click[case_x][case_y]=2;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(SourisCliquee()){
|
||
|
x = _X;
|
||
|
y = _Y;
|
||
|
|
||
|
case_x = x / taille_case;
|
||
|
case_y = y / taille_case;
|
||
|
|
||
|
printf("case choisie : %d, %d\n", case_x, case_y);
|
||
|
|
||
|
|
||
|
if(case_x < grille && case_y < grille && case_click[case_x][case_y] != 1) {
|
||
|
if(joueur == 1 && placement1 == 1 && case_click[case_x][case_y] != 1 && case_click[case_x][case_y]!=2 && case_click[case_x][case_y]!=3){
|
||
|
AfficherSprite(blocage, case_x*taille_case+1, case_y*taille_case+1);
|
||
|
case_click[case_x][case_y]=1;
|
||
|
placement2-=1;
|
||
|
ChoisirCouleurDessin(CouleurParNom("red"));
|
||
|
RemplirRectangle(0,ty+1,tx,ty-100);
|
||
|
if(solo == 1){
|
||
|
|
||
|
for (i = 0; i < grille; i++) {
|
||
|
for (j = 0; j < grille; j++) {
|
||
|
if (case_click[j][i] == 3 && (j + 1 >= grille || case_click[j + 1][i] != 0) &&
|
||
|
(j - 1 < 0 || case_click[j - 1][i] != 0) &&
|
||
|
(i + 1 >= grille || case_click[j][i + 1] != 0) &&
|
||
|
(i - 1 < 0 || case_click[j][i - 1] != 0) &&
|
||
|
(j + 1 >= grille || i + 1 >= grille || case_click[j + 1][i + 1] != 0) &&
|
||
|
(j + 1 >= grille || i - 1 < 0 || case_click[j + 1][i - 1] != 0) &&
|
||
|
(j - 1 < 0 || i + 1 >= grille || case_click[j - 1][i + 1] != 0) &&
|
||
|
(j - 1 < 0 || i - 1 < 0 || case_click[j - 1][i - 1] != 0)) {
|
||
|
printf("GG ROUGE\n");
|
||
|
sleep(1);
|
||
|
gagnant = 2;
|
||
|
ecran_de_fin(gagnant);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
do{
|
||
|
do{
|
||
|
DeplacementIAX(grille, &deplacementX);
|
||
|
}while(last_case_x_j1+deplacementX < 0 || last_case_x_j1+deplacementX >= grille);
|
||
|
do{
|
||
|
DeplacementIAY(grille, &deplacementY);
|
||
|
}while((last_case_y_j1+deplacementY < 0 || last_case_y_j1+deplacementY >= grille));
|
||
|
}while(case_click[last_case_x_j1+deplacementX][last_case_y_j1+deplacementY] != 0 || (deplacementX == 0 && deplacementY == 0));
|
||
|
EffacerAncienSprite(last_case_x_j1*taille_case, last_case_y_j1*taille_case, taille_case, taille_case);
|
||
|
case_click[last_case_x_j1][last_case_y_j1]=0;
|
||
|
AfficherSprite(bleu, (last_case_x_j1+deplacementX)*taille_case, (last_case_y_j1+deplacementY)*taille_case);
|
||
|
last_case_x_j1 = last_case_x_j1 + deplacementX; /*recupère la coordonnée*/
|
||
|
last_case_y_j1 = last_case_y_j1 + deplacementY;
|
||
|
placement1=1;
|
||
|
case_click[last_case_x_j1][last_case_y_j1]=3;
|
||
|
|
||
|
do{
|
||
|
CoordBlocageIA(grille, &blocX, &blocY);
|
||
|
}while(case_click[blocX-1][blocY-1] != 0);
|
||
|
AfficherSprite(blocage, (blocX-1)*taille_case, (blocY-1)*taille_case);
|
||
|
case_click[blocX-1][blocY-1] = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
else if(joueur == -1 && placement2 == 1 && case_click[case_x][case_y] != 1 && case_click[case_x][case_y]!=2 && case_click[case_x][case_y]!=3){
|
||
|
if(multi == 1){
|
||
|
AfficherSprite(blocage, case_x*taille_case, case_y*taille_case);
|
||
|
case_click[case_x][case_y]=1;
|
||
|
placement1-=1;
|
||
|
ChoisirCouleurDessin(CouleurParNom("blue"));
|
||
|
RemplirRectangle(0,ty+1,tx,ty-100);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/*Vérification si les joueurs peuvent encore bouger*/
|
||
|
for (i = 0; i < grille; i++) {
|
||
|
for (j = 0; j < grille; j++) {
|
||
|
if (case_click[j][i] == 2 && (j + 1 >= grille || case_click[j + 1][i] != 0) &&
|
||
|
(j - 1 < 0 || case_click[j - 1][i] != 0) &&
|
||
|
(i + 1 >= grille || case_click[j][i + 1] != 0) &&
|
||
|
(i - 1 < 0 || case_click[j][i - 1] != 0) &&
|
||
|
(j + 1 >= grille || i + 1 >= grille || case_click[j + 1][i + 1] != 0) &&
|
||
|
(j + 1 >= grille || i - 1 < 0 || case_click[j + 1][i - 1] != 0) &&
|
||
|
(j - 1 < 0 || i + 1 >= grille || case_click[j - 1][i + 1] != 0) &&
|
||
|
(j - 1 < 0 || i - 1 < 0 || case_click[j - 1][i - 1] != 0)) {
|
||
|
printf("GG BLEU\n");
|
||
|
sleep(1);
|
||
|
gagnant = 1;
|
||
|
ecran_de_fin(gagnant);
|
||
|
}
|
||
|
if (case_click[j][i] == 3 && (j + 1 >= grille || case_click[j + 1][i] != 0) &&
|
||
|
(j - 1 < 0 || case_click[j - 1][i] != 0) &&
|
||
|
(i + 1 >= grille || case_click[j][i + 1] != 0) &&
|
||
|
(i - 1 < 0 || case_click[j][i - 1] != 0) &&
|
||
|
(j + 1 >= grille || i + 1 >= grille || case_click[j + 1][i + 1] != 0) &&
|
||
|
(j + 1 >= grille || i - 1 < 0 || case_click[j + 1][i - 1] != 0) &&
|
||
|
(j - 1 < 0 || i + 1 >= grille || case_click[j - 1][i + 1] != 0) &&
|
||
|
(j - 1 < 0 || i - 1 < 0 || case_click[j - 1][i - 1] != 0)) {
|
||
|
printf("GG ROUGE\n");
|
||
|
sleep(1);
|
||
|
gagnant = 2;
|
||
|
ecran_de_fin(gagnant);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(multi == 1){
|
||
|
/*Changement de joueur sauf lors des placements des pions*/
|
||
|
|
||
|
joueur=-(joueur);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*Fermeture des fichiers*/
|
||
|
fclose(spriteRouge);
|
||
|
fclose(spriteBleu);
|
||
|
fclose(spriteBlocage);
|
||
|
|
||
|
}
|