2014-11-08 3 views
-3

Я сделал игру с линкорами, и теперь мне нужно убедиться, что компьютер не атакует в одном и том же месте дважды.Создайте случайные не повторяющиеся образцы из массива чисел

Мое представление об этом заключается в хранении координат каждого кадра в переменной, которая добавляется к каждому новому снимку, а затем мне просто нужно проверить и проверить, соответствует ли текущий кадр в переменной.

Это код, у меня есть для съемки:

if playerNumber == "1": 

     eg.msgbox("Player " + str(playerNumber) + " your shot.") 

     hit=False 

     shotX=eg.enterbox("Enter the x-coordinate for your shot (1-5): ") 
     shotY=eg.enterbox("Enter the y-coordinate for your shot (1-5): ") 

    else: 

     eg.msgbox("The computer will now attack!") 

     hit=False 
     shotX=str(random.randint(1,5)) 
     shotY=str(random.randint(1,5)) 

     eg.msgbox ("The computer shot at " + str(shotX) + ", " + str(shotY) + "") 

Моя идея убедившись, что компьютер выбирает то, что не в списке с помощью цикла, где он держит выбор выстрела, пока одна она выбор уже не выбран.

Фактический код, который делает компьютер огонь его выстрел:

hit = haveShot("2", p1ship1, p1ship2 , player2Board) 

    if hit: 
     p2 = p2 + 1 
     eg.msgbox("The Computer has " + str(p2) + " points and Player 1 has " + str(p1) + " points") 
     if p2 == 2:  
      eg.msgbox("Unlucky, The computer won. Press enter to continue") 
      if platform.system() == "Windows": # ONLY PLAY SOUNDS IF ON WINDOWS OS 
       finish() 
      break 

Спасибо!

+0

поставить все координаты в списке и просто удалить коорд после того, как был выбран –

ответ

-1

Вы можете вести журнал всех Выстрелы:

# during initialization 
fired = set() 
# ... skipping to the interesting part ... 
eg.msgbox("The computer will now attack!") 
while True: 
    shotX = random.randint(1,5) 
    shotY = random.randint(1,5) 
    if (shotX, shotY) not in fired: 
     break # OK, no need to look any further 
    # else try another shot... 
eg.msgbox ("The computer shot at {0}, {1}".format(shotX, shotY)) 
fired.add((shotX, shotY)) 

Я также держал shotX и shotY как целые числа (возможно, потребуется их, что путь позже, если вы хотите посмотреть индексы в матрице Например,

+0

Если это не будет 'не в',' break'? – parchment

+0

@parchment: О, верно, раньше у меня было это, и я подумал, что я его поменяю, а потом забыл 'break' после' if'. Я изменю его. Благодаря! –

+0

Прохладный, похоже, что я работаю, я сделаю полный тест, когда я получу время через пару часов! Благодаря! –

-1

U может использовать случайную перестановку n целей и снимать цель из этого беспорядочно переставляемого списка. Используйте random.shuffle для этого, как показано ниже. Я показал выборочный вывод для неповторяющегося случайного генерирования в диапазоне 5 Используйте этот перетасованный список для таргетинга, не проверяя, что вы уже взяли это sh ВЗ.

>>> s=list(range(5)) 
>>> s 
    [0, 1, 2, 3, 4] 
>>> random.shuffle(s) 
>>> s 
    [3, 4, 2, 1, 0] 
>>> s 
    [3, 4, 2, 1, 0] 
>>> random.shuffle(s) 
>>> s 
    [4, 0, 2, 1, 3] 
>>> random.shuffle(s) 
>>> s 
    [2, 1, 3, 0, 4] 
0

Я первый ответ на языке агностик образом.

Очень эффективным способом было бы сохранить последовательный список всех возможных позиций (в вашем случае 5x5 = 25 позиций), использовать один случайный выбор в этом списке, а затем удалить позицию из списка. Это избавит вас от , что делать, когда я ударил позицию я уже попал

реализация Python:

Сначала приготовьте список позиций:

positions = [ (i, j) for i in range(1,6) for j in range(1,6) ] 

Тогда получить случайное положение и удалить его из списка

index = random.randrange(len(positions)) 
shotX, shotY = positions[index] 
del positions[index] 

Edit:

Как доказать, что придется раскошелиться:

>>> import random 
>>> positions = [ (i, j) for i in range(1,6) for j in range(1,6)] 
>>> for i in range(25): 
    index = random.randrange(len(positions)) 
    print positions[index] 
    del positions[index] 


(5, 5) 
(5, 4) 
(1, 4) 
(1, 2) 
(3, 3) 
(1, 1) 
(4, 1) 
(4, 4) 
(5, 1) 
(4, 2) 
(2, 2) 
(2, 4) 
(2, 3) 
(2, 1) 
(3, 2) 
(3, 5) 
(1, 5) 
(5, 3) 
(5, 2) 
(4, 3) 
(4, 5) 
(1, 3) 
(3, 4) 
(2, 5) 
(3, 1) 
>>> print positions 
[] 
+0

Вы должны использовать 'randrange (len (position))', или вы никогда не выберете '(1,1)', и вы можете получить 'IndexError'. –

+0

@TimPietzcker: Спасибо, что исправили его. –

+0

Можно использовать 'pop', чтобы удалить элемент для добавленной привязанности. –