<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Vincent Augusto</title>
    <description>The latest articles on DEV Community by John Vincent Augusto (@john_vincentaugusto_2643).</description>
    <link>https://dev.to/john_vincentaugusto_2643</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2735065%2F4404e5b3-6b82-44e4-9b21-ded2cea661d5.png</url>
      <title>DEV Community: John Vincent Augusto</title>
      <link>https://dev.to/john_vincentaugusto_2643</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john_vincentaugusto_2643"/>
    <language>en</language>
    <item>
      <title>How I Built a Retro Python Game with Amazon Q CLI</title>
      <dc:creator>John Vincent Augusto</dc:creator>
      <pubDate>Mon, 30 Jun 2025 15:38:18 +0000</pubDate>
      <link>https://dev.to/john_vincentaugusto_2643/how-i-built-a-retro-python-game-with-amazon-q-cli-3nbk</link>
      <guid>https://dev.to/john_vincentaugusto_2643/how-i-built-a-retro-python-game-with-amazon-q-cli-3nbk</guid>
      <description>&lt;p&gt;I recently jumped on the "Build Games with Amazon Q CLI and score a T shirt 🏆👕" challenge. As a developer who loves a good retro arcade game and is curious about AI-driven development, this was the perfect excuse to dive in. The mission was simple: build a game using Amazon Q's command-line interface, document the journey, and share the results.&lt;/p&gt;

&lt;p&gt;The result? A fully-functional, nostalgic side-scrolling shooter called &lt;strong&gt;Space Conquer&lt;/strong&gt;, and a ton of insights into pairing AI with a classic coding project. Here’s how it went down.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Game: "Space Conquer" - A Modern-Classic Shooter
&lt;/h2&gt;

&lt;p&gt;For my project, I chose to build &lt;strong&gt;Space Conquer&lt;/strong&gt;, a side-scrolling space shooter inspired by the classic &lt;em&gt;Space Impact&lt;/em&gt; from old Nokia phones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a Retro Shooter?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Nostalgia Factor:&lt;/strong&gt; Like many, I have fond memories of playing &lt;em&gt;Space Impact&lt;/em&gt;. I wanted to capture that simple, addictive fun but with a modern coat of paint—better graphics, dynamic sound, and smoother controls.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;A Great Test for AI:&lt;/strong&gt; A 2D shooter involves a fantastic mix of programming challenges that are perfect for an AI assistant: managing game states, handling real-time user input, collision detection, and creating varied enemy behaviors.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Extensibility:&lt;/strong&gt; I didn't just want to build a game; I wanted to build a &lt;em&gt;framework&lt;/em&gt;. My vision was a modular design where new enemies, power-ups, or levels could be added easily. This is where an AI's ability to generate structured, boilerplate code would really shine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Space Conquer features diverse enemies, collectible power-ups, dynamic audio that changes with the game state, and even a hidden developer panel for testing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8zupemmbpsg7pg5r735.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8zupemmbpsg7pg5r735.png" alt="Main Menu sneak peek" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unlocking AI's Potential: Effective Prompting Techniques
&lt;/h2&gt;

&lt;p&gt;Working with Amazon Q CLI is a conversation. The better your questions, the better the answers. I quickly learned that vague prompts like "make a game" were less effective than breaking down the problem into specific, well-defined tasks.&lt;/p&gt;

&lt;p&gt;Here are a few prompting techniques I discovered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technique 1: Requesting a Modular Architecture
&lt;/h3&gt;

