首页 > 其他分享 >【小游戏】保姆级超有意思的贪吃蛇前端项目,小时候的回忆——你确定不来看看??

【小游戏】保姆级超有意思的贪吃蛇前端项目,小时候的回忆——你确定不来看看??

时间:2024-11-20 23:17:17浏览次数:3  
标签:function 10 ctx 小游戏 snake dx 贪吃蛇 保姆 Math

文章目录


在这里插入图片描述

整体架构流程

HTML5+CSS3+JS

技术细节

一.打开vscode,新建文件名称如下,当然你的css也可以写在html里

在这里插入图片描述

代码如下

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>贪吃蛇游戏</title>
</head>
<style>
#gameCanvas {
  background-color: lightgray;
  display: block;
  margin: 0 auto;
}

#score-board {
  text-align: center;
  margin-top: 10px;
  font-size: 20px;
}

button {
  display: block;
  margin: 10px auto;
  padding: 10px 20px;
  font-size: 16px;
  cursor: pointer;
}
</style>

<body>
  <canvas id="gameCanvas" width="400" height="400"></canvas>
  <div id="score-board">得分: <span id="score">0</span></div>
  <button id="start-button">开始游戏</button>
  <button id="pause-button">暂停游戏</button>
  <button id="reset-button">重置游戏</button>
  <script src="script.js"></script>
</body>


</html>

script.js

// 获取画布和上下文
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

// 蛇的初始位置和大小
const snake = {
  x: [200, 190, 180],
  y: [200, 200, 200],
  dx: 10,
  dy: 0
};

// 食物的初始位置
let food = {
  x: Math.floor(Math.random() * 40) * 10,
  y: Math.floor(Math.random() * 40) * 10
};

// 游戏是否结束的标志
let gameOver = false;

// 得分
let score = 0;

// 游戏速度(每帧之间的延迟时间,单位毫秒)
let gameSpeed = 100;

// 绘制蛇的函数
function drawSnake() {
  ctx.beginPath();
  ctx.fillStyle = 'green';
  for (let i = 0; i < snake.x.length; i++) {
    ctx.fillRect(snake.x[i], snake.y[i], 10, 10);
  }
  ctx.closePath();
}

// 绘制食物的函数
function drawFood() {
  ctx.beginPath();
  ctx.fillStyle = 'red';
  ctx.fillRect(food.x, food.y, 10, 10);
  ctx.closePath();
}

// 移动蛇的函数
function moveSnake() {
  // 移动蛇的身体
  for (let i = snake.x.length - 1; i > 0; i--) {
    snake.x[i] = snake.x[i - 1];
    snake.y[i] = snake.y[i - 1];
  }

  // 移动蛇头
  snake.x[0] += snake.dx;
  snake.y[0] += snake.dy;
}

// 检查蛇是否吃到食物
function checkFood() {
  if (snake.x[0] === food.x && snake.y[0] === food.y) {
    // 重新生成食物
    food = {
      x: Math.floor(Math.random() * 40) * 10,
      y: Math.floor(Math.random() * 40) * 10
    };

    // 蛇的身体增长
    snake.x.push(snake.x[snake.x.length - 1]);
    snake.y.push(snake.y[snake.y.length - 1]);

    // 增加得分
    score++;
    document.getElementById('score').textContent = score;
  }
}

// 检查蛇是否撞到边界或自己
function checkCollision() {
  // 撞到边界
  if (snake.x[0] < 0 || snake.x[0] >= canvas.width || snake.y[0] < 0 || snake.y[0] >= canvas.height) {
    gameOver = true;
  }

  // 撞到自己
  for (let i = 1; i < snake.x.length; i++) {
    if (snake.x[0] === snake.x[i] && snake.y[0] === snake.y[i]) {
      gameOver = true;
    }
  }
}

// 游戏主循环
function gameLoop() {
  if (!gameOver) {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    drawSnake();
    drawFood();
    moveSnake();
    checkFood();
    checkCollision();
    setTimeout(gameLoop, gameSpeed);
  } else {
    ctx.font = "30px Arial";
    ctx.fillStyle = 'black';
    ctx.fillText("游戏结束", 150, 200);
  }
}

// 开始游戏函数
function startGame() {
  gameOver = false;
  score = 0;
  document.getElementById('score').textContent = score;
  snake.x = [200, 190, 180];
  snake.y = [200, 200, 200];
  snake.dx = 10;
  snake.dy = 0;
  food = {
    x: Math.floor(Math.random() * 40) * 10,
    y: Math.floor(Math.random() * 40) * 10
  };
  gameSpeed = 100;
  gameLoop();
}

// 暂停游戏函数
function pauseGame() {
  gameOver = true;
}

// 重置游戏函数
function resetGame() {
  startGame();
}

