俄罗斯方块(原生js 面向过程)

废话不多说直接上源码复制过去就能用

<!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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值