99.99%-ban AI kódolt Magic TCG engine
Posted by laxika@reddit | programmingHungary | View on Reddit | 50 comments
Sziasztok!
Mostanában elég sok AI kritikus comment volt itt a subon. Mivel nekem nagyon más a tapasztalatom, gondoltam csinálok egy tesztet. Úgy döntöttem belevágok egy zöldmezős projektbe amit 100%-ban az AI-ra bízok. Én csak az alap setupot csinálom meg, aztán akár mi lesz is, csak promptolni fogok.
Gyerekkoromban nagyon szerettem volna egy saját MtG motort írni, főleg azért, mert csóró voltam, de imádtam draftolni. Próbálkoztam is vele, de idővel mindig feladtam. A hivatalos szabálykönyv vagy 300 oldal, esélytelen még átlátni is, nem hogy lefejleszteni. Viszont pont emiatt az MtG egy kifejezetten jól definiált rendszer, így a lefejlesztése nem kreatív gondolkodást hanem monoton munkát/kódolást igényel. Emellett objektíven ellenőrizhető hogy azt csinálják-e a lapok ami rájuk van írva + kellőképpen bonyolult is ahhoz, hogy bemutassa mennyire tud "gondolkodni" az AI.
Először két hétre vettem egy Claude x5 majd egy hónapra x20 előfizetést. Ennek a 1.5 hónapnak a végeredményét láthatjátok itt. A project egy működő Java backend + Angular frontendből áll, kicsit több mint 500 ezer sor kóddal. Volt, hogy 9 terminálon futtattam egyszerre a kártyák implementálását, hogy ki tudjam maxolni a token limitet. A laptopom elég erősen le akart olvadni közben.
A matek a végén: nagyjából 80 millió tokent égettem el. Lett 3100+ commit (ebből max az első párat csináltam én, a többit majdnem mind a Claude), és 1974 játszható kártya. A végén egy komplett kiegészítőt (250-300 kártya) kb. 12 óra alatt le tudtam darálni. Igaz, rendesen ki is égtem a folyamatos kód reviewben.
Csináltam róla egy videót, itt megmutatom a gameplay-t, meg azt is, ahogy a Claude hogyan tud leimplementálni egy lapot:
https://www.youtube.com/watch?v=mklNa55sBKg
A kód kint van GitHubon, ha valakit érdekel a repó, vagy lokálisan szeretne draftoni:
https://github.com/laxika/magical-vibes
Tudom, hogy egy 20 éves spagettikódba senki nem szívesen engedné bele az AI-t, de zöldmezős cuccoknál meglepően hatékonyan tud haladni. Még meglepőbb hogy a kód teljesen olvasható, láttam már jóval rosszabbat élő emberektől is. Nem mondom hogy minden tökéletes és bug nélküli, de a komplexitás miatt én sem tudnám jobban megírni, ellenben legalább 10x ennyi időbe telne.
Fontos tudni hogy a kódbázis biztonsági és validálási szempontból nem volt még tesztelve, így előfordulhat hogy frontend moddingal lehet csalni (bár validálás van, de nem garantált hogy a lefedettség 100%), valamint azon sem lepődnék meg ha a websocketet lehetne valahogy hijackelni,.
Ha van kérdés a promptolásról, a setup-ról, vagy akármiről, mondjátok nyugodtan. Észrevételeket (negatívot is) szívesen fogadok. :)
functor_template@reddit
https://www.youtube.com/watch?v=x3dE-NJ1UDQ
ha ráérsz, próbáld ki hogy mi történik ilyenkor, érdekes lehet
StartBrilliant8444@reddit
Szerver vagy kliens authoritative?
Hogyan valósítottad meg a lapok event chainingjét?
laxika@reddit (OP)
Szerver authoritive. Mire gondolsz event chaining alatt? Amikor pl van két lap az asztalon és bejön egy új amire mindkettő reagálna?
Gexryi@reddit
Remek ötlet és projekt! 2 kérdés, ha belefér: 1. Mit csinálnál máshogy ha most kezdenéd? 2. Mint MtG fan: mennyire kellett ismerned az MtG-t ehhez?
laxika@reddit (OP)
Ezt lejjebb említettem már. Megpróbálnék AI swarmokat használni. Ha le akarnák fejleszteni egy kiegészítőt, akkor a benne levő kártyákat halmazokra osztanám és felhúznék egy swarmot (sok agentet egyszerre) akik elkezdenének dolgozni az adott halmazon. Aztán nekem (jobb esetben) csak a végeredményt kellene átnéznem. Egy lap/commit kicsit idegörlő, de azért annyi előnye van hogy aprólékosan lehet látni hogy hogyan változik a kód. Ez a swarmolás ilyen experimental lenne. Lehet hogy bejön, de lehet hogy masszív bukó.
Közepesen. Három éve játszottam utoljára, előtte sem túl komolyan. Talán 2 versenyen voltam de nem értem el semmi komoly helyezést. :)
Gexryi@reddit
Köszi! Csak így tovább!
Expensive-Court-2365@reddit
először is leszögezném hogy ez lenyűgöző, én is használok AI-t szinte naponta, bár nem kódolásra
hol van a határ, amikor már mindez a művészet rovására megy?
mikor következik be az, amikor olyan lesz mint a 3D nyomtató hogy már épületeket is tud 3D nyomtatni, illetve ebben az esetben mondjuk lesz "keze", és festeni fog tudni olyan képeket amik láttán lerakjuk a hajunkat?
elhiszem és megértem hogy 100%-ig magadénak tartod, de nekem ez egyszerűen nem menne..
pont az a hozzáadott érték veszik el belőle szerintem, amitől lenne ez egy művészeti alkotás, amitől olyan szép, csodálatos és lenyűgöző bármi, amit az ember a saját elméjével és kezével épít, alkot
laxika@reddit (OP)
Hmm, én nem igazán tartom a kódolást művészetnek. A modern kori építészettel is így vagyok. A legtöbb dolog amit a bauhausban és utána hoztak létre az nagyon jellegtelen és tömegtermék. Persze vannak craft shopok (le a kalappal előttük) de a termékek nagy tömegét nem így állítják elő. A kód nagy része eddig is ilyen volt (random enterprise webserverek 500 ember által hegesztve, stb), most ez még jobban ki fog bővülni. Akár mit írtam, 80%-át pár éven belül kidobták. Ez az elévülés most még gyorsabb lesz.
Számomra főleg a végtermék a lényeg. Az lesz amit a felhasználók látni fognak és ez alapján döntik el hogy a kód megfelel-e a céljának.
Persze abszolút meg tudom érteni, hogy nem mindenki érez így. Az én világlátásom általában elég gyakorlatias, és néha kicsit túl sztoikus is. :/
Expensive-Court-2365@reddit
megértelek, de amikor itt meglátok egy-egy indie játékot bizonyos subokon, egyszerűen nem jut eszembe más, mint a művészet :)
laxika@reddit (OP)
Ohh persze, de az a végtermék maga, nem pedig a kód. Az igazán jó játékokat továbbra is emberek fogják csinálni. Maximum a kódolásuk/asset generálásuk lesz gyorsabb AI-al.
Happy-Anxiety-4030@reddit
Grat! Ez rohadt menő! Ez a rész érdekelne kicsit bővebben:
Hogyan oldottad meg? Mik voltak a nehézségek?
laxika@reddit (OP)
Nyitottam 9 desktopot Windowson, mindegyikben egy új IntelliJ-t, mindegyik egy különálló klónja volt a master reponak. Claude-nak megmondtam mit csináljon, majd ha tetszett a végeredmény akkor "commit and push". Ő megcsinálta a háttérben a rebase-t.
A nehézség az volt hogy kellett vennem 2x32GB ram-ot a laptopomba mert sokat fogyaszt mind a Claude Code (wtf egy console apptol, de tényleg) + az IntelliJ. Emellett ha elindult egyszerre 3-4 gradle build akkor 90%+ CPU hasznalat mellett pörgött a gépem. Igazából az volt a jó indikátor arra ha már végeztek az agentek hogy megszűnt a ventri zaja. :)
glezmen@reddit
Wow, állat :) én is elég sokat dolgoztatom az AI-t, de ekkora projektet meg nem csinaltattam vele, meg általában elég gyorsan eljön az a pont ahol gyorsabb és egyszerubb kezzel belenyúlni mint vele megcsináltatni, de elképesztő mennyiségű munkát meg tud spórolni.
Malhazz@reddit
Nagyon fasza!
Pár kérdés:
Mi volt a legproblémásabb dolog a fejlesztés közben?
Mit csinálnál máshogy, ha újra kellene kezdeni (de nem használhatod a mostani forráskódot)?
Látom vannak agent md-k. Bármi jó tanács velük kapcsolatban?
laxika@reddit (OP)
Same-Working-9988@reddit
Milyen adatforrást használtál, hogy a kártyákat kinyerd? Webscraping gatherer/scryfall?
laxika@reddit (OP)
"Implement Jace, Cunning Castaway from XLN. Write tests for it except if it is a vanilla card or a basic land. See: https://api.scryfall.com/cards/search?q=set:xln+cn:60&format=json"
Ennyit írtam be. Claude Code tud fetchelni oldalakat így megoldotta bármilyen segítség vagy előfetchelés nélkül.
inagy@reddit
Nem tudom miért gondoltam azt hogy a kártyákat és a grafikát is úgy generátattad valamivel. Logikusabb hogy egy meglévő játék szabálykönyvét engedted neki.
Én pár hónapja akartam a Kaland, Játék, Kockázat könyvek tartalmát AI-val valami JSON formába kivonatolni és utána játék motort írni felé a szabálya alapján. Ráuntam az egész kimenet átolvasgatásába, pedig meglepően tök jól ki lehetett vele szedetni az egyes step-eknél az ellenfeleket és pontokat. Jól mutatja hogy az ember lesz igen gyorsan a szűk keresztmetszet.
neoteraflare@reddit
Ha esetleg nem szórakozásból akartad, hanem hogy játsz velük akkor nézz fel steam-re ott fent van Fighting Fantasy Classic néven a körítés program amihez meg lehet venni a könyveket. Egyet talán kapsz alapban ingyen is.
laxika@reddit (OP)
Fun projectnek hangzik. Régen nagyon szerettem a KJK-t. Én régi könyveket akartam "JSON-osítani". Gemini jó OCR-ben és tud JSON schemára visszaadni adatot. Meglepően jól működött az is, de ahogy írod rengeteg idő volt olvasgatni. Ritkán hibázott, de akkor elég zavaró volt.
Same-Working-9988@reddit
Szuper, megnézem majd a videót meg lehet a repot is
WeakSinger3076@reddit
Mi a 0.001%?
ducktin@reddit
Elképesztő! Köszi, hogy megosztottad! Nem vagyok otthon az MTG motorok világában, gyors kereséssel van pár másik nyílt forrású motor (forge, xmage). Ezekkel van tapasztalatod? Szerintem valószínű, hogy a Claude ezeken is lett tanítva és érdekes lenne tudni a hasonlóságokat.
laxika@reddit (OP)
XMage-t nézegettem annó, de nagyon máshogy működik. Azért akartam újat írni mert nagyon tightly coupled ott a UI a logikával. A végeredmény teljesen más lett, hiába trainingelték az AI-t ezeken a projecteken. Amúgy is meglepődnék a nagy engine beli hasonlóságokon mert én alakítgattam a promptokkal a kód kinézetét és végén az az opció lett amivel már együtt tudtam élni. Teljesen organikusan ált össze az egész.
Nézd meg pl a két kártya implementáció közti különbséget:
https://github.com/laxika/magical-vibes/blob/main/magical-vibes-card/src/main/java/com/github/laxika/magicalvibes/cards/w/WakeningSunsAvatar.java
https://github.com/magefree/mage/blob/master/Mage.Sets/src/mage/cards/w/WakeningSunsAvatar.java
yodeah@reddit
Ezert jarok ide.
laxika@reddit (OP)
Van egy test harness ami felhúz egy "játékot" és azzal tesztelm minden lapot.
Itt egy példa egy lapra:
[]()
Magát a lapot teszteli a rendszer több különböző tesztesettel.
https://github.com/laxika/magical-vibes/blob/main/magical-vibes-backend/src/test/java/com/github/laxika/magicalvibes/cards/w/WakeningSunsAvatarTest.java
Nem mindig optimális, mert ha egy lap egy effectet használ akkor lehetne csak tesztelni az effectet. Ez általában egyszerűbb lapoknál jön elő amik 1-1 dolgot csinálnak. Viszont eddig még a tesztek hossza nem volt probléma így ezeket az eseteket is bent hagytam. A jövőben viszont majd gyomlálni kell őket mert elég lassú már a full build.
Emmellett a problémásabb osztályokra van unit teszt lefedettség is. Sajnos nem mindenhol van minden eset lefedve mert az x20 planban annyi token volt hogy örültem ha minél kevesebb agymunkával minél többet fel tudok használni. De tervezem majd a lefedettséget növelni.
Emellett vannak fuzzing tesztek is. Az teszt létrehoz egy játékot két AI-al. Mindegyik AI kap egy random generált két színű paklit és nyomják egymás ellen. A hibák nagyon jelentős részét ez hozta/hozza ki. Az elején bebugolt az AI 5 game után (megált a játék), most már 1000 game sem akadály. Persze errorokat néha még dob itt ott, ezeket folyamatosan javítgatom.
https://github.com/laxika/magical-vibes/blob/main/magical-vibes-backend/src/test/java/com/github/laxika/magicalvibes/ai/RandomAiFuzzTest.java
Routine-Lettuce-4854@reddit
Egyszerre lenyűgöző, ijesztő és demotíváló. Grats!
Jól tippelem, hogy ez a kártyák illetve a játék szabályainak követését nem teszteli? Mert attól, hogy lefut egy játék, még nem biztos hogy közben nem volt semmi szabálytalan.
Ennél az izgalmas teszt eset az lenne, hogy a kezedből kerül a játékba, de nem castoltad hanem pl. Smuggler's Surprise-al raktad le. Illetve a kevésbé necces, hogy castoltad, de nem kézből, pl. mert airbendelve volt.
Az AI mennyire volt benne az architektúra kialakításában? Azt még te csináltad? Azt próbálom megérteni, hogy ez még mindig az az AI szint amit ismerek: az unalmas "csak darálni kell" részeket bízod rá, vagy ez már egy szinttel erősebb. Mennyi volt az az "alap" amit megcsináltál neki?
laxika@reddit (OP)
Így van, viszont, viszont jól kihozza a nullpointereket, amikor lefagy az AI (megpróbál valamit végtelen ciklusban kijátszani úgy hogy nincs rá mana, fizetni kell a támadáskor de nem tud, stb). Rengeteg hibát megtalált. Persze a játék validálására nem jó (sajnos).
Na igen. Sajnos jópár eset ki tud maradni. Ezen majd "swarmolással" próbálok majd javítani a jövőben ha lesz rá idő és keret. Megmondom az AI-nak hogy egy packageben szereplő kártyákon menjen végig x agentel, nézze meg a tesztlefedettséget + a errata szabályokat és ha valami eltérést talál akkor jelezze.
Amúgy egész jól lefedte ha megnézed mert a végén van egy teszt ami Beacon of Unrest-el hozza vissza graveyardból, de persze lehetne még jó pár esettel bővíteni. Ez akkor lesz majd érdekes ha sokkal több effect le lesz fejlesztve (pl Airbend) és akkor egy swarm végig megy minden lapon mégegyszer hogy bővítse a teszteket.
Az eredeti gradle modulok + Spring init és Angular init volt kézzel. A többi mind AI. Az első pár commitot nem Claude-n keresztül csináltam így ott még nem látszik, de azokat is írogatta. Csak a modulokat setupoltam neki. Talán az 5-6. committól vette át ő a kódolást. A DB-nél már adogattam hozzá a settingseit és ez a 7. commit:
https://github.com/laxika/magical-vibes/commit/a3e090a360a950e06f4e250a22e1ab8a3b9d4fbf
Routine-Lettuce-4854@reddit
Ez sajnos semmit nem mond, Javat egyszer, 24 éve láttam közelről, akkor is csak azért mert egy hálozati protokolhoz példa abban volt. Ja és most amikor nézegettem ennek a forrását :)
Arra gondolok, hogy ahogy fel van építve. Pl. hogy milyen logika dönti el, hogy valami helyben van kezelve a támadásnál; hogy a kártyák / effektek is javaban vannak írva, nem mondjuk valami script nyelven; hogy mi az ami egy új effektet érdemel, ilyesmik.. Félek kötekedésnek érződik, de tényleg nem annak szánom. Hogy legyen egy konkrét kérdés: declareAttackers függvény létét az AI találta ki, vagy te kérted?
BTW, PutXMinusOneMinusOneCountersOnEachCreatureEffect nem csinál semmit :)
laxika@reddit (OP)
Ohh, akkor kevésbé technikailag fogalmazok. Én csak a mappákat hoztam létre és az alap project setupot (hogy milyen technológiákat használjon). Minden mást, beleértve a declareAttackers-t is az AI csinálta.
A `PutXMinusOneMinusOneCountersOnEachCreatureEffect` elvileg itt fult le: `com.github.laxika.magicalvibes.service.effect.PermanentCounterResolutionService#resolvePutXMinusOneMinusOneCountersOnEachCreature` és a `Black Sun's Zenit nevű lap használja.
Itt leírom hogyan implementálta az AI a lapokat:
https://youtu.be/mklNa55sBKg?si=-4N-H0oAPIM_AAV7&t=516
Épp egy effectet is leimplementál (ugyan conditional effectet, de a többi is hasonlóan megy).
Routine-Lettuce-4854@reddit
Köszi. Még kevésbé úgy működik ahogy gondoltam.
Aurii_@reddit
Nem értem miért vagy Downvoteolva, tök racionális kérdések ezek...
laxika@reddit (OP)
Van egy test harness ami felhúz egy "játékot" és azzal tesztelm minden lapot.
Itt egy példa egy lapra:
Magát a lapot teszteli a rendszer több különböző tesztesettel.
https://github.com/laxika/magical-vibes/blob/main/magical-vibes-backend/src/test/java/com/github/laxika/magicalvibes/cards/w/WakeningSunsAvatarTest.java
Nem mindig optimális, mert ha egy lap egy effectet használ akkor lehetne csak tesztelni az effectet. Ez általában egyszerűbb lapoknál jön elő amik 1-1 dolgot csinálnak. Viszont eddig még a tesztek hossza nem volt probléma így ezeket az eseteket is bent hagytam. A jövőben viszont majd gyomlálni kell őket mert elég lassú már a full build.
Emmellett a problémásabb osztályokra van unit teszt lefedettség is. Sajnos nem mindenhol van minden eset lefedve mert az x20 planban annyi token volt hogy örültem ha minél kevesebb agymunkával minél többet fel tudok használni. De tervezem majd a lefedettséget növelni.
Emellett vannak fuzzing tesztek is. Az teszt létrehoz egy játékot két AI-al. Mindegyik AI kap egy random generált két színű paklit és nyomják egymás ellen. A hibák nagyon jelentős részét ez hozta/hozza ki. Az elején bebugolt az AI 5 game után (megált a játék), most már 1000 game sem akadály. Persze errorokat néha még dob itt ott, ezeket folyamatosan javítgatom.
https://github.com/laxika/magical-vibes/blob/main/magical-vibes-backend/src/test/java/com/github/laxika/magicalvibes/ai/RandomAiFuzzTest.java
DelusionalDuck9@reddit
Mennyire érzed magadénak a projektet így, hogy AI generálta szinte az egészet? Nekem ez a pitfall amikor ilyen dolgokba belekezdek: gyorsan összehozok valami minimumot, elkezdem bővíteni, de elfogy a kedvem amikorráeszmélek, hogy ezt nem én csinálom, hanem az AI igazából.
laxika@reddit (OP)
Rengeteg munka volt vele, így eléggé a magaménak érzem. A 3000 commitot mind nekem kellett kézzel jóváhagynom ami magában elég időigényes feladat. Már csak a 3000 approve se 5 perc, átfutni őket meg még jóval időigényesebb. Emellett terelgetni kellett folyamatosan.
Kicsit olyan mintha kapálógépet használna az ember. Ő dolgozik, de ha nem irányítod az egész nem ér semmit + közben rángatja a kezed is össze vissza szóval küzdeni is kell vele. :D
LlopezZ_@reddit
Egyetertek, azert en nem egy random manager altal vibe codolt fostalicska repo alapjan
zopad@reddit
A 3000 commitból kb hánynál vettél észre hibát, és hánynál kellett kézzel belejavítanod?
laxika@reddit (OP)
Ez változott attól hogy mennyire lett "mature" a rendszer. Az elején kb minden 2-3. commitban volt valami ami nem tetszett, utána ez javult olyan 5 körülire. Minden lap egy külön commit (mert közte kiürítettem az AI contextjét). Azokkal szokott probléma lenni ahol új effectek kerültek a játékba. Minél több lap meg lett csinálva, annál kevesebb lett az újdonság.
Kézzel már csak elvből sem javítottam bele :) csak az eredeti gradle modulok + Spring init és Angular init volt kézzel. Hagytam egy commentet az AI-nak aztán amikor újra arra a tabra keveredtem megnéztem hogy volt-e valami előzmény vagy csak a szokásos "fejleszd le az xyz kártyát".
Haunting_Painting286@reddit
:D ez de jó hasonlat!
Additional_Shape_452@reddit
Gratula!
Csodálom hogy még nem jöttek meg az AI semmire sem jó és soha nem tud semmi hello worldnél komplexebbet megoldani stb jellegü kommentek.
t2yeti@reddit
Ezek a kommentek itt vannak velünk a szobában?
Additional_Shape_452@reddit
Még nincs, ezért is csodálkozok.
Infamous-Bed-7535@reddit
"kicsit több mint 500 ezer sor kóddal"
Ez azért elég félelemetesen hangzik. Mindenesetre grat, tanulásra mindenképpen jó volt :)
Vaganyzar@reddit
Mondjuk az jó kérdés, hogy egy ekkora projekt indokolja ezt a sorszámot.
laxika@reddit (OP)
Zavart ez a comment és újrafuttattam a statisztikát és igazad van. A kód tesztek és új sorok nélkül csupán 105k, ami jelentősen logikusabb. Javítom is mindjárt a postban.
Additional_Stay_9768@reddit
Gratulalok, ez szep teljesitmeny, es egyben remek pelda arra, amikor az ember az AI segitsegevel letre tud hozni szuper cuccokat! A karogok ne erdekeljenek, 1-2 ev es nem lesz munkajuk, mert keptelenek fejlodni, tanulni es mint eszkozt hasznalni a sajat javukra!
purplehu@reddit
Nagyon komoly cucc! Tudni kell, hogy mit csinálsz, mert ilyen komplexitású projektnél az AI folyamat megmakkan. Le a kalappal!
PanelPO@reddit
A komplett szabálykönyvet beolvastatod vele minden módosításnál? Vagy kellett valami trükk, hogy contextbe beférjenek a szabályok?
laxika@reddit (OP)
Itt talán egy kicsit csaltam. Az AI ismerte a szabályokat szerintem a training adataiból. Néha a szabály paragrafus számát melléhalucinálta, de összességében tudta hogy mi merre hogyan. Eredetileg próbálkoztam azza hogy egy compact szabály kivonatot csináltatok vele. A végeredmény egész jó volt és szerintem működött volna. Sok szabálynál (kulcsszavaknál mint pl a Haste) csak a neve és a szabály száma szerepelt volna, aztán egy MCP szerver vissza tudta volna adni a szabály szövegét a szám alapján.
Mersaul4@reddit
Gratula, szuper teljesítmény!