Programowanie obiektowe cz 3

Programowanie obiektowe cz 3

Do przygotowania przed zajęciami

* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 9. Programowanie obiektowe. Gra Blackjack.

Cel i tematyka zajęć

Dzisiejsze laboratorium ma na celu zapoznanie Państwa z następującymi zagadnieniami:
* tworzenie obiektów różnych klas w jednym programie,
* umożliwienia obiektom wzajemnego komunikowania się,
* tworzenie złożonychobiektów jako kombinacji prostszych.

– Zadanie przypominające

* Utwórz program w którym skonkretyzowane jest kilka obiektów klasy Critter, i każdy z tych obiektów ma losowo przypisany poziom głodu i nudy, wyświetl te parametry.

Komunikaty

Obiekty komunikują się poprzez wysyłanie i odbieranie komunikatów.

Wysyłanie komunikatów

Poniższy program konkretyzuje dwa obiekty różnych klas. Pierwszy z nich to obiekt klasy Character przypisany do zmiennej //hero//, zaś drugi to obiekt klasy Creatures przypisany do zmiennej //monster//. Podczas wywołania metody blast klasy Character podajemy jako argument nazwę zmiennej do której przypisaliśmy skonkretyzowany obiekt przeciwnika – w naszym przypadku to //monster//, a następnie wywołujemy metodę die obiektu monster, która realizuje “śmierć przeciwnika”.

# Program demonstrujący współdziałanie obiektów

class Character(object):
""" Postać gracza. """
def blast(self, enemy):
print("Twoje strzały dosięgają Twojego przeciwnika.\n")
enemy.die()

class Creatures(object):
""" Obcy w grze strzelance. """
def die(self):
print("Strzały przeciwnika mnie dosięgły - to już mój koniec.")

# main
print("\t\tWalka\n")

hero = Character()
monster = Creatures()
hero.blast(monster)

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

Odbieranie komunikatów

Odbieranie komunikatów to nic innego jak wykonanie metody obiektu (w powyższym przykładzie jest to obiekt //monster// klasy Creatures), nazwa obiektu jest przekazywana do metody wysyłającej komunikat.

Tworzenie obiektów

W pierwszym laboratorium dotyczącym programowania obiektowego poznaliście Państwo tworzenie obiektów. Obiekty te były proste np. dom, możemy jednak sobie wyobrazić, że ten sam dom jest obiektem składającym się z innych obiektów takich jak – pustaki, okna, drzwi, dach, pokoje itp. Poniżej zobaczycie Państwo przykład obiektu złożonego:

#program prezentujący tworzenie obiektów złożonych na przykładzie kart

class Card(object):
""" Karta do gry. """
RANKS = ["A", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "J", "Q", "K"]
SUITS = ["dzwonek", "rzołądź", "wino", "serce"]

def __init__(self, rank, suit, face_up = True):
self.rank = rank
self.suit = suit
self.is_face_up = face_up

def __str__(self):
if self.is_face_up:
rep = self.rank + self.suit
else:
rep = "XX"
return rep

def flip(self):
self.is_face_up = not self.is_face_up

class Hand(object):
""" Ręka - wszystkie karty trzymane przez gracza. """
def __init__(self):
self.cards = []

def __str__(self):
if self.cards:
rep = ""
for card in self.cards:
rep += str(card) + "\t"
else:
rep = ""
return rep

def clear(self):
self.cards = []

def add(self, card):
self.cards.append(card)

def give(self, card, other_hand):
self.cards.remove(card)
other_hand.add(card)

class Deck(Hand):
""" Talia kart. """
def populate(self):
for suit in Card.SUITS:
for rank in Card.RANKS:
self.add(Card(rank, suit))

def shuffle(self):
import random
random.shuffle(self.cards)

def deal(self, hands, per_hand = 1):
for rounds in range(per_hand):
for hand in hands:
if self.cards:
top_card = self.cards[0]
self.give(top_card, hand)
else:
print("Nie mogę dalej rozdawać. Zabrakło kart!")

if __name__ == "__main__":
print("To moduł zawierający klasy do gry w karty.")
input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Zadania do samodzielnego wykonania na laboratoriach

* Napisz dwie klasy – klasę bohatera i klasę przeciwnika. W obu klasach stwórz metodę walcz i obrona. Metoda obrona ma być wywoływana przez metodę walcz przeciwnika z argumentem równym obrażeniom. Obrażenia przekazywane do metody obrona składają się z dwóch elementów – pierwszy to stała liczba np. 5 zaś drugi to liczba losowana z zakresu od 1 do 20.

– 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ć**
* W czasie dzisiejszych laboratoriów stworzyliście Państwo prosty system walki. Proszę rozbudować go o możliwość wyboru przez użytkownika walki lub ucieczki.
* Powyższy program proszę rozbudować o metodę heal umożliwiającą leczenie gracza. Wartość o jaką zostanie podniesiona ilość punktów ma zostać wylosowana z zakresu 1-8. Po leczeniu gracz nie może mieć więcej punktów życia niż maksymalna liczba punktów życia postaci.