2016-07-09 3 views
-5

私はCプログラミング言語であるcs50コースの3週目にfifteen.cプロジェクトに取り組んでいます。私はbool 'won'への未定義の参照を持っています、誰かがなぜこれが起きているのか、それをどう修正するのか説明してください。ありがとう、ここに私のコードです。私はcs50 fifteen.cプロジェクトのCで未定義の参照を持っています

/** 
* fifteen.c 
* 
* Computer Science 50 
* Problem Set 3 
* 
* Implements Game of Fifteen (generalized to d x d). 
* 
* Usage: fifteen d 
* 
* whereby the board's dimensions are to be d x d, 
* where d must be in [DIM_MIN,DIM_MAX] 
* 
* Note that usleep is obsolete, but it offers more granularity than 
* sleep and is simpler to use than nanosleep; `man usleep` for more. 
*/ 

#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 = GetInt(); 

     // 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 tile = d * d - 1; 

    // row 
    for (int row = 0; row < d; row++) 
    { 
     // col 
     for (int col = 0; col < d; col++) 
     { 
      /*if (tile == 0) { 
       tile = atoi(placeholder); 
      }*/ 
       board[row][col] = tile; 
       tile --; 
     } 
    } 

    // swap 1 and 2 if # of tiles is odd 
    if (d*d %2 > 0) { 
     board[d-1][d-3] = 1; 
     board[d-1][d-2] = 2; 
    } 
} 

/** 
* Prints the board in its current state. 
*/ 
void draw(void) 
{ 
    for (int row = 0; row < d; row++) { 
     for (int col = 0; col < d; col++) { 
      // if we're at 0, replace with "_" 
      //if ((row == d-1) && (col == d-1)) { 
       // printf(" _ \n"); 
      // } 
      // draw the tile 
      //else { 
       printf("%2d ", board[row][col]); 
     //} 
    } 
    printf("\n"); 
} 
} 
/** 
* If tile borders empty space, moves tile and returns true, else 
* returns false. 
*/ 
bool move(int tile) 
{ 
    // TODO 
     // search for tile for it's position 
     // set blank tile to a variable 

     // plus or minus one row 
     // plus or minus one col 

     /* int tile_row; 
     int tile_col; */ 
     int blank_row; 
     int blank_col; 

     // find the position of the blank tile and the tile 
     for (int row = 0; row < d; row++) { 
      for (int col = 0; col < d; col++) { 
       /* if (board[row][col] == tile) { 
        tile_row = board[row]; 
        tile_col = board[col]; 
       } */ 
       if (board[row][col] == 0) { 
        blank_row = row; 
        blank_col = col; 
       } 
      } 
     } 

     if (tile == board[blank_row][blank_col-1]) { 
      board[blank_row][blank_col] = tile; 
      board[blank_row][blank_col-1] = 0; 
      return true; 
     } 
     else if (tile == board[blank_row][blank_col+1]) { 
      board[blank_row][blank_col] = tile; 
      board[blank_row][blank_col+1] = 0; 
      return true; 
     } 
     else if (tile == board[blank_row-1][blank_col]) { 
      board[blank_row][blank_col] = tile; 
      board[blank_row-1][blank_col] = 0; 
      return true; 
     } 
     else if (tile == board[blank_row+1][blank_col]) { 
      board[blank_row][blank_col] = tile; 
      board[blank_row+1][blank_col] = 0; 
      return true; 
     } 
    return false; 
} 
/** 
* Returns true if game is won (i.e., board is in winning configuration), 
* else false. 
*/ 
void save(void) 
{ 
    // log 
    const string log = "log.txt"; 

    // delete existing log, if any, before first save 
    static bool saved = false; 
    if (!saved) 
    { 
     unlink(log); 
     saved = true; 
    } 

    // open log 
    FILE* p = fopen(log, "a"); 
    if (p == NULL) 
    { 
     return; 
    } 

    // log board 
    fprintf(p, "{"); 
    for (int i = 0; i < d; i++) 
    { 
     fprintf(p, "{"); 
     for (int j = 0; j < d; j++) 
     { 
      fprintf(p, "%i", board[i][j]); 
      if (j < d - 1) 
      { 
       fprintf(p, ","); 
      } 
     } 
     fprintf(p, "}"); 
     if (i < d - 1) 
     { 
      fprintf(p, ","); 
     } 
    } 
    fprintf(p, "}\n"); 

    // close log 
    fclose(p); 
} 
+2

そして、どこに 'won'関数が定義されていますか(実装されていますか? –

+1

http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix –

+0

[このスクラピーページ]を見ると、 (http://cs50.stackexchange.com/questions/16350/in-pset3-fifteen-c)、 'won()'関数が見つかります。 –

答えて

2

あなたのコードには、機能wonの実装がありません。それを修正するには、関数を追加してください:

bool won(void) 
{ 
    /* Your code here */ 
} 
+0

私はそれらすべてのためにそれをする必要がありますか? – Savage42

+0

コード内で呼び出すすべての関数は、どこかで実装する必要があります。多分、それらがすべて使用されているかどうかはわかりません。 – SurvivalMachine

+0

ありがとう、私はうなずき – Savage42