Zacznijmy od tego, że Pong to najstarszy dowcip w historii gier wideo, który mimo to nigdy się nie zestarzał. Dwie kreski, kropka, piip-piip i już jesteś wciągnięty na cztery godziny. Powstał w 1972 roku w Atari, a za sterami siedział Allan Alcorn, który dostał zadanie od Nolana Bushnella „zrób coś prostego, na próbę”. Wyszło coś tak prostego, że ludzie ustawiali się w kolejkach do automatu w barze, aż ten się zapchał od nadmiaru ćwierćdolarówek i dosłownie przestał działać. To chyba najlepsza recenzja gry w historii – „sukces, bo się zepsuła od popularności”.
Ciekawostka, której nie ma w każdym artykule o Pongu: zanim Atari zrobiło swoją wersję, podobny koncept miał już Magnavox Odyssey, i Bushnell obejrzał go na targach, zanim „wpadł na pomysł” Ponga. Skończyło się pozwem, który Atari przegrało i musiało zapłacić. Klasyka – najpierw kopiujesz, potem tłumaczysz się w sądzie, a i tak zostajesz zapamiętany jako wynalazca gatunku.
A skoro już jesteśmy przy kopiowaniu – w Polsce swoją drogą mieliśmy własny odprysk tego szału, czyli konsolę Amprod TVG-10. Krajowy klon zagranicznych automatów typu „pong”, produkowany w latach 70. przez polski przemysł elektroniczny, który akurat wtedy uczył się, że telewizor może robić coś więcej niż pokazywać Dziennik. Dwie gałki, kilka trybów gry, migoczący biały kwadracik na ekranie – urządzenie, które dziś jest białym krukiem dla kolekcjonerów retro, a wtedy było najbliższym polskiemu dziecku odpowiednikiem konsoli do gier. Wspominam to nie bez powodu, bo cała ta historia krąży w mojej głowie za każdym razem, gdy ktoś mówi „zrób mi Ponga” – bo brzmi to jak najprostsze zadanie na świecie, a jednocześnie ma na karku pół wieku bagażu.
Prompt, który wysłałem do Claude’a
No właśnie – zamiast pisać Ponga sam po raz dwudziesty w życiu (bo to chyba obowiązkowe ćwiczenie każdego programisty, razem z kalkulatorem i listą TODO), postanowiłem sprawdzić, jak dobrze poradzi sobie z tym Claude. Ale że jestem osobą, która lubi utrudniać sobie życie, nie napisałem „zrób mi Ponga”. Napisałem coś w rodzaju: kompletny projekt Qt Creator w C++17, cała grafika i dźwięki generowane proceduralnie (żadnych gotowych assetów), AI przeciwnika na trzech poziomach trudności, efekty cząsteczkowe, płynne animacje, przewijana kamera, no i – bo dlaczego by nie – tryb bullet time zwalniający czas po wciśnięciu Shifta.
Byłem ciekawy dwóch rzeczy. Po pierwsze, czy w ogóle się to skompiluje bez poprawek (bo model nie ma tutaj kompilatora pod ręką, więc pisze „na wiarę”). Po drugie, czy zamiast Ponga nie dostanę przypadkiem jakiegoś dziwoląga, w którym piłka teleportuje się przez paletkę, bo ktoś zapomniał o kolizjach.
Efekt? Zaskakująco solidny. Dostałem cały projekt podzielony na klasy – osobno paletka, piłka, kamera, system cząsteczek, AI, generator dźwięku, generator grafiki, HUD – czyli dokładnie tak, jak powinien wyglądać porządny kod, a nie jeden plik main.cpp na tysiąc linijek, w którym wszystko dzieje się naraz. Dźwięki? Wygenerowane matematycznie jako fale sinusoidalne zapisane bezpośrednio do WAV-a w locie, bez żadnego pliku mp3 z internetu. Grafika? Narysowana przez QPaintera – gradienty, poświata wokół piłki, migoczące gwiazdki w tle. Jak na „AI, popisz mi kod” – zaskakująco ambitne podejście.
Ale (bo zawsze jest jakieś „ale”)
Pierwsza wersja miała przewijaną kamerę na cały ekran w poziomie, co brzmiało fajnie w teorii, a w praktyce sprawiało, że Pong przestawał być Pongiem, a zaczynał przypominać jakiś eksperymentalny side-scroller, w którym gubisz paletkę z oczu, bo „stół” miał jakieś 100 metrów długości. Musiałem to ściąć – kazałem zmieścić całą planszę na jednym ekranie, bez żadnego scrollowania. Bo klasyka to klasyka i nikt nie prosił o takie cudowanie.
Druga poprawka: piłka miała przyspieszać cały czas, także po odbiciu od górnej i dolnej ściany, co po dwudziestu sekundach zamieniało grę w test refleksu, a nie w Ponga. Kazałem, żeby przyspieszała tylko po odbiciu od paletki gracza albo przeciwnika – to jedyne odbicie, które powinno cokolwiek „nagradzać”.
Trzecia sprawa – i tu robi się ciekawie – bullet time. W pierwszej wersji spowalniał dosłownie wszystko, łącznie z ruchem paletek, co czyniło całą mechanikę bezcelową, bo skoro zwalnia się piłka, ale i Ty poruszasz się wolniej, to efektywnie nic się nie zmienia poza tym, że dłużej czekasz. Kazałem to poprawić tak, żeby bullet time zwalniał piłkę i „myślenie” przeciwnika, ale nie prędkość Twojej paletki – dzięki temu faktycznie masz przewagę, a nie tylko ładniejszy spowolniony ekran.
Na deser dorzuciłem funkcję rewind – cofanie czasu, żeby móc odkręcić fatalnie stracony punkt. To już był mój własny pomysł, bo skoro robimy sobie mechaniki rodem z gier akcji, to czemu nie pójść na całość.
Podsumowanie w stylu „no dobra, ale…”
Gdybym miał ocenić tę współpracę jak mecz – AI napisało solidne 80% roboty w pięć minut, ja spędziłem swoje pięć minut na tym, żeby powiedzieć „nie, nie o to chodziło” trzy razy z rzędu, i finalnie mamy działającego Ponga z bullet time i cofaniem czasu, co jest kompletnie niepotrzebne, ale wygląda efektownie. Gdyby Allan Alcorn w 1972 roku miał dostęp do takiego narzędzia, pewnie zamiast dwóch kresek dostalibyśmy od razu Ponga z laserami, dubstepem i systemem osiągnięć – i pewnie musiałby to później wycinać dokładnie tak samo, jak ja.
📎 Załączniki do pobrania:

