`
sfwxp945
  • 浏览: 11149 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

html5的俄罗斯方块

阅读更多
虽然也是用JS写的。但是毕竟用的是HTML5的绘图API
感觉不够利索..
也可能是本人对HTML5的2d绘图接口还不name了解。
这次不上传附件了,直接贴代码吧
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Tetris</title>
<script type="text/javascript">
<!--
//全局变量
var row = 18;			//行
var col = 10;			//列
var size = 20;			//每格宽度
var isOver = false;		//结束标志
var shapes = ["0,1,1,1,2,1,3,1","1,0,1,1,1,2,1,3",
			"1,0,1,1,1,2,2,2","0,2,1,2,2,2,2,1","2,3,2,2,2,1,1,1","3,1,2,1,1,1,1,2",
			"2,0,2,1,2,2,1,2","0,1,1,1,2,1,2,2","1,3,1,2,1,1,2,1","3,2,2,2,1,2,1,1",
			"0,1,1,1,1,2,2,2","1,3,1,2,2,2,2,1",
			"3,1,2,1,2,2,1,2","1,0,1,1,2,1,2,2",
			"1,1,2,1,2,2,1,2",
			"1,1,0,2,1,2,2,2","1,2,2,3,2,2,2,1","2,2,3,1,2,1,1,1","2,1,1,0,1,1,1,2"];		//共19个图像,包括各个图像的各个方向
var colors = ['#af0000','#007900','#578eff','#707070'];	//存储颜色值
var graph;				//图形化对象
var canvas;				//canvas容器对象
var context;			//context绘图对象
var actiion;			//动作事件对象
var tetris;				//方块对象
var clock;				//定时器对象


//图形化类
function Graph()
{
	//填充色彩
	this.rect = function(x,y,width,height,context,color){
		context.fillStyle = color;
		context.fillRect(x,y,width,height);
	}
	//绘制边框   由于不是绝对的像素化,此方法未被使用,但是放在这里备用
	this.stroke = function(x,y,width,height,context,color){
		context.strokeStyle = color;
		context.lineWidth = 1;
		context.strokeRect(x,y,width,height);
	}
	//创建方块
	/*
	this.createBlock = function(){
		if(canvas == null) return;
		var block = canvas.getContext('2d');
		return block;
	}
	*/
	//创建游戏画布
	this.createPanel = function(){
		var ele = document.createElement('canvas');
		ele.id = 'canvas';
		ele.width = 500;
		ele.height = 500;
		document.body.appendChild(ele);
		return ele;
	}
	//绘制游戏区域
	this.gameArea = function(){
		if(canvas == null) return;
		this.rect(0,0,500,500,context,'#eeeeee');
		this.rect(5,5,213,373,context,'#333333');
		this.rect(6,6,211,371,context,'#eeeeee');
		this.rect(10,10,203,363,context,'#333333');
		this.rect(11,11,201,361,context,'#cccccc');
	}
}
//方块类 主要操作方块的各种运动
function Tetris(left,top,shape,color)
{
	this.action = null;			//调用游戏事件对象
	//生成四个方块context对象
	this.blocks = [1,1,1,1];
	this.fresh = function(){
		//随机指定颜色
		var rNum = Math.floor(Math.random() * 10 % 3);
		this.color = color?color:colors[rNum];
		//初始位移值  这步很重要
		this.left = (typeof(left)!='undefined')?left:3;
		this.top = (typeof(top)!='undefined')?top:0;
		//随机出现图形
		this.shape = shape?shape:shapes[Math.floor(Math.random()*19 - 0.000000001)].split(',');
		//判断出现的时候是否会达成游戏结束条件,若达不到结束条件,显示方块
		if(this.action && !this.action.check(left,top,this.shape))
		{
			isOver = true;
			window.clearTimeout(clock);
			alert('Game Over!')
		}
		else
		{
			this.show();
		}
	}
	this.show = function(){
		if(canvas == null) return;
		for(var i in this.blocks)
		{
			//计算方块坐标
			var bleft = (this.shape[i*2]- -this.left)*size +12;
			var btop = (this.shape[i*2+1]- -this.top)*size +12;
			//重新绘制方块
			graph.rect(bleft,btop,size-1,size-1,context,this.color);
		}
	}
	//水平运动
	this.hMove = function(num){
		if(this.action.check(this.left- -num,this.top,this.shape))
		{
			this.clear();
			this.left = this.left- -num;
			this.show();
		}
	}
	//垂直运动
	this.vMove = function(num){
		if(this.action.check(this.left,this.top- -num,this.shape))
		{
			this.clear();
			this.top = this.top- -num;
			this.show();
		}
		else
		{
			this.action.fixShape(this.left,this.top,this.shape);
			this.action.findFull();
			this.fresh();
		}
	}
	//旋转方块
	this.rotate = function(){
		var newshape = [this.shape[1],3-this.shape[0],this.shape[3],3-this.shape[2],this.shape[5],3-this.shape[4],this.shape[7],3-this.shape[6]];
		if(this.action.check(this.left,this.top,newshape))
		{
			this.clear();
			this.shape = newshape;
			this.show();
		}
	}
	//清除上一次画面
	this.clear = function(){
		if(canvas == null) return;
		for(var i in this.blocks)
		{
			//计算方块坐标
			var bleft = (this.shape[i*2]- -this.left)*size +12;
			var btop = (this.shape[i*2+1]- -this.top)*size +12;
			//重新绘制方块
			graph.rect(bleft,btop,size-1,size-1,context,'#cccccc');
		}
	}
	//刷新画面
	this.fresh();
}
//游戏事件类
function Action()
{
	//碰撞检测 边界检测
	this.check = function(left,top,shape){
		var leftMost = col;			//记录最左边的方块坐标
		var rightMost = 0;			//记录最右边的方块坐标
		var bottomMost = 0;			//记录最下面的方块坐标
		var flag = false;			//到达边界标志,为true则已经到了边界
		for(var i=0;i<shape.length;i= i+2)
		{
			//记录最左边的方块坐标
			if(shape[i] < leftMost)
			{
				leftMost = shape[i];
			}
			//记录最右边的方块坐标
			if(shape[i] > rightMost)
			{
				rightMost = shape[i];
			}
			//记录最下面的方块坐标
			if(shape[i+1] > bottomMost)
			{
				bottomMost = shape[i+1]
			}
			//检测是否到达边界
			if(this[(shape[i+1]- -top)*100- -(shape[i]- -left)])
			{
				flag = true;
			}
		}
		//判断是否已经到达极限高度 (即:方块是否已经快堆到顶了)
		for(var m=0;m<3;m++)
		{
			for(var n=0; n<col;n++)
			{
				if(this[m*100+n])
				{
					flag = true;
				}
			}
		}
		//进行综合判断
		if((leftMost- -left)<0 || (rightMost- -left+1)>col || (bottomMost- -top+1)>row || flag)
		{
			return false;
		}
		return true;
	}
	//填充 并存入this数组
	this.fixShape = function(left,top,shape){
		var gray = new Tetris(left,top,shape,colors[3]);
		for(var i=0;i<8;i+=2)
		{
			this[(shape[i+1]- -top)*100- -(shape[i]- -left)] = gray.blocks[i/2];
		}
	}
	//找到整行,并移除
	this.findFull = function(){
		for(var m=0;m<row;m++)
		{
			var count = 0;
			for(var n=0;n<col;n++)
			{
				if(this[m*100 +n])
				{
					count++;
				}
			}
			if(count == col)
			{
				this.removeLine(m);
			}
		}
	}
	//消除整行
	this.removeLine = function(m){
		if(canvas == null) return;
		graph.rect(12,12+m*20,size*col,size-1,context,'#cccccc');
		for(var i=m;i>=0;i--)
		{
			for(var j=0; j<col;j++)
			{
				this[i*100+j] = this[(i-1)*100+j];
				if(this[i*100+j])
				{
					graph.rect(12+j*20,12+i*20,size-1,size-1,context,colors[3]);
				}
				else
				{
					graph.rect(12+j*20,12+i*20,size-1,size-1,context,'#cccccc');
				}
			}
		}
	}
}
//初始化数据,并开始游戏
function ini()
{
	//新建图形化对象
	graph = new Graph();
	//获得总画布对象
	canvas = graph.createPanel();
	context = canvas.getContext('2d');
	//在画布上绘制游戏区域
	graph.gameArea();
	//新建方块对象
	tetris = new Tetris();
	action = new Action();
	tetris.action = action;
	document.onkeydown = function(e){
		if(isOver) return;
		var e = window.event?window.event:e;
		switch(e.keyCode)
		{
			case 38:
				tetris.rotate();
				break;
			case 40: //down
				tetris.vMove(1);
				break;
			case 37: //left
				tetris.hMove(-1);
				break;
			case 39: //right
				tetris.hMove(1);
				break;
		}
	}
	clock = setInterval("if(!isOver) tetris.vMove(1)",500);
}
-->
</script>
</head>

<body onLoad="ini()">
</body>
</html>
分享到:
评论

相关推荐

    html5俄罗斯方块

    《HTML5实现的俄罗斯方块》 HTML5作为现代网页开发的重要标准,为开发者提供了丰富的功能,其中之一就是能够创建互动性的游戏。"HTML5俄罗斯方块"是一个利用HTML5技术实现的经典游戏,它展示了HTML5的Canvas元素、...

    HTML5 俄罗斯方块

    在这个"HTML5 俄罗斯方块"项目中,我们看到了HTML5如何与游戏开发相结合,创造出互动性强、性能优越的在线游戏体验。 首先,HTML5的`&lt;canvas&gt;`元素是构建游戏画面的核心。`&lt;canvas&gt;`提供了一个可编程的画布,允许...

    html5 俄罗斯方块

    HTML5俄罗斯方块是一款利用HTML5技术开发的经典益智游戏,它继承了原版俄罗斯方块的核心玩法,玩家需要在不断下落的图形方块中进行排列,填满一行即可消除得分。这款游戏不仅展示了HTML5在游戏开发领域的潜力,也为...

    html5俄罗斯方块游戏代码.zip

    HTML5俄罗斯方块游戏代码是利用现代Web技术,特别是HTML5和JavaScript,构建的一款3D版本的经典游戏。这个游戏源码的实现涉及到了多个关键的技术点,包括HTML5 Canvas的使用、CSS3动画、JavaScript编程以及可能涉及...

    HTML 5 俄罗斯方块

    "HTML 5 俄罗斯方块"是一个使用这些新特性构建的经典游戏示例,它展示了HTML5在游戏开发领域的潜力。 首先,我们要了解HTML5中的核心元素,如`&lt;canvas&gt;`。在这个俄罗斯方块游戏中,`&lt;canvas&gt;`标签扮演了关键角色,...

    html5俄罗斯方块源代码

    在这个“html5俄罗斯方块源代码”项目中,开发者使用HTML5的Canvas元素、JavaScript编程语言以及可能的CSS3来实现了一款经典的电子游戏——俄罗斯方块。俄罗斯方块是一款广受欢迎的益智游戏,玩家需要操控下落的各种...

    html5俄罗斯方块游戏代码

    HTML5俄罗斯方块游戏是利用HTML5的Canvas API和JavaScript编程语言实现的一款经典电子游戏。Canvas是HTML5中用于绘制2D图形的元素,通过JavaScript控制,可以创建动态且交互性强的游戏界面。以下是对HTML5俄罗斯方块...

    html5俄罗斯方块网页版

    HTML5俄罗斯方块网页版是一款基于HTML5技术开发的在线小游戏,它允许用户直接在网页上体验经典的俄罗斯方块玩法。HTML5是超文本标记语言的第五次重大修订,为网页开发带来了诸多新功能和改进,使其能创建更加互动、...

    基于html5的俄罗斯方块

    【基于HTML5的俄罗斯方块】是一款利用现代Web技术实现的经典游戏,主要涉及HTML5、CSS3和JavaScript等核心技术。这个实例为初学者提供了一个很好的学习平台,通过它,你可以深入理解如何用Web技术构建交互式的网页...

    html5俄罗斯方块!

    HTML5俄罗斯方块是一款利用HTML5技术和JavaScript编程语言实现的经典游戏。HTML5是现代网页开发的标准,它提供了许多增强用户体验的新特性,如离线存储、拖放功能、媒体元素、Canvas画布以及SVG矢量图等。在这个项目...

    HTML5俄罗斯方块2012517

    HTML5俄罗斯方块2012517是一款利用HTML5和JavaScript技术构建的在线游戏,它再现了经典的俄罗斯方块玩法。HTML5是现代网页开发的重要标准,它提供了更丰富的离线存储、多媒体支持以及更好的图形处理能力,使得开发者...

    HTML5经典俄罗斯方块小游戏代码.zip

    HTML5经典俄罗斯方块小游戏是基于现代Web技术构建的一款轻量级在线游戏,它利用了HTML5的强大功能,包括Canvas绘图、JavaScript编程以及CSS3样式,为用户提供了一种在浏览器上直接玩俄罗斯方块的体验。这款小游戏...

    html5 俄罗斯方块 ----kinetic 应用开发介绍 1

    **HTML5俄罗斯方块——基于KineticJS的应用开发** HTML5是现代网页开发的重要标准,它引入了许多新的特性和API,使得开发者可以构建更丰富、更动态的网页应用。在这个项目中,我们将深入探讨如何使用HTML5和...

Global site tag (gtag.js) - Google Analytics