什么是Trae?

Trae 是字节跳动于 2025 年 1 月 19 日推出的 AI 编程工具。

官网:https://www.trae.ai/

核心功能

  • 智能代码生成与优化:集成Claude 3.5和GPT-4o等顶级AI模型,可根据自然语言描述快速生成高质量代码片段,能精准理解需求并提供代码补全、优化和重构建议,提升代码质量,减少手动编写工作量。还可实时分析代码性能,帮助开发者减少冗余代码、提高执行效率。
  • AI驱动的交互模式
    • Chat模式:开发者可通过对话框输入问题或代码需求,Trae会基于AI模型生成代码建议或解答,适合解决编程中的具体问题,如调试错误、优化代码结构等。
    • Builder模式:亮点功能,能根据用户需求直接生成完整的代码项目,如输入“生成一个图片压缩工具”的描述,它就可自动生成项目代码,并在生成过程中征求用户意见,确保代码的准确性和完整性。
  • 原生中文支持:从底层设计上就支持中文,界面语言全面中文化,减少了语言切换带来的不便,让开发者能更专注于代码本身,提升开发效率。
  • 多模态支持:开发者上传图像,Trae会精准理解图像内容,并结合AI功能生成相关代码,极大地简化了需求表达和代码实现的过程,适合需要视觉化输入的开发场景。
  • 便捷的项目预览与调试:提供Webview功能,支持在IDE内直接预览Web页面,方便前端开发,开发者无需切换到浏览器即可实时查看开发效果。还支持在对话中引用代码块、文件或整个项目,实现精准交互。

应用场景

  • Web开发:能够通过简单的自然语言描述快速生成静态网页或动态Web应用的代码,并结合Webview功能直接在IDE内预览和调试前端页面,提高开发效率。
  • 游戏开发:可以生成简单游戏的基础代码,并与主流游戏引擎集成,例如能生成贪吃蛇游戏的基础代码,开发者在此基础上扩展和优化即可。
  • 数据处理:能生成数据清洗、分析和机器学习数据准备的代码,支持多种数据格式,可高效完成数据处理任务,助力开发者快速实现数据驱动的项目。
  • API开发:可以快速生成API请求和后端接口代码,还支持生成API文档和测试代码,帮助开发者快速开发和验证API功能。
  • 工具开发:能根据描述生成实用工具的代码,如图片压缩、文件加密等,开发者通过简单提示词就能快速实现功能,减少开发时间和精力。
  • 学习与教学:不仅适用于专业开发者,也是初学者和教育工作者的得力助手,能生成各种编程语言的基础代码示例,帮助初学者理解语法和逻辑,也为教师提供了丰富的教学用代码案例,辅助教学。

Trae vs Cursor

对比维度 Trae Cursor
核心功能 AI代码生成与优化、Builder模式(项目搭建)、Chat模式(对话交互)、多模态交互(支持图片上传)、Webview功能(前端预览) 智能代码补全、代码生成与解释、上下文感知与代码库索引、深度集成VS Code
语言支持 原生中文支持,也支持英文 主要面向英文开发者
AI模型 Claude 3.5、GPT-4o 自研模型,支持多种语言
价格 免费 付费(订阅制)
上下文感知 支持,但相对Cursor较弱 强,支持全项目上下文分析
多模态交互 支持上传图片生成代码 不支持
项目预览功能 支持Webview预览 不支持
学习成本 适合有一定编程基础的用户,有独特功能需学习 低,基于VS Code,熟悉VS Code的用户易上手
适用场景 Web开发、游戏开发、数据处理、API开发、工具开发 全栈开发、复杂项目开发、代码优化与调试
平台支持 目前仅支持Mac,Windows版本即将上线 深度集成VS Code,支持Windows、Mac、Linux等

实践案例:2048小游戏

输入prompt指令

笔者输入的是“请帮我开发一个2048小游戏”,就是这么简单直接。然后Trae AI就开始辛勤的帮我生成代码,不用几分钟就完成了整体的代码框架搭建。

分别有三个代码文件:

game_2048.py

import tkinter as tk
import random
import colors

