豆包MarsCode 初体验,用React创建一个最经典的贪吃蛇游戏
以下是「 豆包MarsCode 体验官」优秀文章,作者Find。
背景
在人工智能快速发展的时代,大模型(LLM)只要有足够的算力和数据就可以做到任何的事情,甚至可以模拟出另一个地球。LLM作为一个革命化的科技,可以取代很多岗位,甚至可以让人类达到"躺着领钱的时代"。Marscode作为一个新推出的IDE,紧跟时代的潮流,拥抱AI,顺应时代的潮流。 各种各样的语言,都会有一个贪吃蛇的游戏去作为一个里程碑,我也完完全全用这个IDE去编写贪吃蛇游戏这个小demo。
创建项目
在这个IDE创建一个贪吃蛇的项目
生成了一个这样的项目目录
因为我还没学ts,就再用npm init vite去初始化了一个JavaScript的React项目
输完项目名称,cd project-name和npm i切换到你的项目目录和下载依赖就完成了vite脚手架的安装
npm run dev把项目跑起来 很方便直接能网页预览
设计项目
提出自己的需求给AI assistant
设计这个游戏的组件
但是它好像不是很能理解上下文,我这两句话是放在一起写的。只能再给出一份更详细的设计要求
给出了四份组件,那就去项目中创建文件。
创建好对应的目录和文件。询问AI代码
以下过程一样,找AI去生成一份相关组件的代码
当然因为我是分开要的组件代码,所以就产生了一些错误。看到还有AI fix的功能 我果断尝试了
这里AI fix 左右两边分别表示之前的代码和修改后的代码,你可以去看它修改后的代码是否正确去选择是否接受
对于这个问题,AI fix似乎跟个人机一样,根本解决不了
最大的感受就是这个AI fix感觉就是给你改错,然后用错去改你的错,有一点拆东墙补西墙的感觉,毕竟还是AI,可能并不能很好去理解bug本质所在,只会通过bug存在的原因去机械的给你改bug。
解决完所有的bug
代码也是成功跑不出来
有些涉及AI生成的代码中有些属性并未被初始化等等问题,改来改去最后还是把页面跑出来了
代码
GameBoard.jsx
import React, { useState, useEffect, useRef } from 'react'; import Snake from './Snake'; import Food from './Food'; import Score from './Score'; const GameBoard = () => { const [snakeBody, setSnakeBody] = useState([]); const [food, setFood] = useState({}); const [direction, setDirection] = useState('right'); const [isGameOver, setIsGameOver] = useState(false); const [score, setScore] = useState(0); const gameBoardRef = useRef(null); useEffect(() => { gameBoardRef.current.focus(); initializeGame(); }, []); useEffect(() => { if (snakeBody.length) { const timer = setInterval(moveSnake, 300); return () => clearInterval(timer); } }, [snakeBody, direction]); const initializeGame = () => { const initialSnake = [{ x: 200, y: 200 }]; setSnakeBody(initialSnake); setFood(getRandomPosition()); setDirection('right'); setIsGameOver(false); setScore(0); }; const getRandomPosition = () => { const x = Math.floor(Math.random() * 20) * 20; const y = Math.floor(Math.random() * 20) * 20; return { x, y }; }; const moveSnake = () => { let newHead; switch (direction) { case 'right': newHead = { x: snakeBody[0].x + 20, y: snakeBody[0].y }; break; case 'left': newHead = { x: snakeBody[0].x - 20, y: snakeBody[0].y }; break; case 'up': newHead = { x: snakeBody[0].x, y: snakeBody[0].y - 20 }; break; case 'down': newHead = { x: snakeBody[0].x, y: snakeBody[0].y + 20 }; break; default: return; } if (isCollisionWithWall(newHead) || isCollisionWithSelf(newHead)) { setIsGameOver(true); return; } const newSnakeBody = [newHead, ...snakeBody.slice(0, -1)]; if (isCollisionWithFood(newHead)) { setFood(getRandomPosition()); setScore(score + 1); newSnakeBody.push({}); } setSnakeBody(newSnakeBody); }; const isCollisionWithWall = (head) => { return head.x < 0 || head.x >= 400 || head.y < 0 || head.y >= 400; }; const isCollisionWithSelf = (head) => { return snakeBody.some((segment) => segment.x === head.x && segment.y === head.y); }; const isCollisionWithFood = (head) => { return head.x === food.x && head.y === food.y; }; const handleKeyDown = (event) => { if (event.keyCode === 37 && direction !== 'right') { setDirection('left'); } else if (event.keyCode === 38 && direction !== 'down') { setDirection('up'); } else if (event.keyCode === 39 && direction !== 'left') { setDirection('right'); } else if (event.keyCode === 40 && direction !== 'up') { setDirection('down'); } }; return ( <div> <div ref={gameBoardRef} tabIndex="0" onKeyDown={handleKeyDown} className="game-board" > {!isGameOver && <Snake snakeBody={snakeBody} />} {!isGameOver && <Food position={food} />} </div> <Score score={score} /> {isGameOver && <div>Game Over!</div>} </div> ); }; export default GameBoard;
App.jsx和App.css
import React from 'react'; import GameBoard from './components/GameBoard'; import './App.css'; function App() { return ( <div className="app"> <h1>贪吃蛇游戏</h1> <GameBoard /> </div> ); } export default App; .app { text-align: center; } ------------------css------------------ .game-container { display: flex; justify-content: center; align-items: flex-start; } .game-board { position: relative; width: 400px; height: 400px; border: 1px solid black; overflow: hidden; margin-right: 20px; } .score-board { margin-top: 20px; }
Snake.jsx
import React from 'react'; const Snake = ({ snakeBody }) => { return ( <> {snakeBody.map((segment, index) => ( <div key={index} style={{ width: '20px', height: '20px<p align=center>',</p> backgroundColor: index === 0 ? 'green' : 'black', position: 'absolute', left: `${segment.x}px`, top: `${segment.y}px`, }} /> ))} </> ); }; export default Snake;
Food.jsx
import React from 'react'; const Food = ({ position }) => { return ( <div style={{ width: '20px', height: '20px', backgroundColor: 'red', position: 'absolute', left: `${position.x}px`, top: `${position.y}px`, }} /> ); }; export default Food;
Score.jsx
import React from 'react'; const Score = ({ score }) => { return <div className="score-board">Score: {score}</div>; }; export default Score;
个人感受
做个这个小项目后,最大的感受就是如果你掌握了代码底层逻辑、编程思想等,通过这类有智能化AI的IDE一键生成会让你代码速度提升一个层次。可能有些人觉得AI只能搭建起一个简单的框架,事实上,在你搭建好了框架后,你还可以去按照你的需求去逐步完善你的项目,就拿这个贪吃蛇举例而言,如果我后续需要提升难度,根据我吃球后速度提升、设置障碍物等等,我都可以单独拎出这些需求告诉AI助手,就算它并不能完全帮你写完代码,但也能八九不离。CSS样式、页面切片这种,通过tailwindcss框架和语义化标签,AI已经有理解图像的能力,可以很好完成此类工作。当然随着大模型数据不断的喂养,慢慢等到资本的介入,算力不断提高,AI理解能力的提高,也会使这种AI IDE越来越厉害,也许真有一天普通人掌握编程思想不会编程语言也能编程。豆包Marscode正是有这种强大的功能的IDE,我相信豆包Marscode 会越来越好!!!
本文由博客一文多发平台 OpenWrite 发布!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
查询 ps.data_locks 导致 MySQL hang 住
官方在 8.0.37 中修复了这个 bug,可升级到 8.0.37 解决。 作者:胡呈清,爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:[简书 | 轻松的鱼],欢迎讨论。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文约 1500 字,预计阅读需要 8 分钟。 问题描述 MySQL 版本:8.0.26 跑批执行到 insert into t1 select * from t2 时,有一个定时任务运行 MySQL 巡检脚本,巡检脚本执行到 select * from performance_schema.data_locks、select * from performance_schema.data_lock_waits 会导致 MySQL hang,一开始只是某些 SQL 执行无响应,最终 MySQL 无法登录。 分析过程 1. 开始 hang 时的线程状态 下图标记的两个线程中: 第一个线程完整的 SQL 是 insert into t1 select * from t2 第二个线程完整的 SQL 是 select * from pe...
- 下一篇
开发者的利器:Rainbond 赋能你的产品创新
在当今快速变化的技术环境中,普通开发者面临的挑战日益增加。无论是在小型初创公司还是在大型企业中,开发人员都被迫面对繁杂的运维任务、复杂的环境配置以及技术的迅速迭代。这些问题不仅消耗了开发者的时间和精力,也限制了他们对业务本身的专注。为了解决这些痛点,Rainbond 应运而生,它为普通开发者提供了一个友好、高效的解决方案。 面对的挑战:开发者的困境 普通开发者往往需要处理多个角色,既要编写代码,又要管理环境配置,甚至涉及到运维工作。这种情况常常导致以下几个问题: 高依赖性 开发者需要依赖运维团队来搭建和维护开发环境,这种依赖关系往往造成沟通上的低效。在项目进度中,开发者常常因为一些小问题而被迫等待运维团队的支持,导致项目拖延。这种情况不仅影响了开发者的士气,还可能导致业务机会的流失。 学习负担 为了能够独立完成开发任务,开发者不得不花费大量时间学习 Linux、容器、K8s 等底层技术。这不仅降低了他们的工作效率,也让他们对核心业务的关注度降低。大量的时间被用来学习运维技能,而不是进行产品创新和用户体验的提升。 成本问题 小型团队常常缺乏足够的资源来雇佣专业的运维工程师。面对复杂的运维...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境