我正在为我正在制作的游戏编写游戏引擎。 我正在编写一个使用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);
}
}
答案 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则不会发生。
我希望我听起来不是居高临下,这不是意图 - 让这个网站顺利运作,沟通是关键。要成为一个更好的程序员,没有人可以不关心他们自己的代码。