[转][Echarts]俄罗斯方块
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]俄罗斯方块的更多相关文章
- 一起来玩echarts系列(一)------箱线图的分析与绘制
一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
系列目录 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...
- echarts+php+mysql 绘图实例
最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...
- 数据图表插件Echarts(一)
一.引言 最近做一个智慧城市项目,项目中需要图表和报表进行数据分析,从网上找了很多,最后找到了百度开放的echarts,一个很强大的插件. 二.介绍 ECharts,缩写来自Enterprise Ch ...
- ECharts数据图表系统? 5分钟上手!
目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...
- knockout+echarts实现图表展示
一.需要学习的知识 knockout, require, director, echarts, jquery.简单的入一下门,网上的资料很多,最直接就是进官网校习. 二.效果展示 三.require的 ...
- ECharts 初识(基于MVC+jQuery+Angularjs实现的Demo)
一.背景: 我们这行做web开发的,很多时候都需要做数据统计报表,现在我所使用的是来自百度团队的ECharts.官方网址:http://echarts.baidu.com/ 我们知 ...
- 还是俄罗斯方块之android版
前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...
随机推荐
- django中form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- UI 增加文本
1.直接在节点上增加VALUE NODE. 2.写GET,SET,I,P的相关实现 method GET_ZH12. DATA: lr_current TYPE REF TO if_bol_bo_pr ...
- springcloud入门-什么是springcloud
1.单体应用架构存在的问题 一个归档包(例如war)包含所有功能的应用程序,通常称为单体应用. 相信很多项目都是从单体应用开始的,单体应用比较容易部署和测试,项目的初期,项目可以很好的运行,然而,随着 ...
- js如何实现sign算法验证?
https://segmentfault.com/q/1010000011892180
- 2015-10-07 jQuery2
jQuery (2) 四. 过滤选择器 1. $("input[type='button']").val(“中国”) //所有设置type=button的input,其val ...
- Qt使用std::sort进行排序
参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01 ...
- vue项目中多个组件之间传递数据
//父组件<template> <div> <div style="float: left"> <input-data :city=&qu ...
- Xenserver7.6修改root密码
一:重启xenserver服务器 进入此界面时,先用上下建随便动下,解除4S倒计时,后按e键
- linux 执行脚本1.补充命令 2.后台执行
nohup是永久执行&是指在后台运行2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中.最后一个 ...
- [Java复习] 复习知识点
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现. String 被设计成不可变(immutable)类, 所以它的所有对象都是不可变对象. 要被序列化的实例 ...