Listy, słowniki – gramy w szubienicę

Listy, słowniki – Gramy w szubienicę

Do przygotowania przed zajęciami

* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 4. Wprowadzenie. Koniec gry.

Cel i tematyka zajęć

Drugie laboratorium ma na celu utrwalenie wiadomości z trzeciego laboratorium oraz wprowadzenie następujących elementów:
* listy,
* słowniki,

– Zadanie przypominające

* Napisz program obliczający silnię z wykorzystaniem pętli for,
* Napisz program wczytujący z klawiatury liczbę całkowitą. Program powinien przyjmować jedynie liczbę dodatnią. Jeśli użytkownik poda liczbę ujemną, to powinien zostać poinformowany, że wymagana jest liczba dodatnia i poproszony o kolejną liczbę. Próbę wczytywania liczby powtarzamy dopóty, dopóki użytkownik nie poda liczby poprawnej (dodatniej). Taki sposób zapewnienia poprawności wczytywanych danych nazywać będziemy pętlą zaporową.

Listy

Listy od krotek różnią się tym, że są mutowalne.

* deklaracja listy

list1 = []


list2 = ["element 1", "element 2", "element 3"]

* do list możemy dodawać elementy w następujący sposób

score = int(input("Jaki wynik uzyskałeś?: "))
scores.append(score)

* usuwanie elementów z listy po ich wartości przebiega w następujący sposób:


scores.remove(score)

* sortowanie elementów w liście:

scores.sort()

* konkatenacja list

inventory = ["miecz", "zbroja", "tarcza", "napój uzdrawiający"]
chest = ["złoto", "klejnoty"]
print("Znajdujesz skrzynię, która zawiera:")
print(chest)
print("Dodajesz zawartość skrzyni do swojego inwentarza.")
inventory += chest
print("Twój aktualny inwentarz to:")
print(inventory)

– Lista jako stos i kolejka

Listy możemy używać również jako stosu lub kolejki.

Użycie listy jako stosu:


stack = [3, 4, 5]
stack.append(6)
stack.append(7)
print(stack)
stack.pop()
print(stack)
stack.pop()
stack.pop()
print(stack)

Użycie listy jako kolejki:


queue = ["Eric", "John", "Michael"]
queue.append("Terry") # przybywa Terry
queue.append("Graham") # przybywa Graham
queue.pop(0)
print(queue)
queue.pop(0)
print(queue)

– Listy – Gramy w szubienicę

Popularną grę o nazwie Szubienica można przedstawić jako świetny przykład wykorzystania list oraz działania z nimi.


# Szubienica
#
# Klasyczna gra w szubienicę. Komputer losowo wybiera słowo,
# a gracz próbuje odgadnąć jego poszczególne litery. Jeśli gracz
# nie odgadnie w porę całego słowa, mały ludzik zostaje powieszony.

# import modułów
import random

# stałe
HANGMAN = (
"""
------
| |
|
|
|
|
|
|
|
----------
""",
"""
------
| |
| O
|
|
|
|
|
|
----------
""",
"""
------
| |
| O
| -+-
|
|
|
|
|
----------
""",
"""
------
| |
| O
| /-+-
|
|
|
|
|
----------
""",
"""
------
| |
| O
| /-+-/
|
|
|
|
|
----------
""",
"""
------
| |
| O
| /-+-/
| |
|
|
|
|
----------
""",
"""
------
| |
| O
| /-+-/
| |
| |
| |
| |
|
----------
""",
"""
------
| |
| O
| /-+-/
| |
| |
| | |
| | |
|
----------
""")

MAX_WRONG = len(HANGMAN) - 1
WORDS = ("NADUŻYWANY", "MAŁŻ", "GUAM", "TAFTA", "PYTHON")

# inicjalizacja zmiennych
word = random.choice(WORDS) # słowo do odgadnięcia
so_far = "-" * len(word) # kreska zastępuje nieodgadniętą literę
wrong = 0 # liczba nietrafionych liter
used = [] # litery już użyte w zgadywaniu

print("Witaj w grze 'Szubienica'. Powodzenia!")

while wrong < MAX_WRONG and so_far != word:
print(HANGMAN[wrong])
print("\nWykorzystałeś już następujące litery:\n", used)
print("\nNa razie zagadkowe słowo wygląda tak:\n", so_far)

guess = input("\n\nWprowadź literę: ")
guess = guess.upper()

while guess in used:
print("Już wykorzystałeś literę", guess)
guess = input("Wprowadź literę: ")
guess = guess.upper()

used.append(guess)

if guess in word:
print("\nTak!", guess, "znajduje się w zagadkowym słowie!")

# utwórz nową wersję zmiennej so_far, aby zawierała odgadniętą literę
new = ""
for i in range(len(word)):
if guess == word[i]:
new += guess
else:
new += so_far[i]
so_far = new

else:
print("\nNiestety,", guess, "nie występuje w zagadkowym słowie.")
wrong += 1

if wrong == MAX_WRONG:
print(HANGMAN[wrong])
print("\nZostałeś powieszony!")
else:
print("\nOdgadłeś!")

print("\nZagadkowe słowo to", word)

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

