Problème en C (déplacement d'un véhicule)

Fermé
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 - 25 avril 2012 à 14:24
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 - 25 avril 2012 à 14:27
Bonjour,

je code un jeu de Rushhour en projet a la fac

Pour ceux qui ne connaissent pas on a un parking avec des véhicules et le but est de sortir notre voiture par la droite en déplacant d'autre véhicule pour dégager un passage (les véhicules ne bougent que verticalement ou horizontalement en fonction de la position de départ et ne peuvent pas sortir du parking a part la notre et uniquement a droite)

Or j'ai un problème : lorsque j'appelle ma fonction pour déplacer un véhicule il n'y a pas d'erreur et le code de retour est le bon mais la position du véhicule ne change pas

je vous met ici les parties du code qui posent problème (dites le moi si vous voulez le reste) :

move(...) pour déplacer les véhicules :


int move(vehicule_t *v,int shift, vehicule_t park[]) {

  int l, c, i, j;
  int posTmpX, posTmpY;
  int **mat = (int**)malloc(HEIGHT * sizeof(int));
  
  for (l = 0 ; l < WIDTH ; l++) {
    mat[l] = (int*)malloc(WIDTH * sizeof(int));
  }

  /* Used to initialize the matrix to 0 and to place vehicules */
  for (l = 0 ; l < HEIGHT ; l++) {
    for (c = 0 ; c < WIDTH ; c++) {
      mat[l][c] = 0;
    }
  }
  for (i = 0 ; i < NB_VEHICULES ; i++) {
    if (getDirV(park[i]) == 0) {
      posTmpX = getPosV(park[i]).x;
      l = getPosV(park[i]).y;
      for (j = posTmpX ; j < posTmpX + getSizeV(park[i]) ; j++) {
	mat[l][j] = i+1;
      }
    }
    else {
      posTmpY = getPosV(park[i]).y;
      c = getPosV(park[i]).x;
      for (j = posTmpY ; j < (posTmpY + getSizeV(park[i])); j++) {
	mat[j][c] = i+1;
      }
    }
  }
  

  /*	0 : haut
	1 : bas
	2 : gauche
	3 : droite
  */

  c = getPosV(*v).x;
  l = getPosV(*v).y;

  printf ("val ret move() : %d\n\n", verifCase(mat, l, c+getSizeV(*v), getIDV(*v)));  

  printf ("%d %d\n", l, c);

  if (shift == 0) {

    if (verifCase(mat, l-1, c, getIDV(*v)) ==0) {
      setPosY(v, l - 1);	
    }
    else {
      return verifCase(mat, l-1, c, getIDV(*v));
    }
  }

  else if (shift == 1) {
	
    if (verifCase(mat, l+getSizeV(*v), c, getIDV(*v) == 0)) {
      setPosY(v, l+1);
    }
    else {
      return verifCase(mat, l+getSizeV(*v), c, getIDV(*v));
    }
  }

  else if (shift == 2) {
    if (verifCase(mat, l, c-1, getIDV(*v) == 0)) {
      setPosX(v, c-1);
    } 
   else {
      return verifCase(mat, l, c-1, getIDV(*v));
    }
  } 
 
  else if (shift == 3) {

    printf ("%d\n", getPosV(*v).x);
    if (verifCase(mat, l, c+getSizeV(*v), getIDV(*v) == 0)) {
      setPosX(v, c+1);
    }
	
    else {
      return verifCase(mat, l, c+getSizeV(*v), getIDV(*v));
    }
  }
    
  return 0;
} 



verifCase(...) pour vérifier que la case est libre :
int verifCase (int **mat, int l, int c, int id) {

  if (id != 1) {
    if (l < 0 || l >= HEIGHT || c < 0 || c >= WIDTH) {
      
      return 1; //out of park
    }
  }
  else {

    if (l < 0 || l >=HEIGHT || c < 0) {

      return 1;
    }

    else if (c >= WIDTH) {
      
      return 3; //winner
    }
  }

  if (mat[l][c]  != 0) {
      
    return 2; //there is a vehicule on that case
  }	

  return 0;
}


play(...) qui gère la partie pour demander ce qu'on veut faire (déplacer un véhicule, abandonner, voir la solution...) :

int play(vehicule_t park[]) {

  int choiceMenu2, choiceMenu3, vehicule, nb_move_solution, nb_move_user = 0, winner, shift;

  do {
    printf("\nIndiquez le numéro du véhicule à déplacer\nPour visualiser une solution, tapez 17\nPour recommencer cette partie, tapez 18\nPour démarrer une autre grille, tapez 19\nPour sortir du jeu, tapez 0\n? ");
    scanf("%d", &choiceMenu2);
    emptyCache();
  } while (choiceMenu2 < 0 || choiceMenu2 > 19);

  if (choiceMenu2 == 0) {
    printf("\nPartie annulée.\n"); // Returns 2
    return 2;
  }
 
  switch(choiceMenu2) {
    
  case 17:
    // See solution
    do {
      printf("\nCombien de coups voulez-vous voir ? ");
      scanf("%d", &nb_move_solution);
      emptyCache();
    } while (nb_move_solution < 0);
    // FAIRE LES nb_move_solution DEPLACEMENTS
    nb_move_user += nb_move_solution;
    do {
      printf("\nPour continuer la partie, tapez 1\nPour visualiser la suite de la solution pour cette partie, tapez 2\nPour charger une autre grille, tapez 3\nPour sortir du jeu, tapez 0\n? ");
      scanf("%d", &choiceMenu3);
      emptyCache();
    } while (choiceMenu3 < 0 || choiceMenu3 > 3);
    /* S'OCCUPER DES CAS 1, 2, 3, 0 */
    break;
    
  case 18:
    // Recommencer cette partie
    break;
    
  case 19:
    return 2;// Démarrer une autre grille
    break;
    
  default:

    vehicule = (choiceMenu2 - 1);

    if (choiceMenu2 > NB_VEHICULES) {

      printf("\nIl n'y a pas de voiture #%d\n", choiceMenu2);
      return 0;
    }

    do {
      printf("\nPour déplacer le vehicule vers le haut, tapez 0\nPour déplacer le vehicule vers le bas, tapez 1\nPour déplacer le vehicule vers la gauche, tapez 2\nPour déplacer le vehicule vers la droite, tapez 3\nDéplacement souhaité : ");
      scanf("%d", &shift);
      emptyCache();
    } while (shift < 0 || shift > 4);	

    winner = move(&park[vehicule], shift, park);
   
    if (winner == 0) {
      nb_move_user++; //we add 1 to nb_move if we move a car
    }
    if (winner == 1) {

      printf ("erreur vous sortez du parking\n"); //we
    }

    else if (winner == 2) {

      printf ("erreur il y a déja un véhicule a cet endroit\n");
    }

    else  if (winner == 3) {
      
      printf ("bravo vous avez gagné en %d coups\n", (nb_move_user+1));
      return 1;
    }
  }
  return 0;
}


pour l'organisation du code :

le main appelle play tant que play renvoie 0 (donc tant qu'on a pas gagné ou abandonné)
play demande ce qu'on veut faire, quel véhicule on veut déplacer, puis dans quel sens.
ensuite elle appelle move en gardant le code de retours dans la variable winner.

move appelle ensuite verifCase() pour vérifier que la case suivante existe (donc qu'on ne sort pas du parking) et qu'il n'y a pas déja une voiture.
si elle retourne 0 (déplacement possible) on modifie la position du véhicule
sinon on move retourne le code de retour de verifCase (1 si on sort du parking, 2 si il y a un véhicule et 3 si on a gagné donc la voiture 1 sort du parking par la droie)

le problème c'est que mes véhicules ne se déplace pas
j'avais avant un bug dans le retour de verifCase() qui fait que je pouvais bouger indéfiniment et depuis que je l'ai corrigé je ne peux plus bouger du tout (je ne vérifiait pas la bonne case de la matrice a chaque fois)


voila merci d'avance pour votre aide

1 réponse

oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
25 avril 2012 à 14:27
ps : mon véhicule est une structure de type vehicule_t, et possède un id, un type (voiture ou camion pour la taille), une direction (0 ou 1 pour vertical, horizontal) et une position (structure position_t possèdant une variable x et une y)

les véhicules sont stocké dans un tableau et je créé une matrice pour les déplacements pour vérifier la case suivante et pour l'affichage (ce n'est probablement pas le plus optimisé je sais mais pour le moment je voudrais déja réussir a le faire marcher^^)
0