Diskuze: Hra Had
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Již asi chápu - počítal jsem s rozdílem 2 - ale já testuji dozadu až do -6 - což dává rozdíl 8 - tedy 14 by mělo fungovat - ale to tedy není dobé řešení (Různé vzdálenosti mezi články.). Jak bych měl vyřešit to testování kolize hlavy s tělem? Děkuji.
Není mi jasné, proč v metodě MoveBody používáš cyklus, když to jde udělat jedním příkazem pro posunutí prvků v seznamu a přidání dalšího. Vlastně ani nevím, proč ho posunuješ, když stačí přidat další prvek na konec.
Hada bych nedělal jako seznam, ale jako dvourozměrnou bitmapu. Kolize se budou detekovat mnohem snáze a nebude se s rostoucí délkou snižovat rychlost hada.
Aha - špatně jsi to pochopil - nic nepřidávám... (Move = pohyb) Přdávám jinde...
A kdo říká, že hlava nemůže být na konci seznamu?
A k čemu máš ten cyklus v MoveBody když můžeš použít metodu Insert()?
No ale když bude hlava nakonci, a pak s tím zamýchám, tak to přeci nepůjde...
Insert je další nesmysl - nechci nic přidávát... (Navíc by to stejně chtělo cyklus...)
A co ta metoda snakeBody.Insert()? Ta ti stále nefunguje?
Zacházení se seznamem jako s polem je zvěrstvo. Tohle není C, ale C#.
Jaktože nepřidáváš? Posouváš všechny prvky v seznamu a na nultou pozici dáváš novou pozici hlavy. To je klasický Insert() jak z učebnice. Uvědom si, že programuješ v C#.
Neumím si to představit. A jak píši - na to Insert bych stejně musel použít cyklus...
Právě že vůbec neměním počet prvků... Vše po hlavu posouvám o jedno dopředu. Nakonec mi tam zbydou 2 hlavy - 2 stejné pozice - následně ale posunu hlavu a tím je posunut celý had...
public bool Move()
{
if (direction != 0)
{
Vector2 rough = new Vector2();
switch (direction)
{
case 1:
rough = new Vector2(snakeBody[0].X + 12, snakeBody[0].Y);
break;
case 2:
rough = new Vector2(snakeBody[0].X - 12, snakeBody[0].Y);
break;
case 3:
rough = new Vector2(snakeBody[0].X, snakeBody[0].Y + 12);
break;
case 4:
rough = new Vector2(snakeBody[0].X, snakeBody[0].Y - 12);
break;
}
if (IsCollision(rough))
return false;
snakeBody.RemoveAt(snakeBody.Count - 1);
snakeBody.Insert(0, rough);
}
return true;
}
public bool IsCollision(Vector2 testedPosition)
{
foreach (Vector2 position in snakeBody)
if (new Rectangle((int)testedPosition.X, (int)testedPosition.Y, 12, 12).Intersects(new Rectangle((int)position.X, (int)position.Y, 12, 12)))
return true;
return false;
}
Ve třídě si nadefinuješ 2 konstantní pole:
int[] posunX={0, 12, -12, 0, 0}
int[] posunY={0, 0, 0, 12, -12}
a místo celého toho obludného switche dáš jen
rough=new Vector2(snakeBody[0].X+posunX[direction], snakeBody[0].Y+posunY[direction]);
a je to. Nejsi přece placený za počet řádek, že ne?
Napadá tě co s tímhle?
if (snake.snakeBody[0].X + 12 < 0)
snake.snakeBody[0] = new Vector2(Window.ClientBounds.Width, snake.snakeBody[0].Y);
if (snake.snakeBody[0].X > Window.ClientBounds.Width)
snake.snakeBody[0] = new Vector2(0, snake.snakeBody[0].Y);
if (snake.snakeBody[0].Y + 12 < 0)
snake.snakeBody[0] = new Vector2(snake.snakeBody[0].X, Window.ClientBounds.Height);
if (snake.snakeBody[0].Y > Window.ClientBounds.Height)
snake.snakeBody[0] = new Vector2(snake.snakeBody[0].X, 0);
Předpokládám, že ty podmínky jsou chybně. Podle mne by to mělo vypadat asi takto:
snake.snakeBody[0] = new Vector2(
Math.max(Math.min(snake.snakeBody[0].X, Window.ClientBounds.Width), 12),
Math.max(Math.min(snake.snakeBody[0].Y, Window.ClientBounds.Height), 12)
);
Konstanty si případně uprav podle sebe.
Ale já bych chtěl nastavovat hodnotu jen když je třeba - jinak to akorát
bude zbytečně zdržovat - ne? (Podmínky fungují - takže asi chybně
nebudou... )
Aha mi si nerozumíme - tvoje nepropouští - já chci ale normálního hada - který propouští... (Viz. Pacman.)
Poslal jsem ti to akorát na vylepšení - je-li nějaké možné... (Mě se ten kus kódu moc nelíbí...)
V tom případě tam patří konstanty -12
.
Pomalé to není, to si klidně můžeš změřit. Je fakt, že mé řešení není úplně ekvivalentní, protože pokaždé vytváří novou instanci Vector2. Jenže podle všeho ji stejně potřebuješ a vytváříš jednu zbytečnou o kousek výš.
Snaž se vyhýbat podmínkám a cyklům. Nekamarádí se s multiprocesorovými systémy. Podmínky a cykly se totiž nedají paralelizovat. Takové programy jsou pak uvězněny na jednom procesorovém jádře.
Pořád mě nechápeš - chci normálně procházet jako v Pacmanu... 12 tam je jen z jednoho důvodu - vykresluje se směrem dolů a doprava:
dddd
d
d
d
A pozice určuje počátek tohoto rozkolu:
Dd
d
Takže v místě kontaktu pozice písmena
dddd
d
d
d
by byl přechod trhavý - proto jej posunuji o 12...
Zatímco vzdálenější konec přejde až když nastane kontakt s pozicí jeho majitele...
Zobrazeno 22 zpráv z 22.