class Game2048:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title('2048游戏')
        self.grid_cells = []
        self.matrix = [[0] * 4 for _ in range(4)]
        self.score = 0
        self.init_grid()
        self.init_matrix()
        
        # 绑定按键事件
        self.window.bind('<Left>', lambda event: self.move('left'))
        self.window.bind('<Right>', lambda event: self.move('right'))
        self.window.bind('<Up>', lambda event: self.move('up'))
        self.window.bind('<Down>', lambda event: self.move('down'))

    def init_grid(self):
        background = tk.Frame(self.window, bg='#92877d', width=400, height=400)
        background.grid()

        for i in range(4):
            grid_row = []
            for j in range(4):
                cell = tk.Frame(
                    background,
                    bg='#9e948a',
                    width=100,
                    height=100
                )
                cell.grid(row=i, column=j, padx=5, pady=5)
                t = tk.Label(
                    cell,
                    text="",
                    bg='#9e948a',
                    justify=tk.CENTER,
                    font=('Arial', 30, 'bold'),
                    width=4,
                    height=2
                )
                t.grid()
                grid_row.append(t)
            self.grid_cells.append(grid_row)

    def init_matrix(self):
        # 初始化时添加两个数字
        self.add_new_tile()
        self.add_new_tile()
        self.update_grid_cells()

    def add_new_tile(self):
        # 在空位置随机添加一个新数字(24)
        empty_cells = [(i, j) for i in range(4) for j in range(4) if self.matrix[i][j] == 0]
        if empty_cells:
            i, j = random.choice(empty_cells)
            self.matrix[i][j] = 2 if random.random() < 0.9 else 4

    def update_grid_cells(self):
        for i in range(4):
            for j in range(4):
                new_number = self.matrix[i][j]
                if new_number == 0:
                    self.grid_cells[i][j].configure(text="", bg='#9e948a')
                else:
                    self.grid_cells[i][j].configure(
                        text=str(new_number),
                        bg=colors.CELL_COLORS.get(new_number, '#ffffff'),
                        fg=colors.NUMBER_COLORS.get(new_number, '#ffffff')
                    )
        self.window.update_idletasks()

    def stack(self):
        new_matrix = [[0] * 4 for _ in range(4)]
        for i in range(4):
            fill_position = 0
            for j in range(4):
                if self.matrix[i][j] != 0:
                    new_matrix[i][fill_position] = self.matrix[i][j]
                    fill_position += 1
        self.matrix = new_matrix

    def combine(self):
        for i in range(4):
            for j in range(3):
                if self.matrix[i][j] != 0 and self.matrix[i][j] == self.matrix[i][j + 1]:
                    self.matrix[i][j] *= 2
                    self.matrix[i][j + 1] = 0
                    self.score += self.matrix[i][j]

    def reverse(self):
        new_matrix = []
        for i in range(4):
            new_matrix.append([])
            for j in range(4):
                new_matrix[i].append(self.matrix[i][3 - j])
        self.matrix = new_matrix

    def transpose(self):
        new_matrix = [[0] * 4 for _ in range(4)]
        for i in range(4):
            for j in range(4):
                new_matrix[i][j] = self.matrix[j][i]
        self.matrix = new_matrix

    def move(self, direction):
        if direction == 'up':
            self.transpose()
            self.stack()
            self.combine()
            self.stack()
            self.transpose()
        elif direction == 'down':
            self.transpose()
            self.reverse()
            self.stack()
            self.combine()
            self.stack()
            self.reverse()
            self.transpose()
        elif direction == 'left':
            self.stack()
            self.combine()
            self.stack()
        elif direction == 'right':
            self.reverse()
            self.stack()
            self.combine()
            self.stack()
            self.reverse()

        self.add_new_tile()
        self.update_grid_cells()
        if self.game_over():
            self.grid_cells[1][1].configure(text="Game", bg='#ffffff')
            self.grid_cells[1][2].configure(text="Over!", bg='#ffffff')

    def game_over(self):
        # 检查是否还有空格
        for i in range(4):
            for j in range(4):
                if self.matrix[i][j] == 0:
                    return False

        # 检查是否还能合并
        for i in range(4):
            for j in range(3):
                if self.matrix[i][j] == self.matrix[i][j + 1]:
                    return False
        for i in range(3):
            for j in range(4):
                if self.matrix[i][j] == self.matrix[i + 1][j]:
                    return False
        return True

    def run(self):
        self.window.mainloop()

colors.py

CELL_COLORS = {
    2: "#eee4da",
    4: "#ede0c8",
    8: "#f2b179",
    16: "#f59563",
    32: "#f67c5f",
    64: "#f65e3b",
    128: "#edcf72",
    256: "#edcc61",
    512: "#edc850",
    1024: "#edc53f",
    2048: "#edc22e"
}

NUMBER_COLORS = {
    2: "#776e65",
    4: "#776e65",
    8: "#f9f6f2",
    16: "#f9f6f2",
    32: "#f9f6f2",
    64: "#f9f6f2",
    128: "#f9f6f2",
    256: "#f9f6f2",
    512: "#f9f6f2",
    1024: "#f9f6f2",
    2048: "#f9f6f2"
}

main.py

from game_2048 import Game2048

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

工程代码看不懂?直接问:

处理编译错误

遇到编译错误,不用怕,直接问Trae:

我按照指引按照了python相关的依赖库,重新编译运行就成功了,根本不用再去google或百度解决方案。

运行结果

就这样我们就开发好一款经典的2024小游戏,相比于过去这类Demo我们还得各种找源码学习,现在智能得有点吓人。

写在最后

其实我对于国内出现Trae这样类Cursor的编程工具出现并不惊讶,AI编程是目前已经被验证能够真正提效的方向之一,Cursor也打通了付费模式,所以我相信2025年这类的工具将像雨后春笋一般生长出来,让我们拭目以待。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