2

MY ERROR MESSAGE:

~/workspace/pset3/fifteen/ $ make fifteen
clang -ggdb3 -O0 -std=c11 -Wall -Werror -o fifteen fifteen.c -lcs50 -lm
fifteen.c:221:1: error: function definition is not allowed here
{
^
fifteen.c:260:1: error: function definition is not allowed here
{
^
fifteen.c:281:2: error: expected '}'
}
 ^
fifteen.c:195:1: note: to match this '{'
{
^
3 errors generated.
make: *** [fifteen] Error 1

MY CODE:

#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(2000000);
        }

        // sleep thread for animation's sake
        usleep(2000000);
    }

    // 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)
{
    if (d % 2 != 0)
    {
        for (int i = 0; i < d; i++)
        {
            for (int j = 0; j < d; j++)
            {
                board[i][j] = d^2 - 1 - j - d*i;
            }
        }

        board[d - 1][d - 1] = 0;
        board[d - 1][d - 2] = 2;
        board[d - 1][d - 3] = 1;
    }

    else;
    {
        for (int i = 0; i < d; i++)
        {
            for (int j = 0; j < d; j++)
            {
                board[i][j] = d^2 - 1 - j - d*i;
            }
        }

        board[d - 1][d - 1] = 0;
    }
}

/**
 * Prints the board in its current state.
 */
void draw(void)
{
    for (int i = 0; i < d; i++)
    {
        for (int j = 0; j < d; j++)
        {
            if (board[i][j] <= 10)
            {
                printf(" ");

            if (board[i][j] % d == 0 && board[i][j] != 0)
            {
                printf("%i \n", board[i][j]);
            }
            else;
            {
                printf("%i   ", board[i][j]);
            }
        }
    }
}

/**
 * If tile borders empty space, moves tile and returns true, else
 * returns false. 
 */
bool move(int tile)
{
    int zeroi = d - 1;
    int zeroj = d - 1;
    for (int i = 0, i < d, i++)
    {
        for(int j = 0, j < d, j++)
        {
            if (board[i][j] == tile)
            {
                int tilei = i;
                int tilej = j;
                if ((abs(tilei - zeroi) < 2)^(abs(tilej - zeroj) < 2))
                {
                    board[zeroi][zeroj] = tile;
                    board[tilei][tilej] = 0;

                    draw();

                    return true;
                    break;  
                }
                else;
                {
                    return false;
                    break;
                }
            }
            else;
            {
                printf("Tile is not found");
                return false;
            }

        }
    }
    return false;
}

bool won(void)
{
    int count = 0;
    for (int i = 0; i < d; i++)
    {
        for(int j = 0; j < d; j++)
        {
            if (board[i][j] == j + i*d) 
            {
                count = count + 1;
            }
        }

        if (count == d*d)
        {
            return true;
        }
        else;
        {
            return false;
        }
    }
}

1 Answer 1

2

Simply put, there is a missing closing curly brace, }, in the draw() function. It looks to be missing at the first if statement code block. Because of the mispairing/missing closing curly brace, it appears to the compiler that the code is trying to declare a new function within another function which has not closed.

This will cure the errors you see, but will expose a number of other issues, which you should be able to handle.

If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

2
  • yeah iv learnt to try the 2nd or 3rd errors as the 1st error seemed to be the system crapping itself, but who knows im tired as hell so it may just be me. Thanks for your patience Commented Oct 29, 2016 at 6:57
  • Thank you very much, I had the same issue.
    – Gumon
    Commented Oct 18, 2019 at 4:18

You must log in to answer this question.

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