先实现完成阶段二的前两个需求,生成一个L型的模型,将容器分割成18行10列的代码。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style type="text/css">.container{width: 200px;height: 360px;background-color: antiquewhite;position: relative;}.actvity_model{width: 20px;height: 20px;background-color: cornflowerblue;border: .3px solid rgb(148, 170, 218);box-sizing: border-box;position: absolute;}</style></head><body onload="init();"><!-- 背景容器 --><div id="container" class="container"><!-- 块元素 --></div><script>//创建一个常量控制步长const STEP = 20;//定义常量分割容器const ROW_COUNT = 18,COL_COUNT = 10;//创建每个模型的数据源(L型)const MODELS = [{0:{row:2,col:0},1:{row:2,col:1},2:{row:2,col:2},3:{row:1,col:2}}];//创建变量,存放当前使用的模型var currentModel = {};//入口方法function init(){createModel();onKeyDown();}//根据模型的数据创建对应的块元素function createModel(){//确定当前使用哪一个模型currentModel = MODELS[0];//生成对应数量的块元素for (var key in currentModel){var divEle = document.createElement("div");divEle.className = "actvity_model";document.querySelector("#container").appendChild(divEle);}//定位块元素的位置locationBlock();}//根据数据源定位块元素的位置function locationBlock(){//1.拿到所有的块元素var eles = document.querySelectorAll(".actvity_model");for (var i = 0;i<eles.length;i++){//单个块元素var actvityModelEle = eles[i];//2.找到每个块元素对应的数据var blockModel = currentModel[i];//3.根据每个块元素对应的数据来指定块元素的位置actvityModelEle.style.left = blockModel.col * STEP + "px";actvityModelEle.style.top = blockModel.row * STEP + "px";}}//监听用户键盘事件function onKeyDown(){document.onkeydown = function(evnet){switch(event.keyCode){case 38:console.log("上");move(0,-1);break;case 39:console.log("右");move(1,0);break;case 40:console.log("下");move(0,1);break;case 37:console.log("左");move(-1,0);break;}}}//控制块元素移动function move(x,y){var actvityModelEle = document.querySelector(".actvity_model");actvityModelEle.style.top = parseInt(actvityModelEle.style.top || 0) + y * STEP + "px";actvityModelEle.style.left = parseInt(actvityModelEle.style.left || 0) + x * STEP + "px";}</script></body></html>
下面代码完成模型的移动
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style type="text/css">.container{width: 200px;height: 360px;background-color: antiquewhite;position: relative;}.actvity_model{width: 20px;height: 20px;background-color: cornflowerblue;border: .3px solid rgb(148, 170, 218);box-sizing: border-box;position: absolute;}</style></head><body onload="init();"><!-- 背景容器 --><div id="container" class="container"><!-- 块元素 --></div><script>//创建一个常量控制步长const STEP = 20;//定义常量分割容器const ROW_COUNT = 18,COL_COUNT = 10;//创建每个模型的数据源(L型)const MODELS = [{0:{row:2,col:0},1:{row:2,col:1},2:{row:2,col:2},3:{row:1,col:2}}];//创建变量,存放当前使用的模型var currentModel = {};//创建变量标记16宫格的位置var currentX = 0,currentY = 0;//入口方法function init(){createModel();onKeyDown();}//根据模型的数据创建对应的块元素function createModel(){//确定当前使用哪一个模型currentModel = MODELS[0];//生成对应数量的块元素for (var key in currentModel){var divEle = document.createElement("div");divEle.className = "actvity_model";document.querySelector("#container").appendChild(divEle);}//定位块元素的位置locationBlock();}//根据数据源定位块元素的位置function locationBlock(){//1.拿到所有的块元素var eles = document.querySelectorAll(".actvity_model");for (var i = 0;i<eles.length;i++){//单个块元素var actvityModelEle = eles[i];//2.找到每个块元素对应的数据var blockModel = currentModel[i];//3.根据每个块元素对应的数据来指定块元素的位置//每个块元素的位置由两个条件决定:1、16宫格所在的位置。 2、块元素在16宫格中的位置actvityModelEle.style.left = (currentX + blockModel.col) * STEP + "px";actvityModelEle.style.top = (currentY + blockModel.row) * STEP + "px";}}//监听用户键盘事件function onKeyDown(){document.onkeydown = function(evnet){switch(event.keyCode){case 38:console.log("上");move(0,-1);break;case 39:console.log("右");move(1,0);break;case 40:console.log("下");move(0,1);break;case 37:console.log("左");move(-1,0);break;}}}//控制块元素移动function move(x,y){//16宫格在动currentX += x;currentY += y;//根据16宫格来重新定位块元素locationBlock();}</script></body></html>
最后,我们来实现模型的旋转,这旋转的实现基于两条算法规则。

然后,我们把此算法运用到代码中,见rotate()函数
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style type="text/css">.container{width: 200px;height: 360px;background-color: antiquewhite;position: relative;}.actvity_model{width: 20px;height: 20px;background-color: cornflowerblue;border: .3px solid rgb(148, 170, 218);box-sizing: border-box;position: absolute;}</style></head><body onload="init();"><!-- 背景容器 --><div id="container" class="container"><!-- 块元素 --></div><script>//创建一个常量控制步长const STEP = 20;//定义常量分割容器const ROW_COUNT = 18,COL_COUNT = 10;//创建每个模型的数据源(L型)const MODELS = [{0:{row:2,col:0},1:{row:2,col:1},2:{row:2,col:2},3:{row:1,col:2}}];//创建变量,存放当前使用的模型var currentModel = {};//创建变量标记16宫格的位置var currentX = 0,currentY = 0;//入口方法function init(){createModel();onKeyDown();}//根据模型的数据创建对应的块元素function createModel(){//确定当前使用哪一个模型currentModel = MODELS[0];//生成对应数量的块元素for (var key in currentModel){var divEle = document.createElement("div");divEle.className = "actvity_model";document.querySelector("#container").appendChild(divEle);}//定位块元素的位置locationBlock();}//根据数据源定位块元素的位置function locationBlock(){//1.拿到所有的块元素var eles = document.querySelectorAll(".actvity_model");for (var i = 0;i<eles.length;i++){//单个块元素var actvityModelEle = eles[i];//2.找到每个块元素对应的数据var blockModel = currentModel[i];//3.根据每个块元素对应的数据来指定块元素的位置//每个块元素的位置由两个条件决定:1、16宫格所在的位置。 2、块元素在16宫格中的位置actvityModelEle.style.left = (currentX + blockModel.col) * STEP + "px";actvityModelEle.style.top = (currentY + blockModel.row) * STEP + "px";}}//监听用户键盘事件function onKeyDown(){document.onkeydown = function(evnet){switch(event.keyCode){case 38:console.log("上");rotate();break;case 39:console.log("右");move(1,0);break;case 40:console.log("下");move(0,1);break;case 37:console.log("左");move(-1,0);break;}}}//控制块元素移动function move(x,y){//16宫格在动currentX += x;currentY += y;//根据16宫格来重新定位块元素locationBlock();}//控制模型的旋转function rotate(){//算法//旋转后的行 == 旋转前的列//旋转后的列 == 3-旋转前的行//遍历我们当前的 模型数据源for (var key in currentModel){//块元素数据源var blockModel = currentModel[key];//实现算法var temp = blockModel.row;blockModel.row = blockModel.col;blockModel.col = 3-temp;locationBlock();}}</script></body></html>
