【前端实战】用CodeRider-Kilo高效生成五子棋游戏(附完整源码+工具详解)

本文将详细介绍如何借助CodeRider-Kilo AI助手高效开发一款视觉效果精美、功能完整的五子棋游戏。不仅会提供可直接运行的完整源码,还会深入解析CodeRider-Kilo的核心功能、使用流程及在前端开发中的赋能价值,搭配多组工具使用截图,帮助开发者快速掌握这款高效开发工具。

一、开发工具:CodeRider-Kilo AI助手深度解析

在本次五子棋项目开发中,我全程使用了CodeRider-Kilo AI助手作为核心开发工具。CodeRider-Kilo是一款专为开发者打造的智能编码辅助工具,具备精准代码生成、逻辑优化建议、语法错误修复、开发流程简化等核心能力,尤其在前端项目开发中,能大幅提升编码效率,降低开发门槛,即使是新手也能借助它快速完成功能完善的项目。

1.1 CodeRider-Kilo核心功能优势

  • 自然语言转代码:支持以中文自然语言描述功能需求,快速生成符合规范的HTML、CSS、JavaScript代码,无需手动编写基础框架代码。

  • 逻辑智能补全:在编写核心业务逻辑(如五子棋胜负判定、悔棋功能)时,能自动补全逻辑代码,并提供多种优化方案供选择。

  • 实时语法校验与修复:编码过程中实时检测语法错误、逻辑漏洞,主动给出修复建议,减少调试时间。

  • 代码风格统一:自动格式化生成的代码,遵循前端开发规范,保证代码可读性和可维护性。

  • 多场景适配支持:针对前端响应式布局、动画效果等场景,能生成适配多设备的代码,提升开发兼容性。

1.2 CodeRider-Kilo使用截图展示

以下是本次五子棋项目开发过程中,CodeRider-Kilo的关键使用场景截图,直观展示其高效开发能力:

场景1:需求描述生成项目基础框架

在工具中输入“生成一个15×15棋盘的五子棋游戏基础框架,包含HTML结构、CSS样式容器和基础JavaScript变量定义”,即可快速生成项目初始代码:

在这里插入图片描述

图1:CodeRider-Kilo根据自然语言需求生成五子棋基础框架界面

场景2:核心逻辑代码生成与优化

当需要实现“五子棋胜负判定”这一核心逻辑时,输入需求后,工具不仅生成基础判定代码,还会给出多方向检测的优化方案,并标注关键逻辑说明:

在这里插入图片描述

图2:CodeRider-Kilo生成五子棋胜负判定逻辑并提供优化建议

1.3 CodeRider-Kilo在本项目中的开发流程

  1. 需求梳理:明确五子棋核心功能(落子、胜负判定、悔棋、重新开始、数据统计),并以自然语言描述给CodeRider-Kilo。

  2. 框架生成:借助工具生成HTML基础结构、CSS样式框架和JavaScript核心变量与函数模板。

  3. 逻辑实现:针对每个核心功能,通过工具生成初始代码,再根据实际需求微调优化。

  4. UI美化:通过工具生成渐变背景、动画效果等样式代码,提升视觉体验。

  5. 调试优化:利用工具的错误检测功能,修复开发中的bug,优化代码性能。

借助这一流程,原本需要2-3小时的开发工作,最终仅用30分钟左右就完成了,效率提升极为显著。

二、游戏预览

先来看一下借助CodeRider-Kilo开发完成的五子棋游戏最终效果:

1. 游戏主界面

包含15×15标准棋盘、当前玩家提示、回合数统计、操作按钮和胜负数据统计区域,整体UI简洁美观:

在这里插入图片描述

图5:五子棋游戏主界面

2. 落子动画效果

棋子落下时带有缩放动画,视觉反馈清晰,提升游戏交互体验:

在这里插入图片描述

图6:棋子落子动画效果

3. 胜利提示界面

