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

yizhihongxing

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 Date setFullYear() 方法

    以下是关于JavaScript Date对象的setFullYear()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setFullYear()方法 JavaScript Date对象的setFullYear()方法设置日期对象的年份部分。该方法接受一个整数,表示要设置的年份。如果该参数超出了JavaScript所能表示的范围,则自…

    JavaScript 2023年5月11日
    00
  • 高级数据结构及应用之使用bitmap进行字符串去重的方法实例

    我来为您详细讲解“高级数据结构及应用之使用bitmap进行字符串去重的方法实例”的完整攻略。 一、什么是bitmap Bitmap是一种位图索引结构,它的基本原理是用一个bit位来表示某个元素对应的value。例如,如果一个数存在,则可以将这个数所对应的bit位标记为1,否则标记为0。Bitmap索引结构主要应用于快速判定某个元素是否属于一个集合中。 二、使…

    JavaScript 2023年5月28日
    00
  • javascript倒计时效果实现

    以下是关于“JavaScript倒计时效果实现”的完整攻略。 什么是JavaScript倒计时效果 JavaScript倒计时效果,是指网页中通过JavaScript代码实现的一个倒计时效果,通常用于需要计算时间的场景中。例如,网页上的秒杀倒计时、倒计时结束后弹出提示信息等。 实现方法 实现JavaScript倒计时效果有多种方法,下面介绍其中一种实现方式。…

    JavaScript 2023年5月27日
    00
  • javascript获取select值的方法完整实例

    关于JavaScript获取Select的值,你可以按照下面的步骤实现: 第一步:获取Select元素 要获取Select元素,可以使用document.getElementById()方法,传入Select元素的ID作为参数,如下所示: let select = document.getElementById("mySelect"); …

    JavaScript 2023年6月10日
    00
  • js 动态生成json对象、时时更新json对象的方法

    生成 JSON 对象是一项常见的任务,通过 JavaScript 可以动态地生成和更新 JSON 对象。这种功能对于动态地修改网站内容非常重要,并且可以通过 AJAX 和其他技术将数据发送到服务器时使用。下面是生成 JSON 对象和时时更新 JSON 对象的方法攻略。 生成 JSON 对象 我们可以使用 JavaScript 中 JSON 对象的 strin…

    JavaScript 2023年5月27日
    00
  • js实现酷炫倒计时动画

    下面是“js实现酷炫倒计时动画”的完整攻略。 1. 倒计时的原理 倒计时的实现原理是计算当前时间与目标时间之间的时间差(以秒为单位),然后将时间差转换成时、分、秒等单位,最后将这些单位显示出来。在实现动画效果时,可以将显示的数据和动画效果绑定在一起,通常是通过CSS3中的transition或者动画实现。 2. 实现步骤 2.1 设定目标时间 首先我们需要确…

    JavaScript 2023年6月10日
    00
  • javascript实现循环广告条效果

    让我来为您详细讲解“javascript实现循环广告条效果”的完整攻略。 1. 实现思路 要实现循环广告条效果,需要一个滚动容器和多个图片元素,通过JavaScript动态设置滚动容器的left属性,使其滚动。 具体实现思路如下: 使用HTML和CSS构建基本布局,包括一个滚动容器和多个图片元素; 使用JavaScript动态获取滚动容器和图片元素的宽度,计…

    JavaScript 2023年6月11日
    00
  • js自己实现一个大文件切片上传+断点续传的示例代码

    下面是关于“js自己实现一个大文件切片上传+断点续传的示例代码”的完整攻略。 1. 实现思路 将大文件分为多个小文件,每个小文件的大小在10-20MB左右。 设置上传进度条。 判断上传文件是否第一次上传,如果是则上传整个文件,如果不是则上传未上传过的部分文件。 将上传成功的文件进行标记,下次上传时跳过这些已经上传成功的文件。 2. 实现步骤 2.1 分割文件…

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