– Sekwencje zagnieżdżone

Podczas tworzenia oprogramowania niejednokrotnie będą potrzebowali Państwo zastosować sekwencje zagnieżdżone, proszę jednak pamiętać, że dobrą praktyką jest stosowanie nie więcej niż trzech poziomów zagnieżdżenia.

Przykłady sekwencji zagnieżdżonych:

scores = [(name0, score0), (name1, score1), (name2, score2)]

np.

scores = [("Alfred", 10), ("Janek", 5), ("Krystian", 15)]

Sekwencje zagnieżdżone możemy rozpakowywać jeżeli wiemy ile elementów zawiera sekwencja:


name, score = scores[1]

Dostęp do poszczególnych elementów sekwencji zagnieżdżonych


a_score = scores[2]

Słowniki

– Słownik gracza

Słowniki składają się z par klucz:wartość. Mogą być użyte do przechowywania np. słownika w postaci termin — definicja.
Tworzymy go w sposób następujący:


geek = {"404": "ignorant; od używanego w sieci WWW komunikatu o błędzie 404\n - nie znaleziono strony.",
"Googling": "googlowanie; wyszukiwanie w internecie informacji dotyczących jakiejś osoby.",
"Keyboard Plaque" : "(skojarzone z kamieniem nazębnym)zanieczyszczenia nagromadzone w klawiaturze komputera.",
"Link Rot" : "(obumieranie linków) proces, w wyniku którego linki do stron WWW stają się nieaktualne.",
"Percussive Maintenance" : "(konserwacja perkusyjna)naprawa urządzenia elektronicznego przez stuknięcie.",
"Uninstalled" : "(odinstalowany) zwolniony z pracy; termin szczególnie popularny w okresie bańki internetowej."}

Informację w słowniku wyszukujemy po terminie:


definition = geek[term]

W słownikach możemy modyfikować definicje użytych już terminów –
aby użytkownik nie dokonał przypadkowej modyfikacji należy sprawdzać czy termin jest wpisany w słowniku.
Modyfikacja i dodawanie terminów w słowniku odbywa się w ten sam sposób:


geek[term] = definition

– Przykład z konwersją daty


# Konwersja daty

date = input("Podaj datę w formacie DD.MM.RRRR a zostanie ona przetłumaczona na DD month RRRR: ")

months = {"01" : "January",
"02" : "February",
"03" : "March",
"04" : "April",
"05" : "May",
"06" : "June",
"07" : "July",
"08" : "August",
"09" : "September",
"10" : "October",
"11" : "November",
"12" : "December" }

day, month, year = date.split(".")

if month in months:
monthstr = months[month]
else:
print("Podałeś niewłaściwą datę.")

print("Twoja data po zmianie to:", day, monthstr, year, sep=" ")

– Zadania do samodzielnego wykonania na laboratorium

* Pobierz wyniki od użytkownika do listy, a następnie wyświetl je od najmniejszego do największego. Przeczytaj za co odpowiada parametr **reverse** funkcji sort() dla list. Sprawdź jego działanie dla podanej listy.
* Napisz program wyświetlający punktację w sposób zaprezentowany poniżej oraz umożliwiający dodawanie i usuwanie wyników użytkowników z listy.

Nick Wynik
gracz1 5
gracz2 10

* Napisz program, który będzie spełniał funkcję pomocy dla gracza (pewnego rodzaju manual) w tym celu wykorzystaj słowniki, a do prezentacji wszystkich terminów wykorzystaj metodę keys(). Dodaj możliwość wyszukania/przeglądania odpowiedniego terminu w słowniku. **Zadanie proszę zarchiwizować przydatne będzie podczas wykonywania projektu**

– Przykłady używane na laboratoriach

Przykłady pochodzą z książki
* Podstawową książką wykorzystywaną na laboratorium będzie: „Python dla każdego. Podstawy programowania Wydanie III”, autor Michael Dawson, Wydawnictwo Helion **(R)**

Zadanie domowe

**Wszystkie zadania domowe należy archiwizować ponieważ w dalszej części laboratoriów będziecie je Państwo rozbudowywać**
* Zobacz: https://www.youtube.com/watch?v=AEnCpGdhsaY
* Utwórz program wypisujący listę słów w przypadkowej kolejności, a każde słowo występuje na niej tylko raz.
* Napisz program: Kreator postaci, którego zadaniem jest umożliwienie użytkownikowi rozdzielenia punktów podanych przez program (wylosowanych z zakresu od 40-90) na 6 cech: siła, budowa, zręczność, roztropność, inteligencja, charyzma. Sposób podziału pozostawiamy graczowi jednak żadna z cech nie może mieć wartości mniejszej niż 5 i nie może mieć wartości większej niż 20.
* Rozbuduj program z konwersją daty, tak aby sprawdzić, czy dzień jest z odpowiedniego zakresu, a także dokonaj sprawdzenia, czy podany rok składa się z 4 cyfr.
* Rozbuduj program “Gra w skojarzenia”, tak aby odpowiednio odmieniane było słowo punkty (1 punkt, 2-4 punkty, 5 punktów, itd.).
* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 5.