当一方达成五子连珠时,弹出胜利提示框,显示获胜方和所用步数,并自动更新统计数据:

在这里插入图片描述

图7:游戏胜利提示界面

三、功能特性

借助CodeRider-Kilo开发的这款五子棋游戏,具备以下核心功能,覆盖传统五子棋的全部基础需求,同时增加了人性化设计:

  • ✨ 15×15标准五子棋棋盘,完全符合传统五子棋规则,支持黑白棋交替落子。

  • ✨ 流畅的落子动画:棋子落下时带有0.3秒缩放动画,提升交互质感。

  • ✨ 智能胜负判定:实时检测横、竖、斜四个方向的五子连珠情况,精准判定获胜方。

  • ✨ 实用悔棋功能:支持撤销上一步操作,误落子时可快速修正,提升游戏容错率。

  • ✨ 数据统计与本地存储:自动记录黑棋胜场、白棋胜场和总局数,通过localStorage本地存储,刷新页面后数据不丢失。

  • ✨ 重新开始功能:一键重置棋盘和数据,快速开启新一局游戏。

  • ✨ 响应式设计:适配PC、平板等不同屏幕尺寸,在各类设备上均能正常运行。

  • ✨ 炫酷UI设计:采用渐变背景、阴影效果和圆角设计,提升整体视觉体验。

四、技术栈

本项目采用纯原生技术开发,无需任何第三方框架,借助CodeRider-Kilo快速实现功能,技术栈如下:

  • HTML5:搭建游戏的基本结构,定义棋盘、按钮、统计区域等核心元素。

  • CSS3:实现样式美化、落子动画、渐变效果和响应式布局,提升视觉体验。

  • JavaScript:处理游戏核心逻辑(落子、胜负判定、悔棋、数据存储等)。

  • CodeRider-Kilo AI助手:辅助生成代码、优化逻辑、修复错误,提升开发效率。

五、核心代码解析

以下核心代码均由CodeRider-Kilo生成并优化,关键逻辑处添加详细注释,便于理解:

1. HTML结构(CodeRider-Kilo生成基础框架后微调)

HTML结构清晰,分为游戏容器、玩家信息区、棋盘区、操作按钮区、统计区和胜利提示框,便于后续样式和逻辑开发:


<div class="game-container">
    <h1>🎯 五子棋游戏</h1>
    
    <div class="game-info">
        <div class="current-player">
            当前玩家: <span id="currentPlayer" class="player-black">⚫ 黑棋</span>
        </div>
        <div class="move-count">
            回合数: <span id="moveCount">0</span>
        </div>
    </div>

    <div class="board-container">
        <div class="board" id="board"></div>
    </div>

    <div class="controls">
        <button class="btn" onclick="resetGame()">🔄 重新开始</button>
        <button class="btn" onclick="undoMove()">↩️ 悔棋</button>
    </div>

    <div class="stats">
        <div class="stat-item">
            <div class="stat-label">黑棋胜利</div>
            <div class="stat-value" id="blackWins">0</div>
        </div>
        <div class="stat-item">
            <div class="stat-label">白棋胜利</div>
            <div class="stat-value" id="whiteWins">0</div>
        </div>
        <div class="stat-item">
            <div class="stat-label">总局数</div>
            <div class="stat-value" id="totalGames">0</div>
        </div>
    </div>
</div>

<div class="winner-message" id="winnerMessage">
    <div id="winnerText"></div>
    <button class="btn" onclick="hideWinnerMessage()">确定</button>
</div>

2. CSS关键样式(CodeRider-Kilo生成美化样式)

重点解析落子动画和渐变美化相关样式,这两部分是提升游戏视觉体验的核心:

2.1 棋子落子动画

.piece {
    position: absolute;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
    animation: placepiece 0.3s ease; /* 落子动画 */
}

