Polish Python Coders Group Forum

Wszystko o języku Python => Python od podstaw => Wątek zaczęty przez: Ulther_Ego 18:13 06/02/19



Tytuł: Zrozumienie silnika gry
Wiadomość wysłana przez: Ulther_Ego 18:13 06/02/19
Witam jestem nowy i początkujący w pythonie (saaame podstawy), więc z góry chciałbym uprzedzić że mogę być zielony.
Chciałbym prosić kogoś o dokładne wytłumaczenie poniższego skryptu. Wiem że klasa Engine uruchamia (play.Engine()) scenę, pobiera scenę (next_scene.Map()) ze słownika scenes , oraz otwiera.
Wiem to ponieważ prześledziłem każdą instancję, zmienną i funkcję.
Potrzebuję to zrozumieć dokładniej, gdyż chcę napisać własny silnik, ale nie wiem jak do tego się zabrać.

Kod
 
class Engine(object):
 
   def __init__(self, scene_map):
       self.scene_map = scene_map
 
   def play(self):
       current_scene = self.scene_map.opening_scene()
       last_scene = self.scene_map.next_scene('finished')
 
       while current_scene != last_scene:
           next_scene_name = current_scene.enter()
           current_scene = self.scene_map.next_scene(next_scene_name)
           # wydrukowanie ostatniej sceny
           #current_scene.enter()
 
class Map(object):
 
   scenes = {
           'firs_scene': FirstScene(),
           'secound_scene': SecoundScene(),
           'finished': Finished()
}
 
   def __init__(self, start_scene):
       self.start_scene = start_scene
 
   def next_scene(self, scene_name):
       val = Map.scenes.get(scene_name)
       return val
 
   def opening_scene(self):
       return self.next_scene(self.start_scene)
 
 


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Guaz 18:21 06/02/19
play.Engine()?

Czym w takim wypadku jest play. W dodatku nie ma to prawa zadziałać bo Engine nie dostaje obiektu który jest wymagany. (Patrząc po play, wnioskuję że tym argumentem musi być obiekt Map.)

Przykład jakby w teorii mogło to działać:
Kod
start = None #Brakujący klocek startowej sceny dla obiektu Map. Przed hashtagiem wklej właściwe zamiast None.
scene_manager = Map(start)
engine = Engine(scene_manager)
engine.play()
 

Trochę za mało danych tutaj podałeś aby to dokładnie wytłumaczyć :).


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Ulther_Ego 18:30 06/02/19
Fakt nie umieściłem w jaki sposób wywołuję klasę i uruchamiam pierwszą scenę:
Kod
a_map = Map("first_scene")
a_game = Engine(a_map)
a_game.play()
 

Nie podaję Klasy FirsSscene() ponieważ jest ona zrozumiała, określa to jak wygląda "pomieszczenie" tzn. posiada funkcję enter, która przejmuje parametr self.


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Guaz 11:22 09/02/19
Okej, to teraz ten wątek:
https://pl.python.org/forum/index.php?topic=931.0

Powinien ci pokrótce wytłumaczyć wszystko co dzieje się w twoim kodzie związanego z OOP (Object Oriented Programing). Bo metody typu .get dla słownika rozumiem że używasz świadomie, czy jest to skądś wzięte?


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Ulther_Ego 15:42 09/02/19
Kod jest z książki "python 3. proste wprowadzenie do fascynującego świata programowania".
Co do tworzenia klasy, parametrów, instancjonowanie klasy, oraz wywoływanie funkcji mniej więcej wiem.
Atrybuty słowników znam.
Bardziej chodzi mi o wytłumaczenie tego co autor miał na myśli, przy tworzeniu własnego silnika nie chcę robić kopiuj wklej (bo to nie nauka), albo chociaż naprowadzić mnie na trop.
Póki co z powyższego kodu wiem że:
1. Klasa Engine ma __init__(self, scene_map) oraz funkcję play, która przejmuje parametr self.
2. Klasa Map ma __init__(self, start_scene). funkcję next_scene z parametrem self, scene_name oraz funkcję opening_scene z parametrem self.

Teraz od góry w klasie Engine dla funkcji play:
Weź scene_map dla opening_map i ustaw go na current_scene
Weź scene_map dla next_scene z parametrem 'finished' i ustaw go na last_scene

While się nie zajmuję bo go rozumiem.

Dla Map:
Tworzymy słownik scenes
W metodzie __init__ ustawiamy instancję zmiennej stert_scene

Funkcja next_scene:
do val przypisujemy pobranie scenes z klasy Map dla scene_name

Jeśli źle coś zrozumiałem, to proszę o poprawienie.
 


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Guaz 02:09 11/02/19
Jedyny błąd jaki tutaj popełniasz. To self nie jest tym samym co np. `scene_name`.
Ponieważ argumenty podajesz wywołując funkcję.
Parametry są opcjonalne (np. w **kwargs).
self jest defakto reprezentacją siebie samego. Czyli że masz dostęp do obiektów (atrybutów i metod) klasy wewnątrz tych metod które posiadają parametr self.

dygresja:
Używając @classmethod (dekorator). Nadal będziesz miał dostęp do metod, oraz atrybutów statycznych (ale nie wszystkich wewnątrz klasy, tylko tych współdzielonych dla wszystkich obiektów dziedziczących po tej, oraz będących obiektem o tym samym pochodzeniu)

No i w reszcie nie widzę za specjalnych błędów myślowych, chyba że rozczytuje jakiś skrót inaczej niż ty. Ale mnie osobiście nic w oczy nie zakuło poza `self`, które nie != innemu argumentowi w metodzie.


Tytuł: Odp: Zrozumienie silnika gry
Wiadomość wysłana przez: Ulther_Ego 12:05 11/02/19
Dzięki za poprawienie oraz za pomoc :)
Potrzebowałem się trochę rozpisać i skonsultować by ułożyć swoją wiedzę.