2017-03-18 52 views
-1

下面給出的代碼是來自CS50的問題集3的答案。 請看看功能:initdrawmovewon 並提出了一些改進,我可以做到的。 其實我得到一些我不明白的錯誤。CS50 pset3 - 十五的遊戲

/** 
* fifteen.c 
* 
* 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 = 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 board[4][4]; 
    int d; 
    do 
    { 
     printf("enter the size of the board\n"); 
     scanf("%i",&d); 
    }while(d <= 4); 
    printf("enter the values in the grid\n"); 
    for(int i=0;i<d;i++) 
    { 
     for(int j=0;j<d;j++) 
      { 
      scanf("%i\n",&board[i][j]); // set tile's value 
      } 
    } 
     if(d%2 == 0) 
    { 
     int temp; 
     temp = board[3][1]; 
     board[3][1] = board[3][2]; 
     board[3][2] = temp; 
    } 


} 

/** 
    * Prints the board in its current state. 
    */ 
void draw(void) 
{ 
    int d; 

    for(int i=0;i<d-1;i++) 
    { 
     for(int j=0;j<d;j++) 
     { 
      printf("%2i",board[i][j]); 
     } 
     printf("\n"); 
    } 
    do 
    { 
     for(int j=0;j<d-1;j++) 
     { 
      printf("%2i",board[int i][int j]); 
      } 
     } while (int i=d-1); 
     char board[d-1][d-1] = ' '; 
     printf("%c \n", board[d-1][d-1]); 
} 

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

/** 
* Returns true if game is won (i.e., board is in winning configuration), 
* else false. 
*/ 
bool won(void) 
{ 
    // TODO 

    for(i=0;i<d;i++) 
    { 
     for(j=0;j<d;j++) 
     { 
      if(a[i][j] < a[i+1][j+1]) 
      { 
       return true; 
       break; 
      } 
      else{ 
       return false; 
       break; 
       } 
     } 
    } 
} 

我得到這個錯誤,我無法解決。

格式指定類型「INT」,但該參數的類型爲「依賴型」

+2

關於你的開頭段落,Stack Overflow不是[代碼評論](http://codereview.stackexchange.com)SO的唯一主題是這個錯誤的含義。您應該編輯帖子及其標題以反映這一點。 –

+0

請發佈[最小示例](http://stackoverflow.com/help/mcve),並給出完整的錯誤。另外,不是每個人都會知道「CS50」是什麼,但是真相被告知它與問題並不相關,所以我建議刪除對它的引用。 – jerry

回答

0

init()功能,則初始化board[4][4]但根據需要自定義尺寸的板已被使用你需要保持索引的d,不使用4或任何其他固定的電路板尺寸。

同樣在init()函數中,您不需要手動輸入切片的編號。嘗試使用變量(整數,並將其分配到所需的瓦片並將其分配到下一瓦片之前遞增變量。 因此,會有在該檢查條件的變化,如果d是偶數還是奇數。

draw()功能似乎要被罰款。

move()功能存在一些問題。return board[i][j];是無效的,因爲該函數返回bool類型,邏輯似乎是不正確的。檢查演練,如果你還沒有準備好。

won()函數,使用break;聲明後返回不是需要。另外,如果仔細檢查你在if條件中寫入的條件,它不檢查每個變量與同一行中的下一個或下一行中的下一個,但檢查每個變量的對角下一個變量,即使它不存在。

我建議您重新觀看演講視頻,短片和演練,以更好地瞭解代碼和C。