zoukankan      html  css  js  c++  java
  • HTML5游戏开发——俄罗斯方块相关部件函数

    昨天晚上,和搞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>
  • 相关阅读:
    [Dynamic Language] Python Django: 模板引擎(1)基本使用
    [ASM C/C++] C函数调用分析
    [Linux] Ubuntu: 相关工具及配置
    xml小练习
    饿汉式懒汉式
    给定一个数组,获取数组中的最大值,以及最小值。
    Fighting
    通过API文档查询Math类的方法,打印出近似圆,只要给定不同半径,圆的大小就会随之发生改变
    对给定数组进行选择排序
    对给定数组进行冒泡排序
  • 原文地址:https://www.cnblogs.com/picaso/p/2797530.html
Copyright © 2011-2022 走看看