先实现完成阶段二的前两个需求,生成一个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>