JS原创小游戏 旋转方块(源码)

一、介绍

游戏规则:

有两个大方块,由n*n的小方格组成,初始都为黑色,点击方块会在黑白间切换颜色,左边的方块用于自定义题目,右边方块则需要点击后获得与左边相同的图形,另外右边的方块每次点击后会顺时针旋转90度,你需要在脑海中将旋转后的方块复原,否则或许两图相同,但右图经过旋转,所以不过关。每次过关后方格数量会增加(当然题目是自定义的,所以难度还是自己决定,也可以使用随机数的方式获得一个初始题目)

源码:

页面代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>the same</title>
        <!--引入样式表和js文件-->
        <link rel="stylesheet" type="text/css" href="css/game.css"/>
        <script type="text/javascript" src="js/game.js" ></script>
    </head>
    <body>
        <!--左边方块-->
        <div id="ep_div">
            <!--方块用js向table中添加-->
            <table border="1 solid black" cellspacing="2" id="ep">
            </table>
        </div>
        <!--右边方块-->
        <div id="td_div">
            <table border="1 solid black" cellspacing="2" id="td">
            </table>
        </div>
        <!--一些提示信息,不重要-->
        <div class="tip" style="clear: both;">
            <br />
            <p>位置为4时图案位置与例题(左图为例题)相同,1,2,3,4分别为顺时针
                旋转90,180,270,360度,两图位置相同则过关
                (注意旋转后需在脑海复原位置,否则位置对应不同图案相同不过关)
            </p>
            位置:<span id="rot">0</span>
        </div>
        <br />
        <!--重新开始并不会初始化方格数和旋转角度-->
        <button onclick="newGame()">重新开始</button>
        <!--重置会初始化方格数和旋转角度-->
        <button onclick="reset()">重置</button>
    </body>
</html>

样式表:

/*背景颜色*/
 body{
    background-color: blanchedalmond;
 }
 /*大方块左浮动*/
 #ep_div,#td_div{
    float: left;
    margin-left: 30px;
 }
 /*旋转角度设置(这里我用的chrom浏览器所以用了-webkit-,根据自己用的浏览器自行更改)*/
.rotate90{  
    -webkit-transform: rotate(90deg); 
 }  
.rotate180{  
    -webkit-transform: rotate(180deg); 
 } 
 .rotate270{  
    -webkit-transform: rotate(270deg); 
 } 

js文件(重点):

初始化信息:

//方格行列数
var size = 5;
//方格值(1或0),通过值判断是否过关
var ep_arr,td_arr;
//旋转值
var td_rot = 0;
//页面加载完后初始化方格
onload = function(){
    //下面介绍init函数
    //通过init函数创建小方格,并初始化数组
    ep_arr = init("ep");
    td_arr = init("td");
}

init函数(用于初始化方格及方格对应值):

function init(id){
    //通过id获得table
    var ep = document.getElementById(id);
    //行、列的变量
    var tr,td;
    //创建table对应的二维数组
    var arr = new Array;
    //外层循环创建tr标签并添加到table上
    for(var i=0;i<size;i++){
        arr[i] = new Array;
        tr = document.createElement("tr"); 
        ep.appendChild(tr);
        //内层循环创建td标签添加到tr上
        for(var j=0;j<size;j++){
            //为小方格对应数值赋初值
            arr[i][j] = 0;
            //创建td的函数,下面介绍
            var td = createTd(id,i,j);
            tr.appendChild(td);
        }
    }
    //函数返回数组用于给全局变量赋值
    return arr;
}

创建小方格函数(创建一个方格并绑定单击事件):

function createTd(id,i,j){
    //创建方格并设置宽高
    var td = document.createElement("td");
    td.width = 20;
    td.height = 20;
    //id值形式为id_i_j(即table的id加上后缀)
    td.id = id+"_"+i+"_"+j;
    td.bgColor = "black";
    //为方格绑定点击事件(点击事件下面介绍)
    td.addEventListener("click",click_ep);
    //将创建的方格返回
    return td;
}

方格点击事件:

//方格点击变色
function click_ep(e){
    var td = e.target;
    //方格点击后黑白交替,函数下文介绍
    changeColor(td);
    //获得方格所在的div,命名规则为id_div(即table的id加上div后缀)
    var div = document.getElementById(td.id.substr(0,2)+"_div");
    //如果点击的是右边的大方块,大方块会旋转
    if(td.id.indexOf("td")>-1){
        //等待100ms旋转方块
        setTimeout(function(){
            //通过修改class属性完成旋转
            div.className = "rotate"+(++td_rot)*90;
            //提示当前旋转了多少度(1,2,3,4分别代表90,180,270,360)
            document.getElementById("rot").innerHTML = td_rot;
            if(td_rot>3) td_rot = 0;
            //旋转后检查是否过关了(检查函数下文介绍)  
            check();
        },100);
    }
}

颜色黑白交替:

function changeColor(td){
    //通过点击的方格的id截取i,j值(方格id命名规则tableID_i_j)
    var i = td.id.substr(3,1);
    var j = td.id.substr(5,1);
    //通过id判断方格属于ep还是td(ep为自定义题目方格,td为答题区方格)
    if(td.id.indexOf("ep")>-1){
        //通过方格对应数组中的值改变方格颜色(为0就改为1,并改为白色)
        if(ep_arr[i][j]==0){
            td.bgColor = "white";
            ep_arr[i][j] = 1;
        }else{
            td.bgColor = "black";
            ep_arr[i][j] = 0;
        }
    }else{
        if(td_arr[i][j]==0){
            td.bgColor = "white";
            td_arr[i][j] = 1;
        }else{
            td.bgColor = "black";
            td_arr[i][j] = 0;
        }
    }
}

检查游戏是否结束:

function check(){
    //判断ep与td区数组值是否相同
    for(var i=0;i<size;i++){
        for(var j=0;j<size;j++){
            if(ep_arr[i][j]!=td_arr[i][j]){
                return;
            }
        }
    }
    //两个数组值相同弹出提示框
    alert("succeed");
    //过关后方格数量增加
    size++;
    //方格上限设置(太多了屏幕容不下)
    if(size>10)size=5;
    //开始下一局游戏(下文介绍该函数)
    newGame();  
}

开始新游戏:

//重新开始游戏(不初始化为第一关)
function newGame(){
    //将table清空
    document.getElementById("ep").innerHTML = "";
    document.getElementById("td").innerHTML = "";
    //初始化数组并生成td
    ep_arr = init("ep");
    td_arr = init("td");
}

重置游戏(重置游戏到第一关):

function reset(){
    //重置到第一关
    size = 5;
    //开始新游戏
    newGame();
    //位置信息重置
    document.getElementById("rot").innerHTML = 0;
    td_rot = 0;
    //将td的table的class属性置为空(即取消旋转,使方格回到初始位置)
    document.getElementById("td_div").className = "";
}

差不多就是这样了,有兴趣的朋友可以粘贴代码试试哦,游戏还有许多扩展方式,大家可以自由探索。

猜你喜欢

转载自blog.csdn.net/qq_38071004/article/details/79403904