20行js代码实现的贪吃蛇小游戏

20行js代码实现的贪吃蛇小游戏攻略

1. 实现思路

该贪吃蛇小游戏的实现思路非常简单,主要分为以下两步:

  1. 初始化游戏BOSS。
  2. 在游戏中添加监听事件,监听玩家的操作,并处理游戏逻辑。

2. 代码实现

游戏的实现代码如下:

with(document){
    a = appendChild(createElement("canvas")).getContext("2d");
    width = height = 256;
    // 得分数
    score = tail = dir = 1;
    o = {x: ~~(Math.random()*width), y: ~~(Math.random()*height)};
    // 蛇头位置
    snake = [{x: ~~(width/2), y: ~~(height/2)}];
    // 键盘操作
    onkeydown = function(e){
        dir = (e.which - 37) % 4;
    };
    setInterval(function(){
        a.fillStyle="#1D1F21";
        a.fillRect(0,0,266,266);
        a.fillStyle="#FFFFFF";
        // 定义蛇头的坐标
        for (var i=0; i<snake.length; ++i)
            a.fillRect(snake[i].x*10, snake[i].y*10, 9, 9);

        // 判断方向
        x = snake[0].x; y = snake[0].y;
        if (dir == 0) --y;
        if (dir == 1) ++x;
        if (dir == 2) ++y;
        if (dir == 3) --x;

        //判断游戏是否结束
        if (x > 25 || x < 0 || y > 25 || y < 0) {
            alert("Game Over!\nYour Score is: " + score);
            location.reload();
        }

        //移动操作
        if (Math.abs(x-o.x) < 1 && Math.abs(y-o.y) < 1) {
            tail++;
            score += Math.ceil((1/tail) * 500);
            o = {x: ~~(Math.random()*width), y: ~~(Math.random()*height)};
        }
        else {
            snake.pop();
        }

        //增加蛇头
        snake.unshift({x: x, y: y});
    }, 60);
}

3. 代码解释

上述代码以 with(document) 开始,使用了JS语言的with语句操作,将document对象作为默认的根对象,简化了代码编写过程。

接下来是一些变量初始化的语句:

a = appendChild(createElement("canvas")).getContext("2d");
width = height = 256;
score = tail = dir = 1;
o = {x: ~~(Math.random()*width), y: ~~(Math.random()*height)};
snake = [{x: ~~(width/2), y: ~~(height/2)}];

其中, appendChild(createElement("canvas")).getContext("2d"); 表示在HTML文档中创建一个画布,并获取绘图环境; o 是食物对象,初始位置为画布中随机的位置; snake 是蛇对象,初始时只有一节身体,即头部。

接下来是键盘监听事件:

onkeydown = function(e){
    dir = (e.which - 37) % 4;
};

当玩家按下左、右、上、下方向键时,会改变蛇的移动方向。

接下来是用于重绘的 setInterval 函数:

setInterval(function(){
    a.fillStyle="#1D1F21";
    a.fillRect(0,0,266,266);
    a.fillStyle="#FFFFFF";
    for (var i=0; i<snake.length; ++i)
        a.fillRect(snake[i].x*10, snake[i].y*10, 9, 9);
    ...
}

它每隔60毫秒就会重新绘制画布,并在画布上绘制蛇的每一个节点。

接下来是判断前进方向:

x = snake[0].x; y = snake[0].y;
if (dir == 0) --y;
if (dir == 1) ++x;
if (dir == 2) ++y;
if (dir == 3) --x;

如果按下键盘操作键,会根据不同的方向修改蛇的坐标。如果出现了游戏规则外的错误,这里将结束游戏,并且将游戏分数进行显示:

//判断游戏是否结束
if (x > 25 || x < 0 || y > 25 || y < 0) {
    alert("Game Over!\nYour Score is: " + score);
    location.reload();
}

接下来实现了吃食物,如果蛇头位置移动到食物位置,则新增一节蛇身,加分并重新布置食物:

if (Math.abs(x-o.x) < 1 && Math.abs(y-o.y) < 1) {
    tail++;
    score += Math.ceil((1/tail) * 500);
    o = {x: ~~(Math.random()*width), y: ~~(Math.random()*height)};
}
else {
    snake.pop();
}

//增加蛇头
snake.unshift({x: x, y: y});

最后,页面将自动重绘。游戏继续下去直到玩家运行出错或关闭页面:

4. 示例说明

示例一

为了让游戏更好玩,您可以自己动手随意更改代码。比如,将上一个实例的 dir = (e.which - 37) % 4; 这行代码更改成 dir = (e.which - 39) % 4; ,这样就能使用上下左右控制蛇运动了。

示例二

当蛇到达画布边缘时,游戏是如何处理的呢?在游戏规则内,蛇不能穿过墙壁,当蛇头碰到墙壁时,游戏就结束并计算出得分。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:20行js代码实现的贪吃蛇小游戏 - Python技术站

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

相关文章

  • Javascript this 函数深入详解

    Javascript this 函数深入详解 什么是this? this 是javascript中一个非常重要和有用的关键字,它代表当前函数执行的上下文,在不同的函数内部指向不同的对象。需要注意的是,this 的指向并不是在定义的时候确定的,而是在运行的时候才确定的。 this 的4中绑定规则 当你在函数里使用 this 时,请先看调用该函数的方式,它式通过…

    JavaScript 2023年5月27日
    00
  • javascript学习笔记(八)正则表达式

    JavaScript学习笔记(八)正则表达式 什么是正则表达式? 正则表达式是一种高级的文本匹配工具,它允许您通过定制化的模式来识别文本中的特定字符和模式。使用正则表达式可以快速,简单地从大量的文本或数据中提取信息,这是数据分析、数据挖掘等领域中必备的技能。 正则表达式语法 正则表达式是由文本字符和特殊字符构成的文本模式。下面是一些基本的正则表达式语法: ^…

    JavaScript 2023年5月19日
    00
  • 实例教程 纯CSS3打造非常炫的加载动画效果

    通过本实例教程,我们将使用纯 CSS3 技术来构建一些极其酷炫的网站加载动画效果。在本教程中,我们将学习如何使用 CSS3 的关键帧动画和过渡方法来创建许多有趣的动画。 1. 准备工作 在开始编写动画之前,需要先准备好一个 HTML 文件。你可以在文件中添加一些模拟加载过程的标签来测试你的动画。一些可以用于这个目的的标签是:div,span,img 等。 2…

    JavaScript 2023年6月11日
    00
  • Javascript 实现计算器时间功能详解及实例(二)

    针对“Javascript 实现计算器时间功能详解及实例(二)”这篇文章,我来为你详细讲解一下完整攻略。 一、背景介绍 该文章主要讲解了如何使用 JavaScript 实现一个计算器,其中包括基本的加减乘除运算以及计算时间的功能。 二、实现方法 该计算器代码的主要实现方法就是使用了 JavaScript 的 eval() 方法,将输入的表达式进行计算,并输出…

    JavaScript 2023年5月27日
    00
  • JS一个简单的注册页面实例

    下面为大家详细说明“JS一个简单的注册页面实例”的完整攻略。 1. 准备工作 在实现一个简单的注册页面之前,我们需要先准备好以下工作: HTML布局代码:包括表单、输入框、按钮等。 CSS样式表:为页面元素添加样式和布局。 JS代码:实现页面交互,如表单验证等。 2. HTML布局代码 首先使用 HTML 建立一个空白网页,然后在 body 标签内添加以下代…

    JavaScript 2023年6月10日
    00
  • es6新特性之 class 基本用法解析

    “es6新特性之 class 基本用法解析”是用于Javascript语言中的类定义机制。下面详细讲解class基本用法解析,包括类的定义、继承、静态方法、getters/setters等。 1.类定义 ES6的类定义机制为Javascript中引入了面向对象编程的思想,具有类似其他面向对象语言的类定义能力。通过这种方式,可以将代码分解为类,类似于函数定义的…

    JavaScript 2023年6月11日
    00
  • js与jquery回车提交的方法

    下面详细讲解js与jQuery回车提交的方法的完整攻略。 什么是回车提交 回车提交是指用户在输入框内输入内容后按下键盘上的回车键,就会自动提交表单或执行相应的操作,而不需要再点击提交按钮。在表单或查询页面中,这是一种很方便的操作方式。 JavaScript回车提交 Javascript可以通过监听页面上的键盘操作,并且每次键盘按下事件被触发时执行代码。利用这…

    JavaScript 2023年6月11日
    00
  • JavaScript数组操作函数汇总

    让我来为您详细介绍 JavaScript 数组操作函数的常用方法。 JavaScript数组操作函数汇总 1. push() 作用:向数组末尾添加一个或多个元素,并返回新的长度。 语法:arr.push(element1, …, elementN) 示例: let arr = [1, 2, 3]; arr.push(4, 5); console.log(…

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