zoukankan      html  css  js  c++  java
  • js 俄罗斯方块源码,简单易懂

    1、自己引入jquery

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<style type="text/css">
    		*{
    			padding: 0;
    			margin: 0;
    		}
    		.box{
    			 400px;
    			height: 600px;
    			margin: 20px auto;
    			border: 5px solid yellowgreen;
    		}
    		.row{
    			height: 20px;
    			 100%;
    		}
    		.row div{
    			 18px;
    			height: 18px;
    			border: 1px solid transparent;
    			float: left;
    		}
    		
    		.row .active{
    			background: red;
    			border: 1px solid #ccc;
    		}
    		
    		.row .butte{
    			background: goldenrod;
    			border: 1px solid #FF0000;
    		}
    		
    		</style>
    	</head>
    	<body>
    		<div class="box">
    				
    		</div>
    	</body>
    	<script type="text/javascript" src="js/jquery.js"></script>
    	<script type="text/javascript">
    	 	var $box = $(".box");
    	 	var $row = null;
    	 	var $dataArr = [];
    	 	var timer = null;
    	 	var gameRun = true;
    	 	var config = [
    	 		[
    	 			{x:0, y:4},
    	 			{x:1, y:4},
    	 			{x:0, y:5},
    	 			{x:1, y:5}
    	 		],
    	 		[
    	 			{x:0, y:3},
    	 			{x:0, y:4},
    	 			{x:0, y:5},
    	 			{x:0, y:6}
    	 		],
    	 		[
    	 			{x:0, y:5},
    	 			{x:1, y:4},
    	 			{x:1, y:5},
    	 			{x:2, y:4}
    	 		],
    	 		[
    	 			{x:0, y:4},
    	 			{x:1, y:4},
    	 			{x:1, y:5},
    	 			{x:2, y:5}
    	 		],
    	 		[
    	 			{x:0, y:4},
    	 			{x:1, y:4},
    	 			{x:1, y:5},
    	 			{x:1, y:6}
    	 		],
    	 		[
    	 			{x:0, y:4},
    	 			{x:1, y:4},
    	 			{x:2, y:4},
    	 			{x:2, y:5}
    	 		],
    	 		[
    	 			{x:0, y:5},
    	 			{x:1, y:4},
    	 			{x:1, y:5},
    	 			{x:1, y:6}
    	 		]
    	 	];
    	 	var $bullet = [	 	
    	 		{x:0, y:3},
     			{x:0, y:4},
     			{x:0, y:5},
     			{x:0, y:6}
    	 	];
    	 	var $dowm = [
    	 	];
    	 	
    	 	for(var i = 0 ; i < 30; i++){
    	 		$box.append("<div class='row'></div>");
    	 		var temp = [];
    	 		for(var j = 0; j < 20; j++){
    	 			$box.find(".row").last().append("<div></div>");
    	 			temp.push(0);
    	 		}
    	 		$dataArr.push(temp);	
    	 	}
    		$row = $(".row");
    		
    		dataTemp();
    		function dataTemp(){
    			for(var i = 0; i < 30; i++){
    				for(var j = 0; j < 20; j++){
    					if($dataArr[i][j] == 1){
    						$dataArr[i][j] = 0;
    					}
    				}
    			}
    			for(var i = 0; i < $bullet.length;i++){
    				$dataArr[$bullet[i].x][$bullet[i].y] = 1;	 //正在下落的dom		
    			}
    			/*for(var i = 0;i< $dowm.length ;i++ ){
    				$dataArr[$dowm[i].x][$dowm[i].y] = 2;   //已经下来的dom
    			}*/
    			layout();
    		};
    		
    		function layout(){
    			for(var i = 0; i < 30; i++){
    				for(var j = 0; j < 20; j++){
    					if($dataArr[i][j] == 0){
    						$row.eq(i).find("div").eq(j)[0].className = "";
    					}else if($dataArr[i][j] == 1){
    						$row.eq(i).find("div").eq(j)[0].className = "active";
    					}else if($dataArr[i][j] == 2){						
    						$row.eq(i).find("div").eq(j)[0].className = "butte";
    					}		
    				}
    			}	
    		};
    		
    		
    		$(window).on("keydown", function(event) {
    				if(gameRun){
    					switch(event.key) {
    						case "w":
    							rotate();
    							break;
    						case "s":
    							moveToDown();
    							break;
    						case "a":
    							leftRight(-1);
    							break;
    						case "d":
    							leftRight(1);
    							break;
    						default:
    							break;
    					}
    				}
    					
    				
    			});
    		
    		function rotate(){
    			var tmpBlock = new Array(4); 
    			for(var i=0; i<4; i++){ 
    			tmpBlock[i] = {x:0, y:0}; 
    			} 
    			//先算四个点的中心点,则这四个点围绕中心旋转90度。 
    			var cx = Math.round(($bullet[0].x + $bullet[1].x + $bullet[2].x + $bullet[3].x)/4); 
    			var cy = Math.round(($bullet[0].y + $bullet[1].y + $bullet[2].y + $bullet[3].y)/4); 
    			//旋转的主要算法. 可以这样分解来理解。 
    			//先假设围绕源点旋转。然后再加上中心点的坐标。
    			for(var i=0; i<4; i++){ 
    				tmpBlock[i].x = cx+cy-$bullet[i].y; 
    				tmpBlock[i].y = cy-cx+$bullet[i].x; 
    			} 
    			
    			if(judegBorder(tmpBlock)){
    				for(var i=0; i<4; i++){ 
    					$bullet[i].x = tmpBlock[i].x; 
    					$bullet[i].y = tmpBlock[i].y; 
    				} 
    			}
    			
    			
    			
    			dataTemp();
    			
    		}
    		
    		function move(x){			
    				for(var i = 0; i < $bullet.length; i++ ){
    					$bullet[i].x = $bullet[i].x + x;
    				}
    				if(! judegBorder($bullet)){
    					clearInterval(timer);
    					createSqure();
    					return;
    				}
    			dataTemp();
    		}
    		
    		//判断是否越界,越界了,则返回false
    		function judegBorder(obj){
    			var flag = true;
    			for(var i = 0; i < obj.length ; i++){
    				
    				if(obj[i].x >= 30 || obj[i].x < 0 || obj[i].y >= 20 || obj[i].y < 0){
    					flag = false;
    					return false;
    				}
    				
    				if($dataArr[obj[i].x][obj[i].y] == 2){
    					flag = false;
    					return false;
    				}
    			}
    			return flag;
    		}
    		
    		timer=setInterval(function(){
    			move(1);
    		},1000);
    		
    		function createSqure(){
    			
    			var obj = [];
    			//记录停下的
    			for(var i = 0; i < 4; i++){
    				obj.push({x:$bullet[i].x-1,y:$bullet[i].y});
    				$dataArr[$bullet[i].x-1][$bullet[i].y] = 2;
    			}		
    			//消除可以消除的
    			trimp(obj);
    			layout();
    		var randNum =Math.floor(Math.random() * config.length);
    			//判断是否到顶,没有则添加
    			for(var i=0; i<4; i++){	
    				if($dataArr[config[randNum][i].x][config[randNum][i].y] == 2){
    					gameRun = false;
    					alert("Game Over!");
    					return;
    				}
    				$bullet[i] = {x:config[randNum][i].x, y:config[randNum][i].y}; 
    				
    			} 
    			dataTemp();
    			timer=setInterval(function(){
    				move(1);
    			},500);
    		}
    		
    		
    		
    		function leftRight(num){
    			var tmpBlock = new Array(4); 
    				for(var i=0; i<4; i++){ 
    					tmpBlock[i] = {x:$bullet[i].x, y:$bullet[i].y}; 
    				} 
    			for(var i = 0; i < tmpBlock.length; i++ ){
    					tmpBlock[i].y = tmpBlock[i].y + num;				
    				}
    			if(judegBorder(tmpBlock)){
    				for(var i = 0; i < tmpBlock.length; i++ ){				
    					$bullet[i].y = tmpBlock[i].y;										
    				}
    			}
    			dataTemp();
    		}
    		
    		
    		function moveToDown(){
    			var tmpBlock = new Array(4); 
    				for(var i=0; i<4; i++){ 
    					tmpBlock[i] = {x:$bullet[i].x, y:$bullet[i].y}; 
    				} 
    			for(var i = 0; i < tmpBlock.length; i++ ){
    					tmpBlock[i].x = tmpBlock[i].x + 1;				
    				}
    			if(judegBorder(tmpBlock)){
    				for(var i = 0; i < tmpBlock.length; i++ ){				
    					$bullet[i].x = tmpBlock[i].x;										
    				}
    			}
    			dataTemp();
    		}
    		
    		function trimp(obj){
    			for(var i = 0; i < obj.length;i++){
    				var flag = true;
    				
    				for(var j = 0; j < 20; j++){
    					if($dataArr[obj[i].x][j] != 2){	
    						flag = false;
    					}
    				}
    				if(flag){
    					//需要消除
    					for(var j = 0; j < 20; j++){
    						$dataArr[obj[i].x][j] = 0;
    					}
    					//下面的被消除,往下掉
    					for(var x = obj[i].x ; x >= 0 ; x--){
    						for(var y = 0; y < 20;y++){
    							if($dataArr[x][y] == 2){
    								$dataArr[x][y] = 0;
    								$dataArr[x+1][y] = 2;
    							}
    						}
    					}
    					i--;
    				}	
    			}	
    		}
    	</script>
    </html>
    

      

  • 相关阅读:
    关于容器和里面元素的间距的排版技巧
    Grafana 通过api create&update dashboard
    .net(c#)生成xml并输出(api的设计)
    Ajax学习总结
    网站内容更新之伪原创七绝招
    并发和多线程(十九)ConcurrentHashMap源码解析(jdk1.8) Diamond
    分布式事务(一)分布式事务理论基础 Diamond
    分布式事务(二)事务基础ACID隔离级别MVCC Diamond
    并发和多线程(十八)CountDownLatch、Semaphore和CyclicBarrier源码解析 Diamond
    分布式事务(三)XA、2PC、3PC Diamond
  • 原文地址:https://www.cnblogs.com/muamaker/p/6282978.html
Copyright © 2011-2022 走看看