2016-10-04 4 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가됩니다.

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는 서로 다른 (해시의 관점에서) 요소를 제공한다는 것을 보장합니다.

>>> 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 인스턴스가 존재합니다 :

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) 

나 유에게 한 세트의 예를 들어 보겠습니다.

+1

세트를 사용하는 경우 (x, y)가 BOMBS에 있는지 확인하는 이유는 무엇입니까? –

+1

좋은 캐치 @maximilianPeters. 복사 붙여 넣기에서 빠져 나옵니다. – sestus

+0

어쨌든, 그는 달리기 시간에 신경 쓰지 않는 것 같습니다 :) – sestus

0

파이썬 세트를 사용하면 자동으로 중복을 확인하고 이미 목록에있는 모든 항목을 무시합니다. 또한 런타임이 목록을 사용하고 중복을 수동으로 확인하는 것보다 훨씬 낫다고 생각합니다.

링크 : 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

최상의 솔루션 IMHO는 한 줄로 단축 될 수도 있습니다. 샘플은 모든 위치가 고유하다는 것을 확인하기 때문에 위치가 존재하는지 검사하지 않습니다. –

관련 문제