**本文将探讨如何使用 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 根据结构化的提示词,直接生成一个贪吃蛇游戏原型**,并剖析了其背后人工智能的思考和迭代完善过程,展示了生成式 AI 快速进行游戏原型创作的巨大潜力。
[《神助攻,Amazon Bedrock 结合提示工程,零基础创建贪吃蛇游戏!》](http://mp.weixin.qq.com/s?\\__biz=Mzg4NjU5NDUxNg==\\&mid=2247580558\\&idx=1\\&sn=214ce4f0ab1777da36b9309bc6871785\\&chksm=cf94b535f8e33c23fd5665e92344a778d837930df64ca31a04c2418b190bc45dae815a0d5926\\&scene=21#wechat_redirect?trk=cndc-detail)中展示了如何使用 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 和结构化的文本提示词,直接生成贪吃蛇游戏原型的完整过程。
文章发表后,许多开发者反馈说深受这篇文章的启发,并好奇地询问 [Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 是否也能够类似这样来直接生成贪吃蛇游戏原型。以下是本文和各位开发者探讨的内容。
贪吃蛇是一款风靡了几代人的老式游戏。游戏目标很简单:
> 通过控制一条不断增长的小蛇,引导它吃下食物,同时避免撞到游戏界面的边界或蛇身。小蛇吃下越多食物,身体就会越长,游戏难度也就越大,需要玩家迅速反应和具备全局策略思维。
![image.png](https://dev-media.amazoncloud.cn/bde68dd80b1e4d1b9fc74aed762460d4_image.png "image.png")
接下来,让我们看看 [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/17d5a8ad8d2842f6a8feb14a4a9ff351_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/23e3041a4b574a50813b476a00ec9ac9_image.png "image.png")
数分钟后,[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 以思考过程汇总的形式作出了回应,体现了其背后大型语言模型的思考过程,如下图所示。
![image.png](https://dev-media.amazoncloud.cn/9405e42a16a54e08a9654ce4aa7b0631_image.png "image.png")
根据 [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 完整生成的游戏原型代码。
```
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/00ecc3bff54644248e855c15e314e499_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/4ac1ea8633df4b4e8f6d29d23875e308_image.png "image.png")
在提交提示词后,[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 迅速作出回应,截图如下所示:
![image.png](https://dev-media.amazoncloud.cn/715022aa0e11485194e346cfd2d0ce39_image.png "image.png")
要求对贪吃蛇游戏的代码进行调整,并表示当前的速度对于初学者来说太快了。
[Amazon Q](https://aws.amazon.com/cn/q/?trk=cndc-detail) Developer 的回复,解释了如何将初始值为15的 snake_speed 变量修改为较低的8。这样蛇的移动速度就会减慢,游戏对初级玩家来说会更加易于控制。底部的代码片段显示了将 snake_speed 从15改为8,并添加了注释说明这一调整。
您可以按照上述建议进行操作,只需要修改其中一行代码,如下所示:
```
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 技术的不断进步,**像 [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.”
> *前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。
![image.png](https://dev-media.amazoncloud.cn/07174b9cf98a470c87f2be636ce6df9c_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/448667a6b78e42bab520da6966f77fe0_image.png "image.png")