Skip to content

Alternativní závěrečný projekt - Had#12

Merged
encukou merged 2 commits intoPyLadiesCZ:autumn2018from
frenzymadness:project_snake
Nov 14, 2018
Merged

Alternativní závěrečný projekt - Had#12
encukou merged 2 commits intoPyLadiesCZ:autumn2018from
frenzymadness:project_snake

Conversation

@frenzymadness
Copy link
Copy Markdown

Pracuji na alternativní závěrečném projektu pro začátečnický kurz. Stavím přitom na hadím workshopu. Sem to dávám, kdyby se na to chtěl někdo mrknout ještě v průběhu příprav a pomoci mi odhalit chyby.

Hlavní vlastnosti:

  • Mělo by to být ještě více formou zadání a méně formou výukových materiálů než jsou Asteroidy.
  • Je to snazší a tak se jim snažím co nejméně radit konkrétní kód.
  • Hada napsaly v rámci domácích projektů a grafiku už taky znají, takže zbývá to jen spojit dohromady.
  • Chci jim nechat hodně volnou ruku při výběru způsobu implementace.
    • Špatné volby se jim v průběhu nebo až ke konci vymstí a poučí se z toho.
    • Zbytečně komplexní způsob může pomoci, ale taky jen přidat starosti.

Možná to zní „tvrdě“, ale chci aby si z toho něco odnesly i ty, které se cíleně rozhodnou pro snazší projekt. Tady se nenaučí tolik nového jako v Asterodiech, ale zase je to tak rychle neodradí, protože celkem snadno dojdou k funkční variantě a snad je to motivuje pokračovat v rozšířeních a popustit uzdu fantazii.

Názory?

Češtinu opravím pak najednou všude, takže prosím na ni v tuto chvíli nehledět.

Comment thread lessons/projects/snake/index.md Outdated
Na lekci jsme načtený obrázek ukládali do tzv. Spritů, abychom jimi
pak mohli pohybovat a dosáhli plynulého pohybu. Tady bude situace jednodušší,
protože se obejdeme bez plunylého pohybu a tak nám stačí obrázek několikrát
vykreslit na vyprázdněnou plochu.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Důvod pro Sprite proti blit je spíš že se dá otáčet (a pak obarvovat atd.)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Má poznámka o plynulém pohybu vycházela z toho, že Sprite se dá vložit do batch a tím vykreslovat rychleji a v dynamických hrách s plynulým pohybem mnoha objektů tak zajistit dostatečnou rychlost a plynulost. Mělo to fungovat jako takový odkaz na Asteroidy, kde se tohle řeší. Něco jako: „V Asteroidech kolegyně vedle tebe řeší plynulý pohyb, ale ty se bez toho obejdeš“ pro ty méně zdatné a bojácné a „V Asteroidech na tebe čeká nová výzva s podobě plynulého pohybu mnoha objektů najednou“ pro ty odvážné.

Má smysl tu moji myšlenku rozvinout a v tomhle duchu to upravit, nebo to naopak zjednodušit a jako důvod nevyužití Sprite dát že je nepotřebujeme otáčet?

Copy link
Copy Markdown
Member

@encukou encukou Oct 26, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Myslím že má cenu používat Sprite.

Jo, ještě jedna věc: Sprite řeší průhlednost. Když používáš jen blit, je potřeba docela neintuitivním „zaříkadlem“ zapnout alpha blending:

    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)

Na workshopu to je pro ušetření času.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jaký zvolit kompromis mezi optimalizací a složitostí implementace?

  • Jednoduše vytvořit Sprite, vykreslit, zahodit
  • Udržovat si seznamy Sprite (pro každý kousek hada jeden, pro každé ovoce jeden), měnit jejich souřadnice a při použití obrázků i obsah a po jednom je vykreslovat
  • Udržovat si jejich seznam jako v předchozím bodě a navíc mít všechny v batch a vykreslovat je tedy najednou

První varianta sice není optimální, ale zase je to jednoduché.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ostatní můžeš nechat na rozšíření :)

@messa
Copy link
Copy Markdown
Member

