2017-03-18 3 views
-1

以下のコードは、CS50の問題3の回答です。 、movedrawinit won と私が作ることができるいくつかの改善点を提案: の機能を見てください。 実際に私は理解していないエラーが発生しています。CS50 pset3 - 15のゲーム

/** 
* 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型」を指定しますが、引数がinit()機能で「依存型」

+2

オープニング段落については、スタックオーバーフローは[コードレビュー](http://codereview.stackexchange.com)ではありません。ここでの唯一のトピックに関する質問は、そのエラーの意味です。あなたはそれを反映するために投稿とそのタイトルを編集する必要があります。 –

+0

[最小限の例](http://stackoverflow.com/help/mcve)を投稿し、完全なエラーを出してください。また、誰もが "CS50"が何であるかを知っているわけではありませんが、実際にはそれが問題とは関係ないと言われるので、その参照を削除することをお勧めします。 – jerry

答えて

0

を入力している、あなたはboard[4][4]を初期化が、必要に応じてカスタムサイズのボードがすでに使用されていますdの観点からインデックスを作成し、4または他の固定ボードサイズを使用しないようにする必要があります。

また、init()の機能では、タイルの番号を手動で入力する必要はありません。変数を使用してみてください(整数を必要なタイルに割り当てて、その変数を次のタイルに割り当てる前にインクリメントしてください) したがって、dが偶数か奇数かをチェックする条件に変更があります。

draw()関数は、罰金のようです。

move()機能は、いくつかの問題を抱えている。return board[i][j];関数はbool型を返しているとして無効です。ロジックが正しくないようです。お持ちでない場合はウォークスルーをチェックしてください。

won()の機能を使用して、返品後のbreak;の記載はありません必要です。 if条件で記述した条件を注意深くチェックしても、各変数は同じ行または次の行の次の変数とはチェックされませんが、存在しない場合でも各変数の斜め次の変数がチェックされます。

コードやCの一般的な理解を深めるため、講義ビデオ、短編小説、ウォークスルーを再見てください。

関連する問題