// 键盘事件处理函数
function handleKeyDown(event) {
  switch (event.keyCode) {
    case 37: // 左箭头键
      if (snake.dx != 10) {
        snake.dx = -10;
        snake.dy = 0;
      }
      break;
    case 38: // 上箭头键
      if (snake.dy != 10) {
        snake.dx = 0;
        snake.dy = -10;
      }
      break;
    case 39: // 右箭头键
      if (snake.dx != -10) {
        snake.dx = 10;
        snake.dy = 0;
      }
      break;
    case 40: // 下箭头键
      if (snake.dy != -10) {
        snake.dx = 0;
        snake.dy = 10;
      }
      break;
  }
}

// 绑定按钮点击事件
document.getElementById('start-button').addEventListener('click', startGame);
document.getElementById('pause-button').addEventListener('click', pauseGame);
document.getElementById('reset-button').addEventListener('click', resetGame);

// 绑定键盘按下事件
document.addEventListener('keydown', handleKeyDown);

标签:function,10,ctx,小游戏,snake,dx,贪吃蛇,保姆,Math
From: https://blog.csdn.net/2401_82857325/article/details/143927894

相关文章

  • 希冀 操作系统 实验lab1 内核、Boot和printf(保姆级教程 建议点赞收藏 未完成)
    这次我把所有代码都写出来方便大家复制(可以直接复制我的代码粘贴到终端执行)开始之前首先先拉取lab1的内容(一定先干这个,不然做不了实验!!!!!!!!!!!!!!!!)先切换到这个目录下cd20221105894-lab变为:输入gitpullgitcheckoutorigin/lab1 之后刷新一下你的学号-lab文件夹,如果改变了就好......
  • Eclipse保姆级安装及汉化教程(附安装包)
    一、Eclipse介绍Eclipse是一个开放源代码的、基于Java的可扩展开发平台。目前许多开发者开发时仍会选择使用Eclipse,很多初学者刚开始接触Java也是从使用Eclipse开始的二、Eclipse下载安装包下载链接:https://pan.xunlei.com/s/VOC3f6oqiDVvI7iwOwIxD3OrA1#提取码:ms8n三......
  • 2024网络安全学习路线,最全保姆级教程,学完直接拿捏!
     关键词: 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线首先咱们聊聊,学习网络安全方向通常会有哪些问题CSDN独家网络安全资料包!点这里即可获取1、打基础时间太长学基础花费很长时间,光语言都有几门,有些人会倒在学习linux系统及命令的路上,更多的人会倒在......
  • 保姆级聚类热图绘制!(不用R语言!不用写代码!)
    保姆级聚类热图绘制!(不用R语言!不用写代码!)现阶段主流热图用R进行绘制,然而部分专业例如环境专业的同学们基本不怎么会使用代码去得到自己想要的图形(当然也不排除有厉害的同学也是会的)。环境专业的老哥们用的最熟练的莫过于origin了,origin自带的绘图中也是有热图的模块的,但是并......
  • Mybatis Plus保姆级教程 (一学就会!!!)
    目录一、概述二、框架结构2.1框架剖析2.2基本使用2.2.1创建Mapper接口2.2.2测试三、常用注解[email protected]@TableField3.2.1exist3.2.2select3.2.3fill3.3@TableId3.3.1value3.3.2typeNONEINPUT​​​​​​​AUTOASSIGN_ID和ASSIGN_UUI......
  • 大模型实战(二):langchain+Ollama调用本地大模型实现RAG(保姆级)
    文章目录一、任务描述1.环境2.功能二、代码拆解1.导入包2.配置本地模型3.实例化embedding模型4.导入向量化知识库5.加入提示词6.定义查询方法7.问答三、总体代码一、任务描述由于显卡仍然较为昂贵,个人笔记本的硬件条件很难带动大模型,因此我们可以调用一......
  • c++小游戏5个
    这里给出5个简单的C++小游戏示例:猜数字游戏:计算机生成一个随机数,玩家需要猜出这个数字是多少。提示玩家猜测的数字是高了还是低了,直到猜中为止。#include<iostream>#include<cstdlib>#include<ctime>intmain(){srand(time(0));intsecretNumber=r......
  • 在黑色画布里移动白色小方块,小游戏
    importsysimportpygameWIDTH=800HEIGHT=600SIZE=WIDTH,HEIGHTpygame.init()screen=pygame.display.set_mode(SIZE)classPlayer: def__init__(self): self.surf=pygame.Surface((50,50)) self.surf.fill("white") self.rect=self.surf.get_rec......
  • springBoot-RabbitMQ 高级特性(保姆级教程,一步一步带你熟悉RabbitMQ 相关高级特性)
    话不多说,看项目整体架构RabbitMQ高级特性保姆级教程好了,下面县开始贴生产者代码:publisher父依赖:<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.18</versi......
  • 如何求解贪吃蛇游戏问题
    相关:在很多游戏问题中规划算法表现的要比强化学习算法还好,那么为什么还要研究RLAILearnstoplaySnake!代码实现:https://github.com/Chrispresso/SnakeAI关于如何设计使用DQN等RL算法解决《贪吃蛇》游戏的问题已经在前面几个blogs中给出,这里只是作为一个补充,并且本文给......