0

CS50 community! I have a problem with my PSET 3. I've done only init() and draw() functions and can't understand what's wrong, so I can't go on. It prints blankspaces all over the board, so everything in the board equals to zero. Here is my full code with comments. Please, help me!

#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[d][d];                            //initialize a board with MAX = d
    int number = (d * d);                           //make a variable which will be used to print numbers in the board
    for (int row = 0; row < d; row++)                   //in each row of the board
    {
        for (int column = 0; column < d; column++)          //in each column
        {
            number = (number - 1);                              //making number smaller in a loop
            board[row][column] = number;                          //fill in a board
        }
    }
    if (d % 2 == 0)                                                 //if d is even
    {
        int temp = board[d - 1][d - 2];                                 //swap 1 and 2
        board[d - 1][d - 2] = board[d - 1][d - 3];
        board[d - 1][d - 3] = temp;
    }
}

/**
 * Prints the board in its current state.
 */
void draw(void)
{
    for(int row = 0; row < d; row++)                            //in each row
    {
        for(int column = 0; column < d; column++)                   //in each column
       {
            if (board[row][column] > 0)                                 //if number in a board is greater than 0
            {
                printf("%2i", board[row][column]);                          //print it
            }
            if (board[row][column] == 0)                                //if number in a board is equal to 0
            {
                printf(" _ ");                                              //print ' _ '
            }
        }
        printf("\n");                                                   //print a new line
    }
}

/**
 * If tile borders empty space, moves tile and returns true, else
 * returns false. 
 */
bool move(int tile)
{
    // TODO
    return false;
}

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

1 Answer 1

3

You only need to delete this and the code will work:

int board[d][d];    

The reason is that the global variable board is declared above and can be used by any function

int board[DIM_MAX][DIM_MAX];

While your board[][] - is a local variable, It appears when you call init() and disappears when init() is done. So draw() knows nothing about your board[][].

1

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .