首页 > 其他分享 >豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏

时间:2024-09-25 16:51:20浏览次数:10  
标签:head 初体验 const AI React 贪吃蛇 && return snakeBody

以下是「  豆包MarsCode 体验官」优秀文章,作者Find。

背景

在人工智能快速发展的时代,大模型(LLM)只要有足够的算力和数据就可以做到任何的事情,甚至可以模拟出另一个地球。LLM作为一个革命化的科技,可以取代很多岗位,甚至可以让人类达到“躺着领钱的时代”。Marscode作为一个新推出的IDE,紧跟时代的潮流,拥抱AI,顺应时代的潮流。

各种各样的语言,都会有一个贪吃蛇的游戏去作为一个里程碑,我也完完全全用这个IDE去编写贪吃蛇游戏这个小demo。

创建项目

在这个IDE创建一个贪吃蛇的项目

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发

生成了一个这样的项目目录

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_App_02

因为我还没学ts,就再用npm init vite去初始化了一个JavaScript的React项目

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_03

输完项目名称,cd project-namenpm i切换到你的项目目录和下载依赖就完成了vite脚手架的安装

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_App_04

npm run dev把项目跑起来 很方便直接能网页预览

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_贪吃蛇_05

设计项目

提出自己的需求给AI assistant

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_贪吃蛇_06

设计这个游戏的组件

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_07

但是它好像不是很能理解上下文,我这两句话是放在一起写的。只能再给出一份更详细的设计要求

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_贪吃蛇_08

给出了四份组件,那就去项目中创建文件。

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_人工智能_09

创建好对应的目录和文件。询问AI代码

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_贪吃蛇_10

以下过程一样,找AI去生成一份相关组件的代码

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_11

当然因为我是分开要的组件代码,所以就产生了一些错误。看到还有AI fix的功能 我果断尝试了

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_ai_12

这里AI fix 左右两边分别表示之前的代码和修改后的代码,你可以去看它修改后的代码是否正确去选择是否接受

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_13

对于这个问题,AI fix似乎跟个人机一样,根本解决不了

最大的感受就是这个AI fix感觉就是给你改错,然后用错去改你的错,有一点拆东墙补西墙的感觉,毕竟还是AI,可能并不能很好去理解bug本质所在,只会通过bug存在的原因去机械的给你改bug。

解决完所有的bug

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_贪吃蛇_14

代码也是成功跑不出来

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_ai_15

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_16

有些涉及AI生成的代码中有些属性并未被初始化等等问题,改来改去最后还是把页面跑出来了

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_游戏开发_17

 

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏_ai_18

代码

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 会越来越好!!!


标签:head,初体验,const,AI,React,贪吃蛇,&&,return,snakeBody
From: https://blog.51cto.com/u_16851677/12110729

相关文章

  • react之jsx基础(2)高频使用场景
    在React中,JSX的使用是非常广泛和高频的。以下是一些常见的高频使用场景及其示例,帮助你更好地理解JSX的实际应用:1.组件定义JSX最常见的用途之一是定义组件的结构。组件可以是函数组件或类组件,通常会使用JSX来描述组件的UI。函数组件示例:functionGreeting(props){......
  • 如何通过Express和React处理SSE
    如何通过Express和React处理SSE奇舞团360最大的前端团队。已关注 2人赞同了该文章本文作者为360奇舞团前端开发工程师最近AIGC技术的大热,市面上也出现了许多类似生产的AI工具,其中有一大特色就是对话的输出结果是类似真人的打字效果出现,要呈现......
  • Server-Sent Events (SSE) Koa2 & Nginx & React 实践
    Server-SentEvents(SSE)Koa2&Nginx&React实践得鹿梦鱼前端+node全栈,骑马找马中,有兴趣可私聊​关注他 在现代Web应用中,实时数据传输变得越来越重要。Server-SentEvents(SSE)是一种轻量级的技术,允许服务器向客户端主动发送更新。本文将详细介......
  • (零) React Native 项目开发拾遗
    (零)ReactNative项目开发拾遗 一位离职的前端同事,最近接了个 ReactNative 的活儿,遇到许多搞不定的问题,于是找到我帮忙“补课”(没有系统的学习 ReactNative,也不具备原生 Android 和 iOS 开发基础知识)。此前带过另一位前端同事入门 ReactNative 开发,有段时间甚......
  • 我的网站集成ElasticSearch初体验
    我的网站集成ElasticSearch初体验   最近,我给我的网站(https://www.xiandanplay.com/)尝试集成了一下es来实现我的一个搜索功能,因为这个是我第一次了解运用elastic,所以如果有不对的地方,大家可以指出来,话不多说,先看看我的一个大致流程   这里我采用的sdk的版本是El......
  • 在 Windows 机器内使用 Fast API、React、Raspberry Pi 制作服务器应用程序
    系统规格处理器-i5第13代RAM-16GBSSD-Nvme500GB操作系统-WindowsHomeRaspberryPi-Pi48GB我有一个托管的FastAPI应用程序在Windows机器上,同一台机器上还有一个React应用程序。React应用程序使用fastAPI应用......
  • react-基础
    React基础React介绍目标任务:了解什么是React以及它的特点React是什么一个专注于构建用户界面的JavaScript库,和vue和angular并称前端三大框架,不夸张的说,react引领了很多新思想,世界范围内是最流行的js前端框架,最近发布了18版本,加入了很多新特性React英文文档(https://reactjs.or......
  • ReactNative环境搭建
    一、ReactNative概述React是一个构建用户界面的JS框架,实现了数据的响应式和组件化开发,本身既可以用于Web网站项目,也可以用于创建移动端App项目。相较于Vue.js在移动端只能构建WebApp,React生态系统中有一个可以构建“真正原生App”的扩展——ReactNative,可以这样说:“ReactNativ......
  • React 入门第十天:代码拆分与懒加载
    在第十天的学习中,我把重点放在了React的代码拆分和懒加载技术上。这些技术不仅能有效减少应用的初始加载时间,还能提升用户体验。随着应用的功能逐渐增加,如何确保应用性能保持高效,成为了一个必须解决的问题。1.为什么需要代码拆分?在开发大型React应用时,所有的代码通常会被打包成一......
  • React 入门第九天:与后端API的集成与数据管理
    在React学习的第九天,我集中学习了如何与后端API进行集成。这一步是将静态的React应用转变为动态、可交互的关键。通过与后端通信,我们可以从服务器获取数据、发送用户输入以及处理复杂的业务逻辑。1.使用fetch进行数据请求React没有内置的HTTP库,因此我们通常使用浏览器提供的fetch......