昨天晚上,和搞C的朋友在一起,闲来无事,商量着一人搞一个俄罗斯玩玩吧,几天之后拿出来比比谁的更有特色,结果我打算使用HTML5写一个俄罗斯方块。
自己写了一些俄罗斯方块的函数,现记下,分享给有需要的人(方法都是最原始的方法,有问题望多多指教)。
后来改写后成型的HTML5俄罗斯方块体验地址:http://www.9k6.net/games
以下的图形都是已经设置了方向,可以随意旋转,配置自定义颜色和坐标
1、三叉图形:

View Code
/* * * @以长矩形的底边中心为pointX,pointY * @point Array * 0,1,2,3 大矩形 * 4,5,6,7 小矩形 * 8,9 分割线初始点 * 10,11 第二个分割线点 * 12,13 第三个分割线点 * 14,15 第四个分割线点 * @cans obj canvas对象 * @direction str 方向 * @pointX,pointY int 旋转点坐标 * @stepLength(全) int 单个方块大小 * @color str 方块填充颜色 * */ function getTShape(cans,direction,pointX,pointY,color){ var pointArr = new Array(); switch(direction){ case 'down': pointArr[0] = pointX-stepLength*3/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*3; pointArr[3] = stepLength; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY-stepLength/2; break; case 'left': pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength*3/2; pointArr[2] = stepLength; pointArr[3] = stepLength*3; pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength; pointArr[8] = pointX+stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX-stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; break; case 'right': pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength*3/2; pointArr[2] = stepLength; pointArr[3] = stepLength*3; pointArr[4] = pointX+stepLength/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX-stepLength/2; pointArr[15] = pointY+stepLength/2; break; default: pointArr[0] = pointX-stepLength*3/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*3; pointArr[3] = stepLength; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength; pointArr[7] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY+stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY-stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; break; } cans.fillStyle = color; cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形 cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形 cans.strokeStyle = '#FFF'; cans.lineWidth = 1; cans.beginPath(); cans.moveTo(pointArr[8],pointArr[9]); cans.lineTo(pointArr[10],pointArr[11]); cans.lineTo(pointArr[12],pointArr[13]); cans.lineTo(pointArr[14],pointArr[15]); cans.stroke(); }
函数特点:可以自定颜色,自定中心点坐标,可以自定旋转方向(注意:stepLength为全局变量,含义为单个方块的边长)
2、一字形:

