惊了!!用React创建一个最经典的贪吃蛇游戏”- “豆包MarsCode体验官




背景

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

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

创建项目

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

f59aecdb383302ff6a2adf47179448b0.jpeg
image.png

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

62b1910dd1edf63971afcee18ab5f1ea.jpeg
image.png

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

7a611e66e0d53a1af09c1f35f6efcf51.jpeg
image.png

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

ecdcc707e50bfb261c045c51dcbb708e.jpeg
image.png

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

9eb390b817be6757c4b5278b9d5c1a91.jpeg
image.png

设计项目

提出自己的需求给AI assistant

339c60a742295592744bfec4a5846a5f.jpeg
image.png

设计这个游戏的组件

58cae2d0dae00f204a288d86f94dbff2.jpeg
image.png

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

9e398edba0b80bac06fe1e3ec01635b7.jpeg
image.png

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

78159289f3a6e57a5fcb8f5ff04c15eb.jpeg
image.png

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

b41ee219fbc6a6bf17edfb6d5189db3a.jpeg
image.png

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

581f88817752f1a28600c15c5bef2ae8.jpeg
image.png

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

670bf0aac196fd68269508d14ae5fe38.jpeg
image.png

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

35306626e760c4486c8d4b412431d0d2.jpeg
image.png

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

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

解决完所有的bug

84ef971748169949c5e3746c3f334935.jpeg
image.png

代码也是成功跑不出来

379edb9662043a8f6e9acb8d187b99f4.jpeg
image.png
57206dff2f5ff48851f8702e17eb5580.jpeg
image.png

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

043513fe6481b0687ed7e3ddb093e01f.jpeg107b49957129a4035a50767d8437e203.jpeg

代码

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

原文链接:https://juejin.cn/post/7389092138900979723

原文作者:Find

送人玫瑰,手留余香,觉得有收获的朋友可以点赞,关注一波 ,我们组建了高级前端交流群,如果您热爱技术,想一起讨论技术,交流进步,不管是面试题,工作中的问题,难点热点都可以在交流群交流,为了拿到大Offer,邀请您进群,入群就送前端精选100本电子书以及 阿里面试前端精选资料 添加 下方小助手二维码或者扫描二维码 就可以进群。让我们一起学习进步.

推荐阅读

(点击标题可跳转阅读)

[极客前沿]-你不知道的 React 18 新特性

[极客前沿]-写给前端的 K8s 上手指南

[极客前沿]-写给前端的Docker上手指南

[面试必问]-你不知道的 React Hooks 那些糟心事

[面试必问]-一文彻底搞懂 React 调度机制原理

[面试必问]-一文彻底搞懂 React 合成事件原理

[面试必问]-全网最简单的React Hooks源码解析

[面试必问]-一文掌握 Webpack 编译流程

[面试必问]-全网最全 React16.0-16.8 特性总结

[架构分享]- 微前端qiankun+docker+nginx自动化部署

[自我提升]-送给React开发者十九条性能优化建议

[大前端之路]-连前端都看得懂的《Nginx 入门指南》

[软实力提升]-金三银四,如何写一份面试官心中的简历

a04ffda37d9a029e0c3e1d3bf3722095.png

觉得本文对你有帮助?请分享给更多人

关注「React中文社区」加星标,每天进步

e4dfb98bd0f6a8eb419678e26bb1c5b0.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值