废话不多说直接上源码复制过去就能用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>俄罗斯升级</title>
<style type="text/css">
#zong{
border: 0px solid red;
width: 550px;
height: 651px;
overflow: hidden;
margin-left: auto;
margin-right: auto;
}
#qt{
width: 300px;
height: 600px;
border: 3px solid darkgray;
float: left;
margin-left: 10px;
}
#borde{
width: 300px;
height: 600px;
overflow: hidden;
}
.tab1{
width: 300px;
height: 590px;
margin-top: -87px;
}
.tr1{
width: 200px;
height: 25px;
border: 1px;
}
.td1{
width: 18px;
height: 23px;
border: 1px solid darkgray;
background-color: #FFFFFF;
}
.tab2{
width: 200px;
height: 200px;
}
.tr2{
width: 200px;
height: 25px;
}
.td2{
width: 22px;
height: 22px;
border: 1px solid darkgray;
background-color: #FFFFFF;
}
.bor{
border-top: 0px solid red;
}
#xiaoditu{
width: 200px;
height: 222px;
border: 3px solid darkgray;
}
</style>
</head>
<body>
<div id="zong">
<div style="width: 200px; height: 600px;float: left;">
<div id="xiaoditu"></div>
<p id="tex" style="width: 200px; height:50px;line-height: 50px; font-size: 20px; text-align: center;"></p>
<p id="text1" style="width: 200px; height:50px; font-size: 15px; text-align: center;"></p>
<p style="width: 200px; height:100px; font-size: 15px; text-align: center;">空格快速落下<br />←向左移动<br />↑切换形状<br />→向右移动<br />↓暂停移动</p>
</div>
<div id="qt">
<div id="borde">
</div>
</div>
</div>
<script type="text/javascript">
var yundong =[
[
[[3,0],[4,0],[4,1],[5,1]],
[[4,1],[4,2],[5,0],[5,1]],
[[3,0],[4,0],[4,1],[5,1]],
[[4,1],[4,2],[5,0],[5,1]]
],
[
[[3,0],[4,0],[5,0],[4,1]],
[[4,0],[4,1],[4,2],[5,1]],
[[3,1],[4,0],[4,1],[5,1]],
[[4,1],[5,0],[5,1],[5,2]]
],
[
[[3,1],[4,0],[4,1],[5,0]],
[[4,0],[4,1],[5,1],[5,2]],
[[3,1],[4,0],[4,1],[5,0]],
[[4,0],[4,1],[5,1],[5,2]]
],
[
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]]
],
[
[[3,1],[4,1],[5,1],[5,0]],
[[4,0],[4,1],[4,2],[5,2]],
[[3,0],[3,1],[4,0],[5,0]],
[[4,0],[5,0],[5,1],[5,2]]
],
[
[[3,0],[4,0],[5,0],[5,1]],
[[4,2],[5,0],[5,1],[5,2]],
[[3,0],[3,1],[4,1],[5,1]],
[[4,0],[4,1],[4,2],[5,0]]
],
[
[[3,0],[4,0],[5,0],[6,0]],
[[4,0],[4,1],[4,2],[4,3]],
[[3,0],[4,0],[5,0],[6,0]],
[[4,0],[4,1],[4,2],[4,3]]
]
]
var xarr =[
[
[[3,0],[4,0],[4,1],[5,1]],
[[4,1],[4,2],[5,0],[5,1]],
[[3,0],[4,0],[4,1],[5,1]],
[[4,1],[4,2],[5,0],[5,1]]
],
[
[[3,0],[4,0],[5,0],[4,1]],
[[4,0],[4,1],[4,2],[5,1]],
[[3,1],[4,0],[4,1],[5,1]],
[[4,1],[5,0],[5,1],[5,2]]
],
[
[[3,1],[4,0],[4,1],[5,0]],
[[4,0],[4,1],[5,1],[5,2]],
[[3,1],[4,0],[4,1],[5,0]],
[[4,0],[4,1],[5,1],[5,2]]
],
[
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[4,1],[5,0],[5,1]]
],
[
[[3,1],[4,1],[5,1],[5,0]],
[[4,0],[4,1],[4,2],[5,2]],
[[3,0],[3,1],[4,0],[5,0]],
[[4,0],[5,0],[5,1],[5,2]]
],
[
[[3,0],[4,0],[5,0],[5,1]],
[[4,2],[5,0],[5,1],[5,2]],
[[3,0],[3,1],[4,1],[5,1]],
[[4,0],[4,1],[4,2],[5,0]]
],
[
[[3,0],[4,0],[5,0],[6,0]],
[[4,0],[4,1],[4,2],[4,3]],
[[3,0],[4,0],[5,0],[6,0]],
[[4,0],[4,1],[4,2],[4,3]]
]
]
//小图预告数组
var xiaoarr =[
[
[[3,3],[4,3],[4,4],[5,4]],
[[4,4],[4,5],[5,3],[5,4]],
[[3,3],[4,3],[4,4],[5,4]],
[[4,4],[4,5],[5,3],[5,4]]
],
[
[[3,3],[4,3],[5,3],[4,4]],
[[4,3],[4,4],[4,5],[5,4]],
[[3,4],[4,3],[4,4],[5,4]],
[[4,4],[5,3],[5,4],[5,5]]
],
[
[[3,4],[4,3],[4,4],[5,3]],
[[4,3],[4,4],[5,4],[5,5]],
[[3,4],[4,3],[4,4],[5,3]],
[[4,3],[4,4],[5,4],[5,5]]
],
[
[[4,3],[4,4],[5,3],[5,4]],
[[4,3],[4,4],[5,3],[5,4]],
[[4,3],[4,4],[5,3],[5,4]],
[[4,3],[4,4],[5,3],[5,4]]
],
[
[[3,4],[4,4],[5,4],[5,3]],
[[4,3],[4,4],[4,5],[5,5]],
[[3,3],[3,4],[4,3],[5,3]],
[[4,3],[5,3],[5,4],[5,5]]
],
//[[3,0],[3,1],[4,1],[5,1]],
[
[[3,3],[4,3],[5,3],[5,4]],
[[4,5],[5,3],[5,4],[5,5]],
[[3,3],[3,4],[4,4],[5,4]],
[[4,3],[4,4],[4,5],[5,3]]
],
[
[[3,3],[4,3],[5,3],[6,3]],
[[4,3],[4,4],[4,5],[4,6]],
[[3,3],[4,3],[5,3],[6,3]],
[[4,3],[4,4],[4,5],[4,6]]
]
]
var zong = document.getElementById("borde");
var fu = document.getElementById("xiaoditu");
var data = [
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]
]
//七种颜色
var sevenColor=["darkgreen ","limegreen","goldenrod","purple","darkblue","orangered","red"];
//旋转代数
var rotate = 0;
//当前方块是什么形状
var fkng=0;
createTabl(data[0].length,data.length,zong,"tab1","tr1","td1");
createTabl(8,8,fu,"tab2","tr2","td2");
// createTabl(8,8,fu);
function createTabl(wid,hei,fatherNode,attribute1,attribute2,attribute3){
var tabl = document.createElement("table");
tabl.setAttribute("class",attribute1);
fatherNode.appendChild(tabl);
for (var i = 0; i < hei; i++) {
var tr = document.createElement("tr");
tr.setAttribute("class",attribute2);
for (var x = 0; x < wid; x++) {
var td = document.createElement("td");
td.setAttribute("class",attribute3);
tr.appendChild(td);
}
tabl.appendChild(tr);
}
}
var tdNode=document.getElementsByClassName("td1");
var tdNodeTwo=document.getElementsByClassName("td2");
//提升性能局部渲染
function Rendering(arr,pd){
for (var i = 0; i < arr.length; i++) {
if (pd=="bai") {
tdNode[arr[i][1]*10+arr[i][0]].style.backgroundColor="#FFFFFF";
} else{
if (pd=="hui") {
tdNode[arr[i][1]*10+arr[i][0]].style.backgroundColor="black";
} else{
tdNode[arr[i][1]*10+arr[i][0]].style.backgroundColor=sevenColor[fkng];
}
}
}
}
function RenderingFu(arr,num){
for (var i = 0; i < arr.length; i++) {
tdNodeTwo[arr[i][1]*8+arr[i][0]].style.backgroundColor=sevenColor[num];
}
}
function RenderingFuTwo(arr){
for (var i = 0; i < arr.length; i++) {
tdNodeTwo[arr[i][1]*8+arr[i][0]].style.backgroundColor="#FFFFFF";
}
}
//data=1下落状态 data=2落下后的状态 data=0空白部分
//左右下移动
function lrdong(pd,arr){
var leftM=0;
pd=="l"? leftM=-1 : leftM=1;
for (var i = 0; i < arr.length; i++) {
for (var x = 0; x < arr[i].length; x++) {
pd=="t"? arr[i][x][1]+=1 : arr[i][x][0]+=leftM;
}
}
}
//方块旋转是否能转换
function blockRotate(arr){
var nei = rotate+1;
if (nei>3) {
nei=0;
}
//普通边框边界
for (var i = 0; i < arr[nei].length; i++) {
if (arr[nei][i][0]>data[0].length-1||arr[nei][i][0]<0||arr[nei][i][1]>data.length-1) {
return false;
}
}
for (var i = 0; i < arr[nei].length; i++) {
if (data[arr[nei][i][1]][arr[nei][i][0]]==2){
return false;
}
}
return true;
}
//游戏结束
function GameOver(){
var t=false;
for (var x = 0; x < data[3].length; x++) {
if(data[3][x]==2){
t=true;
break;
}
}
return t;
}
//是否得结束游戏
var gameTF;
//得分总数
var TotalScore=0;
var texNode = document.getElementById("tex");
texNode.innerHTML="总得<span style='color:red; font-size:25px;'>"+TotalScore+"</span>分";
//方块落下满行删除
function Fall(){
//是否得结束游戏
gameTF=true;
for (var i = 0; i < data.length; i++) {
for (var x = 0; x < data[i].length; x++) {
if(data[i][x]==0){
break;
}
if(x==data[i].length-1){
TotalScore+=10;
//一行一行消除
for (var y = 0; y <data[i].length ; y++) {
data[i][y]=0;
tdNode[i*10+y].style.backgroundColor="#FFFFFF";
}
for (var z= i-1; z >0; z--) {
for (var r = 0; r <data[i].length ; r++) {
if (data[z][r]>1) {
data[z][r]=0;
data[z+1][r]=2;
tdNode[(z+1)*10+r].style.backgroundColor=tdNode[z*10+r].style.backgroundColor;
tdNode[z*10+r].style.backgroundColor="#FFFFFF";
}
}
}
gameTF=false;
}
}
}
texNode.innerHTML="总得<span style='color:red; font-size:25px;'>"+TotalScore+"</span>分";
}
//左右是否能移动
function LRmoveCollision(arr,pd){
//普通边框边界
for (var i = 0; i < arr.length; i++) {
if (arr[i][0]+1>data[0].length-1&&pd=="r"||arr[i][0]-1<0&&pd=="l") {
return false;
}
}
//撞上别的固定方块
for (var i = 0; i < arr.length; i++) {
if (pd=="l") {
if (data[arr[i][1]][arr[i][0]-1]==2){
return false;
}
} else{
if (data[arr[i][1]][arr[i][0]+1]==2){
return false;
}
}
}
return true;
}
//初始化数据
function initializationData(){
for (var i = 0; i < yundong[fkng].length; i++) {
for (var x = 0; x < yundong[fkng][i].length; x++) {
yundong[fkng][i][x][0]=xarr[fkng][i][x][0];
yundong[fkng][i][x][1]=xarr[fkng][i][x][1];
}
}
}
//碰撞检测
function collision(arr){
//普通边框边界
for (var i = 0; i < arr.length; i++) {
if (arr[i][1]+1>data.length-1) {
stateChange(arr,2);
return false;
}
}
//撞上别的固定方块
for (var i = 0; i < arr.length; i++) {
if (data[arr[i][1]+1][arr[i][0]]==2){
stateChange(arr,2);
return false;
}
}
return true;
}
//状态改变1或2
function stateChange(arr,pd){
for (var i = 0; i < arr.length; i++) {
pd==1 ? data[arr[i][1]][arr[i][0]]=1 : pd==0 ? data[arr[i][1]][arr[i][0]]=0 : data[arr[i][1]][arr[i][0]]=2;
}
}
//不同等级
var state = 0;
//定时器不同速度
var speeds =[300,200,120,90];
//定时器
var timer =null;
//开关
var suspendSwitch=true;
//键盘事件
//在document对象中注册keydown时间处理函数
document.onkeydown = keyDown;
//游戏结束禁止操纵键盘事件
var jinzhi=true;
function keyDown(event){
//标准化事件对象
var event = event || window.event;
if (jinzhi) {
switch(event.keyCode){
case 37://摁下左箭头键
if(LRmoveCollision(yundong[fkng][rotate],"l")){
stateChange(yundong[fkng][rotate],0);
Rendering(yundong[fkng][rotate],"bai")
lrdong("l",yundong[fkng]);
stateChange(yundong[fkng][rotate],1);
Rendering(yundong[fkng][rotate],"b")
}
break;
case 39://摁下右箭头键
if(LRmoveCollision(yundong[fkng][rotate],"r")){
stateChange(yundong[fkng][rotate],0);
Rendering(yundong[fkng][rotate],"bai")
lrdong("r",yundong[fkng]);
stateChange(yundong[fkng][rotate],1);
Rendering(yundong[fkng][rotate],"b")
}
break;
case 38://摁下上箭头键
if(blockRotate(yundong[fkng])){
stateChange(yundong[fkng][rotate],0);
Rendering(yundong[fkng][rotate],"bai")
if(rotate==3){
rotate=0;
}else{
rotate+=1;
}
stateChange(yundong[fkng][rotate],1);
Rendering(yundong[fkng][rotate],"b")
}
break;
case 32://摁下空格键
Rendering(yundong[fkng][rotate],"bai")
while(collision(yundong[fkng][rotate])){
stateChange(yundong[fkng][rotate],0);
lrdong("t",yundong[fkng]);
stateChange(yundong[fkng][rotate],1);
}
Rendering(yundong[fkng][rotate],"b")
break;
case 40://摁下下箭头键
if(suspendSwitch){
clearInterval(timer);
}else{
timer=setInterval(IntervalLuo,speeds[state]);
}
suspendSwitch=!suspendSwitch;
break;
}
}
}
//让用户看到当前速度级别
var textTwo = document.getElementById("text1");
var tf = true;
var forZongFu =0;
var zongFuSwitch=[[0,0],[0,0]];
zongFuSwitch[0][0]=Math.floor(Math.random()*7);
zongFuSwitch[0][1]=Math.floor(Math.random()*4);
zongFuSwitch[1][0]=Math.floor(Math.random()*7);
zongFuSwitch[1][1]=Math.floor(Math.random()*4);
//游戏开始
gameStart();
function gameStart(){
textTwo.innerHTML="当前等级:<span style='color:red; font-size:20px;'>0</span><br/>(级别越大方块下落速度越快)";
//渲染小地图
RenderingFu(xiaoarr[zongFuSwitch[1][0]][zongFuSwitch[1][1]],zongFuSwitch[1][0]);
//随机数
fkng=zongFuSwitch[0][0];
rotate=zongFuSwitch[0][1];
//定时器
timer = setInterval(IntervalLuo,300);
}
function IntervalLuo(){
if(collision(yundong[fkng][rotate])){
stateChange(yundong[fkng][rotate],0);
Rendering(yundong[fkng][rotate],"bai");
lrdong("t",yundong[fkng]);
stateChange(yundong[fkng][rotate],1);
Rendering(yundong[fkng][rotate],"qita");
}else{
Rendering(yundong[fkng][rotate],"hui");
//初始化数据
initializationData()
//随机数
forZongFu+=1;
if (forZongFu>1) {
forZongFu=0;
}
if (forZongFu==1) {
RenderingFuTwo(xiaoarr[zongFuSwitch[1][0]][zongFuSwitch[1][1]])
zongFuSwitch[0][0]=Math.floor(Math.random()*7);
zongFuSwitch[0][1]=Math.floor(Math.random()*4);
fkng=zongFuSwitch[forZongFu][0];
rotate=zongFuSwitch[forZongFu][1];
//渲染小地图
RenderingFu(xiaoarr[zongFuSwitch[0][0]][zongFuSwitch[0][1]],zongFuSwitch[0][0]);
} else{
RenderingFuTwo(xiaoarr[zongFuSwitch[0][0]][zongFuSwitch[0][1]])
zongFuSwitch[1][0]=Math.floor(Math.random()*7);
zongFuSwitch[1][1]=Math.floor(Math.random()*4);
fkng=zongFuSwitch[forZongFu][0];
rotate=zongFuSwitch[forZongFu][1];
//渲染小地图
RenderingFu(xiaoarr[zongFuSwitch[1][0]][zongFuSwitch[1][1]],zongFuSwitch[1][0]);
}
//查看有无满行
Fall();
//是否结束游戏
if (gameTF){
if(GameOver()){
clearInterval(timer);
alert("游戏结束");
tf=false;
jinzhi=false;
}
}
if(tf){
if (TotalScore>=660&&state<3) {
state=3;
clearInterval(timer)
timer = setInterval(IntervalLuo,speeds[state]);
textTwo.innerHTML="当前等级:<span style='color:red; font-size:20px;'>"+state+"</span><br/>(级别越大方块下落速度越快)";
}else if(TotalScore>=350&&state<2){
state=2;
clearInterval(timer)
timer = setInterval(IntervalLuo,speeds[state]);
textTwo.innerHTML="当前等级:<span style='color:red; font-size:20px;'>"+state+"</span><br/>(级别越大方块下落速度越快)";
}else if(TotalScore>=100&&state<1){
state=1;
clearInterval(timer)
timer = setInterval(IntervalLuo,speeds[state]);
textTwo.innerHTML="当前等级:<span style='color:red; font-size:20px;'>"+state+"</span><br/>(级别越大方块下落速度越快)";
}
}
}
}
</script>
</body>
</html>