6 marca 2018

Aplikacja konsolowa python: Losowanie Lotto cz.3

Witam, dziś zakończymy nasz program Losowanie Lotto. Poprzednio zatrzymaliśmy się na przekazaniu ilości kuponów do tajemniczej metody draw w głównej klasie programu. Bez zbędnego przydługawego wstępu, od razu zapraszam do dalszej części wpisu abyśmy mogli szybko omówić wykonanie dalszej części programu.

Przekazanie parametru userCountDraw (ilość wysłanych kuponów) do metody draw zapisujemy w ten sposób:

program.draw(int(userCountDraw))

Jak widzimy powyżej, od razu typ ustalamy na int.

Aby na ekranie nie zobaczyć błędu, musimy metodę stworzyć wewnątrz klasy Lotto

def draw(self,x):
    for i in range(x):
        tempNumber = []

        oneNumber = input("Podaj pierwszą liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(oneNumber, tempNumber))

        twoNumber = input("Podaj drugą liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(twoNumber,tempNumber))

        threeNumber = input("Podaj trzecią liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(threeNumber, tempNumber))

        fourNumber = input("Podaj czwartą liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(fourNumber, tempNumber))

        fiveNumber = input("Podaj piątą liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(fiveNumber, tempNumber))

        sixNumber = input("Podaj szóstą liczbę (przedział od 1 do 49): ")
        tempNumber.append(self.checkNumber(sixNumber, tempNumber))

        tempNumber.sort()

        self.userNumber.append(tempNumber)

W metodzie draw wykorzystujemy pętlę for, z parametrem zgodnym z ilością kuponów. Jeśli metoda draw będzie wyglądała jak na powyższym przykładzie, każda błędnie podana liczba (powtórzona lub nie zgodna z oczekiwaniami, patrz przedział i typ int) spowoduje nie zapytanie o ponowne jej wpisanie, a wylosowanie przez automat ponownej. Należy to zmienić!

Zmodyfikujmy więc checkNumber, gdyż ta metoda jest wywoływana zarówno przy draw jak i przy randNumber

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

        try:
            int(number)
            brokeData = False
        except ValueError:
            brokeData = True

        if (brokeData == False) and (number not in list) and (int(number) > 0 and int(number) <50):
            returnData = int(number)
            break
        else:
            if created == 'user':
                number = input("Podaj prawidłową wartość, liczbę wcześniej nie użytą, z przedziału od 1 do 49: ")
            else:
                number = random.randint(1,49)

    return returnData

Dopisaliśmy kolejny parametr created, funkcja ta musi wiedzieć czy chcemy aby po błędnej liczbie wylosowała sama kolejną, czy użytkownik ma ją podać. W tej metodzie również sprawdzamy za pomocą try czy podana liczba jest na pewno liczbą, czy znajduje się w przedziale od 1 do 49.

Teraz nie zapomnijmy aby w draw podać przy każdym wywołaniu checkNumber ostatniego parametru jakim jest string ‚user’. Również w metodzie randNumber przy każdym wywołaniu draw podać parametr jakim jest string ‚auto’.

W głównej części programu dopisujemy na koniec:

print('Wydałeś łącznie '+str(int(userCountDraw)*3)+'zł')

if(program.checkReward(program.randNumber,program.userNumber)):
    print('Wygrałeś, liczby wylosowane przez system to: '+str(program.randNumber))
else:
    print('Nie wygrałeś, liczby wylosowane przez system to: '+str(program.randNumber))

input('Enter zakończy program...');

Całość jest dostępna pod poniższym linkiem:

https://github.com/govr/lotto