2012-02-27 46 views
1

我正在做一个游戏。在游戏中有一个由单元格填充的网格。每个单元格都有一个伙伴(相同类型的单元格)。应该有24个总计的细胞,这意味着12个不同的细胞对。例如,单元格可以是类型1,网格上将有两个类型1的单元格。 一直到类型12. 我想用我的代码实现的是随机生成一个行和一列,然后放置一个类型1的单元格。再次,生成随机的行和列,并在其上放置1型单元格。 然后增加类型。JAVA需要一个条件来检查整个2D阵列是否已满

现在我正在努力的是确保我的整个网格完全填充单元的条件。 此外,还有一个条件可以确保一旦一个单元格放置在网格上的一个点上,它就不能被另一个单元格替换。

这是我现在想出的代码。

 int type =1; 
    int row=0; 
    int column=0; 
    board[row][column] = new Cell(this, type, row, column); 



    while(board[row][column] != null){ 

     if(type <=12){ 



     row = generator.nextInt(4); 
     column = generator.nextInt(6);  
     board[row][column] = new Cell(this, type, row, column); 
     type++; 

     if (type < 13){ 
     row = generator.nextInt(4);  
     column = generator.nextInt(6);  
     board[row][column] = new Cell(this, type, row, column); 


     row = generator.nextInt(4); 
     column = generator.nextInt(6); 
     board[row][column] = new Cell(this, type, row, column); 


     add(board[row][column]);} //Adding a Cell object **board is a 2d array of type Cell** 
     } 
    } 
    } 

尽我所能来解释最简单的术语问题

+0

那么,如果你能够实现“确保一旦一个单元格放置在网格上的一个点上,它不能被另一个单元格替换”的条件,那么你肯定会知道网格是在完成12次迭代后完整。 – oksayt 2012-02-27 07:08:06

+0

是的,这是真的。然而,我无法确定如何确保一个单元格放置在网格上的某个点上后,它不能被另一个单元格替换。“ – Mjall2 2012-02-27 07:16:24

+0

考虑一下'board [x] [y]'看起来像什么位置1)在初始化之后,2)在一个单元被放置之后。然后你可以为它写一个条件。 – oksayt 2012-02-27 07:20:58

回答

3

更好的方法来做到这一点比随意添加项目将是以直接的方式填充数组,然后随机化它,但没有简单的方法来做到这一点。

有你可以做一个等价的事:创建具有所有必要的值的List中,randomly shuffleList,然后填充从你的阵列,在列表中你的阵列上的行和列映射条目:

List<Integer> list = new ArrayList<Integer>(24); 

for (int type = 1; type <= 12; type++) { 
    //Add each type twice 
    list.add(type); 
    list.add(type); 
} 

Collections.shuffle(list); 
int[][] board = new int[4][6]; 

for (int row = 0; row < 4; row++) { 
    for (int column = 0; column < 6; column++) { 
    int type = list.get(row + column * 4); 
    board[row][column] = new Cell(this, type, row, column); 
    } 
} 

行和列的映射列表条目并不那么重要,只要你用从洗牌列表中的每个条目只有一次,所以你可以这样做:

Iterator<Integer> i = list.iterator(); 

for (int row = 0; row < 4; row++) { 
    for (int column = 0; column < 6; column++) { 
    int type = i.next(); 
    board[row][column] = new Cell(this, type, row, column); 
    } 
} 
+0

因此,对于我的问题我不得不而 ,使它细胞。 然后我的单元格有一个叫做类型的字段,我必须添加到列表中。 董事会是一个类型的单元格数组...我会然后list.get(行+列* 4) – Mjall2 2012-02-27 07:15:25

+0

@ Mjall2 - 是的,你说得对。我更新了示例代码以更好地匹配您的问题。 – 2012-02-27 07:19:13

+0

好的。所以我更好地理解了映射行和列的第一块代码。这是因为我理解Collections.shuffle(list)语句。 谢谢你的时间!我希望完成这个程序! – Mjall2 2012-02-27 07:28:10

2

想象一下你的主板作为索引值从0到23,一个1-d阵列可以通过系统,然后生成您对解决问题基于索引的随机混洗将它们分配给单元。

row = index % 4; 
column = index/4; 

(逆映射是index = column * 4 + row,但你不:

这可以通过从[0 ... 23]提供给行和列索引定义映射被应用到2-d阵列不需要。)

+0

谢谢你的回答。 我不确定索引代表什么。 据我所知,一个数组的起始索引为0,并且对于24槽阵列而言,其数值为23。 – Mjall2 2012-02-27 07:08:24

+0

Orr,那是* my * answer;)(+1 - 将一堆索引洗牌,从顶部和地点类型中绘制单元格) – 2012-02-27 07:09:32

+0

@ Mjall2 - 'index'是索引到[0 ... 23]。它在您接受的答案的循环内显示为“row + column * 4”表达式。 – 2012-02-27 08:12:04

1

我会使用这样的算法。你可以确定插入max_array项目后,每个单元格填充。

注意:没有编译器,类似java的伪代码。

LinkedList<Long> freeCells = new LinkedHashSet<Long>(); 
for (int i = 0; i < max_x; ++i) { 
    for (int j = 0; j < max_y; ++j) { 
     long idx = (((long) i) << 32) & 0xFFFFFFFFL; 
     idx = idx | ((long) j & 0xFFFFFFFFL); 
     freeCells.add(idx); 
    } 
} 
Random rand = new Random(); 
while (freeCells.size() > 0) { 
    int r = rand.getNext() % freeCells.size(); 
    Long idx = freeCells.remove(r); 
    int i = (int) ((idx >> 32) & 0xFFFFFFFFL); 
    int j = (int) (idx & 0xFFFFFFFFL); 
    cell_matrix[i][j] = new Cell(type); 
} 

这只是一个草案,应该让你知道我的意图。

相关问题