2014-11-29 3 views
-1

안녕하세요 저는 파이썬에 상당히 익숙하며 현재 지뢰 찾기 게임을 만들려고합니다. 나는 2 개의리스트를 만들었고, 1 개는 플레이어 (필드)에 표시되고 1 개는 지뢰 (지뢰밭)를 포함합니다. 나는 좌표를 선택하는 플레이어를 요구하고, 프로그램은 주변에 지뢰가 있는지 여부를 확인 여부와 홍수가이 코드를 사용하여 광산 주변의지도를 채우는 : 나는이 있는지 확인하기 위해 노력하고있어 그래서 기본적으로다른 목록을 기반으로 목록을 수정하는 데 문제가 있습니까?

def floodfill(field, minefield, x, y) 
    list1 = [(x, y)] 
    while True: 
     a, b = list1.pop() 
     field[b][a] = 'W' 
     list2 = [(a, b - 1), (a, b + 1), (a - 1, b), (a + 1, b)] 
     for element in list2:    
      x2 = element[0] 
      y2 = element[1] 
      if y2 >= len(field) or x2 >= len(field[0]) or y2 < 0 or x2 < 0: 
       continue 
      if minefield[y2][x2] == 'O':     
       list1.append(element) 
     if not list1: 
      break 
    return field 

을 'minefield'목록을보고 'minefield'목록에 따라 'field'목록을 수정하여 선택한 좌표 주변의 광산을 찾습니다. 문제는 주어진 좌표 주위에 비 광산 블록이 있으면 프로그램이 멈추는 것입니다.

예를 들어 이러한 항목을 실행하면 아무 일도 일어나지 않습니다.

minefield = [['O', 'O'], ['x', 'x']] # field is the same without xs 
x = 0 
y = 0 

그러나이와

: 당신은에 지뢰밭 배열을 수정하지 않기 때문에

field = [['W', 'O'], ['O', 'O']] # Os are covered mines 
+0

* "잼을 중단합니다"*는 무엇을 의미합니까? 비헤이비어를 복제하는 예제를 제공 할 수 있습니까? 자신 만의 변수'list'를 명명하는 것은 나쁜 생각입니다; 그것은 그림자가 내장되어 있습니다. – jonrsharpe

+0

예제를 추가하고 목록의 이름을 변경하려고했습니다. 희망이 지금은 더 명확한 – Aapoman

답변

1

문제가

if minefield[y2][x2] == 'O': 

것 같다 :

minefield = [['O', 'x'], ['x', 'x']] # field is the same without xs 
x = 0 
y = 0 

그것은이 반환 루프에는 항상 'O'가 들어가고 각 for 루프는 좌표가 list1에 추가됩니다. 당신은 (Y2, X2)의 값을 모두 지뢰밭과 필드를 확인할 수 있습니다 모두 인 경우 'O'는 다음 목록 1에 추가 : 위의 수정과 코드를 실행 한 후

if minefield[y2][x2] == 'O' and field[y2][x2] == 'O': 

이 데이터 :

field = [['O', 'O'], ['O', 'O']] 
minefield = [['O', 'O'], ['x', 'x']] 
x = 0 
y = 0 

print floodfill(field, minefield, x, y) 

는 반환 또한

[['W', 'W'], ['O', 'O']] 

매우 위험한 단지

을 할

관찰 된 바와 같이 프로그램이 무한 루프를 입력 할 수 있기 때문입니다. 알고리즘에는 올바른 계산을 할 수있을만큼 충분히 크고 코드에 실수가있을 경우 약간의 시간이 소요될만큼 충분히 작은 반복 리미터가 있어야합니다. 따라서이 경우 제한은 전체 지뢰밭의 크기만큼 큰 값으로 설정되어야합니다 (전체 지뢰가없는 경우). 또한 반복 제한이 초과되면 디버그 및 정보 용으로 적절한 경고가 인쇄 될 수 있습니다.

def floodfill(field, minefield, x, y): 
    list1 = [(x, y)] 
    max_iters = 100 # it should be at least as big as the size of whole minefield 
    # or more dynamic/generic approach based on actual minefield size: 
    # max_iters = len(minefield) * len(minefield[0]) 
    while True and max_iters > 0: 
     max_iters -=1 
     a, b = list1.pop() 
     field[b][a] = 'W' 
     list2 = [(a, b - 1), (a, b + 1), (a - 1, b), (a + 1, b)] 
     for element in list2: 
      x2 = element[0] 
      y2 = element[1] 
      if y2 >= len(field) or x2 >= len(field[0]) or y2 < 0 or x2 < 0: 
       continue 
      if minefield[y2][x2] == 'O' and field[y2][x2] == 'O': 
       list1.append(element) 
     if not list1: 
      break 
    if max_iters <= 0: 
     print "Iterations limit exceeded" 
    return field 
+0

고마워! 지금 일할 코드를 얻었습니다. :) – Aapoman

관련 문제