Amazon Q Developer 实践:零基础创建贪吃蛇游戏

人工智能
游戏
生成式人工智能
Amazon Bedrock
Amazon Q
0
0
本文探讨了如何使用 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 根据结构化的提示词,直接生成一个贪吃蛇游戏原型,并剖析了其背后人工智能的思考和迭代完善过程,展示了人工智能能快速进行游戏原型创作的巨大潜力。 原文出处来自作者于 2024 年 9 月在 community.aws 发表的技术文章: “[From Concept to Playable in Seconds: Creating the Greedy Snake Game with Amazon Q Developer](https://community.aws/content/2mlndUmDADGwEWfv2K5SUmgJCM4/?trk=cndc-detail)” ### **概述** 在我之前的“[Amazon Bedrock 实践:零基础创建贪吃蛇游戏](https://dev.amazoncloud.cn/column/article/66ceac7c1db7ac34cb43b585)”的文章中,我展示了如何使用 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 和结构化的文本提示词,直接生成贪吃蛇游戏原型的完整过程。文章发表后,许多开发人员反馈说深受这篇文章的启发,并好奇地询问 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 是否也能够类似这样来直接生成贪吃蛇游戏原型。这就是我将在本文中具体和各位开发者探讨的内容。 贪吃蛇是一款风靡了几代人的老式游戏。游戏目标很简单: 通过控制一条不断增长的小蛇,引导它吃下食物,同时避免撞到游戏界面的边界或蛇身。小蛇吃下越多食物,身体就会越长,游戏难度也就越大,需要玩家迅速反应和具备全局策略思维。 接下来,让我们看看 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 通过结构化的自然语言提示词,来直接生成完整贪吃蛇游戏原型代码的非凡能力。 ### **提示词** 我将使用之前那篇关于 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 生成贪吃蛇原型代码的博客文章中,相同的结构化提示词,来与 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 进行交互;这样各位读者将可以观察到:[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 和 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 在整个代码生成过程中的具体差异和区别。 以下是我用于生成贪吃蛇游戏原型代码的提示词: *“Write a short and high-quality python script for the following task, something a very skilled python expert would write. You are writing code for an experienced developer so only add comments for things that are non-obvious. Make sure to include any imports required.* *NEVER write anything before the `python` block. After you are done generating the code and after the `python` block, check your work carefully to make sure there are no mistakes, errors, or inconsistencies.* *If there are errors, list those errors in tags, then generate a new version with those errors fixed. If there are no errors, write "CHECKED: NO ERRORS" in tags.* *Here is the task: **write a greedy snake game.*** *Double check your work to ensure no errors or inconsistencies.”* 如上所述,整段结构化的提示词提供了对游戏的主要功能、需使用的库、以及其他实现细节的详细要求。在提示词中提供这种程度的具体细节描述,对于获得高质量的代码输出至关重要。 ### **开发特性 /dev** 如下图所示,在 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 聊天对话框中,我在输入提示词描述之前,先输入了 **"/dev"**。 ![image.png](https://dev-media.amazoncloud.cn/69c317d568534b919bd9e0ffbf90f0d8_image.png "image.png") 在 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的上下文中,**"/dev"** 是一个特殊命令,用于调用 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer Agent 进行软件开发,而不是指 Linux 系统中的目录。 您可以参考以下链接中的 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer Agent 文档,以了解详细信息:https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/software-dev.html?trk=cndc-detail ### **与 Amazon Q Developer 互动** 以下截图展示了与 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的聊天互动界面。我要求其为贪吃蛇游戏原型生成高质量的 Python 脚本,其确认了该请求,并告知我生成代码可能需要的时间(几分钟)。 ![image.png](https://dev-media.amazoncloud.cn/4ef95c6f370647109bf589970e1a2ba6_image.png "image.png") 数分钟后,[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 以思考过程汇总的形式作出了回应,这其实也体现了其背后大型语言模型的思考过程,如下图所示。 ![image.png](https://dev-media.amazoncloud.cn/da6019dce21946c7a14578e989aff4e7_image.png "image.png") 让我们来一起梳理 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的思考过程。 根据 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的以上汇总摘要,其创建一款贪食蛇游戏原型经历了以下步骤: 1. 首先,它计划打开与编写贪食蛇游戏的问题陈述相关的现有本地代码,以探索工作空间并确定是否有可以重用或修改的代码。 2. 接着,它发现因为工作区是空的,没有与贪吃蛇游戏相关的代码文件,需要自己重新编写。为了解决这个问题,它决定创建一个名为 "snake_game.py" 的 Python 新文件,并准备从头开始实现贪食蛇游戏原型代码。 3. 贪食蛇游戏原型代码,随后在 "snake_game.py" 的 Python 文件中被它实现了,它还声明:代码已经完成并能正常运行了。 4. 然后,它对代码进行了仔细地审阅。审阅完成后,它确认了贪食蛇游戏原型的代码已经完整实现,并已经能够正常运行了。它还特别提及:代码已经包括了所有必需的组件,例如游戏初始化、主游戏循环、蛇形移动、食物生成、碰撞检测和得分显示等等。 图中底部的 "Files used" 部分,总结了代码生成过程中执行的文件操作,供我们参考。 ### **输出完整的贪吃蛇游戏原型代码** 以下代码即由 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 完整生成的游戏原型代码。 ```js import pygame import random # Initialize Pygame pygame.init() # Set up the game window width, height = 640, 480 window = pygame.display.set_mode((width, height)) pygame.display.set_caption("Greedy Snake") # Colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) # Snake properties snake_block = 20 snake_speed = 15 # Initialize clock clock = pygame.time.Clock() # Font for score display font = pygame.font.SysFont(None, 50) def draw_snake(snake_list): for block in snake_list: pygame.draw.rect(window, GREEN, [block[0], block[1], snake_block, snake_block]) def game_loop(): game_over = False game_close = False # Starting position of the snake x1 = width // 2 y1 = height // 2 # Initial movement x1_change = 0 y1_change = 0 # Initialize snake snake_list = [] length_of_snake = 1 # Generate first food foodx = round(random.randrange(0, width - snake_block) / snake_block) * snake_block foody = round(random.randrange(0, height - snake_block) / snake_block) * snake_block while not game_over: while game_close: window.fill(BLACK) message = font.render("You Lost! Press Q-Quit or C-Play Again", True, RED) window.blit(message, [width // 6, height // 3]) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: game_loop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 # Check if snake hits the boundaries if x1 >= width or x1 < 0 or y1 >= height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change window.fill(BLACK) pygame.draw.rect(window, RED, [foodx, foody, snake_block, snake_block]) snake_head = [x1, y1] snake_list.append(snake_head) if len(snake_list) > length_of_snake: del snake_list[0] # Check if snake hits itself for segment in snake_list[:-1]: if segment == snake_head: game_close = True draw_snake(snake_list) # Display score score = font.render(f"Score: {length_of_snake - 1}", True, WHITE) window.blit(score, [0, 0]) pygame.display.update() # Check if snake eats food if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, width - snake_block) / snake_block) * snake_block foody = round(random.randrange(0, height - snake_block) / snake_block) * snake_block length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() if __name__ == "__main__": game_loop() ``` 以下截图展示了以 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 生成的贪吃蛇游戏原型代码片段为背景,前景为该游戏代码运行时的截图: ![image.png](https://dev-media.amazoncloud.cn/f5c6a3d4788a41b78d14d3274502cef8_image.png "image.png") 在深入了解 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 实现的游戏原型代码之前,理解 Pygame 在游戏开发中的作用是非常重要的。Pygame 是一组专门用于编写多媒体应用程序(包括游戏)的 Python 模块。它提供了丰富的功能,从处理图形、声音,到管理用户输入、游戏事件等等。 上述代码是使用 Pygame 库编写的经典贪吃蛇游戏原型的 Python 实现。 其主要功能包括:设置游戏窗口、初始化蛇和位置、生成食物、处理用户输入以控制蛇身移动、检测与边界或蛇身是否发生碰撞、更新游戏状态,以及在屏幕上渲染游戏元素等等。游戏将持续进行,直到蛇与边界或自身发生碰撞,此时玩家可以选择退出或重新启动游戏。 不过,如果你是一个游戏新手,以上 AI 生成的游戏原型代码运行后,蛇移动的速度可能会过快,从而让游戏初级玩家无法掌控。 因此,我接着给 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 又安排了一个新任务: 调整蛇奔跑的速度。 ### **调整蛇的奔跑速度** 以下是我拟提交给 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的交互对话框,从而可以调整贪吃蛇游戏中蛇奔跑速度的英文提示词: *“The code works, but the speed of the snake is too fast. I'm just a beginner at the game, could you adjust the game's speed for me?”* ![image.png](https://dev-media.amazoncloud.cn/ac77eb68cbbd4be4b6b6dc6976abe044_image.png "image.png") 在提交提示词后,[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 迅速作出回应,截图如下所示: ![image.png](https://dev-media.amazoncloud.cn/c959e7bf77084311873cbc667d4b76d0_image.png "image.png") 以上截图展示了一段我和 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的聊天对话记录。 我要求对贪吃蛇游戏的代码进行调整,并表示当前的速度对于初学者来说太快了。 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的回复,解释了如何将初始值为 15 的 snake_speed 变量修改为较低的 8。这样蛇的移动速度就会减慢,游戏对初级玩家来说会更加易于控制。底部的代码片段显示了将 snake_speed 从 15 改为 8,并添加了注释说明这一调整。 你可以按照上述建议进行操作,只需要修改其中一行代码,如下所示: ```js snake_speed = 8 ``` 把新修改后的代码运行起来。你会发现:蛇奔跑的速度比之前慢多了,即使是游戏初级玩家也可以自由地控制蛇的运行啦! ### **小结** 本文展示了 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 在根据自然语言的结构化提示词,生成游戏原型代码方面的卓越潜力。 生成的代码体现了 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 以及其背后的大模型,理解复杂需求、利用流行库以及根据用户反馈进行迭代改进的巨大潜力。通过调整蛇的速度,其展现了对个性化游戏体验的适应性探索,而整个思维过程的汇总提供了其宝贵的见解,增强了人类对 AI 系统的透明度和信任度。 随着 AI 技术的不断进步,像 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 这样的 AI 工具有可能彻底改变软件开发领域,加速应用程序或游戏的原型制作和迭代周期,并极大地促进创新。虽然本文展示的贪吃蛇游戏只是一个较简单的案例,但 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 展示出来的能力,为其在更复杂的应用程序开发方向开辟了令人兴奋的无限可能。 **特别说明**:本文封面图像是由 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 上的 Stable Diffusion SD3 Large 1.0 模型生成的。我使用的提示词如下,供大家参考: *“An illustration of a greedy snake slithering through a modern abstract circuit board design, with binary code and computer components in the background, representing the fusion of classic gaming and cutting-edge AI technology. The snake should be large, bold, and vibrant, with a sleek and dynamic appearance. The background should have a futuristic and digital aesthetic, with glowing neon colors and intricate circuitry patterns. The overall style should be a blend of retro gaming elements and contemporary AI/tech motifs.”* **视频链接:https://dev.amazoncloud.cn/video/videoDetail?id=670e2aeafd2bed6cdfbfbe55**
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