messa commented Oct 25, 2018

Jen taková myšlenka: zásadní rozdíl mezi CLI a GUI aplikací je, že v CLI spustíš input() a vrátí se ti zadaný vstup, ale u GUI musíš udělat callback pro onkeypress a vůbec programovat eventově. Pokud někdo naprogramoval hada v CLI, tak nemusí tušit, jak to vůbec začít převádět do GUI. Už jsem viděl slátaniny, kde první půlka programu jsou input() a druhá půlka GUI a dotyčný tápal, jak to propojit. Takže tomuhle doporučuju se víc věnovat v tom textu :) Ale zase nevím, co této lekci předchází, třeba je to pokryté už tam.

@encukou
Copy link
Copy Markdown
Member

encukou commented Oct 25, 2018

Předchází tomu Grafika, kde je to vysvětlené.

Případně se dá použít kratší vysvětlení z workshopu.

@frenzymadness
Copy link
Copy Markdown
Author

Jen taková myšlenka: zásadní rozdíl mezi CLI a GUI aplikací je, že v CLI spustíš input() a vrátí se ti zadaný vstup, ale u GUI musíš udělat callback pro onkeypress a vůbec programovat eventově. Pokud někdo naprogramoval hada v CLI, tak nemusí tušit, jak to vůbec začít převádět do GUI. Už jsem viděl slátaniny, kde první půlka programu jsou input() a druhá půlka GUI a dotyčný tápal, jak to propojit. Takže tomuhle doporučuju se víc věnovat v tom textu :) Ale zase nevím, co této lekci předchází, třeba je to pokryté už tam.

Je to jak píše Petr. Předchází tomu lekce o grafice, kde se o těchto speciálních funkcích dozví vše potřebné. Abychom se tady vyhnuli slepencům, je tam na začátku poznámka, že mají začít s novým souborem a do hotových programů se dívat jen pro radu a připomenutí a nestavět to přímo na nich.

@messa
Copy link
Copy Markdown
Member

messa commented Oct 26, 2018

Uvidíme, zda předpoklady budou splněny i v praxi :) Zase je hezký, že tu úlohu (hada) už znají, takže uvidí více způsobů řešení jedné věci, než furt něco úplně nového.

@frenzymadness
Copy link
Copy Markdown
Author

Dopsáno, doplněno, upraveno, připraveno na review.

@Glutexo slíbil review a korekturu i s vlastním testem implementace, ale jakýkoli postřeh je vítán.

if new_x >= self.width:
self.snake_alive = False
if new_y >= self.height:
self.snake_alive = False
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Možná jestli by nebylo jednodušší a i zajímavější, kdyby hrací plocha byla cyklická? Tj. vylezu vpravo, přilezu zleva :)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logika je pak jednodušší, ale o hodně to zesložití vybírání správných obrázků pro části hada.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@messa Je to jedna z možností rozšíření. Postupujeme tak, jak se vyvíjel had na Nokiích a vycházíme z hada z domácích projektů, kde také byla plocha ohraničená.

@Glutexo
Copy link
Copy Markdown

Glutexo commented Oct 30, 2018

Pořád si říkám, jestli by první krok nemohl být také s pohybem po stisku klávesy. Bylo by to mozkově bližší konzolovému hadu. Tikaní by se mohlo přidat až jako další krok, čímž by se z grafické podoby konzolového hada stal nokiácký první had.

@frenzymadness
Copy link
Copy Markdown
Author

Pořád si říkám, jestli by první krok nemohl být také s pohybem po stisku klávesy. Bylo by to mozkově bližší konzolovému hadu. Tikaní by se mohlo přidat až jako další krok, čímž by se z grafické podoby konzolového hada stal nokiácký první had.

Přemýšlím nad tím.

  • Podle aktuálního popisu:
    • nejdříve udělají funkci pro pohyb a naplánují její pravidelné volání
    • a pak přidají funkci reagující na stisk klávesy, která mění směr.
  • Mohlo by to ale být i tak, že
    • Napíšou funkci pro pohyb, která bude volána stiskem klávesy
    • a pak ji rozdělí do dvou - jedna bude po stisku klávesy ovlivňovat směr a druhá bude automaticky hýbat hadem

