我的问题用言语描述有点复杂,所以我将从现有知识开始。以下代码将所有1从a []随机移到t [] []中-每个1覆盖找到的0:
import java.util.Arrays;
import java.util.Random;
public class test {
public static void main (String[] args) {
Random r = new Random();
int a[] = {1,1,1,1,1,1,1,1,1,1};
int t[][] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 * 12, to avoid
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //out-of-bounds ex;
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //first and last
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //lines and rows
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //always stay 0.
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
int line = r.nextInt(10)+1; //1 - 11 to avoid out of bounds ex
int column = r.nextInt(10)+1;
t[line][column] = a[0]; //set first 1 in t[]
//move line and row away from the first one
//to avoid out-of-bounds ex in while loop below
//(I have to think about if this is really necessary,
//but let's not focus on this ;)
if (line <=5) {
line = (line+2);
}
else {
line =(line-2);
}
if (column <=5) {
column = (column+2);
} else {
column =(column-2);
}
//begin moving 1s
for(int i = 1; i < a.length; i++) { //i=1, because first 1 is
//already set
//the field has to be a new one, so it does not overwrite
//an existing 1.
while( (t[line][column]) !=0) {
line = r.nextInt(10)+1;
column = r.nextInt(10)+1;
}
t[line][column] = a[i];
}
for (int j = 0; j < t.length; j++) {
System.out.println(Arrays.toString(t[j]));
}
}
}
但是现在我想成为彼此相邻的人,例如:
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
我的目标是使它们看起来像一个迷宫(对于迷你迷宫探索器游戏。我不在乎结果是否看起来像我现在的迷宫,但我想了解出了什么问题)。我试图像这样修改while循环:
//while the int at the field is not zero
while( (t[line][column]) !=0 &&
//and all neighbours are 0,
((t[line+1][column]) == 0 && //above
(t[line-1][column]) == 0 && //below
(t[line][column-1]) == 0 && //left
(t[line][column+1]) == 0)) //right
{
//generate new random field.
line = r.nextInt(10)+1;
column = r.nextInt(10)+1;
}
它不起作用,我不确定为什么。这个想法对我来说很有意义,我不知道代码哪里出了问题。我也是一个初学者,所以虽然可能有更好的方法来执行类似的操作,但由于我的代码无法正常工作的原因,我希望能得到详细的帮助:-)
非常感谢你!
最佳答案
您的代码有变化
import java.util.Arrays;
import java.util.Random;
public class Game {
private final static int DIMENSTION = 10;
public static void main(String[] args) {
final Random r = new Random();
final int field[][] = new int[10][10];
for(int line=0; line < DIMENSTION; line ++) {
for(int column=0; column < DIMENSTION; column ++) {
field[line][column] = 0;
}
}
//begin moving 1s
for(int i = 0; i < 8; i++) {
int line = r.nextInt(DIMENSTION);
int column = r.nextInt(DIMENSTION);
while(field[line][column] == 0) {
field[line][column] = 1;
int direction = r.nextInt(4);
switch (direction){
case 0:
if (line < DIMENSTION -1) {
line ++;
}
break;
case 1:
if (line >= 1) {
line --;
}
break;
case 2:
if (column >= 1) {
column --;
}
break;
case 3:
if (column < DIMENSTION - 1) {
column ++;
}
break;
default:
throw new UnsupportedOperationException("Can move wrong direction " + direction);
}
}
}
for (int j = 0; j < field.length; j++) {
System.out.println(Arrays.toString(field[j]));
}
}
}
结果
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 1, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 0, 1, 0, 0, 0]
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0]
并且不要使用更大的数组来避免超出范围