js实现俄罗斯方块

xiaoxiao2021-02-28  136

下面是实现代码 ,代码中有注释,分享给大家,仅供学习

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <style type="text/css"> #gamemap { width: 360px; height: 600px; background: #F4F4F4; } .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; //随机产生的形状,从0-6,分别对应I,T,L,J,S,Z,O 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>
转载请注明原文地址: https://www.6miu.com/read-71901.html

最新回复(0)