Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności:
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Zrozumienie silnika gry  (Przeczytany 157 razy)
« : 18:13 06/02/19 »
Ulther_Ego Offline
Hello World!

Zobacz profil WWW
*

Reputacja: 0
Płeć: Mężczyzna
Wiadomości: 7


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)
 
 
Zapisane
« Odpowiedz #1 : 18:21 06/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


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ć Uśmiech.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #2 : 18:30 06/02/19 »
Ulther_Ego Offline
Hello World!

Zobacz profil WWW
*

Reputacja: 0
Płeć: Mężczyzna
Wiadomości: 7


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.
Zapisane
« Odpowiedz #3 : 11:22 09/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


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?
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #4 : 15:42 09/02/19 »
Ulther_Ego Offline
Hello World!

Zobacz profil WWW
*

Reputacja: 0
Płeć: Mężczyzna
Wiadomości: 7


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.
 
Zapisane
« Odpowiedz #5 : 02:09 11/02/19 »
Guaz Offline
Professional Python User

Zobacz profil
***

Reputacja: 53
Płeć: Mężczyzna
Wiadomości: 412


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.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #6 : 12:05 11/02/19 »
Ulther_Ego Offline
Hello World!

Zobacz profil WWW
*

Reputacja: 0
Płeć: Mężczyzna
Wiadomości: 7


Dzięki za poprawienie oraz za pomoc Uśmiech
Potrzebowałem się trochę rozpisać i skonsultować by ułożyć swoją wiedzę.
Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot