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日

相关文章

  • JSON 对象未定义错误的解决方法

    JSON 对象未定义错误指的是在 JavaScript 中使用 JSON.parse() 方法解析字符串时出现的错误,该错误通常是由于字符串格式不正确或 JSON 对象中缺少属性导致的。以下是解决该错误的攻略: 1. 检查字符串格式 首先,我们需要检查使用 JSON.parse() 方法时传入的字符串格式是否正确。JSON 格式要求属性名必须加双引号,属性值…

    JavaScript 2023年5月27日
    00
  • JS实现至少包含字母、大小写数字、字符的密码等级的两种方法

    要实现至少包含字母、大小写数字、字符的密码等级,可以采用以下两种方法: 方法一:使用正则表达式判断密码是否符合规范 首先,需要定义一个正则表达式来判断密码是否符合要求,可以使用以下正则表达式: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*]).{8,}$/ 其中: (?=.*\d):表示密码中必须包含至…

    JavaScript 2023年6月10日
    00
  • 通过一篇文章由浅入深的理解JSONP并拓展

    JSONP(JSON with Padding)是一种常见的跨域数据请求方式,其原理是利用script标签可以跨站加载资源的特点,实现从其他域名下获取数据。下面就是一篇由浅入深的理解JSONP的攻略。 为什么需要JSONP? 在前后端分离的架构下,前端应用需要从后端获取数据,一般情况下都是通过AJAX请求进行获取。但是由于同源策略的限制,AJAX只能请求同源…

    JavaScript 2023年5月27日
    00
  • 深入探究JS中的异步编程和事件循环机制

    深入探究JS中的异步编程和事件循环机制 在JavaScript中,异步编程是必不可少的。它可以使我们的程序变得更加高效,同时也可以避免一些由于阻塞线程而导致的问题,比如用户界面的卡顿等。异步编程的核心机制就是事件循环,下面将详细探究JavaScript中的异步编程和事件循环机制。 异步编程 JavaScript是单线程的语言,这意味着它只有一个主线程来处理执…

    JavaScript 2023年5月28日
    00
  • JavaScript中arguments的使用方法详解

    JavaScript中arguments的使用方法详解 在JavaScript中,我们可以使用arguments来获取函数调用时传入的所有参数。本文将对arguments的使用方法进行详细讲解,并且给出两个示例说明。 1. 获取传入的所有参数 我们可以使用arguments获取函数调用时传入的所有参数。arguments是一个类数组对象,可以通过argume…

    JavaScript 2023年5月27日
    00
  • JS遍历DOM文档树的方法实例详解

    下面是关于“JS遍历DOM文档树的方法实例详解”的完整攻略。 标题 JS遍历DOM文档树的方法实例详解 简介 在编写JavaScript代码时,遍历DOM文档树是非常常见的操作。例如,查找某个元素、对所有子元素进行操作等等。本文将介绍以下5个遍历DOM文档树的方法: getElementById getElementsByTagName getElement…

    JavaScript 2023年5月28日
    00
  • javascript电商网站抢购倒计时效果实现

    让我来详细讲解一下“JavaScript电商网站抢购倒计时效果实现”的完整攻略。 一、了解倒计时的基本原理 在实现电商网站的抢购倒计时效果之前,我们需要先了解倒计时的基本原理,以便于后续的代码实现。 倒计时的基本原理是利用 JavaScript 中的定时器(setTimeout 或 setInterval)来不断地更新倒计时显示的时间,实现倒计时效果。 具体…

    JavaScript 2023年6月10日
    00
  • JS特殊函数(Function()构造函数、函数直接量)区别介绍

    JS中的函数(Function)是非常重要的概念。在JS中,有三种创建函数的方式:函数直接量、Function()构造函数和箭头函数。其中,函数直接量和Function()构造函数的功能和用法相似,但也有一些区别。 函数直接量 函数直接量是定义函数最简单的方式之一。它就是将一个函数的定义放在一个表达式中,这个表达式可以被赋值给一个变量,或者直接被调用。 函数…

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