Как проверить двухмерный файл - PullRequest
0 голосов
/ 14 апреля 2020

Итак, я пытаюсь создать игру Connect 4. Игра имеет 2 измерения (6row) x (7col). Когда я создаю новую игру, используя метод сброса рамок, панелей, меток для моего GUI, я создаю пустой файл и заполняю его 0. Пример

0 0 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 0 0 0 0 0
0 0 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 0 0 0 0 0 

Пока моя игра играет, и каждый игрок делает ход, я хочу go и найти точное местоположение, которое было сыграно, и изменить 0 на символ проверки игроков, где player1 равен "1", а игрок 2 - это «-1». Пример:

0  0  0  0  0  0  0 
0  0  0  0  0  0  0  
0  0  0  0  0  0  0
0  0  0  1  0  0  0 
0  0  0  1  0  0  0 
0  0  0  1 -1 -1 -1 

После каждого периода времени каждый раз, когда я хочу сделать кнопку, которая сохраняет эти изменения, чтобы я мог перезапустить игру и перезагрузить предыдущую в мой GUI.

public static void file_write(int row,int col,int letter) throws IOException{
        int counter1 = 0; // a counter that goes +1 until reach the row 
        int counter2=0; // a counter that goes +1 until reach the col
        FileWriter writehandle;
        writehandle = new FileWriter("file.txt");
        BufferedWriter bw = new BufferedWriter(writehandle);
        FileReader readhandle = new FileReader("file.txt");
        BufferedReader br = new BufferedReader(readhandle);

        if(Constants.once){ // boolean from class Constants that fills the file with 0. First example
        for(int i=0; i<7; i++){
            for(int j=0; j < 8; j++){
                Constants.line="0";
                bw.write(Constants.line + " "); // filling the file with 0
                }
        bw.newLine();
        }
    }
        if(letter == Constants.Player1) // player 1 symbol is 1
        for(int i=0; i<row;i++)
            for(int j=0; j<col; j++)

                if (br.readLine() == "0"  && counter2 != col){ //if statement in order to not change 
                    bw.write("0");                             //anything else except the player symbol i 
                    counter2++;                                //am looking for
                }
                else if(br.readLine() == " "   && counter2 != col){
                    bw.write(" ");
                    counter2++;
                }
                else if (br.readLine() == "-1" &&  counter2 != col){
                    bw.write("-1");
                    counter2++;
                }

                if(letter == Constants.Player1)
                bw.write("-1");
                else if (letter == Constants.Player2)
                    bw.write("1");
        bw.close();
        writehandle.close();
        Constants.once =false;
        file_read(0,0);


    }

Таким образом, каждый раз, когда происходит перемещение, код получает для него строку и столбец и вызывает этот метод, чтобы внести соответствующие изменения в файл. Моя проблема в том, что я не знаю, как перейти в точное местоположение, чтобы изменить число с помощью файлов, а не массивов. Кажется, код не перемещается в нужное мне место. Помощь!

1 Ответ

1 голос
/ 14 апреля 2020

О Боже, переписывание на месте станет очень страшным и очень подверженным ошибкам.

Я понимаю, что это не совсем ответ на ваш вопрос, но есть ли причина, по которой вы не можете просто загрузить весь файл в память, внести изменения и снова записать его на диск?

    static void write(Path outputFile, int[][] values) throws IOException {
        List<String> lines = Arrays.stream(values)
                .map(row -> Joiner.on("  ")
                        .join(Arrays.stream(row)
                                .mapToObj(Integer::toString)
                                .collect(Collectors.toList())))
                .collect(Collectors.toList());
        Files.write(outputFile, lines, StandardCharsets.UTF_8);
    }

    static int[][] read(Path inputFile) throws IOException {
        int[][] result = new int[6][7];
        List<String> lines = Files.readAllLines(inputFile);
        Preconditions.checkState(lines.size() == 6);
        for (int lineIdx = 0; lineIdx < lines.size(); lineIdx ++) {
            String[] lineValues = lines.get(lineIdx).split("\\s\\s");
            Preconditions.checkState(lineValues.length == 7);
            for (int columnIndex = 0; columnIndex < lineValues.length; columnIndex++) {
                result[lineIdx][columnIndex] = Integer.parseInt(lineValues[columnIndex]);
            }
        }
        return result;
    }

А потом, например


static void examplePlayerOneMoves(int row, int col) {
    int[][] game = read(GAME_FILE);
    Preconditions.checkState(game[row, col] == 0);
    game[row][col] = 1;
    write(GAME_FILE, game);
}

Причина, по которой я не хочу писать файл в том, что манипулирование потоками, подобным этому, в байтовом выражении очень просто agile, и редко бывает хорошей идеей, если вы хотите, чтобы ваш код был поддерживаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...