Místo konce hry při naražení do okraje okýnka můžeš nechat hada „projít“ a objevit se na druhé straně.
Z pohledu logiky hry to není tak složité, jak to může znít.
Stačí v move
místo ukončení hry správně nastavit příslušnou hodnotu.
Je ale potřeba si dát pozor kde použít new_x
a kde new_y
, kde width
a kde
height
, a kde přičíst nebo odečíst jedničku, aby při číslování od nuly
všechno sedělo.
Zkus to!
Jestli ale vykresluješ hada (místo housenky), narazíš teď na problém s vybíráním správných dílků – okraj herní plochy hada vizuálně rozdělí na dva menší. Řešení tohoto problému nechávám na čtenáři – s tím, že je to hodně těžký problém.
Jde logiku vylázání z okýnka vyřešit jednodušeji? Jde! Matematikové vymysleli operaci, která se jmenuje zbytek po dělení. Ta dělá přesně to, co tu potřebuješ – zbytek po dělení nové souřadnice velikostí hřiště dá souřadnici, která leží v hřišti. Když byla předchozí souřadnice o jedna větší než maximum, zbytek po dělení bude nula; když byla -1, dostaneme maximum.
Python moužívá pro zbytek po dělení operátor %
. Zkus si to:
>>> 6 % 10 # Zbytek po dělení šesti desíti
6
>>> 10 % 10
0
>>> -1 % 10
9
Celý kód pro kontrolu a ošetření vylézání z hrací plochy tak jde nahradit dvěma řádky:
new_x = new_x % self.width
new_y = new_y % self.height
Podobné matematické „zkratky“ umí programátorům často usnadnit život. Jen přijít na ně nebývá jednoduché. Ale nevěš hlavu: neláká-li tě studovat informatiku na škole, věz, že to jde i bez „zkratek“. Jen občas trochu krkoloměji.
To, že existuje přesně operace kterou potřebujeme, není až tak úplně náhoda. Ona matematická jednoduchost je spíš důvod, proč se hrací plocha u spousty starých her chová právě takhle. Odborně se tomu „takhle“ říká toroidální topologie.
Pro matematiky
Zkušení matematici si teď možná stěžují na nutnost definovat zbytek po
dělení záporných čísel. Proto dodám, že ho Python schválně
definuje vhodně
pro tento účel; a % b
má vždy stejné znaménko jako b
.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-podzim-snake:extensions:1", "title": "Rozšíření Hada – Nekonečná klec", "html": "\n \n \n\n <h1>Nekonečná klec</h1>\n<p>Místo konce hry při naražení do okraje okýnka můžeš nechat hada „projít“\na objevit se na druhé straně.</p>\n<p>Z pohledu logiky hry to není tak složité, jak to může znít.\nStačí v <code>move</code> místo ukončení hry správně nastavit příslušnou hodnotu.\nJe ale potřeba si dát pozor kde použít <code>new_x</code> a kde <code>new_y</code>, kde <code>width</code> a kde\n<code>height</code>, a kde přičíst nebo odečíst jedničku, aby při číslování od nuly\nvšechno sedělo.\nZkus to!</p>\n<div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-snake/snake/toroid/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span> <span class=\"c1\"># Kontrola vylezení z hrací plochy</span>\n <span class=\"k\">if</span> <span class=\"n\">new_x</span> <span class=\"o\"><</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">width</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n <span class=\"k\">if</span> <span class=\"n\">new_y</span> <span class=\"o\"><</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n <span class=\"n\">new_y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">height</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n <span class=\"k\">if</span> <span class=\"n\">new_x</span> <span class=\"o\">>=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">width</span><span class=\"p\">:</span>\n <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n <span class=\"k\">if</span> <span class=\"n\">new_y</span> <span class=\"o\">>=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">height</span><span class=\"p\">:</span>\n <span class=\"n\">new_y</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n</pre></div>\n </div>\n</div><p>Jestli ale vykresluješ hada (místo housenky), narazíš teď na problém\ns vybíráním správných dílků – okraj herní plochy hada vizuálně rozdělí\nna dva menší.\nŘešení tohoto problému nechávám na čtenáři – s tím, že je to hodně těžký\nproblém.</p>\n<h2>Zbytkové řešení</h2>\n<p>Jde logiku vylázání z okýnka vyřešit jednodušeji? Jde!\nMatematikové vymysleli operaci, která se jmenuje <em>zbytek po dělení</em>.\nTa dělá přesně to, co tu potřebuješ – zbytek po dělení nové souřadnice velikostí\nhřiště dá souřadnici, která leží v hřišti.\nKdyž byla předchozí souřadnice o jedna větší než maximum,\nzbytek po dělení bude nula; když byla -1, dostaneme maximum.</p>\n<p>Python moužívá pro zbytek po dělení operátor <code>%</code>. Zkus si to:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"mi\">6</span> <span class=\"o\">%</span> <span class=\"mi\">10</span> <span class=\"c1\"># Zbytek po dělení šesti desíti</span>\n<span class=\"go\">6</span>\n<span class=\"gp\">>>> </span><span class=\"mi\">10</span> <span class=\"o\">%</span> <span class=\"mi\">10</span>\n<span class=\"go\">0</span>\n<span class=\"gp\">>>> </span><span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"o\">%</span> <span class=\"mi\">10</span>\n<span class=\"go\">9</span>\n</pre></div><p>Celý kód pro kontrolu a ošetření vylézání z hrací plochy tak jde\nnahradit dvěma řádky:</p>\n<div class=\"highlight\"><pre><span></span> <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"n\">new_x</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">width</span>\n <span class=\"n\">new_y</span> <span class=\"o\">=</span> <span class=\"n\">new_y</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">height</span>\n</pre></div><p>Podobné matematické „zkratky“ umí programátorům často usnadnit život.\nJen přijít na ně nebývá jednoduché.\nAle nevěš hlavu: neláká-li tě studovat informatiku na škole, věz, že to jde\ni bez „zkratek“. Jen občas trochu krkoloměji.</p>\n<div class=\"admonition note\"><p>To, že existuje přesně operace kterou potřebujeme, není až tak úplně náhoda.\nOna matematická jednoduchost je spíš <em>důvod</em>, proč se hrací plocha\nu spousty starých her chová právě takhle.\nOdborně se tomu „takhle“ říká\n<a href=\"https://en.wikipedia.org/wiki/Torus#Topology\">toroidální topologie</a>.</p>\n</div><div class=\"admonition note\"><p class=\"admonition-title\">Pro matematiky</p>\n<p>Zkušení matematici si teď možná stěžují na nutnost definovat zbytek po\ndělení záporných čísel. Proto dodám, že ho Python schválně\n<a href=\"https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations\">definuje vhodně</a>\npro tento účel; <code>a % b</code> má vždy stejné znaménko jako <code>b</code>.</p>\n</div>\n\n\n " } } }