【0基础】制作HTML网页小游戏——贪吃蛇(附详细解析)

news2024/11/25 22:33:46

 我在昨天的文章(贪吃蛇HTML源码)里面分享了网页版贪吃蛇小游戏的源码,今天就来给大家详细讲解一下每部分代码是如何运作的,以及以后要如何美化贪吃蛇的UI界面,在哪里修改等。

目录

一、代码运作

1、HTML结构:

2、CSS样式:

3、JavaScript代码:

二、补充知识

1、详细解释一下:

 2、在我们的贪吃蛇游戏中的应用:

三、如何优化UI

1、加载图片:

 2、修改绘制蛇的函数:

 3、修改绘制食物的函数:

 4、等待图片加载完成后开始游戏:


一、代码运作

1、HTML结构:

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- head内容 -->
</head>
<body>
    <canvas id="gameCanvas" width="400" height="400"></canvas>
    <script>
        // JavaScript代码
    </script>
</body>
</html>

这是基本的HTML结构。<canvas>元素用于绘制游戏,而<script>标签包含了所有的JavaScript代码。

2、CSS样式:

<style>
    body {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
        margin: 0;
        background-color: #333;
    }

    canvas {
        border: 1px solid #fff;
    }
</style>

这些CSS规则用于居中显示游戏画布并设置背景颜色。

3、JavaScript代码:

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

这里获取了canvas元素并创建了2D绘图上下文,用于在canvas上绘制图形。

const GRID_SIZE = 20;
const CELL_SIZE = canvas.width / GRID_SIZE;

这定义了网格大小和每个单元格的尺寸。

let snake = [
    { x: 5, y: 10 },
    { x: 4, y: 10 },
    { x: 3, y: 10 }
];

初始化蛇的位置,蛇由一系列坐标点组成。

let food = {
    x: Math.floor(Math.random() * GRID_SIZE),
    y: Math.floor(Math.random() * GRID_SIZE)
};

随机生成食物的位置。

function moveSnake() {
    // 移动蛇的逻辑
}

这个函数处理蛇的移动,包括检查是否吃到食物或撞到墙壁。

function drawSnake() {
    // 绘制蛇的逻辑
}

function drawFood() {
    // 绘制食物的逻辑
}

function drawGrid() {
    // 绘制网格的逻辑
}

这些函数负责在canvas上绘制游戏元素。

function startGame() {
    gameInterval = setInterval(function() {
        moveSnake();
        drawSnake();
        drawFood();
    }, gameSpeed);
}

startGame函数使用setInterval定期调用游戏的核心函数,实现游戏循环。

document.addEventListener('keydown', (event) => {
    // 处理键盘输入
});

这段代码监听键盘事件,用于控制蛇的方向。

这个游戏的核心在于不断更新蛇的位置,检查碰撞,然后重新绘制游戏状态。通过setInterval函数,我们可以定期执行这些操作,从而创建一个简单但功能完整的贪吃蛇游戏。

二、补充知识

很多0基础的朋友们看不太懂ctx.fillStyle还有ctx.strokeStyle这些用法,这些其实都是canvas中的用法。

ctx.fillStylectx.strokeStyle 以及其他许多 ctx 相关的属性和方法都是 HTML5 Canvas API 的一部分。

1、详细解释一下:

  1. ctx 是什么: 当我们调用 canvas.getContext('2d') 时,我们获得了一个 CanvasRenderingContext2D 对象,通常我们将它赋值给 ctx。这个对象提供了在 canvas 上绘图的所有方法和属性。
  2. 常用的 Canvas 属性和方法:
    • ctx.fillStyle: 设置或返回用于填充绘画的颜色、渐变或模式。 例如:ctx.fillStyle = '#fff'; 设置填充颜色为白色。
    • ctx.strokeStyle: 设置或返回用于笔触的颜色、渐变或模式。 例如:ctx.strokeStyle = '#444'; 设置线条颜色为深灰色。
    • ctx.fillRect(x, y, width, height): 绘制一个填充的矩形。 例如:ctx.fillRect(10, 10, 100, 100); 在坐标(10,10)处绘制一个100x100的填充矩形。
    • ctx.beginPath(): 开始一个新的绘制路径。
    • ctx.moveTo(x, y): 将绘图游标移动到指定的坐标。
    • ctx.lineTo(x, y): 添加一个新点,然后创建一条从该点到最后指定点的线条。
    • ctx.stroke(): 绘制已定义的路径。

 2、在我们的贪吃蛇游戏中的应用:

function drawSnake() {
  ctx.fillStyle = '#fff';
  snake.forEach(segment => {
    ctx.fillRect(segment.x * CELL_SIZE, segment.y * CELL_SIZE, CELL_SIZE, CELL_SIZE);
  });
}

