2016-11-30 2 views
1

Я столкнулся с проблемой с этим кодом, и мне было интересно, знает ли кто-нибудь, как его исправить.while цикл работает неправильно (Python)

Этот код предназначен для игры на основе платы, и этот код создает два списка из 20 координат под каждой из переменных treasure_coords и bandit_coords. Эти списки координат не могут иметь координаты (0, 11) в них, и ни одна из координат не может быть в обоих списках.

Я думал, что остановил это, добавив bandit_coords in treasure_coords в мой цикл while, но когда код запускается, он по-прежнему создает одни и те же координаты в обоих списках, и это проблема. Пожалуйста, ответьте с любой полезной обратной связью.

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

Вы должны использовать время цикла? –

ответ

0

Вы не можете использовать in, чтобы проверить, если какой-либо элемент списка в другой. in проверяет, находится ли отдельный элемент внутри списка.

В этом случае any является вашим другом. Это проверит, является ли какой-либо из элементов в списке True. Сочетание этого с генераторами сделает трюк.

bandit_coords in treasure_coords 

должен быть заменен на:

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

Это создаст список с булевой проверкой, если каждая координата в bandit_coords в treasure_coords, а затем проверить, если любой из них True

+1

@jDo '(0,11) в treasure_coords' является правильным использованием' in'. 'bandit_coords в treasure_coords' нет, так как оба являются' list' 'tuple'. – Ulisha

0

Хорошо, я не уверен, что цикл 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:

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) 

Вариант 2:

# 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

Используйте две разные петли. Один для бандитов и один для сокровищ. Поскольку вы занимаете поп-позиции из списка, это не имеет значения. –

Смежные вопросы