通义灵码 2.5 版发布上线,支持 Qwen3

简介: 示例中展示了通义灵码创建贪食蛇游戏的过程,包括代码优化、Bug修复和功能改进(如游戏结束后提示重新开始)。并通过AI总结了工具的核心能力,如实时续写、自然语言生码、单元测试生成等,帮助开发者高效编码并提升代码质量。

通义灵码是由阿里云提供的智能编码辅助工具,提供 代码智能生成、智能问答、多文件修改、编程智能体 等能力,为开发者带来高效、流畅的编码体验。同时,我们为提供企业客户提供了企业标准版、专属版,具备企业级场景自定义、私域知识增强等能力,助力企业研发智能化升级。

image.png

新的 通义灵码支持智能体,并增加了qen3的能力。

image.png

使用原Ai程序员的功能,创建贪食蛇游戏。

image.png

AI对代码进行自动优化

以下是对你提供的 [SnakeGame]代码的详细审查和优化建议:

---

## ✅ 潜在问题与风险分析

### 1. **蛇头移动逻辑存在潜在错误**
- 当前代码中,蛇头的新位置是基于当前头部的位置计算出来的。但之后直接将新位置插入到 [snake](file://d:\demo\tongyi_ai\jj\jj\src\Farm.java#L12-L12) 列表的最前面(索引0),而没有移除旧的头部。
- 实际上,每次移动时都应该:
  - 添加新的头部;
  - 如果未吃到食物,则删除尾部;
  - 否则保留尾部以实现“增长”效果。
- 当前逻辑虽然通过 `else { snake.remove(snake.size() - 1); }` 实现了这一点,但**添加新节点的方式会导致重复的头部**,因为原头部仍然保留在列表中。

✅ **修复方式:** 在添加新头部之前不需要保留旧头部,应统一处理。

---

### 2. **方向输入未做去重或缓冲清理**
- 使用 `scanner.next().charAt(0)` 获取输入时,如果用户连续快速输入多个字符(如 "wwa"),可能会导致后续读取残留字符。
- 虽然不是严重 Bug,但在游戏循环中频繁读取控制台输入时容易造成混乱。

✅ **建议:** 每次只读取一个字符后清空缓冲区,或者使用更稳定的输入方式(如限制单个字符输入)。

---

### 3. **drawMap 方法性能较低**
- 每次绘制地图时都会遍历整个二维数组,并且对每个坐标都调用 [isOccupied()](file://d:\demo\tongyi_ai\jj\jj\src\Farm.java#L42-L49) 方法,该方法本身又会遍历整个蛇身列表。
- 时间复杂度为 O(MAP_HEIGHT * MAP_WIDTH * snake.length),对于较大的地图或较长的蛇来说效率较低。

✅ **优化建议:** 可引入额外的数据结构(如 `Set<String>``boolean[][] occupied`)来记录占用状态,提升查询效率。

---

### 4. **generateFood 方法可能陷入死循环**
- 如果地图被填满,无法生成新的食物位置,`do-while` 循环将无限执行。
- 虽然实际游戏中不太可能发生,但作为健壮性考虑,应加入最大尝试次数限制。

✅ **建议:** 增加尝试次数限制,若超过一定次数仍未找到合适位置则结束游戏或提示。

---

### 5. **资源未关闭**
- `Scanner` 是系统资源,在程序结束时应手动关闭。

✅ **建议:** 在 [startGame()](file://d:\demo\tongyi_ai\jj\jj\src\Farm.java#L106-L115) 结束前调用 `scanner.close()`。

---

## 🚀 性能与可维护性优化建议

### 1. **isOccupied 方法效率低**
- 每次都要遍历整个蛇身列表查找是否冲突。
- 可改用 `Set<int[]>` 并自定义哈希/比较逻辑,或使用 `boolean[][] occupied` 数组来提高效率。

✅ **优化建议:** 引入 `occupied` 状态数组,实时更新蛇体位置的占用状态。

---

### 2. **代码结构略显冗长**
- 所有逻辑集中在单一类中,不利于后期扩展(如增加图形界面、AI 控制等)。
- 可考虑拆分部分功能为独立类或工具类。

✅ **建议:** 若项目规模扩大,建议进行模块化重构。

---

## ✅ 综合优化后的完整代码如下:

```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class SnakeGame {
    private static final int MAP_WIDTH = 20;
    private static final int MAP_HEIGHT = 20;
    private static final char SNAKE_BODY = 'O';
    private static final char FOOD = '*';
    private static final char EMPTY = ' ';

    private List<int[]> snake;
    private int[] food;
    private char[][] map;
    private Random random;
    private Scanner scanner;
    private boolean gameOver;
    private boolean[][] occupied; // 新增用于优化判断的地图占用状态

    public SnakeGame() {
        this.snake = new ArrayList<>();
        this.food = new int[2];
        this.map = new char[MAP_HEIGHT][MAP_WIDTH];
        this.random = new Random();
        this.scanner = new Scanner(System.in);
        this.gameOver = false;
        this.occupied = new boolean[MAP_HEIGHT][MAP_WIDTH];

        // 初始化蛇的位置
        int startX = MAP_HEIGHT / 2;
        int startY = MAP_WIDTH / 2;
        snake.add(new int[]{startX, startY});
        occupied[startX][startY] = true;
        generateFood();
    }

    private void generateFood() {
        int maxAttempts = MAP_HEIGHT * MAP_WIDTH;
        int attempts = 0;
        int x, y;
        do {
            if (attempts++ > maxAttempts) {
                System.out.println("No space to generate food!");
                gameOver = true;
                return;
            }
            x = random.nextInt(MAP_HEIGHT);
            y = random.nextInt(MAP_WIDTH);
        } while (occupied[x][y]);
        food[0] = x;
        food[1] = y;
    }

    private void drawMap() {
        for (int i = 0; i < MAP_HEIGHT; i++) {
            for (int j = 0; j < MAP_WIDTH; j++) {
                if (i == food[0] && j == food[1]) {
                    System.out.print(FOOD);
                } else if (occupied[i][j]) {
                    System.out.print(SNAKE_BODY);
                } else {
                    System.out.print(EMPTY);
                }
            }
            System.out.println();
        }
    }

    private void moveSnake(char direction) {
        int[] head = snake.get(0);
        int newX = head[0];
        int newY = head[1];

        switch (direction) {
            case 'w':
                newX--;
                break;
            case 's':
                newX++;
                break;
            case 'a':
                newY--;
                break;
            case 'd':
                newY++;
                break;
            default:
                System.out.println("Invalid direction!");
                return;
        }

        // 检查边界和碰撞
        if (newX < 0 || newX >= MAP_HEIGHT || newY < 0 || newY >= MAP_WIDTH || occupied[newX][newY]) {
            gameOver = true;
            return;
        }

        // 更新占用状态
        snake.add(0, new int[]{newX, newY});
        occupied[newX][newY] = true;

        // 判断是否吃到了食物
        if (newX == food[0] && newY == food[1]) {
            generateFood();
        } else {
            int[] tail = snake.get(snake.size() - 1);
            occupied[tail[0]][tail[1]] = false;
            snake.remove(snake.size() - 1);
        }
    }

    public void startGame() {
        System.out.println("Welcome to Snake Game!");
        while (!gameOver) {
            drawMap();
            System.out.print("Enter direction (w/a/s/d): ");
            String input = scanner.next();
            if (input.isEmpty()) continue;
            char direction = input.charAt(0);
            moveSnake(direction);
        }
        scanner.close(); // 关闭资源
        System.out.println("Game Over! Your score: " + (snake.size() - 1));
    }

    public static void main(String[] args) {
        SnakeGame game = new SnakeGame();
        game.startGame();
    }
}
```

---

## ✅ 总结

| 类别 | 优化点 |
|------|--------|
| 安全性 | 防止 generateFood 死循环 |
| 性能 | 使用 occupied 数组代替 isOccupied 遍历 |
| 可维护性 | 逻辑清晰,便于后续扩展 |
| 输入处理 | 清理输入缓冲,避免残留字符干扰 |
| 资源管理 | 主动关闭 Scanner |

如果你希望进一步优化 UI、支持暂停、多线程控制、图形界面等,请告诉我,我可以继续协助你扩展这个项目。

我希望可以图形化界面玩游戏

image.png

游戏有bug,蛇自动往右跑,碰壁就会gameover,需要调整一下。

image.png

已经完成了相关设定,全程对话交流,我没上手修改过任何代码。(再次完善代码,游戏结束的时候,结束游戏,不能再有任何操作。并提示可以重新开始游戏。)

image.png

再尝试下智能体的应用,生成最简单的智能体应用

image.png

用AI对自己做个总结

我是一个智能编码助手,具备以下能力:

- **代码实时续写**:在您编写代码的过程中提供行级或函数级的实时续写建议。
- **自然语言生成代码**:根据您的自然语言描述生成相应的代码。
- **单元测试生成**:为您的代码生成对应的单元测试用例。
- **代码注释生成**:为您的代码添加合适的注释,提高代码可读性。
- **代码解释**:对已有的代码进行解释,帮助理解代码逻辑和功能。
- **研发智能问答**:回答与研发相关的问题,提供技术指导和建议。
- **异常报错排查**:帮助分析和解决代码中的异常和错误。

这些能力可以帮助您提高编程效率,减少重复工作,并提升代码质量。

智能体能力,留着下次再体验。




相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
这是7月份的一篇论文,Qwen团队提出的群组序列策略优化算法及其在大规模语言模型强化学习训练中的技术突破
698 0
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
|
3月前
|
存储 资源调度 并行计算
# Qwen3-8B 与 Qwen3-14B 的 TTFT 性能对比与底层原理详解
通义千问Qwen3系列是通义实验室2025年推出的最新大模型,包含多种参数版本,其中Qwen3-8B与Qwen3-14B均支持32K token上下文。Qwen3-8B参数量较小,响应更快,适合低延迟交互;Qwen3-14B参数更多,推理更强,适用于复杂任务。两者在TTFT、架构优化、量化技术及部署方案上各有侧重,满足多样应用场景需求。
1355 9
|
3月前
|
人工智能 运维 算法
通义灵码软件工程大模型获顶会最高奖!
近日,软件领域国际顶会ISSTA 2025(International Symposium on Software Testing and Analysis)公布最高奖项-杰出论文奖——「通义灵码软件工程大模型SWE-GPT」成为唯一获得该奖项的企业论文
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
|
4天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
157 62
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
2月前
|
人机交互 API 开发工具
基于通义多模态大模型的实时音视频交互
Qwen-Omni是通义千问系列的全新多模态大模型,支持文本、图像、音频和视频的输入,并输出文本和音频。Omni-Realtime服务针对实时交互场景优化,提供低延迟的人机交互体验。
405 23