2016-11-30 16 views
1

私はこのコードに問題が出てきたので、誰かがそれを修正する方法を知っているのだろうかと思っていました。whileループが正しく動作しない(Python)

このコードは、ボードベースのゲーム用で、このコードは、変数treasure_coordsbandit_coordsのそれぞれの下に20個の座標の2つのリストを作成します。これらの座標のリストは座標が(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ループを使用する必要がありますか? –

答えて

0

あなたは、リストの任意の要素が他の内側にあるかどうかを確認するためにinを使用することはできません。 inは、個々の要素がリスト内にあるかどうかをチェックします。

この場合、anyはあなたの友人です。これは、リスト内のいずれかの要素がTrueであるかどうかをチェックします。これを発電機と組み合わせることはそのトリックを行うでしょう。

bandit_coords in treasure_coords 

はで交換する必要がある:一つ一つがbandit_coordsの座標と、このブールチェックしてリストを作成します

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

treasure_coordsであるし、それらのいずれかがTrue

+1

@jDo treasure_coordsの '(0,11)'は 'in'の正しい使い方です。 「宝探しの中のbandit_coords」はそうではありません。なぜなら両方が 'tuple'の' list'ですからです。 – Ulisha

0
であるかどうかを確認

OK、whileループが最善の方法であるかどうかは分かりませんが、ここには2つの実装があります:

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

2つの異なるループを使用します。盗賊のためのものと宝物のためのもの。あなたがリストからポップポジションになっているので、それは問題ではありません。 –

関連する問題