使某事物在阵列中移动

时间:2013-11-20 19:44:53

标签: java arrays loops char

我必须制作这个程序,使12×12阵列填充不同的字母,然后制作一种疾病,扩散到相同字母的附近单元格(它将被随机放置在数组中)。到目前为止,我已经设法为阵列和疾病做了一个类(选择一个随机的char来患病),但我不明白我怎么能让它看到附近的细胞。此外,在疾病中,用户可以选择多少个不同的字母(2-4)。到目前为止我已经完成了:

import java.util.Random;
public class Disease {
public char D ;
Random r = new Random();
public void forTwo() {
    Random r = new Random();
    D = (char)(r.nextInt(2) + 'E');
}
public void forThree() {
    Random r = new Random();
    D = (char)(r.nextInt(3) + 'E');
}
public void forFour() {
    Random r = new Random();
    D = (char)(r.nextInt(4) + 'E'); 
}
}

AND THE ARRAY:

import java.util.Arrays;
import java.util.Random;
public class PlayingArea {
private String letters;
public char[][] grid;
public PlayingArea(String letters) {
    this.letters = letters;
}
public void populate() {
    int n = letters.length();
    grid = new char[12][12];

    Random r = new Random();
    for (int j = 0; j < grid.length; j++) {
        for (int i = 0; i < grid.length; i++) {
            grid[i][j] = letters.charAt(r.nextInt(n));
        }
    }
}
public String gridAsString() {
    StringBuilder sb = new StringBuilder();
    for (char[] letterRow : grid) {
        sb.append(Arrays.toString(letterRow)).append('\n');
    }
    return sb.toString();
}
}

4 个答案:

答案 0 :(得分:1)

如果使用数组,则可以使用示例单元格a [1] [1]的邻居 a [0] [1],a [2] [1],a [1] [0]和[1] [2],如果你只在4个方向工作。

您还可以为细胞创建一个类,它知道它的直接相邻细胞, 所以你可以像cell.getLeftNeighbor()一样得到左边的邻居。

修改

好的,现在你已经拥有了你的代码,我们可以提供更具体的帮助。 :)

您实施它的方式,您必须访问您的类PlayArea中的疾病逻辑。我不太明白你们在疾病类中的方法是什么,forTwo()会将“E”或“F”分配给char D,例如。

您需要确定疾病的坐标,您可以通过不同的方式进行:

  • 在PlayingArea中指定坐标,如5和4 = grid [5] [4]。直接邻居现在是网格[x-1] [x],网格[x + 1] [x], grid [x] [x-1]和grid [x] [x + 1]。

  • 将char [] []替换为Cell [] []。您将不得不创建一个类Cell,它只需要知道一个布尔值,哪个字母在其中,如果它是患病的。此外,您可以将其他Cell作为属性,这样您就可以直接访问单元格邻居。

    public class Cell{
        public char letter;
        public boolean diseased;
        public Cell leftCell, rightCell, topCell, bottomCell;
    
        public Cell(char newLetter){
            letter = newLetter;
        }
     }
    

    此示例没有setter / getter方法,您可以在PlayingArea中创建单元格,设置每个单元格的疾病状态并分配/访问相邻单元格。

答案 1 :(得分:0)

首先在纸上画出你的阵列作为网格......就像一个跳棋板。选择该网格中的任何空间,并找出相对于您选择的空间的相邻空间的索引。

写一个方法来做你刚才做的事情。

听起来这是一个反复的问题。 “数组完全被感染需要多少次迭代?”

答案 2 :(得分:0)

鉴于信息有限,我认为递归方式会更自然,但您可以通过迭代轻松实现它(它需要您存储已故的单元格以及下一步的位置)。

由于它是一个2D数组,一旦你有了受感染的细胞,你就可以检查左边和右边的字符是否是“可感染的”(同一个字母)。 要检查上下,您需要选择相邻的子阵列。

例如: 你感染的细胞是[3,4]。要检查左右,您需要转到[3,3]和[3,5]条目。 要检查上下,您需要转到[2,4]和[4,4]。 如果需要对角检查细胞,请检查[2,3],[2,5],[4,3]和[4,5]。

然后,如果您能够“感染”另一个细胞 - 再次在该细胞上调用您的功能。

这可以让你知道从哪里开始。 如果你遇到一些错误 - 发布你的代码并指明你被困的地方(如果你被允许这样做)。

答案 3 :(得分:0)

将疾病对象的当前位置存储为疾病对象中的变量,以便每种疾病都有当前位置/坐标,即x,y

使用x和y作为疾病的当前位置(您不知道):

  • 要查看邻近的单元格,可以使用

array[x+1][y] // Right
array[x-1][y] // Left
array[x][y+1] // Down
array[x][y-1] // Up

  • 如果您也想查看对角线,请使用相同的方法。 (array [x-1] [y-1] =左上角)

除非你将疾病对象传递给阵列或阵列的一个子集,否则你无法从疾病中做到这一点。