Eric
Eric

Reputation: 175

java reading in a 2d array from a file

I am writing a maze game program that looks like this:

import java.util.*;
import java.io.*;


public class MazeGame {

    public static void main(String[] args) throws Exception{

        //Display the maze
        char treasureMaze[][] = {{'P','.','X','X','.'},{'.','X','.','.','.'},{'.','.','.','X','.'},{'X','X','T','.','.'},{'.','.','X','.','.'}}; 
        display(treasureMaze);
        int vertical = 0;
        int horizontal = 0;


        //Give Move Options
        options();

        //Setup a while loop that continues until the user has gotten to the treasure, or 'P'
        while(treasureMaze[vertical][horizontal] != 'T'){
        //Get Users Decision
        Scanner moveChoice = new Scanner(System.in);
        int choice = moveChoice.nextInt();


        if(choice == 1){
            System.out.println("You chose to Move up");
        }
        else if(choice == 2){
            System.out.println("You chose to Move down");
        }
        else if(choice == 3){
            System.out.println("You chose to Move left");
        }
        else if(choice == 4){
            System.out.println("you chose to Move right");
        }
        else{
            return;
        }


        //Move the Player: Each choice will move the player according to their choice and then re-display the map and options
        //so that they can move through the maze
        //Move Up
        if(choice == 1){
            if(vertical - 1 < 0){
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical - 1][horizontal] == '.'){
                treasureMaze[vertical - 1][horizontal] = 'P';
                treasureMaze[vertical][horizontal] = '.';
                vertical -= 1;
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical - 1][horizontal] == 'T'){
                System.out.println("\nCongratulations you won!");
                treasureMaze[vertical][horizontal] = 'T';
            }
            else{
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
        }

        //Move Down
        else if(choice == 2){
            if(vertical + 1 < 0){
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical + 1][horizontal] == '.'){
                treasureMaze[vertical + 1][horizontal] = 'P';
                treasureMaze[vertical][horizontal] = '.';
                vertical += 1;
                display(treasureMaze);
                options();
            }               
            else if(treasureMaze[vertical + 1][horizontal] == 'T'){
                System.out.println("\nCongratulations you won!");
                treasureMaze[vertical][horizontal] = 'T';
            }
            else{                   
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
                }
            }

        //Move Left
        else if(choice == 3){
            if(horizontal - 1 < 0){
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical][horizontal - 1] == '.'){
                treasureMaze[vertical][horizontal - 1] = 'P';
                treasureMaze[vertical][horizontal] = '.';
                horizontal -= 1;
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical][horizontal - 1] == 'T'){
                System.out.println("\nCongratulations you won!");
                treasureMaze[vertical][horizontal] = 'T';
            }
            else{
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
        }

        //Move Right
        else if(choice == 4){
            if(horizontal + 1 < 0){
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical][horizontal + 1] == '.'){
                treasureMaze[vertical][horizontal + 1] = 'P';
                treasureMaze[vertical][horizontal] = '.';
                horizontal += 1;
                display(treasureMaze);
                options();
            }
            else if(treasureMaze[vertical][horizontal + 1] == 'T'){
                System.out.println("\nCongratulations you won!");
                treasureMaze[vertical][horizontal] = 'T';
            }
            else{
                System.out.println("\nCannot move there! Try something else\n");
                display(treasureMaze);
                options();
            }
        }
        else{
            return;
        }

    }
    }




    //Display Object: prints out the maze for the user
    public static void display(char x[][]){
        for(int row = 0; row < x.length; row++){
            for(int column = 0; column < x[row].length; column++){
                System.out.print(x[row][column] + "\t");
            }
            System.out.println();
        }
    }

    //Options Object: gives the options menu to the user
     static void options(){
         System.out.println("You may:");
            System.out.println("\t1) Move up");
            System.out.println("\t2) Move down");
            System.out.println("\t3) Move left");
            System.out.println("\t4) Move right");
            System.out.println("\t0) Quit");

    }
}

This program works fine when I give it the array for the treasureMaze, but I would like to be able to read in different mazes from a text file and am stumped at how to go about doing that. Do i need to use a scanner to read in the array to a variable or something? Thanks in advance for the advice.

Upvotes: 1

Views: 1932

Answers (1)

Brendan Long
Brendan Long

Reputation: 54242

This should just involve reading lines from a FileReader and converting them to a char[]:

// Open "filename.txt" for reading
BufferedReader in = new BufferedReader(new FileReader("filename.txt"));

// Get a single line from the file (you can call this repeatedly for multiple lines)
String line = in.readLine();

// Convert that string to a character array
char[] array = line.toCharArray();

I don't recommend using Scanner since it's slow and pointlessly complex. I'm wrapping the FileReader in a BufferedReader because it's a little bit faster, and it provides the useful readLine() method, but you could read directly from the FileReader if you wanted to.

You could also use Scanner.nextLine() if you're uncomfortable with BufferedReader, but I'd advise becoming familiar with various Reader's.

Since a 2D array is just an array of arrays, you should be able to just set each index of the 2D array to an array you read from the file:

char[][] map = new char[][10];
for(i = 0; i < 10; ++i) {
    String line = in.readLine();
    if(line == null) {
        // Realistically, you'd want better error handling than this
        System.out.println("Uh oh, the file doesn't have 10 lines!");
        return;
    }
    map[i] = line.toCharArray();
}

Upvotes: 2

Related Questions