app.title = '俄罗斯方块';
var refreshT,fallBlockT;
var fallTimout;
var speed = 1000, downSpeed = 30, nomrlSpeed = 1000;
var fallLine = 20, rlMove = 4,score = 0,death=false; var data = [] ,data2 = []; Array.prototype.clone=function(){ var a=[]; for(var i=0,l=this.length;i<l;i++){ if(this[i] instanceof Array){ a.push(this[i].clone()); }else{ a.push(this[i]); }} return a; } var block1={
basePt : [[0,0],[0,1],[1,0],[1,1]],
roate: function(){ }
};
var block2={
basePt : [[0,0],[1,0],[2,0],[2,1]],
shapList:[
[[0,0],[1,0],[2,0],[2,1]],
[[0,0],[0,1],[0,2],[1,0]],
[[0,0],[0,1],[1,1],[2,1]],
[[0,2],[1,0],[1,1],[1,2]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
};
var block3={
basePt : [[0,1],[1,0],[1,1],[2,0]],
shapList:[
[[0,1],[1,0],[1,1],[2,0]],
[[0,0],[0,1],[1,1],[1,2]],
[[0,1],[1,0],[1,1],[2,0]],
[[0,0],[0,1],[1,1],[1,2]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
};
var block4={
basePt : [[0,0],[1,0],[1,1],[2,1]],
shapList:[
[[0,0],[1,0],[1,1],[2,1]],
[[0,1],[0,2],[1,0],[1,1]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
};
var block5={
basePt : [[0,0],[0,1],[1,0],[2,0]],
shapList:[
[[0,0],[0,1],[1,0],[2,0]],
[[0,0],[0,1],[0,2],[1,2]],
[[0,1],[1,1],[2,1],[2,0]],
[[0,0],[1,0],[1,1],[1,2]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
};
var block6={
basePt : [[0,0],[1,0],[1,1],[2,0]],
shapList:[
[[0,0],[1,0],[1,1],[2,0]],
[[0,0],[0,1],[0,2],[1,1]],
[[1,0],[0,1],[1,1],[2,1]],
[[0,1],[1,0],[1,1],[1,2]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
};
var block7={
basePt : [[-1,0],[0,0],[1,0],[2,0]],
shapList:[
[[-1,0],[0,0],[1,0],[2,0]],
[[0,0],[0,1],[0,2],[0,3]]
],
shapIndex : 0,
roate: function(){
this.shapIndex ++;
this.basePt = this.shapList[this.shapIndex%this.shapList.length].clone();
}
}; var blocks = [block1,block2,block3,block4,block5,block6,block7]; var randomBlock = function(){
var rnm= parseInt(Math.random()*100)%7;
var blk = blocks[rnm];
var ck = Math.random()*6;
for (var i = 0; i < ck; i++) {
blk.roate();
}
return blk;
};
var firstBlock = randomBlock();
// 全部方块
for (var j = 0; j < 20; j++) {
for (var i = 0; i < 10; i++) {
data.push([i,j,0]);
}
} option = {
backgroundColor: '#aaa',
title: [{
text: '俄罗斯方块'
},{
text: " 当前得分:0",
left:550,
top: '30%'
},
{
text: " ←、→ 左右移动\r\n\r\n↓ 加速下落,↑ 变形",
left:550,
top: '60%'
}],
grid:{
show:true,
borderColor :'#000',
z:2,
top:50,
left:200,
height:520,
width:260
},
legend: {
show:false
},
xAxis: {
interval :2,
splitLine: {
lineStyle: {
type: 'dashed'
}
},
max:10,
axisTick :{
show:false
},
axisLabel :{
show:false
} ,
axisLine :{
show:false
}
},
yAxis: {
interval :2,
splitLine: {
lineStyle: {
type: 'dashed'
}
},
max:20,
axisTick :{
show:false
},
axisLabel :{
show:false
} ,
axisLine :{
show:false
} },
series: [{
data: data,
type: 'scatter',
symbol :'rect',
symbolSize: function(v){
return v[2]*26;
},
symbolOffset :[13,-13],
label: {
emphasis: {
show: false
}
},
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(120, 36, 50, 0.5)',
shadowOffsetY: 5,
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
offset: 0,
color: 'rgb(251, 118, 123)'
}, {
offset: 1,
color: 'rgb(204, 46, 72)'
}])
}
}
},{
data: data2,
type: 'scatter',
symbol :'rect',
symbolSize: function(v){
return v[2]*26;
},
symbolOffset :[13,-13],
label: {
emphasis: {
show: false
}
},
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(25, 100, 150, 0.5)',
shadowOffsetY: 5,
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
offset: 0,
color: 'rgb(151, 218, 23)'
}, {
offset: 1,
color: 'rgb(104, 100, 5)'
}])
}
}
}]
};
var touchDistortionOther = function(){
var old_Pts = firstBlock.basePt.clone();
firstBlock.roate();
var isTouch = touchFallOther();
firstBlock.basePt = old_Pts;
firstBlock.shapIndex--; return isTouch;
} var touchFallOther = function(){
var pts = firstBlock.basePt.clone(); for (var i = 0; i < pts.length; i++) {
var da_i = pts[i][0]+rlMove;
var da_j = pts[i][1]+fallLine;
if(da_i<0 || da_i >=10){
return true;
}
if( option.series[0].data[da_j*10+da_i] && option.series[0].data[da_j*10+da_i][2] === 1){
return true;
}
}
return false;
}
var touchLeftRightOther = function(lrOffset){
var pts = firstBlock.basePt.clone();
var preLR_move = rlMove + lrOffset; for (var i = 0; i < pts.length; i++) {
var da_i = pts[i][0] + preLR_move;
var da_j = pts[i][1] + fallLine;
if(da_i<0 || da_i >=10){
return true;
}
if( option.series[0].data[da_j*10+da_i] && option.series[0].data[da_j*10+da_i][2] === 1){
return true;
}
}
return false;
}
var setScore = function(){
for (var j = 0; j < 20; j++) {
var rowBlok=0;
for (var i = 0; i < 10; i++) {
rowBlok+= option.series[0].data[j*10+i][2]
}
//消除一行
if(rowBlok == 10){
for (var k = j+1; k < 20; k++) {
for (var m = 0; m < 10; m++) {
option.series[0].data[(k-1)*10+m][2] = option.series[0].data[k*10+m][2];
}
}
score++;
option.title[1].text = ' 当前得分:'+score;
j--;
}
}
};
var checkDeath = function(){
for (var i = 0; i < 10; i++) {
if( option.series[0].data[19*10+i][2] === 1){
death = true;
option.title[1].text = '游戏结束\r\n\r\n 本次得分:'+score;
}
}
};
refreshT = function () {
var pts = firstBlock.basePt.clone(); if(fallLine < 0 || touchFallOther()){
for ( i = 0; i < pts.length; i++) {
var da_i = pts[i][0]+rlMove;
var da_j = pts[i][1]+fallLine+1;
if(option.series[0].data[da_j*10+da_i]){
option.series[0].data[da_j*10+da_i][2] = 1;
}
}
myChart.setOption(option);
//计算得分
setScore();
checkDeath();
option.series[1].data=[];
firstBlock = randomBlock();
rlMove = 4;
fallLine = 20;
speed = nomrlSpeed;
}else{
for (var i = 0; i < pts.length; i++) {
//横轴移动4
pts[i][0]+=rlMove;
pts[i][1]+=fallLine;
pts[i][2]=1;
}
option.series[1].data = pts;
}
//停止下落,
// option.series[1].data = pts;
// option.series[0].data = data;
myChart.setOption(option); }; fallBlockT = function () {
if(death) return;
fallLine--;
refreshT();
fallTimout = setTimeout( fallBlockT, speed);
};
fallBlockT();
document.onkeydown = function (event) {
if (event && event.keyCode === 37 ) {
if(!touchLeftRightOther(-1)){
rlMove--;
refreshT();
}
}
if (event && event.keyCode === 40 ) {
speed = downSpeed;
clearTimeout(fallTimout);
fallBlockT();
}
if (event && event.keyCode === 39 ) {
if(!touchLeftRightOther(1)){
rlMove++;
refreshT();
}
}
//变形
if (event && event.keyCode === 38 ) {
if(!touchDistortionOther()){
firstBlock.roate();
refreshT();
}
}
}

