reviews2

Nechci to zakřiknout, ale pro tento krátký časový úsek máme vítěze!

100 Days of Code, lekce 95, naprogramujte si vlastní Invaders game (to je celé, u závěrečných lekcí jsou nulové instrukce).

Ok, to je docela záhul, main.py, importuje classes ze shooter.py, obstacle.py, projectile.py, invader.py, display.py, inicializuje classes, nastavuje tkinter, samo obsahuje několik čím dál rozsáhlejších funkcí (move_projectiles přes 45 řádků...) a na závěr má nějaký game loop.

Když nevím, poradím se s ChatGPT 4o, a ten víceméně odvádí super práci, jak je zvykem. Jen se občas zasekne na vlastním nesmyslu a pak je nejlepší začít znova. Co ale nezvládl by bug, který mi nedával žádný smysl. Když flotila invaderů klesla na ycor = 0, hra vesele pokračovala dál, invadeři dále klesali a shooter běhal doleva doprava, jenom se jaksi zastavily všechny projektily, moje i invaderovy.

Když jsem se o tom radil s ChatGPT, zkoušel jsem to nakonec rozjet znovu 4x, ale vždycky jenom dělal některé funkce "více robustní" a "přidával debugging messages". Zpětně mi dochází, že tím vlastně nedělal nic jiného než to, co dělá běžně od verze 3.5, a nyní už jen když je zahnán do kouta, bullshituje.

Nedávno jsem byl na semináři o využití large language models ve vědě. Kromě mnoha užitečných informací mě tam zaujal poznatek, že prý aktuálně, díky novému modelu 3.5 je nyní Claude Sonnet lepší než ChatGPT. Ideální možnost ho vyzkoušet.

Yep. Identifikoval problém napoprvé. Špatně navržený loop na konci main.py:

Thank you for sharing your code. I've reviewed the provided files, and I think I can identify the issue causing the projectiles to stop moving when the top of the invaders' fleet reaches y-coordinate 0.

The problem is likely in the move_projectiles() function in main.py. This function is responsible for moving all projectiles and checking for collisions. However, it's not being called continuously in your game loop.

Here's what's happening:

  1. The update_fleet() function is called repeatedly using screen.ontimer(), which moves the fleet of invaders.
  2. The invader_shoot() function is also called repeatedly, which creates new invader projectiles.
  3. However, the move_projectiles() function is not being called in a loop or with a timer. It's only defined but never actually called in the main game loop.

Málokdy se mi stane, že na mě něco udělá napoprvé takový dojem. Krom toho lze zdá se zatím Claude Sonnet 3.5 používat zdarma a není asi tak vytížený jako ChatGPT. Tam každopádně ruším předplatné, ale není to jen tímhle "zklamáním", zjistil jsem totiž, že verze 4 a vyšší jsem si pár měsíců předplácel zbytečně, protože je poskytly zdarma (ano, sice jsem si generoval obrázky nabundlovaným DallE, ale voni stejně stojej za prd, a asi jsem využil nějakých vyšších limitů, ale vem to čert).

Hotová hra je zde.