javascript实现俄罗斯方块游戏的思路和方法


Posted in Javascript onApril 27, 2015

观摩一下《编程之美》:“程序虽然很难写,却很美妙。要想把程序写好,需要写好一定的基础知识,包括编程语言、数据结构与算法。程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具。”

学了几年的计算机,你有没有爱上编程。话说,没有尝试自己写过一个游戏,算不上热爱编程。

俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾。相信大多数同学,曾经为它痴迷得茶不思饭不想。

游戏规则

1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。

2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

javascript实现俄罗斯方块游戏的思路和方法

I:一次最多消除四层

J(左右):最多消除三层,或消除二层

L:最多消除三层,或消除二层

O:消除一至二层

S(左右):最多二层,容易造成孔洞

Z (左右):最多二层,容易造成孔洞

T:最多二层

方块会从区域上方开始缓慢继续落下。玩家可以以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。

分析与解法

每块方块落下的过程中,我们可以做:

1)旋转到合适的方向

2)水平移动到某一列

3)垂直下落到底部

首先,需要用一个二维数组,area[18][10]表示18*10的游戏区域。其中,数组中值为0表示空,1表示有方块。

方块一共7种,每种有4种方向。定义activeBlock[4],在编译之前这个数组的值预定算好,在程序中直接使用。

难点

1)边界检查。

//检查左边界,尝试着朝左边移动一个,看是否合法。
function checkLeftBorder(){ 
  for(var i=0; i<activeBlock.length; i++){ 
    if(activeBlock[i].y==0){ 
      return false; 
    } 
    if(!isCellValid(activeBlock[i].x, activeBlock[i].y-1)){ 
      return false; 
    } 
  } 
  return true; 
} //同理,需要检测右边界和底边界

2)旋转, 需要数理逻辑, 一个点相对另外一个点旋转90度的问题。
3)定时和监听键盘事件机制让游戏自动运行下去。

//开始 
function begin(e){ 
  e.disabled = true; 
  status = 1; 
  tbl = document.getElementById("area"); 
  if(!generateBlock()){ 
    alert("Game over!"); 
    status = 2; 
    return; 
  } 
  paint(); 
  timer = setInterval(moveDown,1000); 
} 
document.onkeydown=keyControl;

程序过程

1)用户点开始->构造一个活动图形, 设置定时器。

//当前活动的方块, 它可以左右下移动, 变型。当它触底后, 将会更新area; 
var activeBlock; 
//生产方块形状, 有7种基本形状。 
function generateBlock(){ 
  activeBlock = null; 
  activeBlock = new Array(4); 
  //随机产生0-6数组,代表7种形态。
  var t = (Math.floor(Math.random()*20)+1)%7; 
  switch(t){ 
    case 0:{ 
      activeBlock[0] = {x:0, y:4}; 
      activeBlock[1] = {x:1, y:4}; 
      activeBlock[2] = {x:0, y:5}; 
      activeBlock[3] = {x:1, y:5}; 

      break; 
    } 
    //省略部分代码..............................
    case 6:{ 
      activeBlock[0] = {x:0, y:5}; 
      activeBlock[1] = {x:1, y:4}; 
      activeBlock[2] = {x:1, y:5}; 
      activeBlock[3] = {x:1, y:6}; 
      break; 
    } 
  } 
  //检查刚生产的四个小方格是否可以放在初始化的位置. 
  for(var i=0; i<4; i++){ 
    if(!isCellValid(activeBlock[i].x, activeBlock[i].y)){ 
        return false; 
      } 
    } 
  return true; 
}

2)每次向下移动后, 都检查是否触底, 如果触底了, 则尝试消行。

//消行 
function deleteLine(){ 
  var lines = 0; 
  for(var i=0; i<18; i++){ 
    var j=0; 
    for(; j<10; j++){ 
      if(area[i][j]==0){ 
        break; 
    } 
  } 
  if(j==10){ 
    lines++; 
    if(i!=0){ 
      for(var k=i-1; k>=0; k--){ 
        area[k+1] = area[k]; 
      } 
    } 
    area[0] = generateBlankLine(); 
    } 
  } 
  return lines; 
}

3)完了之后再构造一个活动图形, 再设置定时器。

效果图

javascript实现俄罗斯方块游戏的思路和方法

javascript实现俄罗斯方块游戏的思路和方法

javascript实现俄罗斯方块游戏的思路和方法

有待优化

1)设置不同形状方块的颜色。

思路:在创建方块函数内,设定activeBlockColor颜色,七种不同形态方块颜色各异(除了修改generateBlock方法之外,还需要修改paintarea方法。因为一开始考虑不周全,消除一行后,重绘方块的同时将颜色统一,因此可以考虑移除表格n行,然后在顶部增添n行,以保证没消除方块的完整性)。

2)当当前方块下落时,可以提前查看下一个方块。

思路:将generateBlock方法拆分成两部分,一部分用于随机尝试下一个方块,一部分用于缓存当前所要描绘的方块。当当前方块碰到底部被固定后,下一方块开始描绘,同时又再次随机产生新方块。如此反复。

以上所述就是本文给大家分享的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JS的数组的扩展实例代码
Jul 09 Javascript
Javascript 获取链接(url)参数的方法
Feb 15 Javascript
JQuery for与each性能比较分析
May 14 Javascript
从零学JSON之JSON数据结构
May 19 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
vue实现div拖拽互换位置
Jul 29 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
Dec 13 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 Javascript
三步实现ionic3点击退出app程序
Sep 17 Javascript
vue实现分页加载效果
Dec 24 Javascript
Electron实现应用打包、自动升级过程解析
Jul 07 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
Mar 21 Javascript
JQuery记住用户名密码实现下次自动登录功能
Apr 27 #Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 #Javascript
使用console进行性能测试
Apr 27 #Javascript
浅谈javascript实现八大排序
Apr 27 #Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 #Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 #Javascript
javascript关于运动的各种问题经典总结
Apr 27 #Javascript
You might like
十天学会php(1)
2006/10/09 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Python实时获取cmd的输出
2015/12/13 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
python实现小球弹跳效果
2019/05/10 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
如何利用python读取micaps文件详解
2020/10/18 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
商场总经理岗位职责
2014/02/03 职场文书
教师个人自我鉴定
2014/02/08 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书