使用 TRAE SOLO 一分钟写个简易版飞机大战

0 阅读6分钟

大家好,我是V哥,最近找到一个好玩的工具 TRAE,官网是这样介绍的:TRAE 深度融合 AI 能力,是一名能够理解需求、调用工具并独立完成各类开发任务的“AI 开发工程师”,帮助你高效推进每一个项目。事不宜迟,马上开干,我们一起来使用 TRAE SOLO 1分钟写个简易版飞机大战玩玩。

首先我的需求是这样的:帮我写一个飞机大战

下面是 TRAE SOLO 自动生成的的全过程


我需要先检查当前目录结构,了解项目的基础情况,然后规划飞机大战游戏的实现步骤。
        
            
toolName: view_folder
            
status: success
          
/Users/vince/Trae/demo1
          
查看main.py的内容,了解现有代码情况,然后规划飞机大战游戏的实现。
        
            
toolName: view_files
            
status: success
          
            
filePath: /Users/vince/Trae/demo1/main.py
          
我将重写main.py文件,实现一个完整的飞机大战游戏,包含玩家飞机、敌机、子弹系统和碰撞检测等功能。
        
            
toolName: edit_file_search_replace
            
status: success
          
            
filePath: /Users/vince/Trae/demo1/main.py
          
changes: undefined
          
现在我需要安装pygame库,然后运行游戏来测试是否正常工作。
        
            
toolName: run_command
            
status: success
          
command: pip install pygame undefined
          
使用python -m pip来安装pygame库,因为直接使用pip命令没有找到。
        
            
toolName: run_command
            
status: success
          
command: python -m pip install pygame undefined
          
使用python3 -m pip来安装pygame库,因为环境中可能只安装了python3。
        
            
toolName: run_command
            
status: success
          
command: python3 -m pip install pygame undefined
          
pygame安装失败,因为缺少SDL依赖。我将修改代码,使用Python内置的turtle库来实现飞机大战游戏,这样不需要任何外部依赖。
        
            
toolName: edit_file_search_replace
            
status: success
          
            
filePath: /Users/vince/Trae/demo1/main.py
          
changes: undefined
          
现在运行游戏,测试使用turtle库实现的飞机大战是否正常工作。
        
            
toolName: run_command
            
status: success
          
command: python3 main.py undefined
          
turtle库在macOS上遇到了Tk依赖问题,我将重新编写一个基于文本界面的飞机大战游戏,使用Python标准库,无需任何外部依赖。
        
            
toolName: edit_file_search_replace
            
status: success
          
            
filePath: /Users/vince/Trae/demo1/main.py
          
changes: undefined
          
修改代码,使用跨平台的非阻塞键盘输入方式,替换Windows特有的msvcrt库。
        
            
toolName: edit_file_search_replace
            
status: success
          
            
filePath: /Users/vince/Trae/demo1/main.py
          
changes: undefined
          
运行游戏,测试跨平台的文本界面飞机大战是否正常工作。
        
            
toolName: run_command
            
status: success
          
command: python3 main.py undefined
          
飞机大战游戏已经成功编写完成!以下是游戏的主要功能和特点:

## 游戏功能

- **玩家控制**:使用A键向左移动,D键向右移动
- **武器系统**:空格键发射子弹
- **敌机系统**:自动生成敌机并向下移动
- **碰撞检测**:
  - 子弹击中敌机得分
  - 敌机撞击玩家游戏结束
- **分数系统**:击中一架敌机得10分
- **游戏状态**:支持游戏结束、重新开始和退出功能

## 游戏特点

- **跨平台**:支持Windows和macOS/Linux系统
- **无外部依赖**:仅使用Python标准库
- **文本界面**:使用字符绘制游戏元素,简洁直观
- **操作简单**:清晰的操作说明
- **代码结构清晰**:模块化设计,易于扩展

## 运行方式

在终端中执行以下命令:

python3 main.py


## 操作说明

- **A键**:向左移动
- **D键**:向右移动
- **空格键**:发射子弹
- **R键**:游戏结束后重新开始
- **Q键**:退出游戏

游戏已经可以运行,你可以在终端中体验这个简单而有趣的飞机大战游戏!

完成以上动作后,在代码区生成的py代码如下:

import os
import sys
import random
import time
import select

# 游戏设置
WIDTH = 40
HEIGHT = 20
PLAYER_CHAR = "▲"
ENEMY_CHAR = "▼"
BULLET_CHAR = "|"
EMPTY_CHAR = " "