/* 落子缩放动画关键帧 */
@keyframes placepiece {
    from {
        transform: translate(-50%, -50%) scale(0); /* 初始状态:缩小为0 */
    }
    to {
        transform: translate(-50%, -50%) scale(1); /* 结束状态:恢复原大小 */
    }
}
2.2 渐变美化样式

/* 页面背景渐变 */
body {
    font-family: 'Microsoft YaHei', Arial, sans-serif;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 20px;
}

/* 按钮渐变样式 */
.btn {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    border: none;
    padding: 12px 30px;
    font-size: 1.1em;
    border-radius: 25px;
    cursor: pointer;
    transition: all 0.3s ease;
    margin: 0 10px;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}

/* 按钮 hover 效果 */
.btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
}

3. JavaScript核心逻辑(CodeRider-Kilo生成并优化)

核心逻辑包括胜负判定、悔棋功能和本地存储,这三部分是游戏的核心,由CodeRider-Kilo生成基础代码后,根据需求进行微调,逻辑严谨且高效:

3.1 胜负判定算法

通过检测当前落子位置的横、竖、斜四个方向的连续同色棋子数量,判断是否达成五子连珠,算法高效精准:


function checkWin(row, col) {
    // 定义四个检测方向:水平、垂直、两个对角线
    const directions = [
        [[0, 1], [0, -1]],   // 水平方向(左右)
        [[1, 0], [-1, 0]],   // 垂直方向(上下)
        [[1, 1], [-1, -1]],  // 对角线1(右下-左上)
        [[1, -1], [-1, 1]]   // 对角线2(左下-右上)
    ];

    for (const direction of directions) {
        let count = 1; // 初始计数为1(当前落子的棋子)
        
        // 遍历每个方向的两个相反方向
        for (const [dr, dc] of direction) {
            let r = row + dr;
            let c = col + dc;
            
            // 循环检测同色棋子
            while (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE && 
                   board[r][c] === currentPlayer) {
                count++;
                r += dr;
                c += dc;
            }
        }
        
        // 连续5个及以上同色棋子则判定获胜
        if (count >= 5) {
            return true;
        }
    }
    
    return false;
}
3.2 悔棋功能

通过记录落子历史,悔棋时删除最后一步的棋子数据和DOM元素,重置回合数和当前玩家,逻辑清晰:


function undoMove() {
    // 无落子记录或游戏结束时,无法悔棋
    if (moveHistory.length === 0 || gameOver) {
        return;
    }

    // 获取最后一步落子信息
    const lastMove = moveHistory.pop();
    // 重置棋盘对应位置数据
    board[lastMove.row][lastMove.col] = null;
    // 减少回合数
    moveCount--;
    
    // 移除页面上的最后一颗棋子
    const cell = document.querySelector(`[data-row="${lastMove.row}"][data-col="${lastMove.col}"]`);
    const piece = cell.querySelector('.piece');
    if (piece) {
        piece.remove();
    }
    
    // 重置当前玩家为最后一步的玩家
    currentPlayer = lastMove.player;
    // 更新页面显示
    updateDisplay();
}
3.3 本地存储统计数据

使用localStorage存储胜场和总局数数据,页面刷新后自动加载,保证数据持久性:


// 保存统计数据到本地存储
function saveStats() {
    localStorage.setItem('gomokuStats', JSON.stringify(stats));
}

// 从本地存储加载统计数据
function loadStats() {
    const savedStats = localStorage.getItem('gomokuStats');
    if (savedStats) {
        stats = JSON.parse(savedStats);
        // 加载后更新页面显示
        updateStatsDisplay();
    }
}

六、完整源码

以下是借助CodeRider-Kilo开发完成的五子棋游戏完整源码,可直接复制到文本编辑器保存为HTML文件,用浏览器打开即可运行:


