while循环不正常(Python)

时间:2016-11-30 11:11:08

标签: 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)

2 个答案:

答案 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 :(得分: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)