JS实现的贪吃蛇游戏完整实例

JS实现的贪吃蛇游戏完整实例

项目简介

贪吃蛇游戏是一款经典的游戏,在很多平台上都有出现。这个项目是一个用JavaScript实现的贪吃蛇游戏,玩家通过控制蛇的移动方向和吃掉生成的食物,在不碰到墙或自身的情况下尽可能地维持蛇的生命并获得高分。

用到的技术

  • HTML
  • CSS
  • JavaScript

实现思路

  • 控制蛇的移动。通过定时器循环,不断移动蛇的位置。当蛇碰到墙或自己的身体时,游戏结束。
  • 生成食物。在画布上随机生成食物。
  • 当蛇吃到食物时,分数增加并生成新的食物。
  • 显示分数和游戏结束。

代码实现

以下是JavaScript部分核心代码:

let snake = {
    body: [{'x': 1, 'y': 0}, {'x': 0, 'y': 0}], // 蛇头在数组的最后一个元素
    direction: 'right', // 初始方向为右
    newDirection: '',
    length: 2, // 初始长度为两节
    score: 0 // 分数初始化为0
}

let food = {
    x: 0,
    y: 0
}

document.onkeydown = function(event) {
    switch (event.keyCode) {
        case 37:
            snake.newDirection = 'left'
            break;
        case 38:
            snake.newDirection = 'up'
            break;
        case 39:
            snake.newDirection = 'right'
            break;
        case 40:
            snake.newDirection = 'down'
            break;
        default:
            break;
    }
}

function update() {
    // 根据蛇头的方向更新移动方向
    if (snake.newDirection === 'left' && snake.direction !== 'right') {
        snake.direction = 'left'
    } else if (snake.newDirection === 'up' && snake.direction !== 'down') {
        snake.direction = 'up'
    } else if (snake.newDirection === 'right' && snake.direction !== 'left') {
        snake.direction = 'right'
    } else if (snake.newDirection === 'down' && snake.direction !== 'up') {
        snake.direction = 'down'
    }

    // 更新蛇的位置
    let newHead = {'x': snake.body[snake.length - 1].x, 'y': snake.body[snake.length - 1].y}
    if (snake.direction === 'left') {
        newHead.x--
    } else if (snake.direction === 'up') {
        newHead.y--
    } else if (snake.direction === 'right') {
        newHead.x++
    } else {
        newHead.y++
    }
    snake.body.push(newHead)
    if (snake.body.length > snake.length) {
        snake.body.shift()
    }

    // 判断蛇是否撞墙或自己
    if (newHead.x < 0 || newHead.x > 39 || newHead.y < 0 || newHead.y > 39) {
        endGame('Game Over!')
        return
    }
    for (let i = 0; i < snake.body.length - 1; i++) {
        if (newHead.x === snake.body[i].x && newHead.y === snake.body[i].y) {
            endGame('Game Over!')
            return
        }
    }

    // 判断蛇是否吃到食物
    if (newHead.x === food.x && newHead.y === food.y) {
        snake.length++
        snake.score += 10
        displayScore()
        generateFood()
    }

    // 更新蛇的位置
    drawSnake()
}

function drawSnake() {
    ctx.clearRect(0, 0, canvas.width, canvas.height)
    for (let i = 0; i < snake.body.length; i++) {
        ctx.fillStyle = '#fff'
        ctx.fillRect(snake.body[i].x * 10, snake.body[i].y * 10, 10, 10)
    }
}

function generateFood() {
    food.x = Math.floor(Math.random() * 40)
    food.y = Math.floor(Math.random() * 40)
    ctx.fillStyle = '#0f0'
    ctx.fillRect(food.x * 10, food.y * 10, 10, 10)
}

function displayScore() {
    scoreText.innerHTML = 'Score: ' + snake.score
}

function endGame(msg) {
    clearInterval(intervalId)
    gameOverText.innerHTML = msg
    gameOverText.style.display = 'block'
}

// 初始化画布、画蛇、生成食物
let canvas = document.getElementById('canvas')
let ctx = canvas.getContext('2d')
drawSnake()
generateFood()

let scoreText = document.getElementById('score')
displayScore()

let gameOverText = document.getElementById('gameover')
let intervalId = setInterval(update, 100) // 每100毫秒更新一次游戏状态

示例说明

在实现过程中,可以通过不断修改函数中的代码,进行游戏后期的特殊功能添加,例如:蛇增加长度或移动速度逐渐加快等。

另外,还可以将本项目的代码和界面进行拆分和模块化,更好地封装和维护。例如:

  • 把canvas部分单独写一个模块,将画蛇、生成食物等功能封装成函数。
  • 把Snake对象和Food对象分别作为一个模块,用ES6的导出和导入来管理模块之间的依赖。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现的贪吃蛇游戏完整实例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • js正则表达式简单校验方法

    首先我们需要了解什么是正则表达式,正则表达式一般用于字符串的处理和匹配,可以用来进行字符串的查找、替换、分割等操作。在JavaScript中,可以通过RegExp对象来创建正则表达式。 接下来,我将详细讲解“js正则表达式简单校验方法”的完整攻略: 1. 创建正则表达式对象 在使用正则表达式之前,需要先创建一个正则表达式对象,可以使用字面量或者构造函数来创建…

    JavaScript 2023年6月10日
    00
  • 如何实现JavaScript动态加载CSS和JS文件

    实现JavaScript动态加载CSS和JS文件通常通过动态创建HTML元素来实现。 一、动态加载CSS文件 创建一个link元素 通过JavaScript动态创建一个link元素,并将其属性设置为需要加载的CSS文件路径。 <link id="dynamic-css" rel="stylesheet" type…

    JavaScript 2023年5月27日
    00
  • token 机制和实现方式

    Token机制是一种通过在用户请求中加入令牌(token)来验证用户身份的方式。相比于传统的基于cookie或session的身份验证方式,Token机制能够避免跨站请求伪造(CSRF)和跨站脚本攻击(XSS)等安全问题。 以下是Token机制的实现方式: 用户登录时,需要向服务器发送登录请求(例如通过POST方式提交用户名和密码)。服务器根据用户输入的用户…

    JavaScript 2023年6月11日
    00
  • 如何通过vscode运行调试javascript代码

    下面是如何通过VSCode运行调试JavaScript代码的完整攻略: 步骤1:安装和配置VSCode 安装VSCode:打开VSCode官网,下载并安装最新的稳定版本。如果已经安装,请保持更新到最新版本。 安装Node.js:在Node.js官网下载并安装Node.js,这将使您可以在VSCode中运行和调试JavaScript代码。 安装VSCode的J…

    JavaScript 2023年5月27日
    00
  • JavaScript实现页面滚动图片加载(仿lazyload效果)

    JavaScript实现页面滚动图片加载(仿lazyload效果) 概述 在网站中,经常会有长页式的页面,滚动页面时会不断加载图片,但是如果在页面的初次加载时一次性加载所有的图片,会给用户带来不必要的流量浪费,同时也会影响页面加载速度。因此,我们可以通过JavaScript实现页面滚动图片加载,去实现对用户体验的优化。 本攻略将介绍一种基于lazyload思…

    JavaScript 2023年6月11日
    00
  • JavaScript 中的输出数据多种方式

    JavaScript 中的输出数据多种方式,下面介绍几种常用方式: console.log() console.log() 是在浏览器控制台输出信息的最常用方式之一,可以输出字符串、数字、布尔值等,也可以输出对象或数组。示例如下: console.log(‘Hello, World!’); // 输出字符串 console.log(123); // 输出数字…

    JavaScript 2023年5月28日
    00
  • js 显示base64编码的二进制流网页图片

    这里是JS显示base64编码的二进制流网页图片的完整攻略。 什么是Base64 Base64是一种基于64个字符的编码方式,通常用于在网络上传输二进制数据。Base64编码可以将任意二进制数据用文本表示,不但方便传输,而且可以避免一些特殊字符在传输过程中被转义。 显示Base64编码的图片 有时候我们需要用JS在网页中显示一张Base64编码的图片,可以通…

    JavaScript 2023年6月1日
    00
  • 深入理解JavaScript的事件执行机制

    深入理解JavaScript的事件执行机制 什么是JavaScript事件? JavaScript事件是指浏览器或网页中发生的特定动作,例如点击、输入、鼠标移动等等。当触发事件时,可以运行特定的代码来响应事件。 事件执行机制 JavaScript事件执行机制分为三个阶段: 事件捕获阶段:事件从文档根节点传递到目标元素之前的过程。 目标阶段:事件达到目标元素。…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部