<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>五子棋游戏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Microsoft YaHei', Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
        }

        .game-container {
            background: rgba(255, 255, 255, 0.95);
            border-radius: 20px;
            padding: 30px;
            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
            text-align: center;
            max-width: 700px;
            width: 100%;
        }

        h1 {
            color: #333;
            margin-bottom: 20px;
            font-size: 2.5em;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
        }

        .game-info {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
            padding: 15px;
            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
            border-radius: 10px;
            color: white;
        }

        .current-player {
            font-size: 1.2em;
            font-weight: bold;
        }

        .player-black {
            color: #333;
            background: white;
            padding: 5px 10px;
            border-radius: 5px;
        }

        .player-white {
            color: #666;
            background: #f0f0f0;
            padding: 5px 10px;
            border-radius: 5px;
            border: 1px solid #ccc;
        }

        .board-container {
            display: inline-block;
            background: #deb887;
            padding: 20px;
            border-radius: 10px;
            box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.2);
            margin: 20px 0;
        }

        .board {
            display: grid;
            grid-template-columns: repeat(15, 30px);
            grid-template-rows: repeat(15, 30px);
            gap: 0;
            background: #deb887;
            position: relative;
        }

        .cell {
            width: 30px;
            height: 30px;
            border: 1px solid #8b4513;
            cursor: pointer;
            position: relative;
            background: transparent;
            transition: background-color 0.3s ease;
        }

        .cell:hover {
            background-color: rgba(255, 255, 255, 0.3);
        }

        .piece {
            position: absolute;
            width: 26px;
            height: 26px;
            border-radius: 50%;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
            animation: placepiece 0.3s ease;
        }

        @keyframes placepiece {
            from {
                transform: translate(-50%, -50%) scale(0);
            }
            to {
                transform: translate(-50%, -50%) scale(1);
            }
        }

        .piece.black {
            background: radial-gradient(circle at 30% 30%, #666, #000);
        }

        .piece.white {
            background: radial-gradient(circle at 30% 30%, #fff, #ddd);
            border: 1px solid #ccc;
        }

        .controls {
            margin-top: 20px;
        }

        .btn {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border: none;
            padding: 12px 30px;
            font-size: 1.1em;
            border-radius: 25px;
            cursor: pointer;
            transition: all 0.3s ease;
            margin: 0 10px;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
        }

        .btn:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
        }

        .btn:active {
            transform: translateY(0);
        }

        .winner-message {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: rgba(0, 0, 0, 0.9);
            color: white;
            padding: 30px 50px;
            border-radius: 15px;
            font-size: 1.5em;
            z-index: 1000;
            display: none;
            animation: fadeIn 0.5s ease;
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translate(-50%, -50%) scale(0.8);
            }
            to {
                opacity: 1;
                transform: translate(-50%, -50%) scale(1);
            }
        }

        .winner-message.show {
            display: block;
        }

        .stats {
            margin-top: 20px;
            padding: 15px;
            background: #f8f9fa;
            border-radius: 10px;
            display: flex;
            justify-content: space-around;
        }

        .stat-item {
            text-align: center;
        }

        .stat-label {
            font-size: 0.9em;
            color: #666;
            margin-bottom: 5px;
        }

        .stat-value {
            font-size: 1.5em;
            font-weight: bold;
            color: #333;
        }
    </style>
