Files

136 lines
3.2 KiB
C

#include "partie.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graph.h>
void initialiser_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){
int i, j;
int compteur = 1;
grille[0][0] = 0;
for (i = 0; i < nb_ligne; i++){
for(j = 0; j < nb_colonne; j++){
/*On saute la 1er case*/
if (i == 0 && j== 0)continue;
grille[i][j] = compteur;
compteur++;
}
}
}
int deplacer(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int touche) {
int i, j;
int vide_i = -1, vide_j = -1;
int cible_i, cible_j;
int temp;
/* Trouver la case vide */
for(i = 0; i < nb_ligne; i++) {
for(j = 0; j< nb_colonne; j++) {
if (grille[i][j] == 0) {
/*vide i/j est l'adresse du trou*/
vide_i = i;
vide_j = j;
}
}
}
/*cible i/j c'est l'adress de la case voisine qu'on veut faire glisser */
cible_i = vide_i;
cible_j = vide_j;
/* Calculer la cible */
if(touche == XK_Left) cible_j = vide_j - 1;
else if(touche == XK_Right) cible_j = vide_j + 1;
else if(touche == XK_Up) cible_i = vide_i - 1;
else if(touche == XK_Down) cible_i = vide_i + 1;
else {
return 0;
}
/* Vérifier les bords */
if (cible_i < 0 || cible_i >= nb_ligne ||
cible_j < 0 || cible_j >= nb_colonne) {
return 0;
}
/* Echanger */
temp = grille[cible_i][cible_j];
grille[cible_i][cible_j] = 0;
grille[vide_i][vide_j] = temp;
return 1;
}
int deplacer_souris(int grille[MAX_TAILLE][MAX_TAILLE], int nb_ligne, int nb_colonne, int clic_x, int clic_y, int l_case, int h_case) {
int case_x = clic_x / l_case;
int case_y = clic_y / h_case;
int vide_i, vide_j, i, j;
/* si on clique dehors ça ne fais rien */
if (case_x >= nb_colonne || case_y >= nb_ligne) return 0;
/* recherche case vide */
for(i=0; i<nb_ligne; i++) {
for(j=0; j<nb_colonne; j++) {
if (grille[i][j] == 0) { vide_i = i; vide_j = j; }
}
}
/* est-ce que la case cliqué est juste a coté du vide ? */
if (case_y == vide_i) {
if (case_x == vide_j - 1 || case_x == vide_j + 1) {
grille[vide_i][vide_j] = grille[case_y][case_x];
grille[case_y][case_x] = 0;
return 1;
}
}
else if (case_x == vide_j) {
if (case_y == vide_i - 1 || case_y == vide_i + 1) {
grille[vide_i][vide_j] = grille[case_y][case_x];
grille[case_y][case_x] = 0;
return 1;
}
}
return 0;
}
void melanger_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne) {
int i;
int touche_aleatoire;
int direction;
srand(time(NULL));
/* On fais 500 mouvements aléatoires */
for (i = 0; i < 500; i++) {
/* tirage d'un nombre entre 0 et 3 */
direction = rand() % 4;
if (direction == 0)touche_aleatoire = XK_Left;
else if (direction == 1)touche_aleatoire = XK_Up;
else if (direction == 2)touche_aleatoire = XK_Right;
else touche_aleatoire = XK_Down;
deplacer(grille,nb_ligne,nb_colonne,touche_aleatoire);
}
}
int verifier_victoire(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){
int i,j,compteur = 1;
if(grille[0][0] != 0)return 0;
for(i = 0; i < nb_ligne; i++) {
for(j = 0; j< nb_colonne; j++) {
if (i == 0 && j == 0)continue;
if(grille[i][j] != compteur)return 0;
compteur++;
}
}
return 1;
}