通义灵码 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对自己做个总结

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

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

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

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




目录
打赏
0
8
10
0
69
分享
相关文章
📣通义大模型新成员Qwen-VLo,重磅上线,它实现了从“看懂”世界到“描绘”世界
通义千问团队推出全新多模态统一理解与生成模型Qwen VLo,具备强大的图像理解与生成能力。它不仅能“看懂”图像内容,还能基于理解进行高质量再创造,实现从感知到生成的跨越。支持开放指令编辑、多语言交互及复杂任务处理,适用于图像生成、风格迁移、检测标注等多种场景。
229 0
魔塔社区-微调Qwen3-1.7B大模型实战
这是一篇关于模型微调实战的教程,主要步骤如下:1. 使用魔塔社区提供的GPU环境;2. 处理 delicate_medical_r1_data 数据集生成训练和验证文件;3. 加载Modelscope上的Qwen3-1.7B模型;4. 注册并使用Swanlab工具配置API;5. 按顺序执行完整代码完成微调设置;6. 展示训练过程。完整代码与实验记录分别托管于魔塔社区和SwanLab平台,方便复现与学习。
481 1
AI IDE正式上线!通义灵码开箱即用
通义灵码AI IDE现已正式上线,用户可免费下载使用。作为AI原生开发环境工具,它深度适配千问3大模型,集成通义灵码插件能力,支持编程智能体、行间建议预测和行间会话等功能。其核心亮点包括:支持最强开源模型千问3,具备MCP工具调用能力;开箱即用的智能编码助手;自带编程智能体模式,端到端完成编码任务;长期记忆、NES行间预测及Inline Chat功能,大幅提升编程效率。目前,通义灵码插件下载量超1500万,生成代码超30亿行,广泛应用于企业开发场景。
AI IDE正式上线!通义灵码开箱即用
通义OmniAudio大模型,让 AI 看懂 360° 视频,并“听”出对应的空间音频
OmniAudio 是一项突破性的空间音频生成技术,能够直接从 360° 视频生成 FOA(First-order Ambisonics)空间音频,为虚拟现实和沉浸式娱乐带来全新可能。通过自监督 coarse-to-fine 预训练和双分支视频表示微调,OmniAudio 在非空间音频质量和空间定位准确性上显著优于现有方法。项目包含超过 103,000 个视频片段的 Sphere360 数据集,支持高质量的模型训练与评估。代码、数据及论文均已开源,助力沉浸式体验技术发展。
292 62
通义灵码你问我答:看看 5 月上线了哪些新功能?
通义灵码5月升级了智能问答(Ask)模式至Agentic模式,支持自主调用工程感知和网络检索工具,使开发者互动更贴合工程场景。新增行间会话(Inline Chat)与行间建议预测(NES)功能,大幅提升代码修改效率。同时发布AI IDE——Lingma IDE,全面集成智能编码能力,开箱即用,无需额外插件。此外,还优化了上下文文件添加体验及其他多项功能,进一步提升开发效率和用户体验。
再不玩通义 VACE 模型你就过时了!一个模型搞定所有视频任务
介绍通义的开源模型在 ecs 或 acs 场景如何一键部署和使用,如何解决不同视频生成场景的问题。
1688图片搜索逆向工程与多模态搜索融合实践——基于CLIP模型的特征向
本文介绍了通过逆向工程分析实现图片搜索的技术方案,包括请求特征捕获、签名算法破解及多模态搜索的实现。利用CLIP模型提取图像特征,并结合Faiss优化相似度计算,提升搜索效率。最后提供完整调用示例,模拟实现非官方API的图片搜索功能。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等