【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏

【AI4CODE】目录

【AI4CODE】1 Trae CN 锥安装配置与迁移

【AI4CODE】2 Trae 锤一个 To-Do-List


这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。
在这里插入图片描述

1 环境准备

创建一个 Snake 的子文件夹,清除以前的会话记录。
在这里插入图片描述

2 开始构建

2.1 输入会话提词

比如:

用html/css/javascript技术栈构建一个简洁美观的贪吃蛇小游戏,要求有开始游戏按钮,保存最高得分记录到本地

2.2 思考过程

在这里插入图片描述

2.3 构建过程

在这里插入图片描述
在这里插入图片描述

2.4 Live Server 启动服务试试

画面出来了,开始游戏发现,蛇的移动数据太快了,修改一下移动速度。
在这里插入图片描述
输入提词:蛇的移动数据太快了

了解您希望调整贪吃蛇的移动速度。当前游戏逻辑使用requestAnimationFrame实现循环,可以通过添加移动间隔控制机制来调节速度。建议在update函数中增加时间间隔判断,例如每200毫秒更新一次蛇的位置。同时保留原有动画帧调用以保证画面流畅。这样既能保持画面渲染流畅度,又能独立控制蛇的移动速度。

现在为贪吃蛇游戏添加移动间隔控制机制来降低移动速度。将在game.js中新增lastMoveTime变量和时间间隔判断逻辑,保持画面流畅的同时实现速度控制。

2.5 OK 可以玩了

在这里插入图片描述
蛇的移动移动速度,也可以自己修改 game.js的

const moveInterval = 300;

这里的单位是毫秒。

3 代码贴出来

所有的代码都 Trae 自动锤出来的,我没有写一行代码,共三个代码文件:index.html/game.js/style.css

3.1 Index.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>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="game-container">
    <canvas id="gameCanvas" width="400" height="400"></canvas>
    <div class="control-panel">
      <button id="startBtn" class="game-btn">开始游戏</button>
      <div class="score-board">
        <span>当前得分:<span id="currentScore">0</span></span>
        <span>最高得分:<span id="highScore">0</span></span>
      </div>
    </div>
  </div>
  <script src="game.js"></script>
</body>
</html>

3.2 Style.css

body {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  margin: 0;
  background: #2c3e50;
  font-family: Arial, sans-serif;
}

.game-container {
  position: relative;
  background: #ecf0f1;
  padding: 20px;
  border-radius: 10px;
  box-shadow: 0 0 20px rgba(0,0,0,0.3);
}

#gameCanvas {
  border: 2px solid #34495e;
}

.control-panel {
  margin-top: 20px;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.game-btn {
  padding: 12px 30px;
  font-size: 18px;
  background: #27ae60;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  transition: background 0.3s;
}

.game-btn:hover {
  background: #219a52;
}

.score-board {
  margin-top: 15px;
  font-size: 16px;
  color: #2c3e50;
  display: flex;
  gap: 20px;
}

@media (max-width: 480px) {
  #gameCanvas {
    width: 300px;
    height: 300px;
  }
}

3.3 Game.js

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const startBtn = document.getElementById('startBtn');
const currentScoreSpan = document.getElementById('currentScore');
const highScoreSpan = document.getElementById('highScore');

const gridSize = 20;
let snake = [];
let food = {};
let direction = 'right';
let nextDirection = 'right';
let gameLoop;
let score = 0;
let highScore = localStorage.getItem('snakeHighScore') || 0;

highScoreSpan.textContent = highScore;

function initGame() {
  snake = [{x: 5, y: 5}];
  score = 0;
  currentScoreSpan.textContent = score;
  direction = 'right';
  nextDirection = 'right';
  generateFood();
}

function generateFood() {
  food = {
    x: Math.floor(Math.random() * (canvas.width/gridSize)),
    y: Math.floor(Math.random() * (canvas.height/gridSize))
  };
  // 防止食物生成在蛇身上
  while(snake.some(segment => segment.x === food.x && segment.y === food.y)) {
    food = {
      x: Math.floor(Math.random() * (canvas.width/gridSize)),
      y: Math.floor(Math.random() * (canvas.height/gridSize))
    };
  }
}

function update() {
  const head = {...snake[0]};
  direction = nextDirection;

  switch(direction) {
    case 'up': head.y--; break;
    case 'down': head.y++; break;
    case 'left': head.x--; break;
    case 'right': head.x++; break;
  }

  // 碰撞检测
  if (head.x < 0 || head.x >= canvas.width/gridSize || 
      head.y < 0 || head.y >= canvas.height/gridSize ||
      snake.some(segment => segment.x === head.x && segment.y === head.y)) {
    gameOver();
    return;
  }

  snake.unshift(head);

  // 吃食物
  if (head.x === food.x && head.y === food.y) {
    score += 10;
    currentScoreSpan.textContent = score;
    generateFood();
  } else {
    snake.pop();
  }
}

function draw() {
  // 清空画布
  ctx.fillStyle = '#ecf0f1';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // 绘制蛇
  ctx.fillStyle = '#27ae60';
  snake.forEach(segment => {
    ctx.fillRect(segment.x*gridSize, segment.y*gridSize, gridSize-2, gridSize-2);
  });

  // 绘制食物
  ctx.fillStyle = '#e74c3c';
  ctx.fillRect(food.x*gridSize, food.y*gridSize, gridSize-2, gridSize-2);
}

function gameOver() {
  cancelAnimationFrame(gameLoop);
  startBtn.textContent = '开始游戏';
  if (score > highScore) {
    highScore = score;
    localStorage.setItem('snakeHighScore', highScore);
    highScoreSpan.textContent = highScore;
  }
}

// 事件监听
let lastMoveTime = 0;
const moveInterval = 300;

function animate(timestamp) {
  if (!lastMoveTime) {
    lastMoveTime = timestamp;
  }
  
  const elapsed = timestamp - lastMoveTime;
  
  if (elapsed >= moveInterval) {
    update();
    lastMoveTime = timestamp;
  }
  
  draw();
  gameLoop = requestAnimationFrame(animate);
}

// 修改游戏启动逻辑
startBtn.addEventListener('click', () => {
  if (!gameLoop) {
    initGame();
    startBtn.textContent = '暂停游戏';
    lastMoveTime = 0; // 重置计时器
    gameLoop = requestAnimationFrame(animate);
  } else {
    cancelAnimationFrame(gameLoop);
    gameLoop = null;
    startBtn.textContent = '继续游戏';
  }
});

// 键盘控制
document.addEventListener('keydown', (e) => {
  switch(e.key.toLowerCase()) {
    case 'arrowup':
    case 'w':
      if (direction !== 'down') nextDirection = 'up';
      break;
    case 'arrowdown':
    case 's':
      if (direction !== 'up') nextDirection = 'down';
      break;
    case 'arrowleft':
    case 'a':
      if (direction !== 'right') nextDirection = 'left';
      break;
    case 'arrowright':
    case 'd':
      if (direction !== 'left') nextDirection = 'right';
      break;
  }
});

本文完

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值