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 相关文章推荐
不同浏览器的怪癖小结
Jul 11 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
将list转换为json失败的原因
Dec 17 Javascript
JavaScript中的闭包
Feb 24 Javascript
JavaScript中Number对象的toFixed() 方法详解
Sep 02 Javascript
node+express制作爬虫教程
Nov 11 Javascript
详解Vue.js入门环境搭建
Mar 17 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
原生JS实现Ajax跨域请求flask响应内容
Oct 24 Javascript
vue.js获得当前元素的文字信息方法
Mar 09 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
Apr 26 Javascript
微信小程序动态显示项目倒计时
Jun 20 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
生成缩略图
2006/10/09 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python中super关键字用法实例分析
2015/05/28 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
python SocketServer源码深入解读
2019/09/17 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
Python 面向对象部分知识点小结
2020/03/09 Python
python如何爬取网页中的文字
2020/07/28 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
关爱残疾人标语
2014/06/25 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
伏羲庙导游词
2015/02/09 职场文书
初中化学教学反思
2016/02/22 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript