嵌套for循环不能正常工作

时间:2014-04-01 18:55:14

标签: java for-loop

我正在为我正在制作的游戏编写游戏引擎。 我正在编写一个使用Cell对象的Map对象。 Cell应该是128x128区域,由数组表示。每个int代表一个对象。但是,当我为Cell生成运行以下代码时:

private int[][] cellGen() {
    int[][] tempMap = new int[128][128];

    for (int x = 0; x < 128; x++) {
        int y = 0;
        for (y = 0; y < 128; y++) {
            tempMap[y][x] = itemGen();

        }
    }
    return tempMap;
}

但是,它只生成一行128个整数,并且不会填满整个数组。我错过了什么呢?

这是itemGen()

private int itemGen(){
    switch(biome){
        case 0: return (int)(5*Math.random());
        case 1: return (int)(5*Math.random())+5;
        case 2: return (int)(5*Math.random())+10;
        case 3: return (int)(5*Math.random())+15;
        case 4: return (int)(5*Math.random())+20;
        default: return 100;
    }
}

这是我正在检查条目的代码:

public class main {
    public static void main(String[] args) {
        Cell c = new Cell();
        System.out.println(Arrays.toString(c.rawCell()));
    }
} 

以下是我的Cell课程的完整代码:

import java.util.Arrays;

public class Cell {
    private int[][] cell;
    private int biome; 

    public Cell(){
        this.cell = cellGen();
        this.biome = biomeGen();
    }

    private int itemGen() {
        switch(biome) {
            case 0: 
                return (int)(5*Math.random());
            case 1: 
                return (int)(5*Math.random())+5;
            case 2:
                return (int)(5*Math.random())+10;
            case 3:
                return (int)(5*Math.random())+15;
            case 4:
                return (int)(5*Math.random())+20;
            default: 
                return 100;
        }
    }

    private int biomeGen() {
        return (int)(5*Math.random());
    }

    private int[][] cellGen() {
        int[][] tempMap = new int[128][128];

        for(int x = 0;x<128;x++) {
            for(int y = 0;y<128;y++) {
                tempMap[y][x] = itemGen();
            }
        }

        return tempMap;
    }

    public int[][] rawCell() {
        return cell;
    }

    public String toString(){
        return Arrays.toString(cell);
    }
}

3 个答案:

答案 0 :(得分:1)

for (int x = 0; x < 128; x++) {
    for (int y = 0; y < 128; y++) {
        tempMap[x][y] = itemGen();
    }
}

试试这个

我不确定< 127是否正确我认为你想要< 128

同样tempMap[y][x] = itemGen();似乎反直觉,除非另有要求,否则你应该做tempMap[x][y] = itemGen();

现在你正在填写一个完整的专栏,然后再转到下一栏,在进入下一行之前,填充整行似乎更直观。

最后,将int y = 0移动到for循环中是有意义的,就像for (int y = 0; y < 128; y++)一样,因为每次x迭代都会重新创建y。

否则你可能会这样做

int x = 0;
int y = 0;
for (x = 0; x < 128; x++) {
    for (y = 0; y < 128; y++) {
        tempMap[x][y] = itemGen();
    }
}

你可以说它不起作用,但已经运行了这段代码

int[][] table = new int[128][128];
        int x = 0;
        int y = 0;
        for (x = 0; x < 128; x++) {
            for (y = 0; y < 128; y++) {
                table[x][y] = 1;
            }
        }
        for (x = 0; x < 128; x++) {
            String line = "";
            for (y = 0; y < 128; y++) {
                line += ", " + table[x][y];
            }
            out.println(line);
        }

我知道它确实有用。

答案 1 :(得分:1)

此循环存在两个问题,首先您的条件设置不正确。 x&lt; 127和y&lt;它应该是x&lt; 128和y&lt;通常且正确的x <128或更高。 tempMap.length和y&lt; tempMap [I]。长度:

private int[][] cellGen(){
    int[][] tempMap = new int[128][128];
    for(int x = 0;x<tempMap.length;x++){ //loop over rows x is the row number
        for(int y = 0;y<tempMap[i].length;y++){ //loop over columns y is the column number
            tempMap[x][y] = itemGen();

        }

    }
    return tempMap;

}

答案 2 :(得分:0)

除了Cell.toString()方法之外,您的代码完全按照您希望的方式工作。如果你看一下,你可以调用Arrays.toString(int[][] cell),这当然会给你一个两个(!) - 维数组Cell.cell的字符串表示。现在,什么是二维数组?一堆一维数组!那么你的Cell.toString()方法(以及你的测试代码)所做的是在Cell.cell中打印数组的地址,这当然不是你想要的。你想要一个Cell.cell的矩阵表示,从Java 1.5开始,我们有Arrays.deepToString(Object[] a)为我们做这个。但是,这会将所有字符串放在一行中,并且您可能希望方形矩阵的输出字符串为正方形,因此您必须自己迭代。这是比较输出的代码。

import java.util.Arrays;

public class main {
    public static void main(String[] args) {
        Cell c = new Cell();
        int[][] cell = c.rawCell();
        System.out.println("Arrays.toString:");
        System.out.println(Arrays.toString(cell)); // ugly, ugly object addresses

        System.out.println("\n\n");

        System.out.println("Arrays.deepToString:");
        System.out.println(Arrays.deepToString(cell)); // well this is basically alright, but it's all in one line

        System.out.println("\n\n");

        //now there's a pretty matrix! look at you, all filled with numbers
        System.out.println("Going down the levels by hand:");
        for(int i = 0; i < cell.length; i++) {
            System.out.print("[");
            for(int j = 0; j < cell[i].length; j++) {
                System.out.print(cell[i][j]);
                if(j != cell[i].length - 1) {
                    System.out.print(", ");
                }
            }
            System.out.println("]");
        }

        System.out.println("\n\n\n\n\n\n\n\n");

        // if you're dead set on using Arrays.toString(),
        // you'll have to go down to the very lowest level by hand
        System.out.println("Arrays.toString for each one-dimensional array:");
        for(int i = 0; i < cell.length; i++) {
            System.out.println(Arrays.toString(cell[i]));
        }
    }
} 

现在这不是一个很难解决的问题,除非它比它应该更加艰难。你应该从中汲取一些东西:

  • 发布所有相关代码。这意味着实际播放的所有代码 在你的最终出现的任何部分看起来都不是那样的 应该(如果你看到带@的数字,肯定是输出语句 其中的符号,应该让你好奇。)

  • 请尽量不要让人多次询问。第一条评论是问“这是整个[..]代码吗?” - 不应该重复。

  • 查看您正在使用的Javadocs内容,如果某些内容无法正常运行,请确定它们如何与您的代码一起使用。

  • 实际上检查你的输出,不要只是掩盖它 - 你会立即看到输出中有@符号,而int s则不会发生。

我希望我听起来不是居高临下,这不是意图 - 让这个网站顺利运作,沟通是关键。要成为一个更好的程序员,没有人可以不关心他们自己的代码。