class PlaneGame:
    def __init__(self):
        self.player_x = WIDTH // 2
        self.player_y = HEIGHT - 2
        self.bullets = []
        self.enemies = []
        self.score = 0
        self.game_over = False
        self.last_enemy_time = time.time()
        self.enemy_spawn_delay = 1.0  # 秒
        
        # 设置标准输入为非阻塞
        if os.name == 'nt':
            import msvcrt
        else:
            # Unix系统设置
            import tty
            import termios
            self.old_settings = termios.tcgetattr(sys.stdin)
            tty.setcbreak(sys.stdin.fileno())
    
    def clear_screen(self):
        # 跨平台清屏
        os.system('cls' if os.name == 'nt' else 'clear')
    
    def draw(self):
        self.clear_screen()
        
        # 创建游戏网格
        grid = [[EMPTY_CHAR for _ in range(WIDTH)] for _ in range(HEIGHT)]
        
        # 绘制玩家
        grid[self.player_y][self.player_x] = PLAYER_CHAR
        
        # 绘制子弹
        for bullet in self.bullets:
            if 0 <= bullet[1] < HEIGHT and 0 <= bullet[0] < WIDTH:
                grid[bullet[1]][bullet[0]] = BULLET_CHAR
        
        # 绘制敌机
        for enemy in self.enemies:
            if 0 <= enemy[1] < HEIGHT and 0 <= enemy[0] < WIDTH:
                grid[enemy[1]][enemy[0]] = ENEMY_CHAR
        
        # 绘制边界
        print("=" * (WIDTH + 2))
        for row in grid:
            print("|" + "".join(row) + "|")
        print("=" * (WIDTH + 2))
        
        # 绘制分数
        print(f"分数: {self.score}")
        
        if self.game_over:
            print("游戏结束!按R键重新开始,按Q键退出")
            print("操作说明:A键向左,D键向右,空格键发射")
        else:
            print("操作说明:A键向左,D键向右,空格键发射,Q键退出")
    
    def handle_input(self):
        # 跨平台非阻塞键盘输入
        try:
            if os.name == 'nt':
                import msvcrt
                if msvcrt.kbhit():
                    key = msvcrt.getch().decode('utf-8').lower()
                    self.process_key(key)
            else:
                # Unix系统使用select
                rlist, _, _ = select.select([sys.stdin], [], [], 0.01)
                if rlist:
                    key = sys.stdin.read(1).lower()
                    self.process_key(key)
        except Exception as e:
            pass
    
    def process_key(self, key):
        if key == 'a' and self.player_x > 0:
            self.player_x -= 1
        elif key == 'd' and self.player_x < WIDTH - 1:
            self.player_x += 1
        elif key == ' ':
            # 发射子弹
            self.bullets.append([self.player_x, self.player_y - 1])
        elif key == 'r' and self.game_over:
            self.reset_game()
        elif key == 'q':
            self.exit_game()
    
    def exit_game(self):
        # 恢复终端设置
        if os.name != 'nt':
            import termios
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings)
        sys.exit()
    
    def update(self):
        if not self.game_over:
            # 更新子弹
            new_bullets = []
            for bullet in self.bullets:
                bullet[1] -= 1  # 子弹向上移动
                if bullet[1] > 0:  # 子弹未飞出屏幕
                    new_bullets.append(bullet)
            self.bullets = new_bullets
            
            # 生成敌机
            current_time = time.time()
            if current_time - self.last_enemy_time > self.enemy_spawn_delay:
                enemy_x = random.randint(0, WIDTH - 1)
                self.enemies.append([enemy_x, 0])
                self.last_enemy_time = current_time
            
            # 更新敌机
            new_enemies = []
            for enemy in self.enemies:
                enemy[1] += 1  # 敌机向下移动
                if enemy[1] < HEIGHT:  # 敌机未飞出屏幕
                    new_enemies.append(enemy)
            self.enemies = new_enemies
            
            # 检测碰撞:子弹击中敌机
            bullets_to_remove = []
            enemies_to_remove = []
            
            for i, bullet in enumerate(self.bullets):
                for j, enemy in enumerate(self.enemies):
                    if bullet[0] == enemy[0] and bullet[1] == enemy[1]:
                        bullets_to_remove.append(i)
                        enemies_to_remove.append(j)
                        self.score += 10
            
            # 删除击中的子弹和敌机(从后往前删除,避免索引问题)
            for i in sorted(bullets_to_remove, reverse=True):
                del self.bullets[i]
            
            for j in sorted(enemies_to_remove, reverse=True):
                del self.enemies[j]
            
            # 检测碰撞:敌机撞击玩家
            for enemy in self.enemies:
                if enemy[0] == self.player_x and enemy[1] == self.player_y:
                    self.game_over = True
    
    def reset_game(self):
        self.player_x = WIDTH // 2
        self.player_y = HEIGHT - 2
        self.bullets = []
        self.enemies = []
        self.score = 0
        self.game_over = False
        self.last_enemy_time = time.time()
    
    def run(self):
        while True:
            self.handle_input()
            self.update()
            self.draw()
            time.sleep(0.1)  # 控制游戏速度

if __name__ == "__main__":
    game = PlaneGame()
    game.run()

下面我来测试运行一下,单击代码区右上角的运行按钮:

在终端运行的效果是这样的:

啥也不说,V哥先爽一把。

小结一下

TRAE 覆盖从编码、调试到测试、重构、部署等多类开发任务。提供智能体编程工具 CUE,支持代码补全、多行修改、智能导入和智能重命名等功能,适配多种日常开发场景,帮助你减少重复操作,专注核心创新。TRAE 不仅将 AI 集成进 IDE,也让 Al 使用更多开发工具。TRAE 目前拥有双重开发模式:IDE 模式保留原有流程,控制感更强;SOLO 模式让 AI 主导任务,自动推进开发任务。你可根据任务需求自由切换,让高效与灵活并存。兄弟们,不用犹豫,快去试试吧。