View Code
/* * * @以第二个方块中心为pointX,pointY * @point Array * 0,1,2,3 大矩形 * 4,5,6,7 第一条分割线 * 8,9,10,11 第二个分割线线 * 12,13,14,15 第三个分割线线 * @cans obj canvas对象 * @direction str 方向 * @pointX,pointY int 旋转点坐标 * @stepLength(全) int 单个方块大小 * @color str 方块填充颜色 * */ function getLShape(cans,direction,pointX,pointY,color){ var pointArr = new Array(); switch(direction){ case 'up': pointArr[0] = pointX-stepLength*3/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*4; pointArr[3] = stepLength; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = pointX-stepLength/2; pointArr[7] = pointY+stepLength/2; pointArr[8] = pointX+stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength*3/2; pointArr[13] = pointY-stepLength/2; pointArr[14] = pointX+stepLength*3/2; pointArr[15] = pointY+stepLength/2; break; default: pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength*3/2; pointArr[2] = stepLength; pointArr[3] = stepLength*4; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = pointX+stepLength/2; pointArr[7] = pointY-stepLength/2; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY+stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX-stepLength/2; pointArr[13] = pointY+stepLength*3/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength*3/2; break; } cans.fillStyle = color; cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//矩形 cans.strokeStyle = '#FFF'; cans.lineWidth = 2; cans.beginPath(); cans.moveTo(pointArr[4],pointArr[5]); cans.lineTo(pointArr[6],pointArr[7]); cans.stroke(); cans.beginPath(); cans.moveTo(pointArr[8],pointArr[9]); cans.lineTo(pointArr[10],pointArr[11]); cans.stroke(); cans.beginPath(); cans.moveTo(pointArr[12],pointArr[13]); cans.lineTo(pointArr[14],pointArr[15]); cans.stroke(); }
函数特点:两种方向,横、纵向,以第二个方块为中心旋转
3、田字形:

View Code
/* * * @以左上第一个方块中心为pointX,pointY * @point Array * 0,1,2,3 大矩形 * 4,5,6,7 第一条分割线 * 8,9,10,11 第二个分割线线 * @cans obj canvas对象 * @pointX,pointY int 起始点坐标 * @stepLength(全) int 单个方块大小 * @color str 方块填充颜色 * */ function getOShape(cans,pointX,pointY,color){ var pointArr = new Array(); pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*2; pointArr[3] = stepLength*2; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = pointX+stepLength*3/2; pointArr[7] = pointY+stepLength/2; pointArr[8] = pointX+stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY+stepLength*3/2; cans.fillStyle = color; cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//矩形 cans.strokeStyle = '#FFF'; cans.lineWidth = 2; cans.beginPath(); cans.moveTo(pointArr[4],pointArr[5]); cans.lineTo(pointArr[6],pointArr[7]); cans.stroke(); cans.beginPath(); cans.moveTo(pointArr[8],pointArr[9]); cans.lineTo(pointArr[10],pointArr[11]); cans.stroke(); }
特点:无
4、F形(两种,共八个方向):

View Code
/* * * @以左上第一个方块中心为pointX,pointY * @point Array * 0,1,2,3 第一个矩形(中心所在的矩形) * 4,5,6,7 第二个矩形 * 8,9,10,11 第一条分割线 * 12,13,14,15 第二个分割线线 * 16,17,18,19 第三个分割线线 * @cans obj canvas对象 * @pointX,pointY int 起始点坐标 * @stepLength(全) int 单个方块大小 * @color str 方块填充颜色 * @flag int 类型(-|向下座向为1,右为0) * */ function getEShapeLib(cans,direction,pointX,pointY,color,flag){ var pointArr = new Array(); switch(direction){ case 'down': pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength*3/2; pointArr[2] = stepLength; pointArr[3] = stepLength*2; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX-stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; if(flag==1){ pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[16] = pointX-stepLength/2; pointArr[17] = pointY+stepLength/2; pointArr[18] = pointX-stepLength/2; pointArr[19] = pointY+stepLength*3/2; }else{ pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[16] = pointX+stepLength/2; pointArr[17] = pointY+stepLength/2; pointArr[18] = pointX+stepLength/2; pointArr[19] = pointY+stepLength*3/2; } break; case 'up': pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength; pointArr[3] = stepLength*2; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX-stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; if(flag==1){ pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[16] = pointX+stepLength/2; pointArr[17] = pointY-stepLength*3/2; pointArr[18] = pointX+stepLength/2; pointArr[19] = pointY-stepLength/2; }else{ pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[16] = pointX-stepLength/2; pointArr[17] = pointY-stepLength*3/2; pointArr[18] = pointX-stepLength/2; pointArr[19] = pointY-stepLength/2; } break; case 'left': pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*2; pointArr[3] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY-stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; if(flag==1){ pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[16] = pointX-stepLength*3/2; pointArr[17] = pointY-stepLength/2; pointArr[18] = pointX-stepLength/2; pointArr[19] = pointY-stepLength/2; }else{ pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[16] = pointX-stepLength*3/2; pointArr[17] = pointY+stepLength/2; pointArr[18] = pointX-stepLength/2; pointArr[19] = pointY+stepLength/2; } break; default://right pointArr[0] = pointX-stepLength*3/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*2; pointArr[3] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY-stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength/2; if(flag==1){ pointArr[4] = pointX+stepLength/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[16] = pointX+stepLength/2; pointArr[17] = pointY+stepLength/2; pointArr[18] = pointX+stepLength*3/2; pointArr[19] = pointY+stepLength/2; }else{ pointArr[4] = pointX+stepLength/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[16] = pointX+stepLength/2; pointArr[17] = pointY-stepLength/2; pointArr[18] = pointX+stepLength*3/2; pointArr[19] = pointY-stepLength/2; } break; } /**/ cans.clearRect(0,0,460,800); /**/ cans.fillStyle = color; cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形 cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形 cans.strokeStyle = '#FFF'; cans.lineWidth = 2; cans.beginPath(); cans.moveTo(pointArr[8],pointArr[9]); cans.lineTo(pointArr[10],pointArr[11]); cans.stroke(); cans.beginPath(); cans.moveTo(pointArr[12],pointArr[13]); cans.lineTo(pointArr[14],pointArr[15]); cans.stroke(); cans.beginPath(); cans.moveTo(pointArr[16],pointArr[17]); cans.lineTo(pointArr[18],pointArr[19]); cans.stroke(); }
特点:flag是界定两种方向的形状的标志
5、Z形:

View Code
/* * * @以左上第一个方块中心为pointX,pointY * @point Array * 0,1,2,3 第一个矩形(中心所在的矩形) * 4,5,6,7 第二个矩形 * 8,9,10,11 第一条分割线 * 12,13,14,15 第二个分割线线 * 16,17,18,19 第三个分割线线 * @cans obj canvas对象 * @pointX,pointY int 起始点坐标 * @stepLength(全) int 单个方块大小 * @color str 方块填充颜色 * @flag int 类型(-|向下座向为1,右为0) * */ function getZShapeLib(cans,direction,pointX,pointY,color,flag){ var pointArr = new Array(); switch(direction){ case 'up': if(flag==1){ pointArr[0] = pointX-stepLength*3/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*2; pointArr[3] = stepLength; pointArr[4] = pointX-stepLength/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX-stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength/2; pointArr[15] = pointY+stepLength*3/2; }else{ pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength*2; pointArr[3] = stepLength; pointArr[4] = pointX-stepLength*3/2; pointArr[5] = pointY+stepLength/2; pointArr[6] = stepLength*2; pointArr[7] = stepLength; pointArr[8] = pointX+stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX-stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX-stepLength/2; pointArr[15] = pointY+stepLength*3/2; } break; default://right if(flag==1){ pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength/2; pointArr[2] = stepLength; pointArr[3] = stepLength*2; pointArr[4] = pointX+stepLength/2; pointArr[5] = pointY-stepLength*3/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY+stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY+stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY-stepLength/2; pointArr[14] = pointX+stepLength*3/2; pointArr[15] = pointY-stepLength/2; }else{ pointArr[0] = pointX-stepLength/2; pointArr[1] = pointY-stepLength*3/2; pointArr[2] = stepLength; pointArr[3] = stepLength*2; pointArr[4] = pointX+stepLength/2; pointArr[5] = pointY-stepLength/2; pointArr[6] = stepLength; pointArr[7] = stepLength*2; pointArr[8] = pointX-stepLength/2; pointArr[9] = pointY-stepLength/2; pointArr[10] = pointX+stepLength/2; pointArr[11] = pointY-stepLength/2; pointArr[12] = pointX+stepLength/2; pointArr[13] = pointY+stepLength/2; pointArr[14] = pointX+stepLength*3/2; pointArr[15] = pointY+stepLength/2; } break; } /**/ cans.clearRect(0,0,460,800); /**/ cans.fillStyle = color; cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形 cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形 cans.strokeStyle = '#FFF'; cans.lineWidth = 2; cans.beginPath(); cans.moveTo(pointArr[8],pointArr[9]); cans.lineTo(pointArr[10],pointArr[11]); cans.lineTo(pointArr[12],pointArr[13]); cans.lineTo(pointArr[14],pointArr[15]); cans.stroke(); }
特点:两种方向,flag界定。
以上是俄罗斯方块的几种形状,当然方法有很多种,你也可以使用线条路径然后填充的方法。
全部代码(使用了jQuery):
View Code
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Canvas</title>
</head>
<style type="text/css">
body{margin:20px auto; padding:0; 1000px}
canvas{border:2px dashed #CCC}
#can1{float:left}
#can2{float:right}
</style>
<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function(){
var cans = $('#can1').get(0).getContext('2d');
var stepLength = 30; // 全局变量,单个方块的宽度
var canWidth = 371;
var canHeight = 619;
var dir = ['up','left','down','right'];
var intNum =0;
function getL(){
intNum = (intNum==4)?0:intNum;
//getTShape(cans,dir[intNum],200,200,'#D54D34');
//getTShape(cans,dir[intNum],300,400,'red');
//cans.translate(-40,-50);
getTShape(cans,dir[intNum],171,325,'red');
intNum++;
}
$('canvas').click(getL);
/*
*框线绘画
*
*/
var intX = Math.floor(canWidth/stepLength);
var intY = Math.floor(canHeight/stepLength);
for(var i=1;i<intX;i++){
cans.lineWidth = 1;
cans.strokeStyle = '#ddd';
cans.beginPath();
cans.moveTo(i*(stepLength+1),0);
cans.lineTo(i*(stepLength+1),canHeight);
cans.closePath();
cans.stroke();
}
for(var i=1;i<intY;i++){
cans.lineWidth = 1;
cans.strokeStyle = '#ddd';
cans.beginPath();
cans.moveTo(0,i*(stepLength+1));
cans.lineTo(canWidth,i*(stepLength+1));
cans.closePath();
cans.stroke();
}
/*
*
* @以长矩形的底边中心为pointX,pointY
* @point Array
* 0,1,2,3 大矩形
* 4,5,6,7 小矩形
* 8,9 分割线初始点
* 10,11 第二个分割线点
* 12,13 第三个分割线点
* 14,15 第四个分割线点
* @cans obj canvas对象
* @direction str 方向
* @pointX,pointY int 旋转点坐标
* @stepLength(全) int 单个方块大小
* @color str 方块填充颜色
*
*/
function getTShape(cans,direction,pointX,pointY,color){
var pointArr = new Array();
switch(direction){
case 'down':
pointArr[0] = pointX-stepLength*3/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*3;
pointArr[3] = stepLength;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY-stepLength/2;
break;
case 'left':
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength*3/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*3;
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength;
pointArr[8] = pointX+stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX-stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
break;
case 'right':
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength*3/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*3;
pointArr[4] = pointX+stepLength/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX-stepLength/2;
pointArr[15] = pointY+stepLength/2;
break;
default:
pointArr[0] = pointX-stepLength*3/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*3;
pointArr[3] = stepLength;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY+stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY-stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
break;
}
cans.fillStyle = color;
cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形
cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形
cans.strokeStyle = '#FFF';
cans.lineWidth = 1;
cans.beginPath();
cans.moveTo(pointArr[8],pointArr[9]);
cans.lineTo(pointArr[10],pointArr[11]);
cans.lineTo(pointArr[12],pointArr[13]);
cans.lineTo(pointArr[14],pointArr[15]);
cans.stroke();
}
//getLShape(cans,'vertical',300,300,'#D54D34');
/*
*
* @以第二个方块中心为pointX,pointY
* @point Array
* 0,1,2,3 大矩形
* 4,5,6,7 第一条分割线
* 8,9,10,11 第二个分割线线
* 12,13,14,15 第三个分割线线
* @cans obj canvas对象
* @direction str 方向
* @pointX,pointY int 旋转点坐标
* @stepLength(全) int 单个方块大小
* @color str 方块填充颜色
*
*/
function getLShape(cans,direction,pointX,pointY,color){
var pointArr = new Array();
switch(direction){
case 'up':
pointArr[0] = pointX-stepLength*3/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*4;
pointArr[3] = stepLength;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = pointX-stepLength/2;
pointArr[7] = pointY+stepLength/2;
pointArr[8] = pointX+stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength*3/2;
pointArr[13] = pointY-stepLength/2;
pointArr[14] = pointX+stepLength*3/2;
pointArr[15] = pointY+stepLength/2;
break;
default:
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength*3/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*4;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = pointX+stepLength/2;
pointArr[7] = pointY-stepLength/2;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY+stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX-stepLength/2;
pointArr[13] = pointY+stepLength*3/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength*3/2;
break;
}
cans.fillStyle = color;
cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//矩形
cans.strokeStyle = '#FFF';
cans.lineWidth = 2;
cans.beginPath();
cans.moveTo(pointArr[4],pointArr[5]);
cans.lineTo(pointArr[6],pointArr[7]);
cans.stroke();
cans.beginPath();
cans.moveTo(pointArr[8],pointArr[9]);
cans.lineTo(pointArr[10],pointArr[11]);
cans.stroke();
cans.beginPath();
cans.moveTo(pointArr[12],pointArr[13]);
cans.lineTo(pointArr[14],pointArr[15]);
cans.stroke();
}
//getOShape(cans,171,325,'red');
/*
*
* @以左上第一个方块中心为pointX,pointY
* @point Array
* 0,1,2,3 大矩形
* 4,5,6,7 第一条分割线
* 8,9,10,11 第二个分割线线
* @cans obj canvas对象
* @pointX,pointY int 起始点坐标
* @stepLength(全) int 单个方块大小
* @color str 方块填充颜色
*
*/
function getOShape(cans,pointX,pointY,color){
var pointArr = new Array();
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*2;
pointArr[3] = stepLength*2;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = pointX+stepLength*3/2;
pointArr[7] = pointY+stepLength/2;
pointArr[8] = pointX+stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY+stepLength*3/2;
cans.fillStyle = color;
cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//矩形
cans.strokeStyle = '#FFF';
cans.lineWidth = 2;
cans.beginPath();
cans.moveTo(pointArr[4],pointArr[5]);
cans.lineTo(pointArr[6],pointArr[7]);
cans.stroke();
cans.beginPath();
cans.moveTo(pointArr[8],pointArr[9]);
cans.lineTo(pointArr[10],pointArr[11]);
cans.stroke();
}
getEShapeLib(cans,'down',171,325,'red',0);
/*
*
* @以左上第一个方块中心为pointX,pointY
* @point Array
* 0,1,2,3 第一个矩形(中心所在的矩形)
* 4,5,6,7 第二个矩形
* 8,9,10,11 第一条分割线
* 12,13,14,15 第二个分割线线
* 16,17,18,19 第三个分割线线
* @cans obj canvas对象
* @pointX,pointY int 起始点坐标
* @stepLength(全) int 单个方块大小
* @color str 方块填充颜色
* @flag int 类型(-|向下座向为1,右为0)
*
*/
function getEShapeLib(cans,direction,pointX,pointY,color,flag){
var pointArr = new Array();
switch(direction){
case 'down':
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength*3/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*2;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX-stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
if(flag==1){
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[16] = pointX-stepLength/2;
pointArr[17] = pointY+stepLength/2;
pointArr[18] = pointX-stepLength/2;
pointArr[19] = pointY+stepLength*3/2;
}else{
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[16] = pointX+stepLength/2;
pointArr[17] = pointY+stepLength/2;
pointArr[18] = pointX+stepLength/2;
pointArr[19] = pointY+stepLength*3/2;
}
break;
case 'up':
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*2;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX-stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
if(flag==1){
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[16] = pointX+stepLength/2;
pointArr[17] = pointY-stepLength*3/2;
pointArr[18] = pointX+stepLength/2;
pointArr[19] = pointY-stepLength/2;
}else{
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[16] = pointX-stepLength/2;
pointArr[17] = pointY-stepLength*3/2;
pointArr[18] = pointX-stepLength/2;
pointArr[19] = pointY-stepLength/2;
}
break;
case 'left':
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*2;
pointArr[3] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY-stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
if(flag==1){
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[16] = pointX-stepLength*3/2;
pointArr[17] = pointY-stepLength/2;
pointArr[18] = pointX-stepLength/2;
pointArr[19] = pointY-stepLength/2;
}else{
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[16] = pointX-stepLength*3/2;
pointArr[17] = pointY+stepLength/2;
pointArr[18] = pointX-stepLength/2;
pointArr[19] = pointY+stepLength/2;
}
break;
default://right
pointArr[0] = pointX-stepLength*3/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*2;
pointArr[3] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY-stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength/2;
if(flag==1){
pointArr[4] = pointX+stepLength/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[16] = pointX+stepLength/2;
pointArr[17] = pointY+stepLength/2;
pointArr[18] = pointX+stepLength*3/2;
pointArr[19] = pointY+stepLength/2;
}else{
pointArr[4] = pointX+stepLength/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[16] = pointX+stepLength/2;
pointArr[17] = pointY-stepLength/2;
pointArr[18] = pointX+stepLength*3/2;
pointArr[19] = pointY-stepLength/2;
}
break;
}
cans.fillStyle = color;
cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形
cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形
cans.strokeStyle = 'blue';
cans.lineWidth = 2;
cans.beginPath();
cans.moveTo(pointArr[8],pointArr[9]);
cans.lineTo(pointArr[10],pointArr[11]);
cans.stroke();
cans.beginPath();
cans.moveTo(pointArr[12],pointArr[13]);
cans.lineTo(pointArr[14],pointArr[15]);
cans.stroke();
cans.beginPath();
cans.moveTo(pointArr[16],pointArr[17]);
cans.lineTo(pointArr[18],pointArr[19]);
cans.stroke();
}
/*
*
* @以左上第一个方块中心为pointX,pointY
* @point Array
* 0,1,2,3 第一个矩形(中心所在的矩形)
* 4,5,6,7 第二个矩形
* 8,9,10,11 第一条分割线
* 12,13,14,15 第二个分割线线
* 16,17,18,19 第三个分割线线
* @cans obj canvas对象
* @pointX,pointY int 起始点坐标
* @stepLength(全) int 单个方块大小
* @color str 方块填充颜色
* @flag int 类型(-|向下座向为1,右为0)
*
*/
function getZShapeLib(cans,direction,pointX,pointY,color,flag){
var pointArr = new Array();
switch(direction){
case 'up':
if(flag==1){
pointArr[0] = pointX-stepLength*3/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*2;
pointArr[3] = stepLength;
pointArr[4] = pointX-stepLength/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX-stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength/2;
pointArr[15] = pointY+stepLength*3/2;
}else{
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength*2;
pointArr[3] = stepLength;
pointArr[4] = pointX-stepLength*3/2;
pointArr[5] = pointY+stepLength/2;
pointArr[6] = stepLength*2;
pointArr[7] = stepLength;
pointArr[8] = pointX+stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX-stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX-stepLength/2;
pointArr[15] = pointY+stepLength*3/2;
}
break;
default://right
if(flag==1){
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*2;
pointArr[4] = pointX+stepLength/2;
pointArr[5] = pointY-stepLength*3/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY+stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY+stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY-stepLength/2;
pointArr[14] = pointX+stepLength*3/2;
pointArr[15] = pointY-stepLength/2;
}else{
pointArr[0] = pointX-stepLength/2;
pointArr[1] = pointY-stepLength*3/2;
pointArr[2] = stepLength;
pointArr[3] = stepLength*2;
pointArr[4] = pointX+stepLength/2;
pointArr[5] = pointY-stepLength/2;
pointArr[6] = stepLength;
pointArr[7] = stepLength*2;
pointArr[8] = pointX-stepLength/2;
pointArr[9] = pointY-stepLength/2;
pointArr[10] = pointX+stepLength/2;
pointArr[11] = pointY-stepLength/2;
pointArr[12] = pointX+stepLength/2;
pointArr[13] = pointY+stepLength/2;
pointArr[14] = pointX+stepLength*3/2;
pointArr[15] = pointY+stepLength/2;
}
break;
}
cans.fillStyle = color;
cans.fillRect(pointArr[0],pointArr[1],pointArr[2],pointArr[3]);//大矩形
cans.fillRect(pointArr[4],pointArr[5],pointArr[6],pointArr[7]);//小矩形
cans.strokeStyle = 'blue';
cans.lineWidth = 2;
cans.beginPath();
cans.moveTo(pointArr[8],pointArr[9]);
cans.lineTo(pointArr[10],pointArr[11]);
cans.lineTo(pointArr[12],pointArr[13]);
cans.lineTo(pointArr[14],pointArr[15]);
cans.stroke();
}
});
</script>
<body>
<canvas id="can1" width="371px" height="619px"></canvas>
<canvas id="can2" width="371px" height="619px"></canvas>
</body>
</html>
