140 lines
4.0 KiB
C
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");
|
||
|
}
|
||
|
}
|