136 lines
3.2 KiB
C
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;
|
|
}
|