0

Play method. this method should allow me to enter commands to rotate a certain row or column of a 4x4 array. it needs to be in a loop (i assume while) to always ask for a command, do the rotation, and print it and end when back to the original, I'm having trouble with what i should have as the while loop, i have a default and a current variable, i use puzzle both times so default gets overwritten (this is what is wrong) so the loop doesn't run, i don't really know how to get around this, i know it doesn't need to be puzzle both times however I've kept it in just to show.

import java.util.Scanner;

public class puzzle {

public static final int N = 4;
public static final int NUMBER_OF_ROTATIONS = 5;

public static void main(String[] args) {
    int[][] puzzle = new int[N][N];
    reset(puzzle);
    test(puzzle);
    reset(puzzle);
    scramble(puzzle);
    System.out.println("### Testing puzzle game play\n");
    play(puzzle);
}

public static void print(int[][] puzzle) {
    for (int[] row : puzzle) {
        for (int elem : row) {
            System.out.printf("%4d", elem);
        }
        System.out.println();
    }
    System.out.println();
}

public static void test(int[][] puzzle) {
    System.out.println("### Testing reset method\n");
    print(puzzle);
    System.out.println("### Testing rotate methods\n");
    print(puzzle);
    for (int i = 0; i < N; i++) {
        System.out.println("### rotateColumn(" + i + ")\n");
        rotateColumn(puzzle, i);
        print(puzzle);
        System.out.println("### rotateRow(" + i + ")\n");
        rotateRow(puzzle, i);
        print(puzzle);
    }
    reset(puzzle);
    System.out.println("### Testing random rotations\n");
    print(puzzle);
    for (int i = 0; i < 5; i++) {
        randomRotation(puzzle);
        print(puzzle);
    }
}

public static int[][] reset(int[][] puzzle) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            puzzle[i][j] = i * N + j;
    }
    return puzzle;
}

public static void scramble(int[][] puzzle) {
    for (int i = 0; i < NUMBER_OF_ROTATIONS; i++) {
        randomRotation(puzzle);
    }
}


// TODO: Implement method as specified in assignment brief

public static void rotateRow(int[][] arr, int row) {

    int newRow = arr[row][arr.length - 1];
    int nextRow;
    for (int IndexNo = 0; IndexNo < arr.length; IndexNo++) {
        nextRow = arr[row][IndexNo];
        arr[row][IndexNo] = newRow;
        newRow = nextRow;
    }

}


// TODO: Implement method as specified in assignment brief

public static void rotateColumn(int[][] arr, int column) {
    int newCol = arr[arr.length - 1][column];
    int nextCol;
    for (int IndexNo = 0; IndexNo < arr.length; IndexNo++) {
        nextCol = arr[IndexNo][column];
        arr[IndexNo][column] = newCol;
        newCol = nextCol;
    }
}


// TODO: Implement method as specified in assignment brief

public static void randomRotation(int[][] puzzle) {

    int rowrandom = (int) (Math.random() * 3 + 1);
    int colrandom = (int) (Math.random() * 3 + 1);
    int option = (int) (Math.random() * 2 + 1);

    if (option == 1) {
        rotateRow(puzzle, rowrandom);
    } else {
        rotateColumn(puzzle, colrandom);
    }

}

// TODO: Implement method as specified in assignment brief

static void play(int[][] puzzle) {
    reset(puzzle);
    int[][] Default = puzzle;
    print(puzzle);

    for (int i = 0; i < 5; i++) {
        randomRotation(puzzle);

    }
    int[][] Current = puzzle;
    print(puzzle);


    while (Current!=Default) {
        System.out.println("enter row x or col x: ");
        Scanner input = new Scanner(System.in);
        String x = input.nextLine();

        if (x.equals("row 0")) {
            rotateRow(puzzle, 0);
            print(puzzle);

        }
        if (x.equals("row 1")) {
            rotateRow(puzzle, 1);
            print(puzzle);

        }
        if (x.equals("row 2")) {
            rotateRow(puzzle, 2);
            print(puzzle);

        }
        if (x.equals("row 3")) {
            rotateRow(puzzle, 3);
            print(puzzle);

        }
        if (x.equals("col 0")) {
            rotateColumn(puzzle, 0);
            print(puzzle);

        }
        if (x.equals("col 1")) {
            rotateColumn(puzzle, 1);
            print(puzzle);

        }
        if (x.equals("col 2")) {
            rotateColumn(puzzle, 2);
            print(puzzle);

        }
        if (x.equals("col 3")) {
            rotateColumn(puzzle, 3);
            print(puzzle);
        }


    }
}

}

1 Answer 1

1

You're not changing the content of int[][] puzzle, you're just setting it to the same array you've passed to the method initially.

If

static void play(int[][] puzzle) {
    reset(puzzle);
    int[][] Default = puzzle;
    print(puzzle);

    for (int i = 0; i < 5; i++) {
        randomRotation(puzzle);

    }

    int[][] Current = puzzle;
    print(puzzle);

should change the values of puzzle, you should have the method return a new array and save that as the current inside your for loop of the play method.

newPuzzle = randomRotation(puzzle);

Like above.

Sign up to request clarification or add additional context in comments.

10 Comments

i can't assign randomRotation as a variable
@sb33 because randomRotation is not returning anything. You can change the method to return arrays
@viviboo3 the methods were a template code we can't change it i believe
@sb33 it says: // TODO: Implement method as specified in assignment brief so I don't see why not
@viviboo3 wouldn't it mess up hows its being used previously though?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.