{"id":1074,"date":"2026-10-12T10:17:25","date_gmt":"2026-10-12T17:17:25","guid":{"rendered":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/?p=1074"},"modified":"2026-10-21T11:51:26","modified_gmt":"2026-10-21T18:51:26","slug":"ascii-assault-a-post-mortem","status":"publish","type":"post","link":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/2026\/10\/ascii-assault-a-post-mortem\/","title":{"rendered":"ASCII Assault: A Post-Mortem"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"310\" class=\"alignright wp-image-1103\" style=\"width: 460px;\" src=\"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-content\/uploads\/2026\/10\/ascii_assault-hero.png\" alt=\"\" srcset=\"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-content\/uploads\/2026\/10\/ascii_assault-hero.png 746w, https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-content\/uploads\/2026\/10\/ascii_assault-hero-300x202.png 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/>While deep diving into LLMs I built a video game. A text-based shooter with waves, escalating difficulty, sound effects, and a scoring system. It runs in a browser. You can play it right now (see top comment).<br><br>My coding is limited to scripting languages for the most part (PHP for the win).<br><br>I can write JavaScript. But I didn\u2019t know the canvas API. Nonetheless I directed the construction of a playable, shippable game.<br><br>Here&#8217;s how.<br><br>I started in ChatGPT. Described what I wanted\u2026 a text shooter in the spirit of 1990\u2019s Shootem Up style games (SHMUPS) but in ASCII graphics because I\u2019m not an artist and I wanted to do this all in a single HTML page. ASCII characters as enemies, keyboard-driven, waves that get harder. ChatGPT gave me a working foundation fast. First prototype was up in minutes.<br><br>Then the tuning started, and the wheels came off.<br><br>If you&#8217;ve never made a game, here&#8217;s the thing nobody tells you: getting it to run is maybe 20% of the work. Getting it to feel right is the other 80%. And &#8220;feel right&#8221; is not something you can spec in a prompt. It&#8217;s something you know from experience\u2026 from decades of playing games, thinking about games, writing about games, and watching other people play them.<br><br>The hit detection was wrong. Not broken. Wrong. The escalation curve was too linear. Spawn timing on later waves felt arbitrary instead of intentional. The audio feedback didn&#8217;t match the visual rhythm, and the parallax scrolling terrain was a total hot mess.<br><br>I could articulate all of it. I just didn\u2019t want to spend days unraveling what the model had created when the next time through the prompt the code was likely to reshuffle (one step forward, two steps back).<br><br>ChatGPT started chasing its tail. I&#8217;d describe a problem, it would fix it and break something else. We were going in circles.<br><br>I set it aside\u2026 then later I moved to Claude.<br><br>Not because Claude was &#8220;better&#8221;, but because the project needed a fresh context and a different reasoning style. I ported my intent, not my code. I described what the game was supposed to be, what was wrong, and what &#8220;done&#8221; looked like. Things that had been circular started converging.<br><br>What came out the other end is a real, playable game that I tuned to my satisfaction. I&#8217;m the designer, the QA department, and the creative director. The AI was my development team. Two different developers, hired for different phases of the project, managed by someone who understood the product but couldn&#8217;t do their job for them.<br><br>That&#8217;s the skill. Not coding. Not prompt engineering. Knowing what done looks like.<br><br>I used my lived knowledge\u2026 the kind Google and an LLM don&#8217;t have and turned a chatbot into a toolchain.<br><br>Many executives I talk to think AI fluency means writing better prompts. No. It means knowing a domain deeply enough to steer the conversation. The model writes the code. You have to know when the output is right even though you can&#8217;t read it.<br><br>That&#8217;s the job now.<br><br><hr><br>Give the game a spin here: <a href=\"https:\/\/kitchencloset.com\/usr\/bin\/ascii_assault\/\">https:\/\/kitchencloset.com\/usr\/bin\/ascii_assault\/<\/a> and leave me a comment below on what you liked, any bugs you found, etc&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>While deep diving into LLMs I built a video game. A text-based shooter with waves, escalating difficulty, sound effects, and a scoring system. It runs in a browser. You can play it right now (see top comment). My coding is limited to scripting languages for the most part (PHP for the win). I can write [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[246,12,111],"tags":[196,291,292,294,296,295,293,297],"class_list":["post-1074","post","type-post","status-publish","format-standard","hentry","category-ai-rant","category-general","category-unloading","tag-ai","tag-ascii","tag-games","tag-shmup","tag-shooter","tag-side-scroller","tag-text-based","tag-web-game"],"_links":{"self":[{"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/posts\/1074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/comments?post=1074"}],"version-history":[{"count":4,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/posts\/1074\/revisions"}],"predecessor-version":[{"id":1116,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/posts\/1074\/revisions\/1116"}],"wp:attachment":[{"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/media?parent=1074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/categories?post=1074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kitchencloset.com\/home\/bryan\/blog\/wp-json\/wp\/v2\/tags?post=1074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}