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. ZZW_shell脚本中的调用MYSQL传参及注意的问题

    [oracle@ip9140 db_pcc]$ cat zzw_cc.sh #!/bin/bash z_user='pcc_csuser22'z_pass='pcc_csuser22'z_db='db ...

  2. 如何正确使用QThread

    如何正确使用QThread https://www.2cto.com/kf/201609/550462.html

  3. doxygen

    //commndline: doxygen Doxyfile /**comment /* /** time diff@pre precondition@post endcondition@throw ...

  4. css隐藏滚动条依旧可以滚动

    在做企业页面的时候,大部分页面都应该是活的,不应该写死,因为要从后台拿数据进行填充.而后台的数据是不确定的,有时候会让我们的容器撑得很大.这时候我们需要隐藏掉滚动条达到美观或者其他布局效果,隐藏掉单个 ...

  5. 正确学习Linux系统的5个建议

    摘要: 最近几年Linux系统应用越来越广泛,以至于很多人开始热衷学习Linux.但是我们都是从小都是学习windows系统长大的,从windows 98到现在的windows 10,而根据学习win ...

  6. Java的课堂实验

    题目是:用Aplet创建一个小程序,使得当你的鼠标经过图片时,放歌~ 其中,补充知识:1.MouseMotionListener这个和MouseListener这两个监听器要了解以下 2.Aplet这 ...

  7. Verilog强制激励语法

    Verilog强制激励语法 1. 在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值. 过程连续赋值往往是不可以综合的,通常用在测试模块中. 两种方式都有各自配套的命令来停止赋值过程. ...

  8. ceph存储集群性能测试工具步骤(初稿)

    一.源码安装fio工具: #yum install libaio-devel make #wget http://brick.kernel.dk/snaps/fio-2.2.10.tar.gz #ta ...

  9. java学习笔记41(数据库连接池 C3p0连接池)

    在之前的学习中,我们发现,我们需要频繁的创建连接对象,用完之后还需要在关闭资源,因为这些连接对象都是占资源的,但是又不得不创建,比较繁琐,为了解决这种情况,Java出现了数据库连接池: 数据库连接池的 ...

  10. 学习HashMap随笔(更新中)

    1.先来一个HashMap和HashTable的区别: HashMap线程不安全,键值可以为空 HashTable线程安全,键值不可以为空 2.hashmap我理解的是把数组存储和链表存储相结合了 具 ...