我遇到了这个代码的问题,我想知道是否有人知道如何修复它。
此代码适用于基于棋盘的游戏,此代码在每个变量treasure_coords
和bandit_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 :(得分: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)