本文探讨了如何使用 [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**