所以我的Java扫雷游戏被表示为int [] [],其中-1表示我的。当我初始化我的游戏时,我需要随机放置x个数量的地雷。
这样做的优雅方式是什么?我正在考虑使用ArrayList和每个单元格的坐标,随机选择它,更改int [] []的状态,然后删除该Point。这样可以确保两次都没有选择任何一个点。
有更优雅的方式吗?
答案 0 :(得分:4)
我会这样做,但略有不同。使用发卡算法。
按顺序创建网格中所有坐标的数组。 ([0,0], [0,1] .. [0,max], [1,0] .. [max, max])
。然后通过按顺序迭代列表并使用随机元素交换每个元素来“洗牌”。然后选择列表中的前x个元素,并将地雷放在这些位置。
答案 1 :(得分:1)
我会生成随机坐标并检查现有矿井的板。如果它存在则跳过它并生成新坐标,如果它没有放置我的坐标。
答案 2 :(得分:0)
我认为矿井宽度是固定的?
如果是这样,那么你可以这样做:
说你有4x4矿井网。
将小数转换为二进制,因此对于4位,范围将为:
2 ^ 4 = 16 =>范围是0 ... 15
然后只需为每个网格“行”调用此函数:
1,16,0,3
将转换为:
0001
1111
0000
0011
答案 3 :(得分:0)
这是在python中。但它打印了地雷的(x,y)坐标。结果已排序,但无关紧要。
from random import sample
import sys
def randomSquares(n, m, mines):
return sorted([ (mine % m, mine // n) for mine in sample(xrange(n * m), mines)])
if __name__ == '__main__':
print randomSquares(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))