&lt;p&gt;Instead of asking for a single, monolithic script, I prompted for a clean, organized structure from the start.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Prompt:&lt;/strong&gt; "Create a project structure for a PyGame-based space shooter. I need separate modules for asset management, sprites (player, enemies, bullets), UI components, and the main game loop. The asset manager should load images and sounds from manifest files."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; Amazon Q generated a directory structure (&lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;assets/&lt;/code&gt;, &lt;code&gt;tools/&lt;/code&gt;) and starter Python files for each module (&lt;code&gt;asset_loader.py&lt;/code&gt;, &lt;code&gt;sprites.py&lt;/code&gt;, &lt;code&gt;ui.py&lt;/code&gt;, &lt;code&gt;main.py&lt;/code&gt;). The generated &lt;code&gt;asset_loader.py&lt;/code&gt; included a function to read a JSON manifest, which was a huge head start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technique 2: Defining Behavior with Roles and Rules
&lt;/h3&gt;

&lt;p&gt;When creating enemies, I defined their characteristics and constraints clearly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Prompt:&lt;/strong&gt; "Generate a Python class &lt;code&gt;Enemy&lt;/code&gt; that inherits from &lt;code&gt;pygame.sprite.Sprite&lt;/code&gt;. It needs attributes for health, speed, and score value. Then, create a subclass &lt;code&gt;EliteEnemy&lt;/code&gt; that moves in a sine wave pattern down the screen and fires a bullet every 2 seconds."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; Q provided a base &lt;code&gt;Enemy&lt;/code&gt; class and a well-defined &lt;code&gt;EliteEnemy&lt;/code&gt; subclass with its &lt;code&gt;update()&lt;/code&gt; method already implementing the sine wave movement using &lt;code&gt;math.sin()&lt;/code&gt;. This saved me from figuring out the trigonometry and timing loops myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Handled Classic Programming Challenges
&lt;/h2&gt;

&lt;p&gt;Game development is full of recurring problems. Here's how Amazon Q helped tackle some of the classics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State Management:&lt;/strong&gt; A game needs distinct states like 'main_menu', 'gameplay', 'settings', and 'game_over'. I prompted the AI to implement a simple state machine. It generated a &lt;code&gt;GameManager&lt;/code&gt; class that held the current state and handled transitions, ensuring that the main menu logic didn't run during gameplay and vice-versa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collision Detection:&lt;/strong&gt; A core mechanic of any shooter. I asked Q for an efficient way to check for collisions between player bullets and enemies, and between the player and enemy ships or bullets. It suggested using PyGame's built-in &lt;code&gt;pygame.sprite.groupcollide()&lt;/code&gt; function, providing a concise and performant solution that I could drop right into my main game loop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Power-Up Spawning:&lt;/strong&gt; I wanted power-ups to drop randomly from destroyed asteroids. I prompted: "When an asteroid is destroyed, there should be a 15% chance of it dropping a power-up. The power-up type (health, speed, rapid-fire) should be chosen randomly." The AI generated a clean &lt;code&gt;if random.random() &amp;lt; 0.15:&lt;/code&gt; check and a &lt;code&gt;random.choice()&lt;/code&gt; call to select from a list of power-up types.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Time-Saving Automation: More Than Just Code
&lt;/h2&gt;

&lt;p&gt;One of the biggest wins was using AI for automation &lt;em&gt;around&lt;/em&gt; the code. The project summary mentions developer tools, and Q was instrumental here.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Asset Manifest Generator
&lt;/h3&gt;

&lt;p&gt;My game uses JSON files to manage all assets (images, sounds, maps). Manually keeping these in sync is tedious.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Prompt:&lt;/strong&gt; "Write a Python script for the &lt;code&gt;tools/&lt;/code&gt; directory that scans the &lt;code&gt;assets/images/enemies&lt;/code&gt; and &lt;code&gt;assets/sounds/sfx&lt;/code&gt; directories and automatically generates a &lt;code&gt;manifest.json&lt;/code&gt; file with all the file paths."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This single prompt created a utility script that saved me countless minutes of error-prone manual editing every time I added a new enemy sprite or sound effect.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Cross-Platform Launcher
&lt;/h4&gt;

