2016-10-30 15 views
5

Chciałbym, aby moje kostki były ponumerowane , a nie, aby je powtórzyć, ponieważ gdy to zrobi, zarejestruje błędne dane wejściowe w moim programie (bez awarii, po prostu komunikat w postaci łańcucha znaków "Twoje dane wejściowe były błędne "). Jest to gra planszowa, więc nie chcę powtarzać tych samych wartości, na przykład 6,0, aby powtórzyć dwa razy lub nawet trzykrotnie. Czy istnieje sposób na zapisanie wartości kości lub czegokolwiek, co mogę zrobić, aby za każdym razem wybierał nowe losowe wartości?Powtórz wartości kostki NIE powtarzaj, jeśli instrukcja

dice = random.randint(0,3) 
ans = network.receive() 
    if dice == 0: 
     guess = str(random.randint(0,4))+','+str(random.randint(0,4)) 
    elif dice == 1: 
     guess = str(random.randint(0,4))+','+str(random.randint(4,9)) 
    elif dice == 2: 
     guess = str(random.randint(4,9))+','+str(random.randint(0,4)) 
    else: 
     guess = str(random.randint(4,9))+','+str(random.randint(4,9)) 

Pożądany wyjściowa:

6,0 
4,5 
8,1 
1,7 

z żadnych powtarza, takie jak:

6,0 
8,2 
6,0 #this is a repeat, I do not want this to happen 
3,9 
+0

Czy chcesz powiedzieć, że nie chcesz, aby kombinacja (6,0) się powtarzała? Czy nie chcesz, aby którykolwiek z tych rzutów kostką powtórzył się w ramach jednej kombinacji (czyli na przykład nie (6,6) lub (1,1))? – Ukimiku

+0

Nie chcę powtarzać kombinacji (6,0). –

+2

Dlaczego modelujesz kości, jeśli wartości nie mogą się powtarzać? Czy nie powinien to być rysunek karty czy coś takiego? – OrangeDog

Odpowiedz

3

Albo można po prostu zwinąć w kółko, aż nowa kombinacja wyłania. Oznacza to również, że musisz wykonać pewne księgowanie kombinacji już wylosowanych. Musisz upewnić się, że pozostała przynajmniej jedna możliwa kombinacja, w przeciwnym razie pętla się nie zakończy.

combis = [] 

dice = random.randint(0,3) 
ans = network.receive() 

while True: 
    if dice == 0: 
     guess = str(random.randint(0,4))+','+str(random.randint(0,4)) 
    elif dice == 1: 
     guess = str(random.randint(0,4))+','+str(random.randint(4,9)) 
    elif dice == 2: 
     guess = str(random.randint(4,9))+','+str(random.randint(0,4)) 
    else: 
     guess = str(random.randint(4,9))+','+str(random.randint(4,9)) 

    if not guess in combis: 
     combis.append(guess) 
     break 
+0

Wow! Właśnie tego szukałem i nie sądzę, bym odgadł, że odpowiedź jest tak prosta. Dziękuję bardzo!!! Testowałem to kilka razy i raz nie powtórzyłem kombinacji. Idealny! –

+0

Wydaje się niemożliwe rozwiązanie na chwilę haha! –

+0

Cieszę się, że działało :) – Ukimiku

4

Można używać słownika, który mapuje dice do argumentów random.randint połączeń:

>>> mapping = { 
...  0: [0, 4, 0, 4], # if dice == 1 
...  1: [0, 4, 4, 9], # elif dice == 2 
...  2: [4, 9, 0, 4], # elif dice == 3 
... } 
>>> mapping[0] 
[0, 4, 0, 4] 
>>> a, b, c, d = mapping[0] 
>>> a 
0 
>>> b 
4 
>>> c 
0 
>>> d 
4 

Dalej, przy użyciu collections.defaultdict, nie musisz szczególnie zajmować się skrzynką else.

from collections import defaultdict 

dice = random.randint(0, 3) 
ans = network.receive() 

dice_random_mapping = defaultdict(lambda: [4, 9, 4, 9], { # else 
    0: [0, 4, 0, 4], # if dice == 1 
    1: [0, 4, 4, 9], # elif dice == 2 
    2: [4, 9, 0, 4], # elif dice == 3 
}) 

if ans == None: 
    start1, stop1, start2, stop2 = dice_random_mapping[dice] 
    guess = str(random.randint(start1, stop1))+','+str(random.randint(start2, stop2)) 
+0

Dziękuję za poświęcony czas, aby napisać tę odpowiedź. Bardzo doceniane! Ale niestety nadal powtarzane wartości, takie jak powtórzone 4,4 w dwóch przypadkach, więc drugie 4,4 było błędne wejście. –

+0

Należy pamiętać, że jest to gra planszowa dla botów i botów, więc program działa, dopóki ktoś nie wygra. Dlatego mój bot może powtarzać wartości, na przykład w instancji 4,4. Chcę temu zapobiec. –

2

Ta funkcja może wykonywać wszystkie rzuty kośćmi. Jest lekko zoptymalizowany.

import random 

def roll_dice(low=1, high=6, count=1, allow_repeats=True): 
    if not allow_repeats and count > (high - low): 
     raise ValueError('Impossible not to have repeats with so many dice.') 
    if not allow_repeats: 
     possible_rolls = range(low, high) + [high] 
     return random.sample(possible_rolls, count) 
    return [random.randint(low, high) for _ in range(count)] 

próbki:

>>> roll_dice() 
[1] 
>>> roll_dice(count=2) 
[5, 3] 
>>> roll_dice(3, 10, count=2) 
[8, 3] 
>>> roll_dice(count=5, allow_repeats=False) 
[6, 3, 2, 1, 4] 
>>> roll_dice(count=5, allow_repeats=True) 
[6, 6, 1, 5, 3] 
Powiązane problemy