来自:http://gallery.echartsjs.com/editor.html?c=xrkJZ2pfeZ

[转][Echarts]俄罗斯方块的更多相关文章

  1. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  2. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts

    系列目录 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...

  4. echarts+php+mysql 绘图实例

    最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...

  5. 数据图表插件Echarts(一)

    一.引言 最近做一个智慧城市项目,项目中需要图表和报表进行数据分析,从网上找了很多,最后找到了百度开放的echarts,一个很强大的插件. 二.介绍 ECharts,缩写来自Enterprise Ch ...

  6. ECharts数据图表系统? 5分钟上手!

    目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...

  7. knockout+echarts实现图表展示

    一.需要学习的知识 knockout, require, director, echarts, jquery.简单的入一下门,网上的资料很多,最直接就是进官网校习. 二.效果展示 三.require的 ...

  8. ECharts 初识(基于MVC+jQuery+Angularjs实现的Demo)

    一.背景:      我们这行做web开发的,很多时候都需要做数据统计报表,现在我所使用的是来自百度团队的ECharts.官方网址:http://echarts.baidu.com/      我们知 ...

  9. 还是俄罗斯方块之android版

    前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...

随机推荐

  1. 配置Beyond Compare作为比较和合并工具

    配置方法 建议配置在~/.gitconfig中. Linux下 [diff]    tool = bc3[difftool]    prompt = false[merge]    tool = bc ...

  2. 分布式监控系统(类zabbix)

    目录: 为什么要做监控? 监控系统业务需求分析: 监控系统架构设计: 监控系统表结构设计: 一.为什么要做监控系统? 市面上已经有很多成熟的监控系统,例如zabbix.nagios,为什么自己开发监控 ...

  3. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  4. jquery常用实例

    $("#returnTop").click(function () { var speed=200;//滑动的速度 $('body,html').animate({ scrollT ...

  5. XenServer7.6命令行导出导入虚拟机(迁移)

    一:命令行方法导出虚拟机(先关闭虚拟机) 1.1:打印虚拟机列表 xe vm-list uuid ( RO) : 43dfac04-515e-7769-b2d2-444d4b7cb198 name-l ...

  6. 高级数据类型--字典(dict)

    一.字典介绍 dict(字典) 是 除列表以外 Python 之中 最灵活 的数据类型.字典同样可以用来 存储多个数据,通常用于存储 描述一个 物体 的相关信息 和列表的区别: 列表 是 有序 的对象 ...

  7. ecmall 学习记录3

    1.在ecmall.php 中 336行有一个函数 function lang_file($file) { return ROOT_PATH . '/languages/' . LANG . '/' ...

  8. Error: No EPCS layout data - looking for section [EPCS-C84018]

    /********************************************************************** * Error: No EPCS layout data ...

  9. sklearn.model_selection.StratifiedShuffleSplit

    sklearn.model_selection.StratifiedShuffleSplit

  10. IC卡热复位时序

    热复位(warm reset):在时钟CLK和电源电压VCC处于激活状态的前提下,IC卡收到复位信号时产生的复位. 冷复位过程之后,如果收到的复位应答信号不满足规定,终端将启动热复位并从IC卡获得复位 ...