&lt;p&gt;I wanted a simple way for anyone to run the game, regardless of their OS.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Prompt:&lt;/strong&gt; "Create a Python script named &lt;code&gt;run_game.py&lt;/code&gt; that checks the user's operating system. It should ensure all dependencies from &lt;code&gt;requirements.txt&lt;/code&gt; are installed using pip and then launch the &lt;code&gt;main.py&lt;/code&gt; script."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Q generated a script using the &lt;code&gt;subprocess&lt;/code&gt; and &lt;code&gt;sys&lt;/code&gt; modules that provided a one-click experience—a small but professional touch that I might have skipped otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-Generated Code That Impressed Me
&lt;/h2&gt;

&lt;p&gt;It's one thing to generate boilerplate, but another to produce elegant solutions. Here are a couple of snippets that stood out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Manifest-Driven Asset Loader
&lt;/h3&gt;

&lt;p&gt;This function, generated early on, set the foundation for the game's modularity. It loads all assets listed in a JSON file into a dictionary, making them easily accessible throughout the game.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Part of src/asset_loader.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_assets_from_manifest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manifest_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Loads images and sounds based on a JSON manifest file.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;assets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;images&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sounds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manifest_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;images&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;images&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;convert_alpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error loading image &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sounds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sounds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error loading sound &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;assets&lt;/span&gt;

&lt;span class="c1"&gt;# Example Usage in main.py
# ASSETS = load_assets_from_manifest('assets/manifest.json')
# player_img = ASSETS['images']['player_ship']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This design is clean, error-handled, and makes adding 50 new assets as easy as adding one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Base Class for Animated UI Panels
I wanted the UI to have a modern, "glowing" feel. I asked Q to create a reusable class for this.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Part of src/ui.py
import pygame

class GlowingPanel(pygame.sprite.Sprite):
    """
    A UI panel that has a subtle pulsing glow effect by alpha blending.
    """
    def __init__(self, rect, color, glow_color):
        super().__init__()
        self.rect = rect
        self.color = color
        self.glow_color = glow_color
        self.image = pygame.Surface(self.rect.size, pygame.SRCALPHA)

        self.glow_alpha = 100
        self.glow_direction = 2 # Rate of change for alpha

    def update(self):
        """Update the pulsing glow effect."""
        self.glow_alpha += self.glow_direction
        if self.glow_alpha &amp;gt;= 180 or self.glow_alpha &amp;lt;= 80:
            self.glow_direction *= -1

        self.image.fill((0, 0, 0, 0)) # Clear with transparency

        # Draw base panel
        pygame.draw.rect(self.image, self.color, (0, 0, self.rect.width, self.rect.height), border_radius=8)

        # Draw glow effect (a slightly larger rect with changing alpha)
        glow_surface = pygame.Surface(self.rect.size, pygame.SRCALPHA)
        glow_rect = pygame.Rect(0, 0, self.rect.width, self.rect.height)
        glow_color_with_alpha = (*self.glow_color, self.glow_alpha)
        pygame.draw.rect(glow_surface, glow_color_with_alpha, glow_rect, border_radius=10)

        # Blit the glow onto the main surface
        self.image.blit(glow_surface, (0,0), special_flags=pygame.BLEND_RGBA_ADD)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This self-contained class for a UI element with its own animation logic is a great example of the object-oriented code Q can produce. It's reusable for scoreboards, health bars, or any other panel in the game.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
Using Amazon Q CLI for the "Build Games" challenge was a fantastic experience. It didn't just write code for me; it acted as a partner that handled the tedious, boilerplate, and sometimes complex parts of development, freeing me up to focus on the creative vision for "Space Conquer."&lt;/p&gt;

&lt;p&gt;If you're a developer who hasn't tried integrating an AI assistant into your workflow, I highly recommend it. Pick a fun project, break it down into small pieces, and start prompting. You'll be surprised at how much you can build.&lt;/p&gt;

&lt;p&gt;And hey, I might even get a t-shirt out of it.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>amazonqcli</category>
      <category>python</category>
      <category>pygame</category>
    </item>
  </channel>
</rss>
