不写一行代码,用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,提高工作效率。

相关推荐
千天夜27 分钟前
激活函数解析:神经网络背后的“驱动力”
人工智能·深度学习·神经网络
大数据面试宝典28 分钟前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
封步宇AIGC33 分钟前
量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据
人工智能·python·机器学习·数据挖掘
m0_5236742134 分钟前
技术前沿:从强化学习到Prompt Engineering,业务流程管理的创新之路
人工智能·深度学习·目标检测·机器学习·语言模型·自然语言处理·数据挖掘
HappyAcmen44 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
噜噜噜噜鲁先森1 小时前
看懂本文,入门神经网络Neural Network
人工智能
InheritGuo2 小时前
It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
人工智能·计算机视觉·sketch
weixin_307779132 小时前
证明存在常数c, C > 0,使得在一系列特定条件下,某个特定投资时刻出现的概率与天数的对数成反比
人工智能·算法·机器学习
封步宇AIGC2 小时前
量化交易系统开发-实时行情自动化交易-3.4.1.6.A股宏观经济数据
人工智能·python·机器学习·数据挖掘
Jack黄从零学c++2 小时前
opencv(c++)图像的灰度转换
c++·人工智能·opencv