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正则相关知识点专题

    JS正则相关知识点专题 一、正则表达式的概念 正则表达式是对字符串操作的一种逻辑公式,是进行字符串匹配、查找、替换等操作的一种工具。JS中使用RegExp对象来表示正则表达式,可以通过构造函数或直接量来创建一个RegExp对象。 常用的正则表达式元字符有: ^: 匹配字符串开头 $: 匹配字符串结尾 .: 匹配单个字符 *: 匹配前面的字符0或多次 +: 匹…

    JavaScript 2023年6月10日
    00
  • JS数组及对象遍历方法代码汇总

    JS数组及对象遍历方法代码汇总 在 JavaScript 开发中,我们经常需要对数组和对象进行遍历操作。为了方便我们的开发,JavaScript 提供了许多遍历方法。本篇文章将为大家介绍常用的 JS 数组及对象遍历方法,并给出相应的示例说明。 数组遍历方法 1. for 循环遍历数组 for 循环是比较传统且常用的数组遍历方法。它可以遍历数组的所有元素,并且…

    JavaScript 2023年5月27日
    00
  • JavaScript实现简易飞机大战

    下面我将详细讲解“JavaScript实现简易飞机大战”的完整攻略。 前言 在开始编写代码之前,我们需要先了解一下游戏的基本结构和要素,主要包括游戏界面、玩家飞机、敌机、子弹、游戏结束等。在了解了这些基本要素后,我们才能更好的开始编写游戏代码。 游戏界面 游戏的界面主要由背景和玩家飞机、敌机等元素组成。我们可以使用HTML和CSS创建一个游戏界面,其中CSS…

    JavaScript 2023年6月11日
    00
  • 前端面试知识点锦集(JavaScript篇)

    下面我将详细讲解“前端面试知识点锦集(JavaScript篇)”的完整攻略。 本文概述 在本篇文章中,我们将总结并详细讲解一些前端面试中常见的JavaScript知识点,包括数据类型、变量、作用域、闭包、原型链、异步编程等等。这些知识点在前端开发中非常重要,也是面试中经常会问到的内容。 JavaScript数据类型 JavaScript有七种数据类型,分别是…

    JavaScript 2023年5月18日
    00
  • Js 获取、判断浏览器版本信息的简单方法

    获取、判断浏览器版本信息是前端开发中常见的操作需求。接下来我将为大家讲解如何使用JavaScript实现获取、判断浏览器版本信息的简单方法。 方法一:使用navigator.userAgent字符串 每个HTTP请求(包括浏览器载入页面、图像以及框架等)都包含一个头部信息User-Agent(用户代理)。该信息通常包含浏览器类型、版本、操作系统、引擎等信息。…

    JavaScript 2023年6月11日
    00
  • JavaScript箭头函数的五种使用方法及三点注意事项

    下面我就详细讲解一下“JavaScript箭头函数的五种使用方法及三点注意事项”的攻略。 JavaScript箭头函数的五种使用方法 1. 简单的箭头函数 简单的箭头函数是指只有一个参数且只有一条语句的箭头函数。例如,以下代码: const greeting = name => `Hello, ${name}!`; console.log(greeti…

    JavaScript 2023年5月27日
    00
  • bootstrapValidator.min.js表单验证插件

    下面是关于bootstrapValidator表单验证插件的完整攻略。 Bootstrap Validator 概述 Bootstrap Validator 是一个用来为表单组件添加验证的 jQuery 插件。它使用了 Twitter Bootstrap 的样式,并集成了 jQuery 的特性,可以非常方便地为表单添加验证规则。 安装步骤 首先需要下载 Bo…

    JavaScript 2023年6月10日
    00
  • JavaScript超详细实现网页轮播图

    接下来我将为你详细讲解“JavaScript超详细实现网页轮播图”的完整攻略。 第一步:基本布局和样式 首先,在HTML中创建轮播图容器,并给其一个固定的宽度和高度,用CSS设置容器的样式,包括边框、背景等。在容器中再创建一个ul元素,用于存放轮播图的各项内容,每个li元素代表一张轮播图,设置其宽度和高度并设置背景图片,用CSS对其进行样式设置,包括边距等。…

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