1

I need line 72 declaration to apply to the formula stated on line 207. I have formatted it this way because previously my move() function was re-declaring the variable zeroi, which did not allow it to change continuously over each iteration or move. Sorry if this is convoluted, i have been lookign at this for a while

/**
 * fifteen.c
 *
 * Computer Science 50
 * Problem Set 3
 *
 * 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();

    int zeroi = d - 1; \\LOOK HERE
    int zeroj = d - 1;

    // accept moves until game is won
    while (true)
    {

        // 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);
        }
        else;
        move(tile);
    }

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

    if (d % 2 != 0)
    {
        board[d - 1][d - 2] = 2;
        board[d - 1][d - 3] = 1;
    }
}

/**
 * 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("%2i   ", board[i][j]);
            }

            else if (board[i][j] >= 10)
            {
                printf("%i   ", board[i][j]);
            }
        }
        printf("\n");
    }
    printf("\n");
}

/**
 * If tile borders empty space, moves tile and returns true, else
 * returns false. 
 */
bool move(int tile) \\LOOK HERE!
{


    for (int i = 0; i < d; i++)
    {
        for(int j = 0; j < d; j++)
        {
            if (board[i][j] == tile)
            {
                if ((abs(i - zeroi) == 1)^(abs(j - zeroj) == 1))
                {
                    board[zeroi][zeroj] = tile;
                    board[i][j] = 0;

                    return true;
                    break;
                }
                else;
                {
                    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;
        }
    }
    return false;
}
  • Can you please edit your question and identify which lines you are talking about and why you need to do this? Keep in mind that lines get reformatted when pasted here and often again when copied to or from an IDE. We have no idea which lines you're talking about. – Cliff B Oct 29 '16 at 9:35
  • oh sorry i thought the lines would translate. THIS IS THE DECLARATION: int zeroi = d - 1; int zeroj = d - 1; int tilei; int tilej; THIS IS THE FUNCTION I WANT IT TO APPLY TO: bool move(int tile) they are at rows 74 and 207 respectively more or less – Bijan Khadembashi Oct 29 '16 at 10:40
  • Again, we have no idea what rows 74 and 207 are! Edit your question, and add comments on those rows to identify them! – Cliff B Oct 29 '16 at 10:55
  • ok, i have added the comment \\LOOK HERE So you can word search for that i guess? I don't see the difference personally – Bijan Khadembashi Oct 29 '16 at 11:02
0

One way to do it would be to declare zeroi and zeroj inside of the move() function. Since d is a global, you can just use it inside the move() function. I suggest this, because you don't use zeroi nor zeroj anywhere else, but only on the move() function.

The move() function will look something like this:

/**
 * If tile borders empty space, moves tile and returns true, else
 * returns false. 
 */
bool move(int tile) \\LOOK HERE!
{
    int zeroi = d - 1; \\LOOK HERE
    int zeroj = d - 1;

    for (int i = 0; i < d; i++)
    {
        for(int j = 0; j < d; j++)
        {
            if (board[i][j] == tile)
            {
                if ((abs(i - zeroi) == 1)^(abs(j - zeroj) == 1))
                {
                    board[zeroi][zeroj] = tile;
                    board[i][j] = 0;

                    return true;
                    break;
                }
                else;
                {
                    return false;
                }
            }
        }
    }
}
| improve this answer | |

You must log in to answer this question.

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