下面是实现代码 ,代码中有注释,分享给大家,仅供学习
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
width: 360px;
height: 600px;
background:
}
.kuai {
width: 28px;
height: 28px;
margin: 1px;
float: left;
}
</style>
<script type="text/javascript">
<--!
gamemap二维数组,绘制地图, 0 代表 空白 ,1 代表墙 ,如果是 2 代表正在下落的 方块, 3 代表已经下沉的方块
-->
var gamemap = new Array();
gamemap[0] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[1] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[2] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[3] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[4] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[5] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[6] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[7] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[8] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[9] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[10] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[11] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[12] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[13] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[14] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[15] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[16] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[17] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[18] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
gamemap[19] = new Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
var level = 0;
var r = 0;
var c = 5;
var mshape;
var shape;
var dirkey;
var quick = 1;
var timer;
<--!
每个数字代表一种图形,获得图形
-->
function getshape(shapeid, r, c) {
var shapes = new Array();
switch (shapeid) {
case 0:
shapes[0] = new Array(r, c - 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r, c + 1);
shapes[3] = new Array(r, c + 2);
break;
case 1:
shapes[0] = new Array(r, c - 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r, c + 1);
shapes[3] = new Array(r + 1, c);
break;
case 2:
shapes[0] = new Array(r, c - 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r, c + 1);
shapes[3] = new Array(r + 1, c - 1);
break;
case 3:
shapes[0] = new Array(r, c - 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r, c + 1);
shapes[3] = new Array(r + 1, c + 1);
break;
case 4:
shapes[0] = new Array(r, c + 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r + 1, c - 1);
shapes[3] = new Array(r + 1, c);
break;
case 5:
shapes[0] = new Array(r, c - 1);
shapes[1] = new Array(r, c);
shapes[2] = new Array(r + 1, c);
shapes[3] = new Array(r + 1, c + 1);
break;
case 6:
shapes[0] = new Array(r, c);
shapes[1] = new Array(r, c + 1);
shapes[2] = new Array(r + 1, c);
shapes[3] = new Array(r + 1, c + 1);
break;
default:
break;
}
return shapes;
}
<--!
初始化地图
-->
function initmap() {
var divmap = document.getElementById("gamemap");
for (var r = 0; r < gamemap.length; r++) {
for (var c = 0; c < gamemap[r].length; c++) {
var divchild = document.createElement("div");
divchild.id = "r" + r + "c" + c;
divchild.className = "kuai";
divmap.appendChild(divchild);
}
}
shapemaker();
paint();
setInterval("fall()", 700);
}
<--!
渲染颜色
0 代表 空白
1 代表边框 ,黑色
2 代表 正在下落得方块
3 代表 已经下沉到底部的方块 ,
-->
function paint() {
for (var r = 0; r < gamemap.length; r++) {
for (var c = 0; c < gamemap[r].length; c++) {
switch (gamemap[r][c]) {
case 0:
document.getElementById("r" + r + "c" + c).style.background = "white";
break;
case 1:
document.getElementById("r" + r + "c" + c).style.background = "black";
break;
case 2:
document.getElementById("r" + r + "c" + c).style.background = "gold";
break;
case 3:
document.getElementById("r" + r + "c" + c).style.background = "orangered";
break;
default:
break;
}
}
}
}
function shapemaker() {
shape = parseInt(Math.random() * 7);
<--!
生成随机数,0-6,每个数字代表一种图形
-->
mshape = getshape(shape, r, c);
if (isover()) {
alert("恭喜你获得" + level * 100 + "分");
location.reload();
}
for (var i = 0; i < mshape.length; i++) {
gamemap[mshape[i][0]][mshape[i][1]] = 2;
}
}
<--!
下落 代码
-->
function fall() {
var aftershape = new Array();
for (var i = 0; i < mshape.length; i++) {
aftershape[i] = new Array(mshape[i][0] + 1, mshape[i][1]);
}
if (iscollision(aftershape)) {
for (var i = 0; i < mshape.length; i++) {
gamemap[mshape[i][0]][mshape[i][1]] = 3;
}
paint();
var row = isfull();
while (row != -1) {
for (var i = row; i > 0; i--) {
gamemap[i] = gamemap[i - 1];
}
<--! 消除方块
-->
gamemap[0] = new Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
level++;
row = isfull();
}
r = 0;
c = 5;
quick = 1;
shapemaker();
} else {
r++;
drawshape(mshape, aftershape);
}
paint();
}
function isover() {
for (var i = 0; i < mshape.length; i++) {
if (gamemap[mshape[i][0]][mshape[i][1]] == 3) {
return true;
} else {
return false;
}
}
}
<--! 判断行是否满了,返回行号 -->
function isfull() {
for (var i = gamemap.length - 2; i >= 0; i--) {
var samenum = 0;
for (var j = 1; j < gamemap[i].length - 1; j++) {
if (gamemap[i][j] != 3) {
break;
} else {
samenum++;
if (samenum == gamemap[i].length - 2) {
return i;
}
}
}
samenum = 0;
}
return -1;
}
<--! 判断是否发生碰撞 -->
function iscollision(shapes) {
var collision = false;
for (var i = 0; i < shapes.length; i++) {
var value = gamemap[shapes[i][0]][shapes[i][1]];
if (!(value == 0 || value == 2)) {
collision = true;
}
}
return collision;
}
<--! 旋转图形 -->
function rotate(shapeid, shape) {
var shapes = new Array();
if (shapeid >= 0 && shapeid < 6) {
for (var i = 0; i < shape.length; i++) {
var square = shape[i];
x = square[0] - r;
y = square[1] - c;
shapes[i] = new Array((square[0] + y - x), (square[1] - x - y));
}
} else if (shapeid == 6) {
shapes = shape;
}
return shapes;
}
<--!
按方向键控制图形变换 ↑ 键 是旋转
-->
function presslimit(event) {
var aftershape = new Array();
if (event.keyCode >= 37 && event.keyCode <= 40) {
dirkey = event.keyCode - 37;
switch (dirkey) {
case 0:
for (var i = 0; i < mshape.length; i++) {
aftershape[i] = new Array(mshape[i][0], mshape[i][1] - 1);
}
break;
case 1:
aftershape = rotate(shape, mshape);
break;
case 2:
for (var i = 0; i < mshape.length; i++) {
aftershape[i] = new Array(mshape[i][0], mshape[i][1] + 1);
}
break;
case 3:
for (var i = 0; i < mshape.length; i++) {
aftershape[i] = new Array(mshape[i][0] + 1, mshape[i][1]);
}
break;
default:
break;
}
if (!iscollision(aftershape)) {
drawshape(mshape, aftershape);
switch (dirkey) {
case 0:
c--;
break;
case 2:
c++;
break;
case 3:
r++;
break;
default:
break;
}
}
paint();
} else if (event.keyCode == 13) {
quick = 0;
}
}
<--! 绘制图形 -->
function drawshape(befor, after) {
for (var i = 0; i < befor.length; i++) {
gamemap[befor[i][0]][befor[i][1]] = 0;
}
for (var i = 0; i < after.length; i++) {
gamemap[after[i][0]][after[i][1]] = 2;
}
mshape = after;
}
onkeydown = presslimit;
onload = initmap;
</script>
<body>
<div id="gamemap"></div>
</body>
</html>