Blocus/regles.c
2021-11-17 18:06:51 +01:00

140 lines
4.0 KiB
C

/* Leni Boscher * Tanguy Domergue */
#include<stdio.h>
#include<stdlib.h>
#include<graph.h>
#include"regles.h"
#include"plateau.h"
/* Fonction qui donne la case dans laquelle le pion du joueur est */
couple chercherPion(int joueur) {
int i;
int j;
for(i=1;i<taille+1;i++) {
for(j=1;j<taille+1;j++) {
if(tab[i][j].etat==joueur) {
couple pion;
pion.x=i;
pion.y=j;
return pion;
}
}
}
}
/* Fonction qui retourne la case sur laquelle on a cliqué */
couple calculIndice(int x, int y){
int i=1;
int j=1;
for(i=1;i<taille;i++) {
if ((x>=tab[i][j].coord.x)&&(x<=tab[i+1][j].coord.x)) {
break;
}
}
for(j=1;j<taille;j++) {
if ((y>=tab[i][j].coord.y)&&(y<=tab[i][j+1].coord.y)) {
break;
}
}
if((x>decalage+DIMENSIONS) || (x<decalage) || (y>decalage+DIMENSIONS) || (y<decalage)) {
couple indice;
indice.x=-1;
indice.y=-1;
return indice;
}
couple indice;
indice.x=i;
indice.y=j;
return indice;
}
/* Fonction de restriction de déplacement : le joueur ne peut pas se déplacer si la case visée est déjà occupée ou condamnée
Cette fonction restreint également le placement des croix : le joueur ne peut pas placer de croix sur son adversaire ou sur une case déjà condamnée */
int caseVerif(couple indice) {
if(indice.x == -1 || indice.y == -1) {
return -1;
}
if(tab[indice.x][indice.y].etat==-1){
return -1;
}
if (tab[indice.x][indice.y].etat==0){
return 1;
} else {
return 0;
}
}
/* Fonction de restriction de déplacement : le joueur ne peut se déplacer que sur les cases adjacentes (diagonales comprises) */
int deplacAdj(couple indice, couple pion) {
if (((pion.x)+1 == indice.x && (pion.y)+1 == indice.y)
|| ((pion.x)+1 == indice.x && (pion.y) == indice.y)
|| ((pion.x)+1 == indice.x && (pion.y)-1 == indice.y)
|| ((pion.x) == indice.x && (pion.y)+1 == indice.y)
|| ((pion.x) == indice.x && (pion.y)-1 == indice.y)
|| ((pion.x)-1 == indice.x && (pion.y)+1 == indice.y)
|| ((pion.x)-1 == indice.x && (pion.y) == indice.y)
|| ((pion.x)-1 == indice.x && (pion.y)-1 == indice.y)){
return 1;
} else {
return 0;
}
}
/* Fonction qui pose une condition de victoire : si le pion du joueur 1, du joueur 2 ou de l'ordinateur
* est entouré de cases remplies et donc ne peut plus se déplacer, la partie se termine */
int winCondition(couple pion1, couple pion2) {
if ((tab[pion1.x+1][pion1.y+1].etat!=0)
&& (tab[pion1.x+1][pion1.y].etat!=0)
&& (tab[pion1.x+1][pion1.y-1].etat!=0)
&& (tab[pion1.x][pion1.y+1].etat!=0)
&& (tab[pion1.x][pion1.y-1].etat!=0)
&& (tab[pion1.x-1][pion1.y+1].etat!=0)
&& (tab[pion1.x-1][pion1.y].etat!=0)
&& (tab[pion1.x-1][pion1.y-1].etat!=0)){
ChargerImage("./img/winorange.png", 110, 200, 0, 1, 746, 549);
winner=2;
return 1;
} else if ((tab[pion2.x+1][pion2.y+1].etat!=0)
&& (tab[pion2.x+1][pion2.y].etat!=0)
&& (tab[pion2.x+1][pion2.y-1].etat!=0)
&& (tab[pion2.x][pion2.y+1].etat!=0)
&& (tab[pion2.x][pion2.y-1].etat!=0)
&& (tab[pion2.x-1][pion2.y+1].etat!=0)
&& (tab[pion2.x-1][pion2.y].etat!=0)
&& (tab[pion2.x-1][pion2.y-1].etat!=0)){
winner=1;
ChargerImage("./img/winbleu.png", 110, 200, 0, 0, 747, 547);
return 1;
} else {
return 0;
}
}
/* Fonction qui affiche dans le terminal, l'etat de la partie après chaque coup
* 1 représente le pion du joueur 1, 2 représente les croix du joueur 1
* 3 représente le pion du joueur 2 ou de l'ordinateur, 4 représente les croix du joueur 2 ou de l'ordinateur
* 0 représente une case vide et les -1 représentent les bordures du plateau de jeu, ou il est impossible de cliquer */
void AfficherTableau() {
int i;
int j;
for(i=1;i<taille+1;i++) {
for(j=1;j<taille+1;j++) {
printf("%d ",tab[j][i].etat);
}
printf("\n");
}
}