5 marca 2018

Aplikacja konsolowa python: Losowanie Lotto cz.2

Hej, w tym wpisie omówię między innymi, jak wykonać metodę która sprawdzi czy wylosowany numer przez nasz program jest poprawny, oracz czy nie został już wcześniej użyty w tej samej liście. Oczywiście zgodnie z zasadami programowania obiektowego, nie będziemy powielać naszej metody i wykorzystamy ją również dla numerów wpisanych przez użytkownika. Zaczynamy

W poprzednim wpisie dodaliśmy metodę randNumber, w niej do listy przy pomocy append dopisywaliśmy kolejne liczby, bez żadnej walidacji! Jak można się domyśleć, to nie jest dobry sposób. W losowaniu lotto nie może trafić nam się dla przykładu 2x liczba 14.

Dopiszmy więc kolejną metodę i nazwijmy ją checkNumber, potrzebujemy przekazać jej parametr number oraz list.
Parametr number to numer który został wylosowany, sprawdzimy czy nie został już wcześniej użyty, ale w jakim zbiorze ? A no właśnie w liście która zostanie przekazana jako drugi parametr list.

def checkNumber(self, number, list, created, returnData=None):
    while True:
        brokeData = True

        if number not in list:
            returnData = int(number)
            break
        else:
            number = random.randint(1,49)

    return returnData

W kodzie powyżej mamy jeszcze trzeci parametr returnData który z automatu ma przypisaną wartość None. Wpisałem go dla tego, gdyż zostanie on wykorzystany poniżej w metodzie.

Jeśli automat wylosował złą liczbę, musi powtórzyć jej losowanie, dla tego całość została zamknięta w pętli while. Sprawdzamy czy liczba nie znajduje się już w zbiorze list, jeśli nie, zapisujemy liczbę w returnData i przerywamy działanie pętli. Jeśli liczba wylosowana przez program znajduje się już w zbiorze list, losujemy ponownie kolejną, wtedy pętla zaczyna działać na nowo.

Gdzie wywołać metodę ?

Wystarczy spojrzeć na poniższy kod:

def randNumber(self):
    tempNumber = []

    oneNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(oneNumber, tempNumber))

    twoNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(twoNumber, tempNumber))

    threeNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(threeNumber, tempNumber))

    fourNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(fourNumber, tempNumber))

    fiveNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(fiveNumber, tempNumber))

    sixNumber = random.randint(1, 49)
    tempNumber.append(self.checkNumber(sixNumber, tempNumber))

    tempNumber.sort()
    self.randNumber = tempNumber

Tak teraz będziemy losować numery lotto.

Wróćmy w tym momencie do głównej części naszego programu.

Dopiszmy w dalszych liniach kodu pętle While i zapytajmy się w niej o ilość kuponów jakąś użytkownik chce posłać w losowaniu lotto. Dodatkowo sprawdźmy za pomocą try czy podana wartość przez użytkownika jest typu int, w przeciwnym wypadku, zapytamy ponownie, tak długo, aż użytkownik poda int

userCountDraw = ''

while True:
    try:
        int(userCountDraw)
        break
    except ValueError:
        userCountDraw = input("Podaj ilość kuponów jaką chcesz wysłać w lotto: ")

Za pierwszym razem userCountDraw nie będzie typu int, więc automatycznie przejdziemy do except. Tam zapytamy o podanie ilości kuponów, po wprowadzeniu wartości przez użytkownika, pętla wykona się ponownie. Przerywamy ją tylko w sytuacji gdy wartość będzie typu int.

Przekazujemy wartość userCountDraw do nowej metody draw wewnątrz głównej klasy naszego programu. Ale o tym będzie następny wpis.