Dokážu si představit oboje, ale mám obavu z jedné věci. Když budou volat v prvním kroku funkci po pohyb hned po té, co nějak nastaví směr v závislosti na stisknuté klávese, mohlo by pro ně pak být komplikované přenést směr pohybu do nějakého globální proměnné či třídy tak, aby směr byl nastaven vždy a stisk klávesy jej jen změnil. Přeci jen při přesunu volání funkce pro pohyb z události pro stisk klávesy do události pro tik dojde ke změně kontextu a proměnná obsahující stisknutou klávesu bude najednou nedosažitelná.

Můj popis mi příjde více jako programování a doplňování funkcionality v logickém sledu, zatímco u tebe to vnímám spíše jako refaktoring po té, co zjistím, že to potřebuji udělat jinak, aby se had hýbal automaticky.

Netvrdím, že je to problém, ale napadlo mě to. Co na to @encukou ?

@frenzymadness
Copy link
Copy Markdown
Author

Povídali jsme si o tom s @mcurlej. Prosím o komentář.

@Glutexo
Copy link
Copy Markdown

Glutexo commented Nov 1, 2018

S tím sledem ti musím dát za pravdu. Jsem ale na vážkách, je-li to dobře. Ono to pak vypadá jak recept z kuchařky. Přitom úprava s důsledky přesahujícími do jiných částí kódu je docela cenná zkušenost. A co na to ten @encukou? 😄

@frenzymadness
Copy link
Copy Markdown
Author

Já nejsem proti, aby základní hra byla jako podle kuchařky, protože zásahy do kódu napříč funkcemi budou muset dělat při implementaci každého rozšíření.

Na základní hře bych jim rád ukázal, že když si to dobře rozmyslí, mohou implementovat krok za krokem.

Mimochodem ani to samozřejmě neznamená, že nebudou kusy kódu měnit v průběhu, protože i přes podobu kuchařky tam mají spoustu možností volby a ne všechny se musí povést na první pokus.

@Glutexo
Copy link
Copy Markdown

Glutexo commented Nov 1, 2018

Pak ale není problém nasměrovat to ukládání směru nějakým doporučením tak, aby to pak nebylo potřeba měnit.

@encukou
Copy link
Copy Markdown
Member

encukou commented Nov 1, 2018

Můj popis mi příjde více jako programování a doplňování funkcionality v logickém sledu, zatímco u tebe to vnímám spíše jako refaktoring po té, co zjistím, že to potřebuji udělat jinak, aby se had hýbal automaticky.

Tohle je přesně důvod, proč to ve workshopu je v tomto pořadí.

Přejít z toho, že je stav hry rozhozený po globálních seznamech na něco, kam je možné jednoduše dát i aktuální směr, není triviální. Na kurzu je potřeba vždycky v každém kroku řešit jen jednu netriviální věc, jinak se v tom lidi ztratí.
Na workshopu jedu stylem „teď si ukážeme refactoring, věřte mi že je to potřeba“, ane u závěrečného projektu to asi nebude ono.

Možná mějte stav hry v třídě hned od začátku (možná s vysvětlením proč je to dobré). Pak by, myslím, oba přístupy byly zhruba na stejno.

@Glutexo
Copy link
Copy Markdown

Glutexo commented Nov 1, 2018

Možná mějte stav hry v třídě hned od začátku (možná s vysvětlením proč je to dobré). Pak by, myslím, oba přístupy byly zhruba na stejno.

👍🏻 Tak máme třídu State, která je na to přímo dělaná. Její mání od začátku mi stále více připadá zásadní a rozestrkávání těchto informací jinam akorát zvyšuje entropii (čti: dělá bordel).

@frenzymadness
Copy link
Copy Markdown
Author

Možná mějte stav hry v třídě hned od začátku (možná s vysvětlením proč je to dobré). Pak by, myslím, oba přístupy byly zhruba na stejno.

