JavaScript实现简易贪吃蛇(面向对象的方式)

这篇博客介绍了如何使用JavaScript实现一个简单的贪吃蛇游戏,重点在于运用面向对象编程思想。作者通过分析游戏对象,如地图、食物、蛇和随机数对象,详细解释了在JavaScript中模拟面向对象特性,包括封装、继承和多态。博客还提供了代码实现和后续优化的方向。
摘要由CSDN通过智能技术生成

版本更新2019-7-4

源码
体验地址

在这里插入图片描述

说明

使用ES6语法重构了master的代码,并且增加了以下功能:

  • 开始按钮
  • 暂停按钮
  • 得分制度,每得5分难度增加

已解决问题

  • 使用模块化思想
  • 蛇不会在向右移动的时候向左转向,也不会向上移动的时候向下转向

待优化

  • 如何使用canvas重构
  • 加入图片
  • 优化背景和蛇

游戏分析

这是一个简单版的贪吃蛇游戏,主要练习面向对象编程思想,方便自己的学习和理解面向对象思想。那么,要使用面向对象思想来做这个程序,所以多给自己提问:

  • 什么是面向对象
  • 什么是对象
  • 如何找对象
  • 这个游戏的对象是什么
  • js不是面向对象的语言,那使用js如何实现面向对象呢

面向对象编程思想(来自百度百科)

面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切事物皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。

什么是对象

我的理解是:具有某种行为或属性的某一个事物或人称为对象,总之万物皆为对象

游戏中的对象

  • 游戏
  • 地图
  • 食物
  • 随机数对象

js如何实现面向对象

js是一门基于面向对象的语言,但不是面向对象的,也就是说可以使用一些方法可以模拟面向对象,我们都知道面向对象具有以下特性:

  • 封装
  • 继承
  • 多态
  • 抽象

js中所有的对象的原型都最终指向了object,形成原型链,根据这个特性来实现继承,或者使用es6的语法使用class的方法来实现,其实原理就是原型链,es6不是所有的浏览器都支持,所以这里使用最原始的方法。

js没有类的概念,但是可以通过构造函数来模拟,添加属性和方法,实现封装,也可以把需要共享属性和方法放在原型对象中,实现继承。

有了这些概念,可以来实现了,其实我一开始是毫无头绪的,无从下手,但是一点点的分析慢慢就知道如何实现了。

实现

地图的显示

设置一个div创建地图,设置样式

<div class="map"></div>
.map {
   
            width: 800px;
            height: 600px;
            background-color: #ccc;
            position: relative;
            margin: 50px auto;
        }

随机数对象random

这里把random对象暴露在window中,设置为全局对象,方便在其他对象中使用,后面的是一样的。

//随机数自调用函数
((function (window) {
   
    //随机数对象的构造函数
    function Random() {
   

    }
    //添加方法
    Random.prototype.getRandom = function (min, max) {
   
        return Math.floor(Math.random() * (max - min) + min);
    };
    //将该对象设置为全局对象
    window.Random = new Random();

})(window));

食物对象food

食物首先初始化随机生成在地图上,等待蛇过来吃它。蛇吃完后马上就要再产生新的食物,但是先要把之前的食物清除,我把食物存储在一个elements数组中,方便清除。食物的坐标是食物的宽度与地图的宽度的比值。

分析食物的属性有:

  • 宽(默认20px)
  • 高(默认20px)
  • 颜色(默认为绿色)

方法:

  • 初始化食物,随机在地图上生成
  • 清空食物,生成之前先把之前存在的食物先清除掉(防止一个地图全是食物,毕竟食物一次只能随机产生一次)
//创建食物对象
((function (window) {
   
    //创建一个数组存储食物
    var elements = [];
    //食物的构造函数
    function Food(width, height, color) {
   
        this.width = width || 20;
        this.height = height || 20;
        this.color = color || "green";
        this.element = document.createElement("div");
    }

    //初始食物的方法
    Food.prototype.init = function (map) {
   
        //初始化之前先删除地图中的元素
        remove();
        var div = this.element;
        map.appendChild(div);
        div.style.width = this
利用面向对象的方法,实现贪吃蛇。 1. 利用面向对象的思想实现——一个食物对象、一个蛇对象、一个游戏总控对象。 2. 在使用××.prototype= {}重写原型对象的时候,一定要加上一句constructor:该对象。不然会造成实例化出来的实例的constructor为object。 3. 在underscore中,使用_.random(a,b)即可获得a-b中的一个随机数。 4. 在求食物的随机位置的时候,用到了panel.clientHeight/this.height - 1) * this.height。 原理是使用盒子的高度/小球的高度,可以算得最多放多少个小球。因为要控制小球不能超过边界,所以总数量要减去1,数量×高度即为随机位置的最大值。 5. 在蛇对象中,用body数组存放蛇身体每一个部分对象。蛇的绘制过程就是遍历body,在面板上绘制。 6. 蛇的移动分为两部分。 ① 蛇节移动到前一个蛇节的位置。直到蛇头后一个蛇节移动到蛇头的位置。 ② 根据direction判断蛇头如何移动。 注意:在游戏绘制的过程中,界面的每一次绘制都要**删除**之前的绘制,不然会叠加到一起。 7. 在蛇的闭包中建一个局部数组,存储蛇对象,可以更加方便的删除操作。 8. 只有在原型对象中的方法和属性,外界是可以调用的。 9. 蛇的移动(动画)必然需要定时器协助。定时器的时间,即象征着刷新速度,也就是难度。 10. this所在的函数在哪一个对象中,this就指向谁。单独写一个函数的时候,如果调用之前对象的this,需要备份指针(将对象的this赋值给另一个变量)。 11. JavaScript原生的键盘按下事件(keydown) 中,事件有一个keyCode属性,其值代表按下的键。其中:37—left、38—top、39—right、40—bottom。 12. 边界控制。通过判断蛇头与最大X和Y的关系,判断是否碰到边界。 13. confirm()方法用于显示一个带有指定消息和确认及取消按钮的对话框。 14. window.location.reload(); 重新加载当前文档 15. window.close() 方法用于关闭浏览器窗口。 16. 与食物的碰撞检测:如果蛇头和食物坐标重叠,将蛇尾添加到body中。并重新绘制一个食物点,将之前的食物删掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值