</head>
<body>
    <div class="game-container">
        <h1>🎯 五子棋游戏</h1>
        
        <div class="game-info">
            <div class="current-player">
                当前玩家: <span id="currentPlayer" class="player-black">⚫ 黑棋</span>
            </div>
            <div class="move-count">
                回合数: <span id="moveCount">0</span>
            </div>
        </div>

        <div class="board-container">
            <div class="board" id="board"></div>
        </div>

        <div class="controls">
            <button class="btn" onclick="resetGame()">🔄 重新开始</button>
            <button class="btn" onclick="undoMove()">↩️ 悔棋</button>
        </div>

        <div class="stats">
            <div class="stat-item">
                <div class="stat-label">黑棋胜利</div>
                <div class="stat-value" id="blackWins">0</div>
            </div>
            <div class="stat-item">
                <div class="stat-label">白棋胜利</div>
                <div class="stat-value" id="whiteWins">0</div>
            </div>
            <div class="stat-item">
                <div class="stat-label">总局数</div>
                <div class="stat-value" id="totalGames">0</div>
            </div>
        </div>
    </div>

    <div class="winner-message" id="winnerMessage">
        <div id="winnerText"></div>
        <button class="btn" onclick="hideWinnerMessage()">确定</button>
    </div>

    <script>
        const BOARD_SIZE = 15;
        let board = [];
        let currentPlayer = 'black';
        let gameOver = false;
        let moveCount = 0;
        let moveHistory = [];
        let stats = {
            blackWins: 0,
            whiteWins: 0,
            totalGames: 0
        };

        // 初始化游戏
        function initGame() {
            board = Array(BOARD_SIZE).fill(null).map(() => Array(BOARD_SIZE).fill(null));
            currentPlayer = 'black';
            gameOver = false;
            moveCount = 0;
            moveHistory = [];
            createBoard();
            updateDisplay();
            loadStats();
        }

        // 创建棋盘
        function createBoard() {
            const boardElement = document.getElementById('board');
            boardElement.innerHTML = '';
            
            for (let row = 0; row < BOARD_SIZE; row++) {
                for (let col = 0; col < BOARD_SIZE; col++) {
                    const cell = document.createElement('div');
                    cell.className = 'cell';
                    cell.dataset.row = row;
                    cell.dataset.col = col;
                    cell.onclick = () => makeMove(row, col);
                    boardElement.appendChild(cell);
                }
            }
        }

        // 下棋
        function makeMove(row, col) {
            if (gameOver || board[row][col] !== null) {
                return;
            }

            board[row][col] = currentPlayer;
            moveHistory.push({ row, col, player: currentPlayer });
            moveCount++;

            const cell = document.querySelector(`[data-row="${row}"][data-col="${col}"]`);
            const piece = document.createElement('div');
            piece.className = `piece ${currentPlayer}`;
            cell.appendChild(piece);

            if (checkWin(row, col)) {
                gameOver = true;
                showWinner();
                updateStats();
            } else {
                currentPlayer = currentPlayer === 'black' ? 'white' : 'black';
            }

            updateDisplay();
        }

        // 检查获胜
        function checkWin(row, col) {
            const directions = [
                [[0, 1], [0, -1]],   // 水平
                [[1, 0], [-1, 0]],   // 垂直
                [[1, 1], [-1, -1]],  // 对角线1
                [[1, -1], [-1, 1]]   // 对角线2
            ];

            for (const direction of directions) {
                let count = 1;
                
                for (const [dr, dc] of direction) {
                    let r = row + dr;
                    let c = col + dc;
                    
                    while (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE && 
                           board[r][c] === currentPlayer) {
                        count++;
                        r += dr;
                        c += dc;
                    }
                }
                
                if (count >= 5) {
                    return true;
                }
            }
            
            return false;
        }

        // 显示获胜信息
        function showWinner() {
            const winnerText = document.getElementById('winnerText');
            const winnerMessage = document.getElementById('winnerMessage');
            const winner = currentPlayer === 'black' ? '⚫ 黑棋' : '⚪ 白棋';
            winnerText.textContent = `🎉 ${winner} 获胜!用了 ${moveCount}`;
            winnerMessage.classList.add('show');
            
            stats.totalGames++;
            if (currentPlayer === 'black') {
                stats.blackWins++;
            } else {
                stats.whiteWins++;
            }
            saveStats();
            updateStatsDisplay();
        }

        // 隐藏获胜信息
        function hideWinnerMessage() {
            document.getElementById('winnerMessage').classList.remove('show');
        }

        // 重置游戏
        function resetGame() {
            hideWinnerMessage();
            initGame();
        }

        // 悔棋
        function undoMove() {
            if (moveHistory.length === 0 || gameOver) {
                return;
            }

            const lastMove = moveHistory.pop();
            board[lastMove.row][lastMove.col] = null;
            moveCount--;
            
            const cell = document.querySelector(`[data-row="${lastMove.row}"][data-col="${lastMove.col}"]`);
            const piece = cell.querySelector('.piece');
            if (piece) {
                piece.remove();
            }
            
            currentPlayer = lastMove.player;
            updateDisplay();
        }

        // 更新显示
        function updateDisplay() {
            const currentPlayerElement = document.getElementById('currentPlayer');
            const moveCountElement = document.getElementById('moveCount');
            
            if (currentPlayer === 'black') {
                currentPlayerElement.textContent = '⚫ 黑棋';
                currentPlayerElement.className = 'player-black';
            } else {
                currentPlayerElement.textContent = '⚪ 白棋';
                currentPlayerElement.className = 'player-white';
            }
            
            moveCountElement.textContent = moveCount;
        }

        // 更新统计显示
        function updateStatsDisplay() {
            document.getElementById('blackWins').textContent = stats.blackWins;
            document.getElementById('whiteWins').textContent = stats.whiteWins;
            document.getElementById('totalGames').textContent = stats.totalGames;
        }

        // 保存统计数据
        function saveStats() {
            localStorage.setItem('gomokuStats', JSON.stringify(stats));
        }

        // 加载统计数据
        function loadStats() {
            const savedStats = localStorage.getItem('gomokuStats');
            if (savedStats) {
                stats = JSON.parse(savedStats);
                updateStatsDisplay();
            }
        }

        // 更新统计
        function updateStats() {
            updateStatsDisplay();
        }

        // 初始化游戏
        initGame();
    </script>