👍🏻 Tak máme třídu State, která je na to přímo dělaná. Její mání od začátku mi stále více připadá zásadní a rozestrkávání těchto informací jinam akorát zvyšuje entropii (čti: dělá bordel).

Upravil jsem to v tomto duchu a je tam tedy zmíněno, že by měly od samého počátku používat minimálně jednu třídu pro stav hry.

Je poznámka: Ta implementace přiložená k tomuto projektu je čistě ukázková a pro nás (pro představu) a nebude nikde zmíněna pro účastnice, takže mezi textem a touto implementací nemusí existovat žádná spojitost. Implementace asteroidů se také používá jen jako motivace pro holky, pro ukázku fungování v jednotlivých fázích a nikde neni k dispozici veřejně.

@Glutexo
Copy link
Copy Markdown

Glutexo commented Nov 13, 2018

Tumáš jazykovou korektūru.

Co do obsahu, teďka po vyzdvihnutí stavové třídy bych nic zásadního proti neměl. Přechod ze skokového ovládání na časované jsme zavrhli.

Přidám sem jen pár takových polovýhrad, co jsem psal na Slacku:

  • Stavová třída je pořád jen převlečená globální proměnná. Pokud se s ní bude manipulovat nějakými logickými metodami, tak budiž. Jen na to pamatujme.
  • Snad by se dalo obejít bez řešení zahnutých obrázků, jak hada vykreslit pěkného. Je to takové crcání a přitom by se stejný čas dal věnovat koumání nad zábavnější herní logikou. Jen to hádě pak nebude vypadat jak na novějších Nokiích.
  • Pořád mi přijde, že je na to hrozně málo času. Je to lepší než Asteroidy, mimo jiné také tím, že si už jednu verzi holky napsaly v předchozích hodinách. Ale stejně.

Pokud bych ještě na něco narazil, tak bych ještě dal vědět. Ale klidně bych to pustil, jak to je. :shipit:

@frenzymadness frenzymadness changed the title [WIP] Alternativní závěrečný projekt - Had Alternativní závěrečný projekt - Had Nov 14, 2018
frenzymadness and others added 2 commits November 14, 2018 06:45
* Doplněny pevné mezery za jednopísmenné předložky.
* Doplněny mezery kolem symbolů.
* Spojovníky nahrazený pomlčkami.
* Doplněny pevné mezery po jednopísmenných spojkách.

Doplněny chybějící čárky – ohraničující vedlejší věty a vyjadřující
vylučovací poměr. Doplněny pomlčky ohraničující vedlejší větný
celek. Odebrány pomlčky ze slovních spojení, ve kterých se nepoužívají.

Odkaz na stránku Wikipedie o hře had obsahuje závorky. Kvůli tomu byl
použitý Markdown rozbitý. Závorky opatřeny lomítkem, čímž byl odkaz opraven.

My si hrajeme **s** hadem, ale funkce hýbe hadem. Mačkáš mi hada,
debile! Doplněno pár slov do vět, které moc nedávaly smysl, byly
skladebně špatně nebo se mi jen nelíbily.
@frenzymadness
Copy link
Copy Markdown
Author

Udělal udělal jsem squash na jednotlivé commity. Aktuálně je tam jeden se samotným projektem a jeden s opravami od Glutexa.

Myslím si, že jsme připraveni to pustiti do světa. Kdo stiskne to magické tlačítko nebo dá alespoň svolení?

@encukou
Copy link
Copy Markdown
Member

encukou commented Nov 14, 2018

Tohle repo je pro podzim 2018. PR nezasahuje do ostatních kurzů. Jako lektor v Ostravě nepotřebuješ svolení někoho jiného :)

@encukou encukou merged commit 7205cce into PyLadiesCZ:autumn2018 Nov 14, 2018
@frenzymadness
Copy link
Copy Markdown
Author

Udělá někdo cherry-pick na naučse? Mám na to založit issue?

@encukou
Copy link
Copy Markdown
Member

encukou commented Nov 14, 2018

Založ issue, ale myslím že by se to mělo obecně dělat až po "live" vyzkoušení.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants