public class Maze {
private static final int Max_Maze_Row=20;
private static final int Max_Maze_Column=50;
public static Entity[][] maze =new Entity[Max_Maze_Row][Max_Maze_Column];
public Maze(){
}
public static void create(String filename) throws FileNotFoundException{
Scanner fileinput=new Scanner(new FileInputStream(filename));
fileinput.useDelimiter("");
while(fileinput.hasNextLine()){
for(int row=0;row<Max_Maze_Row;row++){
String line_content=fileinput.nextLine();
for(int col=0;col<Max_Maze_Column;col++){
if(line_content.charAt(col)=='*'){
maze[row][col]=new Wall('*',row,col);
}
if(line_content.charAt(col)==' '){
maze[row][col]=new Space(' ',row,col);
}
}
}
}
}
public abstract class Entity {
protected char symbol;
protected int row;
protected int col;
Entity(char symbol, int row, int col){
this.symbol=symbol;
this.row=row;
this.col=col;
}
public abstract void create();
public char Entity_put(char newEntity, int newRow, int newCol){
char oldEntity=this.symbol;
this.symbol=newEntity;
this.row=newRow;
this.col=newCol;
System.out.println(oldEntity);
return oldEntity;
}
}
public class Wall extends Entity{
public Wall(char symbol,int row,int col){
super(symbol,row,col);
}
public void create(){
}
}
我还有一个继承自Entity超类的类Space。它本质上是&#39; &#39 ;.所以会发生什么,程序从文本文件中读取,然后创建具有特定行,列,字符值的墙和空间实体。这些实体存储在Entity [] []迷宫中。 但是,我该如何引用这些对象? 例如,我怎么知道迷宫阵列中有多少墙对象? 基本上,我想要做的是: 随机选择不是墙的实体(即空间实体)。 做点什么。
答案 0 :(得分:0)
您可以使用索引引用多维数组中的对象,然后您可以使用instanceof来识别它们是Wall还是Space .....您可以编写如下所示的内容。下面是一个计算Walls数量的代码&#39;和空间&#39;在你的迷宫多维数组中。
public static void count(Maze[][] maze) {
int wallCount = 0;
int spaceCount = 0;
if (maze != null)
for (int i = 0; i < maze.length; i++) {
if (maze[i] != null)
for (int j = 0; j < maze[i].length; j++) {
if (maze[i][j] instanceof Wall)
wallCount++;
if (maze[i][j] instanceof Space)
spaceCount++;
}
}
}
答案 1 :(得分:0)
编辑:
我认为你可以在performAction
类中使用另一个抽象函数,例如Entity
,并在每个子类中重写此方法,在本例中为Wall
和Space
。稍后遍历数组时,您可以执行
Entity entity = maze[row][col];
entity.performAction();
Java将确定在运行时使用哪个子类performAction
。
=============================================== ============================
一种选择是将另外两个ArrayList
存储为字段。例如,
List<Entity> walls;
List<Entity> spaces;
在构造函数中初始化它们。
public Maze() {
this.walls = new ArrayList<Entity>();
this.spaces = new ArrayList<Entity>();
}
在Maze.create()
中最内层的循环内,您可以使用这些循环来跟踪墙和空间。
for(int col = 0; col < Max_Maze_Column; col++){
if (line_content.charAt(col) == '*') {
maze[row][col] = new Wall('*', row, col);
this.walls.add(maze[row][col]);
}
if (line_content.charAt(col) == ' ') {
maze[row][col] = new Space(' ', row, col);
this.spaces.add(maze[row][col]);
}
}
您可以通过索引访问获得每个墙和空间。如需尺寸,请致电walls.size()
和spaces.size()
。对于随机访问,您可以使用
// int max = walls.size() or spaces.size()
Random seed = new Random();
// Generate a random integer from 0 to (max - 1)
int index = seed.nextInt(max);
第二个选项可能是在稍后遍历数组时使用instanceof
运算符。例如,
Entity entity = maze[row][col];
if (entity instanceof Wall) {
Wall wall = (Wall) entity;
// do something with wall
} else if (entity instanceof Space) {
Space space = (Space) entity;
// do something with space
}