1.2. Mały Lotek

W Toto Lotku trzeba zgadywać liczby. Napiszmy prosty program, w którym będziemy mieli podobne zadanie. Użyjemy języka Python.

1.2.1. Szablon

Zaczynamy od utworzenia pliku o nazwie toto.py w dowolnym katalogu za pomocą dowolnego edytora. Zapis ~$ poniżej oznacza katalog domowy użytkownika. Obowiązkowa zawartość pliku:

Kod nr
1
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

Pierwsza linia to ścieżka do interpretera Pythona (zob. interpreter), druga linia deklaruje sposób kodowania znaków, dzięki czemu możemy używać polskich znaków.

1.2.2. Wartości i zmienne

Zaczniemy od wylosowania jednej liczby. Potrzebujemy funkcji randint(a, b) z modułu random. Zwróci nam ona liczbę całkowitą z zakresu <a; b>. Do naszego pliku dopisujemy:

Kod nr
4
5
6
7
import random

liczba = random.randint(1, 10)
print "Wylosowana liczba:", liczba

Wylosowana liczba zostanie zapamiętana w zmiennej liczba (zob. zmienna ). Instrukcja print wydrukuje ją razem z komunikatem na ekranie. Program możemy już uruchomić w terminalu (zob. terminal), wydając w katalogu z plikiem polecenie:

~$ python toto.py

Efekt działania naszego skryptu:

../../_images/toto02.png

Tip

Skrypty Pythona możemy też uruchamiać z poziomu edytora, o ile oferuje on taką możliwość.

1.2.3. Wejście – wyjście

Liczbę mamy, niech gracz, czyli użytkownik ją zgadnie. Pytanie tylko, na ile prób mu pozwolimy. Zacznijmy od jednej! Dopisujemy zatem:

Kod nr
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
print "Wylosowana liczba:", liczba

odp = raw_input("Jaką liczbę od 1 do 10 mam na myśli? ")

Liczbę podaną przez użytkownika pobieramy za pomocą instrukcji raw_input() i zapamiętujemy w zmiennej odp.

Attention

Zakładamy na razie, że gracz wprowadza poprawne dane, czyli liczby całkowite!

1.2.3.1. Ćwiczenie 1

  • Zgadywanie, gdy losowana liczba jest drukowana, nie jest zabawne. Zakomentuj więc instrukcję drukowania: # print "Wylosowana liczba:", liczba – będzie pomijana przez interpreter.
  • Dopisz odpowiednie polecenie, które wyświetli liczbę podaną przez gracza. Przetestuj jego działanie.
../../_images/toto03.png

1.2.4. Instrukcja warunkowa

Mamy wylosowaną liczbę i typ gracza, musimy sprawdzić, czy trafił. Uzupełniamy nasz program:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print "Wylosowana liczba:", liczba

odp = raw_input("Jaką liczbę od 1 do 10 mam na myśli? ")
# print "Podałeś liczbę: ", odp

if liczba == int(odp):
    print "Zgadłeś! Dostajesz długopis!"
else:
    print "Nie zgadłeś. Spróbuj jeszcze raz."

Używamy instrukcji warunkowej if, która sprawdza prawdziwość warunku liczba == int(odp) (zob. instrukcja warunkowa). Jeżeli wylosowana i podana liczba są sobie równe (==), wyświetlamy informację o wygranej, w przeciwnym razie (else:) zachętę do ponownej próby.

Note

Instrukcja raw_input() wszystkie pobrane dane zwraca jako napisy (typ string). Do przekształcenia napisu na liczbę całkowitą (typ integer) wykorzystujemy funkcję int(), która w przypadku niepowodzenia zgłasza wyjątek ValueError. Ich obsługę omówimy później.

Przetestuj kilkukrotnie działanie programu.

../../_images/toto04.png

1.2.5. Pętla for

Trafienie za pierwszym razem wylosowanej liczby jest bardzo trudne, damy graczowi 3 szanse. Zmieniamy i uzupełniamy kod:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print "Wylosowana liczba:", liczba

for i in range(3):
    odp = raw_input("Jaką liczbę od 1 do 10 mam na myśli? ")
    # print "Podałeś liczbę: ", odp

    if liczba == int(odp):
        print "Zgadłeś! Dostajesz długopis!"
        break
    else:
        print "Nie zgadłeś. Spróbuj jeszcze raz."
        print

Pobieranie i sprawdzanie kolejnych liczb wymaga powtórzeń, czyli pętli (zob. pętla). Blok powtarzających się operacji umieszczamy więc w instrukcji for. Ilość powtórzeń określa wyrażenie i in range(3). Zmienna iteracyjna i to “licznik” powtórzeń. Przyjmuje on kolejne wartości wygenerowane przez funkcję range(n). Funkcja ta tworzy listę liczb całkowitych od 0 do n-1.

A więc polecenia naszego skryptu, które umieściliśmy w pętli, wykonają się 3 razy, chyba że... użytkownik trafi za 1 lub 2 razem. Wtedy warunek w instrukcji if stanie się prawdziwy, wyświetli się informacja o nagrodzie, a polecenie break przerwie działanie pętli.

Attention

Uwaga na WCIĘCIA!

Podporządkowane bloki kodu wyodrębniamy za pomocą wcięć (zob. formatowanie kodu). Standardem są 4 spacje i ich wielokrotności. Przyjęty rozmiar wcięć obowiązuje w całym pliku. Błędy wcięć sygnalizowane są komunikatem IndentationError.

W naszym kodzie linie 10, 13, 16 wcięte są na 4 spacje, zaś 14-15, 17-18 na 8.

1.2.5.1. Ćwiczenia

Sprawdźmy działanie funkcji range() w trybie interaktywnym interpretera Pythona. W terminalu wpisz polecenia:

~$ python
>>> range(100)
>>> for i in range(0, 100, 2)
...   print i
...
>>> exit()

Funkcja range może przyjmować opcjonalne parametry określające początek, koniec oraz krok generowanej listy wartości.

Uzupełnij kod, tak aby program wyświetlał informację “Próba 1”, “Próba 2” itd. przed podaniem liczby.

1.2.6. Instrukcja if...elif

Po 3 błędnej próbie program ponownie wyświetla komunikat: “Nie zgadłeś...” Za pomocą członu elif możemy wychwycić ten moment i wyświetlić komunikat: “Miałem na myśli liczbę: liczba”. Kod przyjmie następującą postać:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print "Wylosowana liczba:", liczba

for i in range(3):
    print "Próba ", i + 1
    odp = raw_input("Jaką liczbę od 1 do 10 mam na myśli? ")
    # print "Podałeś liczbę: ", odp

    if liczba == int(odp):
        print "Zgadłeś! Dostajesz długopis!"
        break
    elif i == 2:
        print "Miałem na myśli liczbę: ", liczba
    else:
        print "Nie zgadłeś. Spróbuj jeszcze raz."
    print

Ostateczny wynik działania naszego programu prezentuje się tak:

../../_images/toto07.png

1.2.7. Materiały

Źródła:


Licencja Creative Commons Materiały Python 101 udostępniane przez Centrum Edukacji Obywatelskiej na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.

Utworzony:2017-09-08 o 19:38 w Sphinx 1.4.5
Autorzy:Patrz plik “Autorzy”