Za trudna, za łatwa, w końcu grywalna. Gra w aplikacji do zakupów
· · Nie jednym promptem · odcinek 6 · Read in English
Co zrobić, żeby użytkownicy wracali do Zakupomatu między jednymi zakupami a drugimi?
To pytanie zna każdy, kto robi aplikację używaną "od czasu do czasu". Do listy zakupów zaglądasz, kiedy czegoś brakuje, i w sklepie. A potem przez kilka dni - nic. I wcale nie chodzi o to, żeby aplikacja robiła się głośniejsza. Jedna z użytkowniczek chwaliła Zakupomat właśnie za to, że nie ma w nim zbędnych ozdobników 🙂
Mój pomysł był taki - mała gra. Coś na chwilę w kolejce do kasy albo dla pasażera w drodze do sklepu (pasażera, nie kierowcy 😉). Opcjonalna, schowana pod "Więcej", z rywalizacją domowników. I od początku z jednym warunkiem, który napisałem agentowi wprost:
"To ma być gra, w którą ludzie będą chcieli grać, a nie sztuczny wypełniacz w aplikacji do zakupów."
W nocy z piątku na sobotę założyłem zgłoszenie. W sobotę do TestFlighta poszły trzy kolejne wersje, a rodzina grała między nimi. W niedzielę wieczorem gra była już w obu sklepach. Jeszcze rok temu nie byłoby opcji, żeby coś takiego powstało w weekend - jedna osoba i dwa agenty. Brzmi jak "jednym promptem"? No to opowiem, co się działo pomiędzy 😉
Koszyczek i cztery półki
Pomysł wziąłem prosto z PRL-u - z "Nu, pogodi!", czyli Elektroniki IM 02. Kto miał, ten pamięta - wilk z koszykiem i jajka staczające się z czterech grzęd 🙂 Tamta gra była dużo prostsza. W wersji zakupowej z czterech półek spadają produkty, świeże łapiesz, a zepsute przepuszczasz na ziemię. A serduszka przywracają życie. Trzy serca, punkty, bonus za serię, coraz szybsze tempo. Do tego Twój rekord, rekord rodziny i informacja, że ktoś z domowników poprawił wynik od Twojej ostatniej wizyty. A za pobicie własnego rekordu - konfetti, to samo co po zakończonych zakupach.
Pierwsza wersja miała na dole cztery przyciski do sterowania koszykiem. Zapytałem: a dlaczego po prostu nie dotknąć półki, przy której ma stanąć koszyk? Przyciski zniknęły, sterujesz dotykając planszy. Drobiazg, ale od niego zaczęło się fajnie grać.
Wersja 1: za trudna
Rodzina dostała grę na telefony i zaczęło się. Grałem ja, grała Marta, grały dzieci. I po kilku rundach napisałem agentowi:
"Także do 700 punktów jest dość łatwo, a przejście 1090 jest niemal niemożliwe."
Kod był poprawny. Testy przechodziły. Matematycznie dwa produkty nigdy nie wpadały do koszyka w tej samej chwili - minimalny odstęp wynosił 460 ms. Tylko że końcowe spadanie do koszyka trwało 700 ms! Na ekranie leciały więc dwa, trzy produkty naraz i mózg widział kilka zadań jednocześnie. Test sprawdzał logikę. Nie sprawdzał człowieka.
A druga uwaga była jeszcze ciekawsza:
"W ogóle moja żona nie skumała, że nie ma łapać zepsutych produktów."
Dla mnie to było oczywiste - w końcu sam to wymyśliłem 😂 Dla kogoś, kto po prostu otwiera grę, wcale nie. Zmieniliśmy więc nie tylko tekst instrukcji. Na ekranie startowym są teraz trzy podpisane rysunki - "ŁAP", "OMIJAJ" i "+1 SERCE" - a zepsute produkty są oliwkowe, z plamkami i czerwonym ×. Nie sam kolor, bo kolor nie każdemu wystarczy.
Wersja 2: za łatwa
Poprawki: krótszy finał lotu, odstęp co najmniej 900 ms, tempo rosnące w sześciu stopniach do limitu, serca do odzyskania życia, dźwięki. Kolejny build do TestFlighta.
I tu zwrot akcji. Marta przy pierwszym podejściu doszła do 15 000 punktów... i sama skończyła. Bo się nudziło!
Do tego miałem listę "drobiazgów, które denerwują": serc co najmniej 3× za dużo, każdy produkt spada z tą samą prędkością, tempo staje na 6, wyjście z gry kasuje rundę, dźwięki takie sobie. A w Codexie, z którym robiłem pierwsze wersje (GPT-6-Astra zrobił zajebistą robotę!), właśnie skończyły mi się tokeny. Dalej poszedłem z Klaudiuszem.
Wersja 3: dwa wyniki rodziny jako dane
Tu Claude zaczął od czegoś innego niż kręcenie parametrami. Zbudował prosty model gracza: im mniej czasu między produktami, tym większa szansa na pomyłkę. I dopasował go do jedynych danych, jakie mieliśmy - dwóch rodzinnych wyników: około 1000 w pierwszej wersji i 15 000 w drugiej.
Model pokazał coś, co czuliśmy, ale nie umieliśmy nazwać. W wersji 2 tempo stawało, a serce pojawiało się średnio co 28 produktów i leczyło prawie każdy błąd. Statystycznie rundy mogły ciągnąć się 20-30 minut. To była gra, której nie da się przegrać. Można ją tylko porzucić.
Co się zmieniło:
- Tempo rośnie przez całą rundę, ale coraz wolniej - nie ma limitu, jest ściana, która rośnie powoli.
- Każdy produkt spada z inną prędkością, więc nie da się grać "na rytm". Szybki produkt nigdy nie wyprzedzi wolniejszego, bo kolejność ustala moment złapania, a nie start z półki.
- Serca 3× rzadsze i zawsze spadają szybko - nagroda za czujność, nie koło ratunkowe.
- Bonus do ×5 za długą serię, więc każdy błąd naprawdę boli.
- Wyjście z gry ją pauzuje, a z pauzy można zacząć od nowa.
Model daje teraz typową rundę na 4-8 minut. Uczciwie - to hipoteza, nie pomiar. Model nie wie, czy gra jest fajna. To wiedzą tylko ludzie przy kasie 😉
Terkot licznika
Jedna z rzeczy, która cieszy mnie najbardziej, to... dźwięk. Napisałem, że naliczanie wyniku na koniec rundy ma być jak na publicznej stronie statystyk Zakupomatu, a dźwięk ma być "takim szybkim terkotaniem - mam nadzieję, że rozumiesz o co chodzi".
Zrozumiał! W grze nie ma ani jednego pliku audio. Wszystkie dźwięki - "plop" do koszyka, który rośnie razem z bonusem, plusk upuszczonego owocu, "bleh" złapanego zgniłka - generuje kod. A terkot licznika jest wyliczony z tej samej krzywej co animacja cyfr - na początku pędzi, potem zwalnia i milknie dokładnie wtedy, kiedy zatrzymuje się ostatnia cyfra. Jak koło fortuny 🙂
Rywalizacja bez profili domowników
Najtrudniejsza decyzja nie dotyczyła gry, tylko prywatności. Zakupomat rozpoznaje rodzinę jednym wspólnym kluczem i celowo nie wie, kto z domowników co kupił. Jak w takim razie pokazać "mój rekord" i "rekord rodziny"?
Agent zaproponował pseudonimy. Odmówiłem. Przy zwykle dwóch graczach w rodzinie, jeśli rekord nie jest mój, to i tak wiem, czyj jest 😉 Nie trzeba budować systemu profili, żeby dać rodzinie frajdę z rywalizacji.
Skończyło się na losowym identyfikatorze instalacji aplikacji - nie osoby, nie telefonu z danych sprzętowych, nie reklamowym. Nie widać go w aplikacji. Serwer trzyma tylko najlepsze wyniki, a nie historię wszystkich rund. Rekord rodziny to sama liczba, bez autora. Usunięcie rodziny usuwa jej wyniki. I uczciwie - to nie jest pełna anonimowość wobec serwera, bo właśnie po tym identyfikatorze wie, który rekord jest czyj. Ale to minimum potrzebne do funkcji, zapisane w decyzji projektu razem z tym, czego z tym identyfikatorem nie robimy.
Ile to kosztowało
Grę robiłem z agentami Anthropic i OpenAI. Limity tokenów skończyły się nie raz, a czekać pięć godzin albo tydzień na nowe okno mi się nie chciało - więc dopłacałem. Frajda z robienia była ogromna, ale "darmowe i bez wysiłku" to nie było.
Kosztowało też mój czas, i to w miejscu, w którym zwykle go oszczędzam. To był jeden z pierwszych razów, kiedy tak dokładnie przeglądałem kod agentów - głównie Codexa na początkowych etapach. I nie tylko pod kątem tego, czy gra działa i czy szanuje prywatność, ale samego kodu: jak jest poukładany, co jest zbędne, co się zemści przy następnej zmianie. Kodu jest dużo. Wierzę, że właśnie dzięki tym przeglądom jest lepszy i nie zostawia długu technologicznego, który ktoś (czyli ja 😉) będzie spłacał przez kolejne miesiące.
Rola agentów - kod, testy, przeglądy, poprawki i cała obsługa wydań do dwóch sklepów. Moja - pomysł, granice (opcjonalna, bez profili, bez wypełniacza), krytyka sterowania, przegląd kodu, zbieranie uwag od rodziny i decyzja, kiedy jest dość dobrze. Agent napisze kolejną wersję w godzinę. Ale to, czy chce się w nią grać, sprawdzi tylko ktoś, kto w nią gra.
Czy to działa?
Nie wiem. I to jest najuczciwsza odpowiedź. Nie mam jeszcze danych, czy gra sprawi, że rodziny będą częściej wracać do aplikacji. Mam jedną rodzinę, która gra namiętnie, i rekord 50 970 punktów.
Dlatego od razu dołożyłem pomiar - w panelu widzę, ile rodzin zagrało i ile gra co tydzień. Wrócę z liczbami, kiedy będzie z czego liczyć.
Co to znaczy dla Twojego zespołu
- "Działa i ma testy" to nie to samo co "chce się w to grać". Testuj czas reakcji człowieka i to, co widzi na ekranie, a nie tylko logikę.
- Dwa punkty danych od prawdziwych ludzi są warte więcej niż sto symulacji. A z dwóch punktów da się zbudować model, który powie, gdzie szukać.
- To, co oczywiste dla twórcy, nie jest oczywiste dla użytkownika. Daj pierwszą wersję komuś, kto nie wie, jak miało być.
- Prywatność to też projektowanie. Często wystarczy mniej danych, niż podpowiada pierwszy pomysł.
W ANSLAN pomagamy zespołom pracować z agentami AI tak, żeby szybkość szła w parze z decyzjami ludzi, którzy znają użytkowników. Agent dowiezie wersję w weekend. Czy to dobra wersja, powie ktoś przy kasie w sklepie.
A gra czeka w Zakupomacie, pod "Więcej": zakupomat.app. Na zawsze za darmo, bez reklam, bez sprzedaży danych i bez abonamentu. Najlepszy wynik wszystkich rodzin widać na zakupomat.app/stats (strona odświeża się raz na dobę). Na razie to mój - 50 970. Spróbujesz go pobić? 😉
Do zobaczenia za tydzień 🙂