</body>
</html>

七、运行说明

由于是纯前端项目,借助CodeRider-Kilo生成的代码无需任何额外依赖,运行步骤极为简单:

  1. 将上述完整源码复制到任意文本编辑器(如记事本、VS Code等)。

  2. 将文件保存为 gomoku.html(注意文件后缀为.html)。

  3. 直接用浏览器(Chrome、Edge、Firefox等)打开该HTML文件,即可正常运行游戏。

八、扩展方向(CodeRider-Kilo辅助实现建议)

如果想进一步完善这款五子棋游戏,可以借助CodeRider-Kilo快速实现以下扩展功能,只需向工具描述需求即可生成对应代码:

  • 添加人机对战模式:向CodeRider-Kilo描述“实现五子棋人机对战,AI具备基础防守和进攻逻辑”,工具可生成AI算法代码。

  • 支持在线双人对战:描述“借助WebSocket实现五子棋在线双人对战,支持房间创建和加入”,工具可生成前后端交互基础代码。

  • 增加计时功能:描述“为黑白棋玩家分别添加计时,超时判定失败,实现快棋模式”,工具生成计时相关逻辑代码。

  • 自定义棋盘样式:描述“支持自定义棋盘颜色、棋子大小和背景图片”,工具生成对应的样式配置代码。

  • 添加音效和背景音乐:描述“为落子、获胜、悔棋等操作添加音效,支持背景音乐开关”,工具生成音频相关代码。

九、总结

本次五子棋项目的开发,充分体现了CodeRider-Kilo AI助手在前端开发中的高效赋能价值。通过自然语言描述需求,即可快速生成规范、可运行的代码,大幅减少了基础编码和调试时间,让开发者能更专注于功能设计和体验优化。

这款借助CodeRider-Kilo开发的五子棋游戏,功能完整、UI美观、运行流畅,适合作为前端入门练习项目。同时,CodeRider-Kilo的使用流程也值得开发者借鉴,无论是新手入门还是资深开发者提升效率,都是一款极具价值的工具。

如果你有任何问题、优化建议,或者想了解CodeRider-Kilo的更多使用技巧,欢迎在评论区留言交流!

觉得本文对你有帮助的话,欢迎点赞、收藏、关注,后续会分享更多借助CodeRider-Kilo开发的前端实战项目

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