2017-03-18 8 views
-1

아래 코드는 CS50의 문제 3에 대한 대답입니다. 기능을 살펴 준비해주십시오 init, draw, move, 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() 함수에서 타일의 수를 수동으로 입력 할 필요가 없습니다. 변수를 사용해보십시오 (정수를 사용하여 필요한 타일에 할당하고 다음 타일에 할당하기 전에 해당 변수를 증가 시키십시오.)

draw() 기능은 잘 될 것 같다.

move() 기능은 몇 가지 문제가있다. 함수 bool 형식을 반환이 같은 return board[i][j];이 유효하지 않습니다. 논리는 잘못된 것 같다. 아직받지 못한 경우 연습을 확인합니다.

에서 won() 기능을 사용하여 반품 후 break; 명세서가 아닙니다 필요합니다. 또한 if 조건으로 작성한 조건을주의 깊게 검사하면 각 변수가 동일한 행이나 다음 행의 다음 변수와 함께 점검되지 않지만 각 변수의 대각선으로 다음 변수가 존재하지 않더라도 검사합니다 .

코드와 C를 더 잘 이해하기 위해 강의 비디오, 단편 및 연습을 다시 보는 것이 좋습니다.