2016-11-30 6 views
1

이 코드에 문제가 있습니다. 문제를 해결하는 방법을 알고 있는지 궁금합니다.while 루프가 제대로 작동하지 않습니다. (Python)

이 코드는 보드를 기반으로 한 게임을 대상으로 작성되었으며이 코드는 각각 treasure_coordsbandit_coords 변수 아래에 두 개의 좌표 20 개 목록을 만듭니다. 이 좌표 목록은 그 안에 좌표 (0, 11)을 가질 수 없으며 두 좌표 중 어느 좌표도 될 수 없습니다.

내 while 루프에 bandit_coords in treasure_coords을 추가하여이 작업을 중단 한 것으로 생각했지만 코드가 실행되면 두 목록에 동일한 좌표가 여전히 생성되고 이것이 문제입니다. 유용한 의견으로 답장 해주십시오.

import random 
board = [] 
for x in range(12): 
    board.append(["[ ]"]*12) 
coord_creater = [(x, y) for x in range(len(board[0])) for y in range(len(board))] 
treasure_coords = random.sample(coord_creater, 20) 
bandit_coords = random.sample(coord_creater, 20) 
while (0,11) in treasure_coords or (0,11) in bandit_coords or bandit_coords in treasure_coords: 
    treasure_coords = random.sample(coord_creater, 20) 
    bandit_coords = random.sample(coord_creater, 20) 
print (treasure_coords) 
print (bandit_coords) 
+0

당신이 while 루프를 사용해야합니까 : 2

for x in range(20): treasure_at = random.choice(possible_cords) possible_cords.pop(possible_cords.index(treasure_at)) bandit_at = random.choice(possible_cords) possible_cords.pop(possible_cords.index(bandit_at)) treasure_cords.append(treasure_at) bandit_cords.append(bandit_at) print zip(treasure_cords, bandit_cords) 

옵션? –

답변

0

당신은리스트의 요소가 다른 내부에 있는지 확인하는 in을 사용할 수 없습니다. in은 개별 요소가 목록 안에 있는지 검사합니다.

이 경우 any은 (는) 귀하의 친구입니다. 목록의 요소 중 하나라도 True인지 확인합니다. 이것을 발전기와 결합하면 속임수를 쓸 수 있습니다. 그 중 하나가 True

+1

@jDo treasure_coords의'(0,11)'는'in'의 올바른 사용법입니다. 보물 _ 코즈의 bandit_coords는 둘 다 '튜플'의 '목록'이기 때문에 그렇지 않다. – Ulisha

0
경우이 treasure_coords에있는 모든 단일가 bandit_coords 좌표 경우 부울 검사와 목록을 작성하고 확인합니다

any([coord in treasure_coords for coord in bandit_coords ]) 

: 필요

bandit_coords in treasure_coords 
에 의해 교체 할

좋아요, while 루프를 사용하는 것이 가장 좋은 방법인지는 잘 모르겠지만 여기에는 두 가지 구현이 있습니다.

import random 
board = [] 
for x in range(12): 
    board.append(["[ ]"]*12) 
possible_cords = [(x,y) for x in range(len(board[0])) for y in range(len(board))] 

# we don't want any item at (0,11) 
invalid_cord = possible_cords.pop(11) 
treasure_cords = list() 
bandit_cords = list() 

옵션 1 :

# or if you must use a while loop 
count = 0 
while count < 20: 
    treasure_at = random.choice(possible_cords) 
    possible_cords.pop(possible_cords.index(treasure_at)) 
    bandit_at = random.choice(possible_cords) 
    possible_cords.pop(possible_cords.index(bandit_at)) 
    treasure_cords.append(treasure_at) 
    bandit_cords.append(bandit_at) 
    count += 1 
print zip(treasure_cords, bandit_cords) 
+0

좋아, 내가 원한다면 어떻게 할까? 도둑 10 명, 보물 20 명? –

+0

두 개의 서로 다른 루프를 사용하십시오. 도적을위한 것과 보물을위한 것. 당신이 목록에서 팝 포지션이기 때문에 그것은 중요하지 않습니다. –

관련 문제