不写一行代码,用GitHub Copilot打造弹珠台游戏

今天将为大家展示如何使用 GitHub Copilot 实现一个 Python 弹珠台游戏

最终成果展示

相关工具

该示例主要使用了Github Copilotinline chat功能实现。

每一步的操作方式示例如下:

  1. 按键盘上的 ⌘A 全选代码
  2. 按键盘上的 ⌘I 打开 inline chat
  3. 在 inline chat 中输入提示词
  4. 点击 "接受" 按钮,写入代码
  5. 运行代码查看生成效果,如果没有达到预期,调整提示语重试一次

代码生成过程

每一步的提示词和生成效果

  1. 你要生成一个弹珠台的 Python 代码:窗口大小为 800*600,窗口出现时开始游戏

    生成结果:按照预期生成了窗口。

  1. 游戏固定为每秒 60 帧 生成结果:还没有绘制界面,因此界面没有变化。
  1. 屏幕左上方开始,排列着 6 行 10 列的方块(后面将它们称作障碍物)

    生成结果:界面上出现了方块。

  1. 每个障碍物的宽度平均分配了整个窗口的宽度,高度为 20

    生成结果:方块按照设定的尺寸显示了出来。

  1. 每个障碍物的颜色随机分配,但不能为黑色,颜色仅在游戏开始时生成一次,生成之后不能改变

    生成结果:每个方块被随机指定了颜色。

  1. 屏幕最下方有一个白色方块(后面称它为挡板),长 80 高 20

    生成结果:挡板显示了出来。

  1. 用键盘的左右按键控制挡板左右移动,不能上下移动

    生成结果:挡板可以左右移动,但会移出窗口。

  1. 挡板不可以移出窗口

    生成结果:挡板被限制了不能移出窗口,为了方便操作,挡板可以改为用鼠标控制移动。

  1. 挡板的位置跟着鼠标的位置移动

    生成结果:挡板已经可以跟着鼠标移动了

  1. 在所有的障碍物下方有一个小球

    生成结果

    • 小球显示出来了,而且 Copilot 还很贴心地设置了大小和小球飞行效果。
    • 但是小球的初始飞行方向不是随机的,我们让 Copilot 生成随机方向,让游戏更有趣。
  1. 小球在游戏开始时向上,在与垂直方向夹角为 60 度的范围内,随机选一个方向飞行

    生成结果:多启动游戏几次就可以看到,飞行方向已经是随机的了。

  1. 小球在碰到屏幕上方的障碍物任意一条边时,小球会发生反弹,同时与小球碰撞的障碍物会消失

    生成结果:小球和障碍物碰撞后,障碍物会消失,但是剩余障碍物的颜色会改变,需要优化一下。

  1. 小球和障碍物碰撞之后,障碍物的颜色全部保持不变

    生成结果:小球和障碍物碰撞后,障碍物的颜色不再改变。

  1. 小球如果飞出屏幕下边缘,游戏暂停,同时在屏幕显示"Do you want to restart the game?",用户可以在键盘上输入 Y 重新开始游戏,或者输入 N 结束游戏

    生成结果

    • 游戏结束后可以重新开始或者退出游戏。
    • 但是游戏重开后,障碍物的颜色没有重新计算,需要优化。
  1. 重新开始游戏后,障碍物的颜色需要重新随机生成一次

    生成结果

    • 游戏重开后,障碍物的颜色重新计算了。
    • 但是小球的初始飞行方向没有重新生成,需要优化一下。
  1. 重新开始游戏后,小球的初始飞行方向要重新生成一次,生成方法与游戏开始时相同

    生成结果:游戏重开后,小球的初始飞行方向也重新生成了。至此,这个游戏基本完成。

代码生成结果

python 复制代码
import pygame
import random
import math

# Initialize pygame
pygame.init()

# Set window size
window_width = 800
window_height = 600
window_size = (window_width, window_height)

# Create the game window
window = pygame.display.set_mode(window_size)

# Set the frame rate
clock = pygame.time.Clock()
fps = 60

# Define obstacle properties
obstacle_width = window_width // 10
obstacle_height = 20

# Create the paddle
paddle_width = 80
paddle_height = 20
paddle_x = (window_width - paddle_width) // 2
paddle_y = window_height - paddle_height
paddle_rect = pygame.Rect(paddle_x, paddle_y, paddle_width, paddle_height)