这段代码将填充颜色设置为白色(#fff),然后为蛇的每个部分绘制一个填充矩形。

function drawGrid() {
  ctx.strokeStyle = '#444';
  for (let x = 0; x <= canvas.width; x += CELL_SIZE) {
    ctx.beginPath();
    ctx.moveTo(x, 0);
    ctx.lineTo(x, canvas.height);
    ctx.stroke();
  }
  // ... 绘制水平线的代码
}

这段代码设置线条颜色为深灰色(#444),然后使用路径绘制方法画出网格线。

Canvas API 提供了强大而灵活的 2D 绘图能力,可以用于创建各种图形、动画和游戏。在我们的贪吃蛇游戏中,我们只使用了它的一小部分功能。如果对 Canvas 绘图感兴趣,还有很多有趣的技术可以探索,比如绘制圆形、添加渐变色、使用变换等。

三、如何优化UI

最基本的优化就是改变蛇和食物的外观了,于是我加了几个加载图片的代码

1、加载图片:

const headImg = new Image();
const bodyImg = new Image();
const tailImg = new Image();
const foodImg = new Image();
headImg.src = 'img/head.png';
bodyImg.src = 'img/body.png';
tailImg.src = 'img/tail.png';
foodImg.src = 'img/food.png';

 2、修改绘制蛇的函数:

function drawSnake() {
  // ... (前面的代码保持不变)
  
  snake.forEach((segment, index) => {
    let img;
    if (index === 0) {
      img = headImg;
    } else if (index === snake.length - 1) {
      img = tailImg;
    } else {
      img = bodyImg;
    }

    ctx.save();
    ctx.translate(segment.x * CELL_SIZE + CELL_SIZE / 2, segment.y * CELL_SIZE + CELL_SIZE / 2);

    // 根据蛇的方向旋转图片
    if (index === 0) {
      switch (direction) {
        case 'up':
          ctx.rotate(-Math.PI / 2);
          break;
        case 'down':
          ctx.rotate(Math.PI / 2);
          break;
        case 'left':
          ctx.rotate(Math.PI);
          break;
        case 'right':
          // 默认方向,不需要旋转
          break;
      }
    }

    ctx.drawImage(img, -CELL_SIZE / 2, -CELL_SIZE / 2, CELL_SIZE, CELL_SIZE);
    ctx.restore();
  });
}

 3、修改绘制食物的函数:

function drawFood() {
  ctx.drawImage(foodImg, food.x * CELL_SIZE, food.y * CELL_SIZE, CELL_SIZE, CELL_SIZE);
}

 4、等待图片加载完成后开始游戏:

Promise.all([
  new Promise(resolve => headImg.onload = resolve),
  new Promise(resolve => bodyImg.onload = resolve),
  new Promise(resolve => tailImg.onload = resolve),
  new Promise(resolve => foodImg.onload = resolve)
]).then(() => {
  resetGame();
});

于是我美化成了这样,哈哈哈哈哈哈,想要完整代码和素材的拿去即可

网盘链接:夸克网盘分享

CSDN下载链接:【免费】0基础制作HTML网页小游戏-贪吃蛇(附详细解析)资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组的常用算法

数组是同类型数据的集合。便于整体处理数据&#xff0c;数组操作的主要算法有&#xff1a; 1求极值 2查找 3排序 2查找 cprimer plus第11.1节278--279页 4数组和指针的区别&#xff1a;数组表示法和指针表示法 数组表示法1 int a[4]{2,4,1,5}; for(int i0;i<4;i)cou…

JAVA 的excel数据批量导入解析 现在都用什么API工具 Apache POI 、EasyExcel 、easypoi有什么区别

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;SpringBoot &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 在Java中&#xff0c;处理Excel数据批量导入解析时&#xff0c;常…

通讯录

在写一个程序前需要了解的知识&#xff0c;需要对通讯录的流程了如指掌&#xff0c;才能写出一个完整的程序 。 写一个主函数&#xff0c;里面包含菜单、对菜单的选择、以及循环。创建个人信息结构体&#xff0c;多人构成的结构体数组。分析每一个函数&#xff1a; 1).增加信…

webstorm修改主题色和配色常用插件(全部实用)包含主题、界面、开发效率等

Windows 用户打开setting 选择配色 更换主题看这里 效率插件 Rainbow Brackets 推荐理由&#xff1a;用各种鲜明的颜色显示括号&#xff0c;这样可以很容易分清楚括号配对问题。 Key promoter 推荐理由&#xff1a;只要是鼠标操作能够用快捷键替代的&#xff0c;Key Promoter…

若依漏洞综合利用工具

若依漏洞综合利用工具 安装与使用 该工具使用java开发&#xff0c;环境要求&#xff1a;JDK1.8版本 java -jar “文件名” 即可打开图形化界面。 注意查看"必看操作说明"模块。 1.首先下载好几个必要模块。 然后把openjfx-17.0.11_windows-x64_bin-sdk放在D盘根…

音视频入门基础:AAC专题(1)——AAC官方文档下载

一、AAC简介 高级音频编码&#xff08;英语&#xff1a;Advanced Audio Coding&#xff0c;AAC&#xff09;是有损音频压缩的专利数字音频编码标准&#xff0c;由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年&#xff0c;为一种基于MPEG…

【python因果推断库14】饮酒年龄 - 贝叶斯分析

目录 饮酒年龄 - 贝叶斯分析 主效应模型 交互模型 将连续变量以治疗阈值为中心 饮酒年龄 - 贝叶斯分析 这个例子使用了回归断点设计来探讨最低合法饮酒年龄&#xff08;在美国为21岁&#xff09;对全因死亡率的因果效应。数据集来自carpenter2009effect 的一项研究。 impo…

C语言蓝桥杯:语言基础

竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_search函数&#xff0c;用于查找…

yolov8实现图片验证码识别

1、环境准备 1.1、安装miniconda 地址&#xff1a;Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 注意&#xff1a;为避免不兼容的问题&#xff0c;推荐下载py38版本&#xff0c;我下载的是Miniconda3-py38_23.1.0-1-Windows-x86_…

【Java 类与对象】多态

空山新雨后 天气晚来秋 目录 多态的概念 多态实现条件 多态的转型 向上转型 向下转型 instanceof 关键字 方法的重写 Override注解 重写的权限 只能重写继承而来的方法&#xff08;1&#xff09; final、static 不能被重写&#xff08;2&#xff09; 重写的方法不能带有等级更严…

向量——通俗地解释

1. 向量 向量是一个既有大小(模)又有方向的对象&#xff0c;它可以用来描述空间中的位置、力或速度等量。我们可以从物理、数学和计算机的角度来看待向量&#xff0c;这三种观点看似不同却有关联。 &#xff08;1&#xff09;在物理专业视角下&#xff0c;向量是空间中的箭头&a…

KubeBlocks 如何降低管理多种数据库的学习门槛

什么是 KubeBlocks KubeBlocks 是一个开源的 Kubernetes 数据库 operator&#xff0c;能够帮助用户在 Kubernetes 上运行和管理多种类型的数据库。据我们所知&#xff0c;大多数数据库 operator 通常只能管理某种特定类型的数据库&#xff0c;例如&#xff1a; CloudNativePG…

秋招突击——算法练习——9/4——73-矩阵置零、54-螺旋矩阵、48-旋转图像、240-搜索二维矩阵II

文章目录 引言复习新作73-矩阵置零个人实现 54-螺旋矩阵个人实现参考实现 48-旋转图像个人实现参考实现 240-搜索二维矩阵II个人实现参考实现 总结 引言 秋招开展的不是很顺利&#xff0c;还是要继续准备&#xff0c;继续刷算法&#xff01;不断完善自己&#xff0c;希望能够找…

Jupyter notebook配置与使用(安装过程+环境配置+运行实例)

前言 Jupyter Notebook 是一个开放源代码的 Web 应用程序&#xff0c;它允许创建和共享包含实时代码、方程式、可视化和叙述性文本的文档。 主要功能&#xff1a; 交互式计算&#xff1a;用户可以直接在浏览器中编写和执行代码。Markdown 支持&#xff1a;使用 Markdown 格式来…

一道迭代器失效练习题

随便写写 首先学习迭代器失效 传送门 : C—浅谈迭代器失效 学完迭代器失效之后做一道题呗 题目 分析 vector的迭代器为啥会失效 1、插入的时候扩容&#xff0c;转移空间出现野指针 2、删除的时候移动了元素&#xff0c;导致指针没指向正确的元素 list的迭代器为啥会失效 li…

pdf怎么压缩?分享5种压缩PDF文件的方法

pdf怎么压缩&#xff1f;PDF文件的压缩在日常办公和学习中尤为重要&#xff0c;它不仅能够大幅度缩减文件大小&#xff0c;节省宝贵的存储空间&#xff0c;还能加快文件在网络中的传输速度&#xff0c;提升工作效率。特别是在处理包含大量图像或复杂布局的PDF文档时&#xff0c…

Http带消息头两种请求办法

API接口最近经常碰到&#xff0c;协调几个乙方来回对接&#xff0c;把我折腾晕了&#xff0c;索性自己写一个小的工具&#xff0c;导入历史数据。 获取平台免登录token 接口说明 URL Path&#xff1a;gateweb/bigm-dm/openApi/ologin/openLogin 说明&#xff1a;第三方免登…

vue2 wavesurfer.js(7.8.5)简单使用

文档地址&#xff1a;https://wavesurfer.xyz/docs/ <template><div><el-row><el-card class"card"><div id"waveform" ref"waveform"></div></el-card></el-row><div>总时长&#xff1…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

亲测可用导航网站源码分享 – 幽络源

幽络源为大家分享一套经过亲测可用的导航网站源码。初看这套PHP源码时&#xff0c;其数据库结构更像是商城系统源码&#xff0c;但经过某位小天才的修改&#xff0c;它已变成一个功能完备的导航网站。经过站长的测试&#xff0c;该源码运行良好&#xff0c;简单部署即可使用&am…