【jquery】jquery写<俄罗斯方块>

本文介绍了一个使用HTML和JavaScript实现的简单俄罗斯方块游戏。通过键盘控制方块移动和旋转,实现了基本的游戏逻辑,包括方块下落、消除行等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲来无事,于是.....


键盘上下左右进行控制。

javascript:

var tab=null;
	var score=0;//得分
	var speds=1000;//下落速度
	$(function(){
		tab=$('table');
		
		//生成游戏界面
		for(var r=0;r<45;r++){//45行
			var row = $('<tr/>');
			tab.append(row);
			for(var c=0;c<30;c++){//30列
				row.append('<td/>');
			}
		}
		
		//生成图形
		var graph=generateGraph(13,0);
		applyColor(graph,randomColor());
			
		//不断产生图形,并下落
		var interID=setInterval(function(){
					graph=atuoGenerateGraph(graph);
					if(graph==null){
						clearInterval(interID);
						alert('game over!');
					}
			  },speds);

		//绑定左移,右移,旋转事件 
		$('body').keydown(function(e){
			if(e.keyCode==37){
				graph=aroundMove(graph,-1);
			}
			if(e.keyCode==39){
				graph=aroundMove(graph,1);
			}
			if(e.keyCode==38){
				var clr = getColor(graph);
				applyColor(graph,'');
				graph=spinGraph(graph,graph[0]);
				applyColor(graph,clr);
			}
			if(e.keyCode==40){
				graph=downGraph(graph,1);
			}
		});
		
		$('body').prepend('<div></div>');
		$('body div').css('font-size',18);
		$('body div').css('font-weight','bold');
		$('body div').append('得分:'+score);

		//获取焦点
		$('body').focus();
	});
	
	
	/**
	 * 不断自动产生图形
	 */
	function atuoGenerateGraph(graph){
		var res=downGraph(graph,1);
		if(res==null){
			//计算得分
			score+=eliminateLine();
			speds=speds/(parseInt(score/20)+1);//每得20分进行一次速度升级
			$('body div').empty();
			$('body div').append('得分:'+score);
			//重新生成新的图形
			var graph=generateGraph(13,0);
			applyColor(graph,randomColor());
			return graph
		}else{
			return res;
		}
	}

	/**
	 *  消除整行
	 */
	function eliminateLine(){
		var trs=tab.find('tr');
		var tempInx=[];
		for(var i=0;i<trs.length;i++){
			var tds=$(trs[i]).find('td');
			var flag=true;
			for(var j=0;j<tds.length;j++){
				if(!validateBgColor($(tds[j]))){
					flag=false;
					break;
				}
			}
			if(flag){
				tempInx.push(i);
			}
		}

		for(var i=0;i<tempInx.length;i++){
			var tr=$('table tr:eq('+tempInx[i]+')');
			tr.remove();
			var tds=tr.find('td');
			for(var j=0;j<tds.length;j++){
				$(tds[j]).css('background-color','');
			}
			tab.prepend(tr);
		}
		return tempInx.length;
	}


	/**
	 * 使图形左右移动
	 * p: -1 左移 1 右移
	 */
	function aroundMove(graph,p,color){
		var nGraph=[];
		var clr = getColor(graph);
		applyColor(graph,'');
		for(var i=0;i<graph.length;i++){
			var pos=getTDCoord(graph[i]);
			var x=pos.x+p;
			var tempEl=getCoord(x,pos.y);
			if(tempEl==null||validateBgColor(tempEl)){
				applyColor(graph,clr);
				return graph;
			}else{
				nGraph[i]=tempEl;
			}
		}
		applyColor(nGraph,clr);
		return nGraph;
	}
	
	/**
	 * 使图形下降
	 * graph:图形中元素的集合
	 * speed:下落速度
	 * color:已存在元素的背景色,用来标示已存在元素
	 */
	function downGraph(graph,speed,color){
		var nGraph=[];
		var clr = getColor(graph);
		applyColor(graph,'');
		if(graph==null){
			return null;
		}
		for(var i=0;i<graph.length;i++){
			var pos=getTDCoord(graph[i]);
			var y=pos.y+speed;
			var tempEl=getCoord(pos.x,y);
			//下落,除非接触到yi存在元素,或者界面的底部
			if(tempEl==null||validateBgColor(tempEl)){
				applyColor(graph,clr);
				return null;
			}else{
				nGraph[i]=tempEl;
			}
		}
		applyColor(nGraph,clr);
		return nGraph;
	}
	
	/**
	 * 根据背景颜色判断
	 */
	function validateBgColor(el){
		var bg=el.css('background-color'); 
		if(bg&&RGBtoHex(bg)!='FFFFFF'){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * rgb颜色转换为16进制颜色
	 * col:颜色字符串
	 */
	function RGBtoHex(col) {
		var R=-1;
		var G=-1;
		var B=-1;
		if(col.substring(0,3)=='rgb'){
			var str=col.substring(4,col.length-1);
			var color=str.split(',');
			R=color[0];
			G=color[1];
			B=color[2];
		}else if(col.substring(0,1)=='#'){
			return col.substring(1,col.length).toUpperCase();
		}else{
			return null;
		}
		function toHex(N){
			if (N==null) 
				return "00"; 

			N=parseInt(N); 
			if (N==0 || isNaN(N)) 
				return "00"; 
			N=Math.max(0,N); 
			N=Math.min(N,255); 
			N=Math.round(N); 
			return "0123456789ABCDEF".charAt((N-N%16)/16) + "0123456789ABCDEF".charAt(N%16); 
		}
		return toHex(R)+toHex(G)+toHex(B)
	}
	
	/**
	 * 生成图形
	 */
	var rindex=[];
	function generateGraph(x,y){
		var core=getCoord(x,y);
		if(core==null){
			alert(core);
			alert(tab);
		}
		if(validateBgColor(core)){
			return null;
		}
		var graphs=[];
		
		//图形1
		var graph1=[];
		graph1.push(core);
		graphs.push(graph1);
		//图形2
		var graph2=[];
		graph2.push(core);
		graph2.push(getCoord(x+1,y));
		graphs.push(graph2);
		//图形3
		var graph3=[];
		graph3.push(core);
		graph3.push(getCoord(x+1,y));
		graph3.push(getCoord(x+2,y));
		graph3.push(getCoord(x+3,y));
		graphs.push(graph3);
		//图形4
		var graph4=[];
		graph4.push(core);
		graph4.push(getCoord(x+1,y));
		graph4.push(getCoord(x,y+1));
		graph4.push(getCoord(x+1,y+1));
		graphs.push(graph4);
		//图形5
		var graph5=[];
		graph5.push(core);
		graph5.push(getCoord(x+1,y));
		graph5.push(getCoord(x-1,y));
		graph5.push(getCoord(x,y+1));
		graphs.push(graph5);
		//图形6
		var graph6=[];
		graph6.push(core);
		graph6.push(getCoord(x+1,y));
		graph6.push(getCoord(x,y+1));
		graph6.push(getCoord(x-1,y+1));
		graphs.push(graph6);
		graphs.push(graph6);
		graphs.push(graph6);//增加图形6的随机概率
		
		
		return graphs[randomIndex(graphs.length,rindex)];
	}
	
	/** 
	 * 随机数
	 */
	function randomIndex(len,arr){
		var flag = false;
		var index= 0;
		do{//保证每3次随机必定有一个不同于前两个的图形
			index=parseInt(Math.random()*len);
			if(arr.length<2||arr[0]!=index){
				arr.unshift(index,1);
				arr.length=2;
				flag = false;
			}else{
				if(arr[1]>=2){
					flag = true;
				}else{
					arr[1] = arr[1]+1;
					flag = false;
				}
			}
		}while(flag);
		return index;
	}
	
	/**
	 * 随机颜色
	 */
	var colors = ['aquamarine','black','blue','blueviolet','brown','cadetblue','chocolate','cornflowerblue','crimson','darkorange','deepskyblue'];
	var cindex = [];
	function randomColor(){
		return colors[randomIndex(colors.length,cindex)]
	}

	/**
	 * 获取元素颜色
	 */
	function getColor(arr){
		if(arr==null){
			return '';
		}
		return arr[0].css('background-color');
	}
	
	/**
	 * 上色
	 */
	 function applyColor(arr,color){
		if(arr==null){
			return null;
		}
		for(var i=0;i<arr.length;i++){
			arr[i].css('background-color',color);
		}
	 }
	

    /**
	 * 旋转图形
	 * graph:图形中元素的集合
	 * core: 旋转的中心点
	 */
	 function spinGraph(graph,core){
		var tempGraph=[];
		for(var i=0;i<graph.length;i++){
			if(spinSingle(graph[i],core)==null){
				return graph;
			}else{
				tempGraph.push(spinSingle(graph[i],core));
			}
		}
		return tempGraph;
	 }

	 /**
	  * 旋转单一的点
	  * t1围绕t2旋转
	  */
	function spinSingle(t1,t2){
		var dis=getDistance(t1,t2);
		var absDis=getTDCoord(t2);
		var x=-1;
		var y=-1;
		if(dis.x==0||dis.y==0){
			y=absDis.y-dis.x;
			x=absDis.x+dis.y;
		}else if(dis.x*dis.y>0){
			x=absDis.x+dis.x;
			y=absDis.y-dis.y;
		}else if(dis.x*dis.y<0){
			x=absDis.x-dis.x;
			y=absDis.y+dis.y;
		}
		if(x<0||y<0){
			return null;
		}
		return getCoord(x,y);
	}
	/**
	 * 获取t1到t2的距离
	 */
	function getDistance(t1,t2){
		var tc1=getTDCoord(t1);
		var tc2=getTDCoord(t2);
		var x=tc1.x-tc2.x;
		var y=tc1.y-tc2.y;
		return {x:x,y:y};
	}

	/**
	 *	获取指定td的坐标
	 */
	function getTDCoord(td){
		var ctd=td;
		var len=ctd.length;
		var x=-1;
		while(len>0){
			ctd=ctd.prev('td');
			x++;
			len=ctd.length;
		};
		var y=-1;
		var tr=td.parent('tr');
		len=tr.length;
		while(len>0){
			tr=tr.prev('tr');
			y++;
			len=tr.length;
		};
		return {x:x,y:y};
	}

	/**
	 * 获取指定坐标的td
	 */
	function getCoord(x,y){
		var trs=tab.find('tr');
		if(y>=trs.length||y<0){
			//y=trs.length-1;
			return null;
		}
		var tds=$(trs[y]).find('td');
		if(x>=tds.length||x<0){
			//x=tds.length-1;
			return null;
		}
		return $(tds[x]);
	}

html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> 俄罗斯方块 </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <style type="text/css">
	table{
		background-color:rgb(168,209,217);
	}
	td{
		width:5px;
		height:5px;
		background-color:#fff;
		border:0px
	}
  </style>
  <script type="text/javascript" src="jquery.min.js">
  </script>
  <script type="text/javascript">
  <!--
	
//-->
  </script>
 </head>

 <body>
  <table border="0px" cellpadding="2px" cellspacing="1px">
  </table>
 </body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值