美文网首页
用面向对象的方法写一个俄罗斯方块(一):设计思路

用面向对象的方法写一个俄罗斯方块(一):设计思路

作者: HolidayPeng | 来源:发表于2018-10-29 10:43 被阅读50次

俄罗斯方块的逻辑稍微有些复杂,实现的方法也有很多,这里分享其中一种。
首先我们得有数据驱动的思维,把这个游戏抽象成两组数据:
方块活动的范围是一组数据,方块可以在这个范围向左、向右、向下移动,我们可以把这个范围标记为一个二维数组,类似于一个xy坐标轴:

gameAreaData: [
  [0, 0, 0, 0, 1, 0, 0, 0, 0, 0] ,
  [0, 0, 0, 0, 1, 1, 1, 0, 0, 0] ,
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,
  [2, 2, 2, 2, 2, 2, 2, 2, 2, 0] 
  …
]

没有方块的时候该坐标单位的值为0,有方块并且方块可以移动的时候值为1,方块不能移动的时候值为2。
方块有不同的形状,每种形状又可以旋转,同样可以用一个二维数组来保存这些形状,比如长条:

teris: {
  origin: [
    [1, 1, 1, 1]
  ],
  rotate: [
    [
      [1, 1, 1, 1]
    ],
    [
      [1],
      [1],
      [1],
      [1]
    ],
    [
      [1, 1, 1, 1]
    ],
    [
      [1],
      [1],
      [1],
      [1]
    ]
  ]
  …
}

另外方块在移动时,我们需要知道方块移动的位置,是向下移动一个单位,还是向右/向左移动了一个单位。我们可以用一个对象来保存当前位置:

position: {
 x: 0,
 y: 0
};

现在两组数据我们都有了,要做的就是在方块位置移动的时候或者形状变化(旋转)的时候,把第二组数据的值赋给第一组数据:

function updateData() {
  for (let i = 0; i < teris.origin.length; i++) {
    for (let j = 0; j < teris.origin[0].length; j++) {
      gameAreaData[teris.position.x + 1][teris.position.y + j] = teris.origin[i][j];
    }
  }
}

这样俄罗斯方块的基本逻辑我们就有了,现在可以来考虑一下代码结构的问题。
首先七种方块由于形状不同,内部的数据也不同,我们可以把它们分成七个类:

class IBlock ;
class Square;
class RLblock;
class TBolck;
class Swagerly;
class RSwagerly;
class LinePiece;

操作这其中方块的方法是共享的,可以把这些方法放在一个共同的类里,并让这个类继承七种方块的属性(数据):

class Shapes() {
  constructor: {
    this.shapesData = [
      lBlock,
      Square,
      RLblock,
      TBolck,
      Swagerly,
      RSwagerly,
      LinePiece
    ]
  }
}

为了让Shapes每次被实例化的时候系统不必分配内存给它的方法,我们把这些方法写在原型链上:

class Shapes() {
  constructor: {
    this.shapesData = [
      lBlock,
      Square,
      RLblock,
      TBolck,
      Swagerly,
      RSwagerly,
      LinePiece
    ]
  }
}

Shapes.prototype.updateData = function() {
  for (let i = 0; i < teris.origin.length; i++) {
    for (let j = 0; j < teris.origin[0].length; j++) {
      gameAreaData[teris.position.x + 1][teris.position.y + j] = teris.origin[i][j];
    }
  }
}
……

最后到游戏的具体操作部分,我们把这些操作都放在一个JS文件里。这一篇先讲解思路,下一篇再续上完整的实现过程。

相关文章

  • 用面向对象的方法写一个俄罗斯方块(一):设计思路

    俄罗斯方块的逻辑稍微有些复杂,实现的方法也有很多,这里分享其中一种。首先我们得有数据驱动的思维,把这个游戏抽象成两...

  • OOD与OOP的区别

    OOD:面向对象设计 面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间...

  • WEB 八

    JS 面向对象编程 利用JS面向对象编程写一个贪吃蛇小游戏 思路:地图->蛇->让蛇运动->用键盘控制蛇运动->食...

  • 贪吃蛇心得

    整体思路 用面向对象的思路写一个贪吃蛇游戏,首先需要找到游戏中的所有对象。在每一个游戏的实现中都会有一个游戏引擎对...

  • 拖拽的面向对象的实现及问题解决

    1、实现过程 拖拽的面向对象实现和面向过程实现的基本方法是一样的,只是采用的是两种不同的思路,一个是面向对象的思路...

  • 《软件工程》笔记6

    面向对象设计 面向对象设计,就是用面向对象观点建立求解空间模型的过程。通过面向对象分析得出的问题域模型,为建立求解...

  • 用面向对象的方法写一个俄罗斯方块(二):代码详解

    上一篇讲解了具体思路,这一篇上具体的代码。首先是七种形状的类: 剩下六个类的结构类似,这里就不再赘述。接下来是这几...

  • 编程语言基础概念1

    什么是面向对象? 面向对象:指在程序设计中采用封装、继承、多态等设计方法。 什么是面向过程? 面向过程:程序设计按...

  • JavaScript的点击事件是不能封装在原型上的

    在JavaScript中,用面向对象的思想封装一个对象,在设计该对象的方法时,页面的点击事件是不能封装在原型上的。...

  • 「JS」面向对象

    面向对象程序设计方法面向过程面向对象概念基本特点 JavaScript 面向对象constructor自定义构造器...

网友评论

      本文标题:用面向对象的方法写一个俄罗斯方块(一):设计思路

      本文链接:https://www.haomeiwen.com/subject/rjfltqtx.html