まず、ご来店いただき、問題の解決に時間を割いていただきありがとうございます。
私は完全な初心者 (3 日目のプログラミング) であり、なぜ私がこの問題を解決しようとして数え切れないほど頭が痛む時間を費やしたのか、まだ理解していないのかを説明しています。
問題: 文字列 (* と _) で構成される .txt ファイルをスキャンし、それをブール配列 (つまり、* = true および _ = false) に変換するにはどうすればよいですか (また、どのように出力しますか? double for ループも必要になると思います)?メイン メソッドでスキャナが機能していないようで、「そのようなファイルはありません」というエラーが表示されます。
おまけ問題: 新しいグリッドが古いグリッドを置き換え、最新のグリッドがノンストップで新しいグリッドになるように、グリッドをどのように反復しますか (たとえば、for ループを使用)。私は「show()」メソッドに慣れていませんが、うまく機能しました。
問題のアイデアを提供するための私の不完全なコードは次のとおりです。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class GameOfLife {
public static boolean[][] gen() throws IOException {
Scanner scanner = new Scanner(new File("seed.txt"));
int rows = 0, columns = 0;
while (scanner.hasNextLine()) {
String s = scanner.nextLine();
if (s.length() > columns)
columns = s.length();
rows++;
}
boolean[][] grid = new boolean[rows][columns + 1];
Scanner scanner1 = new Scanner(new File("seed.txt"));
String line;
for (int r = 0; r < rows; r++) {
line = scanner1.nextLine();
System.out.println(line);
for (int c = 0; c <= line.length(); c++) {
if (r == line.length()) {
break;
}
if(line.charAt(r) == '*') {
grid[r][c] = true;
}
}
}
return grid;
}
public static boolean[][] nextGen(boolean[][] cells){
boolean[][] newCells = new boolean[cells.length][cells[0].length];
int num;
for(int r = 0; r < cells.length; r++){
for(int c = 0; c < cells[0].length; c++){
num = numNeighbours(cells, r, c);
if (occupiedNext(num, cells[r][c]))
newCells[r][c] = true;
}
}
return newCells;
}
public static void main(String[] args) throws IOException{
boolean[][] cells = gen();
show(cells);
cells = nextGen(cells);
show(cells);
Scanner scanner2 = new Scanner(new File("seed.txt"));
while(scanner2.nextLine().length() != 0){
cells = nextGen(cells);
show(cells);
}
}
private static boolean inbounds(boolean[][] cells, int r, int c) {
return r >= 0 && r < cells.length && c >= 0 &&
c < cells[0].length;
}
private static int numNeighbours(boolean[][] cells, int row, int col) {
int num = cells[row][col] ? -1 : 0;
for (int r = row - 1; r <= row + 1; r++)
for(int c = col - 1; c <= col + 1; c++)
if (inbounds(cells, r, c) && cells[r][c] )
num++;
return num;
}
public static void show(boolean[][] grid){
String s = "";
for(boolean[] row : grid){
for(boolean val : row)
if(val)
s += "*";
else
s += "_";
s += "\n";
}
System.out.println(s);
}
public static boolean occupiedNext(int numNeighbours, boolean occupied){
if (occupied && (numNeighbours == 2 || numNeighbours == 3))
return true;
else if (!occupied && numNeighbours == 3)
return true;
else
return false;
}
}