# Create the ball
ball_radius = 10
ball_x = window_width // 2
ball_y = window_height - paddle_height - ball_radius
ball_speed = 5
ball_angle = random.uniform(-math.pi/3, math.pi/3)  # Random angle within a range of 60 degrees
ball_speed_x = ball_speed * math.sin(ball_angle)
ball_speed_y = -ball_speed * math.cos(ball_angle)

# Set paddle movement speed
paddle_speed = 5

# Function to generate random obstacle colors
def generate_obstacle_colors():
  obstacle_colors = []
  for _ in range(60):
    color = (random.randint(0, 254), random.randint(0, 254), random.randint(0, 254))
    obstacle_colors.append(color)
  return obstacle_colors

# Function to create obstacles
def create_obstacles():
  obstacles = []
  obstacle_colors = generate_obstacle_colors()
  for row in range(6):
    for col in range(10):
      obstacle_x = col * obstacle_width
      obstacle_y = row * obstacle_height
      obstacle_rect = pygame.Rect(obstacle_x, obstacle_y, obstacle_width, obstacle_height)
      obstacles.append((obstacle_rect, obstacle_colors.pop(0)))
  return obstacles

# Create obstacles
obstacles = create_obstacles()

# Start the game loop
running = True
game_over = False
while running:
  # Check for events
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False

  if not game_over:
    # Update game logic here
    mouse_x, _ = pygame.mouse.get_pos()
    paddle_rect.x = mouse_x - paddle_width // 2

    # Move the ball
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # Check for ball collision with walls
    if ball_x <= 0 or ball_x >= window_width - ball_radius:
      ball_speed_x *= -1
    if ball_y <= 0:
      ball_speed_y *= -1
    if ball_y >= window_height:
      game_over = True

    # Check for ball collision with paddle
    if paddle_rect.colliderect(pygame.Rect(ball_x - ball_radius, ball_y - ball_radius, ball_radius * 2, ball_radius * 2)):
      ball_speed_y *= -1

    # Check for ball collision with obstacles
    for obstacle, color in obstacles:
      if obstacle.colliderect(pygame.Rect(ball_x - ball_radius, ball_y - ball_radius, ball_radius * 2, ball_radius * 2)):
        ball_speed_y *= -1
        obstacles.remove((obstacle, color))

  # Draw game elements here
  window.fill((0, 0, 0))  # Clear the window

  # Draw obstacles
  for obstacle, color in obstacles:
    pygame.draw.rect(window, color, obstacle)

  # Draw paddle
  pygame.draw.rect(window, (255, 255, 255), paddle_rect)

  # Draw ball
  pygame.draw.circle(window, (255, 255, 255), (ball_x, ball_y), ball_radius)

  if game_over:
    # Draw game over message
    font = pygame.font.Font(None, 36)
    text = font.render("Do you want to restart the game? (Y/N)", True, (255, 255, 255))
    text_rect = text.get_rect(center=(window_width // 2, window_height // 2))
    window.blit(text, text_rect)

    # Check for restart or quit
    for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_y:
          game_over = False
          ball_x = window_width // 2
          ball_y = window_height - paddle_height - ball_radius
          ball_angle = random.uniform(-math.pi/3, math.pi/3)
          ball_speed_x = ball_speed * math.sin(ball_angle)
          ball_speed_y = -ball_speed * math.cos(ball_angle)
          obstacles = create_obstacles()
        elif event.key == pygame.K_n:
          running = False

  # Update the display
  pygame.display.update()

  # Limit the frame rate
  clock.tick(fps)

# Quit the game
pygame.quit()

如果运行上面这段代码,会发现按 Y 或 N 控制重开或者停止游戏时,有时需要按好几次才能生效,这个问题最终在 Chatgpt 的帮助下,得到了解决。

解决方案如下:

python 复制代码
# 等待用户决定函数
def wait_for_user_decision():
    waiting_for_input = True
    while waiting_for_input:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_y:
                    return True  # 用户决定重新开始游戏
                elif event.key == pygame.K_n:
                    return False  # 用户决定不重新开始游戏

# 在游戏结束逻辑中调用此函数
if game_over:
    # 绘制游戏结束提示
    font = pygame.font.Font(None, 36)
    text = font.render("Do you want to restart the game? (Y/N)", True, (255, 255, 255))
    text_rect = text.get_rect(center=(window_width // 2, window_height // 2))
    window.blit(text, text_rect)
    pygame.display.update()  # 确保提示信息被渲染显示

    # 等待用户决定
    user_decision = wait_for_user_decision()
    if user_decision:
        # 重置游戏状态,以重新开始
        game_over = False
        ball_x = window_width // 2
        ball_y = window_height - paddle_height - ball_radius
        ball_angle = random.uniform(-math.pi/3, math.pi/3)
        ball_speed_x = ball_speed * math.sin(ball_angle)
        ball_speed_y = -ball_speed * math.cos(ball_angle)
        obstacles = create_obstacles()
    else:
        running = False

所有用到的提示词

在此列出了所有可能用到的提示词,有兴趣的同学可以参考,并根据实际生成代码的效果选用。

  1. 你要生成一个弹珠台的 Python 代码:窗口大小为 800*600,窗口出现时开始游戏
  2. 游戏固定为每秒 60 帧
  3. 屏幕左上方开始,排列着 6 行 10 列的方块(后面将它们称作障碍物)
  4. 每个障碍物的宽度平均分配了整个窗口的宽度,高度为 20
  5. 每个障碍物的颜色随机分配,但不能为黑色,颜色仅在游戏开始时生成一次,生成之后不能改变
  6. 屏幕最下方有一个白色方块(后面称它为挡板),长 80 高 20
  7. 用键盘的左右按键控制挡板左右移动,不能上下移动
  8. 挡板不可以移出窗口
  9. 挡板的位置跟着鼠标的位置移动
  10. 在所有的障碍物下方有一个小球
  11. 小球是圆形,颜色是白色,大小为 20*20
  12. 小球的起始位置与下边缘的距离是 20,左右居中
  13. 小球在游戏开始时向上,在与垂直方向夹角为 60 度的范围内,随机选一个方向飞行
  14. 小球在碰到屏幕上方的障碍物时,小球会发生反弹,同时与小球碰撞的障碍物会消失
  15. 小球和障碍物碰撞之后,障碍物的颜色全部保持不变
  16. 小球在碰到挡板时,小球会发生反弹,挡板不会消失
  17. 小球在碰到屏幕左、上、右边缘时,会发生反弹
  18. 小球如果飞出屏幕下边缘,游戏暂停,同时在屏幕显示"Do you want to restart the game?",用户可以在键盘上输入 Y 重新开始游戏,或者输入 N 结束游戏
  19. 重新开始游戏后,障碍物的颜色需要重新随机生成一次
  20. 重新开始游戏后,小球的初始飞行方向要重新生成一次,生成方法与游戏开始时相同

后记

写完这个功能以后,心情真是喜忧参半,喜的是"以后很多事情可以不用自己来做了",忧的是"以后很多事情可以不用自己来做了"。

当然上面的话只是开玩笑,希望我的分享能够帮助你更好地使用 AI,提高工作效率。

相关推荐
阿里云大数据AI技术3 分钟前
云栖实录 | 从多模态数据到 Physical AI,PAI 助力客户快速启动 Physical AI 实践
人工智能
小关会打代码10 分钟前
计算机视觉进阶教学之颜色识别
人工智能·计算机视觉
IT小哥哥呀16 分钟前
基于深度学习的数字图像分类实验与分析
人工智能·深度学习·分类
机器之心41 分钟前
VAE时代终结?谢赛宁团队「RAE」登场,表征自编码器或成DiT训练新基石
人工智能·openai
机器之心42 分钟前
Sutton判定「LLM是死胡同」后,新访谈揭示AI困境
人工智能·openai
大模型真好玩1 小时前
低代码Agent开发框架使用指南(四)—Coze大模型和插件参数配置最佳实践
人工智能·agent·coze
jerryinwuhan1 小时前
基于大语言模型(LLM)的城市时间、空间与情感交织分析:面向智能城市的情感动态预测与空间优化
人工智能·语言模型·自然语言处理
落雪财神意1 小时前
股指10月想法
大数据·人工智能·金融·区块链·期股
中杯可乐多加冰1 小时前
无代码开发实践|基于业务流能力快速开发市场监管系统,实现投诉处理快速响应
人工智能·低代码
渣渣盟1 小时前
解密NLP:从入门到精通
人工智能·python·nlp