实战——面向对象+原型实现贪吃蛇

本文通过面向对象和原型模式详细讲解如何使用JavaScript实现贪吃蛇游戏。内容包括思路分析、页面代码、Food、Snake和Game对象的定义,以及游戏方法的优化,如将方法定义在原型上,避免全局污染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象+原型实现贪吃蛇

前面的那篇贪吃蛇(https://blog.youkuaiyun.com/F_Felix/article/details/89676816)尽管也是用到了面向对象的,但是还有一些可以优化的地方,比如游戏本身同样是个对象,比如使用 JavaScript 中的原型
同样,我们先来分析一下这个贪吃蛇

思路分析

1、总共有几个对象? 这里有4个对象,分别是Snake、Food、Game、map,但是为了简单点就把map对象给省略了如果需要可以直接用之前那篇的
2、各个对象分别有哪些属性及方法呢?

  • Food对象:宽高、颜色、位置属性以及渲染方法(width、height、bgColor、x、y 和render)
  • Snake对象:宽高、方向、头颜色、身体颜色、身体属性以及渲染和移动方法(width、height、direction、headColor、bodyColor、body、render、move)
  • Game对象:地图、蛇、食物属性和初始化、初始化游戏、开始游戏、暂停游戏、重置游戏、结束游戏、操作蛇对象(map、snake、food、init、start、pause、control、reset)

3、怎么在之前的基础上进行优化?

然后就不多解释了,代码中有注释描述,直接上代码

页面代码

<!-- 样式部分 -->
<style>
  * {
    
    
    margin: 0;
    padding: 0;
  }
  .map {
    
    
    width: 800px;
    height: 500px;
    background-color: #000;
    margin: 0 auto;
    position: relative;
  }
  p {
    
    
    text-align: center;
    line-height: 30px;
  }
  .btn {
    
    
    margin: 0 auto;
    text-align: center;
  }
</style>
<!-- 界面布局部分 -->
<body>
  <div class="btn">
    <button class="begin">开始游戏</button>
    <button class="pause">暂停游戏</button>
    <button class="reset">重启游戏</button>
  </div>
  <p>
    <strong>游戏说明:</strong>Enter--> 开始游戏 Space--> 暂停游戏 Esc--->
    重置游戏 ←↑→↓ 控制方向
  </p>
  <p>蛇每吃10个点速度增加,极限速度50,初始速度200</p>
  <div class="map"></div>
  <script src="food.js"></script>
  <script src="snake.js"></script>
  <script src="game.js"></script>
  <script>
    var map = document.querySelector('.map')
    var btn1 = document.querySelector('.begin')
    var btn2 = document.querySelector('.pause')
    var btn3 = document.querySelector('.reset')
    var g = new Game({
    
    
      map: map
    })
    g.init()

    btn1.onclick = function() {
    
    
      g.start()
    }
    btn2.onclick = function() {
    
    
      g.pause()
    }
    btn3.onclick = function() {
    
    
      g.reset()
    }
    // 解决js中点击了一次按钮,再按回车会触发之前点击按钮的事件
    document.
利用面向对象方法实现贪吃蛇。 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、付费专栏及课程。

余额充值