2017-07-22 1 views
-10

Je prends cs50 et sur pset3 quinze. Le jeu semble bien, sauf lors de la saisie d'un nombre pour remplacer «_» par. Au début, lorsque le jeu demande un numéro/une tuile à déplacer, je saisis le chiffre pour que '_' se déplace mais ne remplace pas '_' par le nombre choisi. Cela n'arrive que lorsque les dimensions sont paires et en choisissant les chiffres à gauche de '_' au début de la partie. Merci!Pourquoi mon programme de jeu de quinze impression '_' au lieu du numéro remplacé?

#define _XOPEN_SOURCE 500 

#include <cs50.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

// constants 
#define DIM_MIN 3 
#define DIM_MAX 9 

// board 
int board[DIM_MAX][DIM_MAX]; 

// dimensions 
int d; 

// prototypes 
void clear(void); 
void greet(void); 
void init(void); 
void draw(void); 
bool move(int tile); 
bool won(void); 

int main(int argc, string argv[]) 
{ 
    // ensure proper usage 
    if (argc != 2) 
    { 
     printf("Usage: fifteen d\n"); 
     return 1; 
    } 

    // ensure valid dimensions 
    d = atoi(argv[1]); 
    if (d < DIM_MIN || d > DIM_MAX) 
    { 
     printf("Board must be between %i x %i and %i x %i, inclusive.\n", 
      DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX); 
     return 2; 
    } 

    // open log 
    FILE *file = fopen("log.txt", "w"); 
    if (file == NULL) 
    { 
     return 3; 
    } 

    // greet user with instructions 
    greet(); 

    // initialize the board 
    init(); 

    // accept moves until game is won 
    while (true) 
    { 
     // clear the screen 
     clear(); 

     // draw the current state of the board 
     draw(); 

     // log the current state of the board (for testing) 
     for (int i = 0; i < d; i++) 
     { 
      for (int j = 0; j < d; j++) 
      { 
       fprintf(file, "%i", board[i][j]); 
       if (j < d - 1) 
       { 
        fprintf(file, "|"); 
       } 
      } 
      fprintf(file, "\n"); 
     } 
     fflush(file); 

     // check for win 
     if (won()) 
     { 
      printf("ftw!\n"); 
      break; 
     } 

     // prompt for move 
     printf("Tile to move: "); 
     int tile = get_int(); 

     // quit if user inputs 0 (for testing) 
     if (tile == 0) 
     { 
      break; 
     } 

     // log move (for testing) 
     fprintf(file, "%i\n", tile); 
     fflush(file); 

     // move if possible, else report illegality 
     if (!move(tile)) 
     { 
      printf("\nIllegal move.\n"); 
      usleep(500000); 
     } 

     // sleep thread for animation's sake 
     usleep(500000); 
    } 

    // close log 
    fclose(file); 

    // success 
    return 0; 
} 

/** 
* Clears screen using ANSI escape sequences. 
*/ 
void clear(void) 
{ 
    printf("\033[2J"); 
    printf("\033[%d;%dH", 0, 0); 
} 

/** 
* Greets player. 
*/ 
void greet(void) 
{ 
    clear(); 
    printf("WELCOME TO GAME OF FIFTEEN\n"); 
    usleep(2000000); 
} 

/** 
* Initializes the game's board with tiles numbered 1 through d*d - 1 
* (i.e., fills 2D array with values but does not actually print them). 
*/ 
void init(void) 
{ 
    int dimensionNum = (d * d) - 1; 
    for (int i = 0; i < d; i++) 
    { 
     for (int j = 0; j < d; j++) 
     { 
      board[i][j] = dimensionNum--; 
     } 
    } 

    if (d % 2 == 0) 
    { 
     board[d - 1][d - 2] = 2; 
     board[d - 1][d - 3] = 1; 
    } 
} 

/** 
* Prints the board in its current state. 
*/ 
void draw(void) 
{ 
    for (int i = 0; i < d; i++) 
    { 
     for (int j = 0; j < d; j++) 
     { 
      if (board[i][j] == 0) 
      { 
       printf(" _"); 
      } 
      else 
      { 
       printf("%3i", board[i][j]); 
      } 
     } 
     printf("\n"); 
    } 
} 

/** 
* If tile borders empty space, moves tile and returns true, else 
* returns false. 
*/ 
bool move(int tile) 
{ 
    int _i, _j; 
    for (int i = 0; i < d; i++) 
    { 
     for (int j = 0; j < d; j++) 
     { 
      if (board[i][j] == tile) 
      { 
       _i = i; 
       _j = j; 
      } 
     } 
    } 

    if (board[_i + 1][_j] == 0) 
    { 
     board[_i + 1][_j] = board[_i][_j]; 
     board[_i][_j] = 0; 
     return true; 
    } 
    else if (board[_i - 1][_j] == 0) 
    { 
     board[_i - 1][_j] = board[_i][_j]; 
     board[_i][_j] = 0; 
     return true; 
    } 
    else if (board[_i][_j - 1] == 0) 
    { 
     board[_i][_j - 1] = board[_i][_j]; 
     board[_i][_j] = 0; 
     return true; 
    } 
    else if (board[_i][_j + 1] == 0) 
    { 
     board[_i][_j + 1] = board[_i][_j]; 
     board[_i][_j] = 0; 
     return true; 
    } 

    return false; 
} 
+3

Les vidages de code externes ne sont pas appréciés ici. Je suggère de préparer l'exemple [Minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) qui montre le problème. Afficher l'entrée, la sortie attendue et la sortie réelle sous forme de texte * dans la question *. –

+0

'board [_i-1] [_ j]', etc. ne vérifie pas qu'il est dans les limites. – stark

Répondre

1

Une fois que vous essayez de trouver la tuile dans la carte en fonction de déplacement, vous devriez vérifier si les indices de tableau obtenus sont valides ou non. Parce que, dans le cas où les entrées de l'utilisateur sont en dehors des valeurs autorisées, une valeur de déchet est utilisée pour la vérification de la condition. Donc, faites les variables _i et _j -1 ou quelque chose au début et vérifiez si elles sont - 1 après la boucle for dans la fonction de déplacement. Si c'est le cas, cela signifie que vous avez des entrées illégales et que vous pouvez directement renvoyer des fausses informations. Sinon, vous pouvez procéder à la vérification de la condition. L'autre code semble être bien. Vous pouvez également essayer d'utiliser le débogueur ou passer en revue la procédure pas à pas pour une meilleure compréhension. Si cela répond à votre question, cliquez sur la coche verte pour fermer cette question.