2016-10-04 82 views
2

我正在用随机生成的炸弹进行扫雷游戏。但有时我发现在我的炸弹坐标列表中有重复的地方。如何检查列表中的重复项,并将其替换为其他随机坐标。检查随机生成列表中的重复项并替换它们

from random import randint 

def create_bombpos(): 
    global BOMBS, NUM_BOMBS, GRID_TILES 
    for i in range(0, NUM_BOMBS): 
     x = randint(1, GRID_TILES) 
     y = randint(1, GRID_TILES) 
     BOMBS.append((x, y)) 
    print(BOMBS) 

用户可以决定董事会有多大是由GRID_TILES输入。 如果他们输入5,该板将是5x5。炸弹的ammount的是:

GRID_TILES * GRIDTILES/5 

回答

3
from random import randint 

def create_bombpos(): 
    global BOMBS, NUM_BOMBS, GRID_TILES 
    i = 0 
    while i<NUM_BOMBS: 
     x = randint(1, GRID_TILES) 
     y = randint(1, GRID_TILES) 
     if (x,y) not in BOMBS 
      BOMBS.append((x, y)) 
      i = i + 1 
    print(BOMBS) 

如果新生成的点已经在列表中,然后i将不会增加,我们会找到另一个新生成的点,直到它不存在于BOMBS

希望它有帮助!

+0

谢谢,这似乎帮助!我会尽快接受答案。 –

4

搜索整个BOMBS列表中的每一次将花费你O(n)(线性时间)。为什么不用set来代替?一个Set可以保证你最终得到不同的(在散列方面)元素。

from random import randint 

def create_bombpos(): 
BOMBS = set() 
i = 0 
while i<NUM_BOMBS: 
    x = randint(1, GRID_TILES) 
    y = randint(1, GRID_TILES) 
    if (x,y) not in BOMBS 
     BOMBS.add((x, y)) 
     i = i + 1 
print(BOMBS) 

让我要给你一个集合的例子:

>>> a = set() 
>>> a.add((1,2)) 
>>> a 
{(1, 2)} 
>>> a.add((1,2)) 
>>> a.add((1,3)) 
>>> a.add((1,2)) 
>>> a 
{(1, 2), (1, 3)} 

我很多次同样的元素添加到组,但只有1个实例将出席会议。

+1

为什么如果你使用一个集合来检查(x,y)是否在BOMBS中? –

+1

不错,赶上@maximilianPeters。复制n粘贴。 – sestus

+0

无论如何,看起来他并不在乎跑步的时间:) – sestus

0

使用python为此设置,它会自动检查重复项,并简单地忽略已经在列表中的每个条目。 我也认为运行时比使用列表和手动检查重复项要好得多。

链接:https://docs.python.org/2/library/sets.html

3

你也可以使用random.sample来实现这一目标:

from random import sample 

GRID_TILES = 100 
NUM_BOMBS = 5 

indexes = sample(range(GRID_TILES * GRID_TILES), NUM_BOMBS) 
BOMBS = [(i // GRID_TILES, i % GRID_TILES) for i in indexes] 
+1

最好的解决方案恕我直言,甚至可以缩短为一行。不检查位置是否存在,因为样本确保每个位置都是唯一的。 –