自学JS第一站-----一个只能在firefox下运行的俄罗斯方库

window.onload = function(){
	if(!document.getElementById) return false;
	if(!document.getElementById("canvas")) return false;
	var canvas = document.getElementById("canvas");
	var context = canvas.getContext("2d");

	// width:列数 对应横坐标
	// height:  行数 对应纵坐标
	var width = 10;
	var height = 10;

	canvas.width = width * 50;
	canvas.height = height * 50;
		
	// 当前图形的位置
	var xpos = 3;
	var ypos = 0;
	
	// 随机生成的图形
	var cube;
	
	// 随机生成的图像
	order = Math.floor(Math.random() * 20);
	//order = 9;
	
	// 用于取消TimeInterval的变量
	var timeInterval;
	
	document.onkeydown = function(event){
		// true 表示可以左移
		var checkLeft = function(x_offset, y_offset){
			var flag = false;
			for(var j = 0; j < 4; j++){
				for(var i = 0; i < 4; i++){
					flag = checkMainPos(i + x_offset, j + y_offset);
					if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
						// 已经到边上了
						if(i + xpos === 0){
							return false;
						}
						flag = checkMainPos(i + x_offset + 1, j + y_offset);
						if(flag){
							if(main[i + x_offset - 1][j + y_offset] === 1){
								return false;
							}
						}
						break;
					}
				}
			}
			return true;
		};
		
		// x_offset表示横向坐标
		var checkRight = function(x_offset, y_offset){
			var flag = false;
			for(var j = 0; j < 4; j++){
				for(var i = 3; i > 0; i--){
					flag = checkMainPos(i + x_offset, j + y_offset);
					if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
						// 已经到边上了
						if(i + xpos === width - 1){
							return false;
						}
						flag = checkMainPos(i + x_offset + 1, j + y_offset);
						if(flag){
							if(main[i + x_offset + 1][j + y_offset] === 1){
								return false;
							}
						}
						break;
					}
				}
			}
			return true;
		};
		
		var checkSwitch = function(){
			clearCube();
			var tmporder = (Math.floor(order / 4)) * 4 + (order % 4 + 1) % 4;
			var i, j, flag;
			for(var i = 0; i < 4; i++){
				for(var j = 0; j < 4; j++){
					if(cube[Math.floor(tmporder / 4)][tmporder % 4][i][j] === 1){
						flag = checkMainPos(i + xpos + 1, j + ypos);
						if(flag){
							if(main[i + xpos - 1][j + ypos] === 1){
								return false;
							}
						}else{
							return false;
						}
					}
				}
			}
			return true;
		};
		
		var charCode = event.which;
		
		if(checkStop(xpos, ypos))
			return;
		
		// 向左移一个格子
		if(charCode === 37){
			var flag = checkLeft(xpos, ypos);
			if(flag){
				clearCube();
				xpos--;
				loadCube();
				displayMain();
			}
		}
		// 向右移一个格子
		if(charCode === 39){
			var flag = checkRight(xpos, ypos);
			if(flag){
				clearCube();
				xpos++;
				loadCube();
				displayMain();
			}
		}
		
		// 变换图形
		if(charCode === 38){
			if(checkSwitch()){
				clearCube();
				order = (Math.floor(order / 4)) * 4 + (order % 4 + 1) % 4;
				loadCube();
				displayMain();
			}
			else{
				loadCube();
			}
		}
	};
	
	// 需要设置成其他颜色的数组
	var main = [];
	for(var i = 0; i < width; i++){
		main[i] = [];
		for(var j = 0; j < height; j++){
			main[i][j] = 0;
		}
	}
	
	var checkOver = function(){
		for(var i = 0; i < 4; i++){
			for(var j = 3; j >= 0; j--){
				if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
					if(j + ypos <= 0){
						return true;
					}else{
						return false;
					}
				}
			}
		}
		return false;	
	}
	
	var cleanCube = function(){
		var flag = false;
		var i, j, i_i, j_j;
		for(j = height - 1; j >= 0; j--){
			var sum = 0;
			for(i = 0; i < width; i++){
				sum += main[i][j];
			}
			if(width === sum){
				flag = true;
				// j行向上的全部刷新一遍
				for(i_i = 0; i_i < width; i_i++){
					for( j_j = j; j_j > 0; j_j--){
						main[i_i][j_j] = main[i_i][j_j - 1];
					}
				}
			}
		}
		if(flag){
			display();
		}
	}
	
	// x_offset y_offset
	// 在指定偏移量的情况下,看一个图形是否该停止下降,是则返回true
	var checkStop = function(order, x_offset, y_offset){
		for(var i = 0; i < 4; i++){
			for(var j = 3; j >= 0; j--){
				var flag = checkMainPos(i + x_offset, j + y_offset);
				if(flag){
					if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
						//到底了
						if(j + y_offset >= height - 1){
							return true;
						}
						flag = checkMainPos(i + x_offset, j + y_offset + 1);
						if(flag){
							if(main[i + x_offset][j + y_offset + 1] === 1){
								return true;
							}
						}
						break;
					}
				}
				continue;
			}
		}
		return false;
	}
		
	// 显示当前图形
	var displayMain = function(){
		var i, j;
		for(i = 0; i < width; i++){
			for(j = 0; j < height; j++){
				if(main[i][j] === 0){
					context.fillStyle = "#000";
				}else{
					context.fillStyle = "#00f";
				}
				context.font = "20pt Calibri";
				context.fillRect( i * 50, j * 50, 50, 50);
			}
		}
	};
		
	// 加载图形 只根据图形编号,图形坐标
	var loadCube = function(){
		var i, j, flag;
		for(i = 0; i < 4; i++){
			for(j = 0; j < 4; j++){
				if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
					flag = checkMainPos(i + xpos, j + ypos);
					if(flag){
						main[i + xpos][j + ypos] = 1;
					}
				}
			}
		}
	};
	
	// 图形清除功能 只根据图形编号,图形坐标
	var clearCube = function(){
		var i, j, flag;
		for(i = 0; i < 4; i++){
			for(j = 0; j < 4; j++){
				if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
					flag = checkMainPos(i + xpos, j + ypos);
					if(flag){
						main[i + xpos][j + ypos] = 0;
					}
				}
			}
		}
	};
	
	var move = function(event){
		// true 表示可以左移
		var checkLeft = function(x_offset, y_offset){
			var flag = false;
			for(var j = 0; j < 4; j++){
				for(var i = 0; i < 4; i++){
					flag = checkMainPos(i + x_offset, j + y_offset);
					if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
						// 已经到边上了
						if(i + xpos === 0){
							return false;
						}
						flag = checkMainPos(i + x_offset + 1, j + y_offset);
						if(flag){
							if(main[i + x_offset - 1][j + y_offset] === 1){
								return false;
							}
						}
						break;
					}
				}
			}
			return true;
		};
		
		// x_offset表示横向坐标
		var checkRight = function(x_offset, y_offset){
			var flag = false;
			for(var j = 0; j < 4; j++){
				for(var i = 3; i > 0; i--){
					flag = checkMainPos(i + x_offset, j + y_offset);
					if(cube[Math.floor(order / 4)][order % 4][i][j] === 1){
						// 已经到边上了
						if(i + xpos === xwidth - 1){
							return false;
						}
						flag = checkMainPos(i + x_offset + 1, j + y_offset);
						if(flag){
							if(main[i + x_offset + 1][j + y_offset] === 1){
								return false;
							}
						}
						break;
					}
				}
			}
			return true;
		};
		
		var charCode = event.which;
		
		if(checkStop(xpos_x, ypos_y))
			return;
		
		// 向左移一个格子
		if(charCode === 37){
			var flag = checkLeft(xpos, ypos);
			if(flag){
				xpos--;
				displayCanvas();
			}
		}
		// 向右移一个格子
		if(charCode === 39){
			var flag = checkRight(xpos, ypos);
			if(flag){
				xpos++;
				displayCanvas();
			}
		}
		
		// 变换图形
		if(charCode === 38){
			oldorder = order;
			order = (Math.floor(order / 4)) * 4 + (order % 4 + 1) % 4;
			//order = 10;
			displayCanvas();  // old
		}
	};

	// 若要检测位置不在main坐标中,false
	var checkMainPos = function(i, j){
		if(i >= 0 && i < width && j >= 0 && j < height)
			return true;
		return false;
	};
		
	var initCube = function(){
		cube = [];
		// i表示有多少个系列
		for(var i = 0; i < 5; i++){
			cube[i] = [];
			// j表示每个系列的图形
			for(var j = 0; j < 4; j++){
				cube[i][j] = [];
				for(var k = 0; k < 4; k++){
					cube[i][j][k] = [];
					for(var l = 0; l < 4; l++){
						cube[i][j][k][l] = 0;
					}
				}
			}
		}
		
		// 图形分为5个系列每个系列4种图形
		// 系列0 @@@@
		cube[0][0][1][0] = 1;
		cube[0][0][1][1] = 1;
		cube[0][0][1][2] = 1;
		cube[0][0][1][3] = 1;
		
		cube[0][1][0][2] = 1;
		cube[0][1][1][2] = 1;
		cube[0][1][2][2] = 1;
		cube[0][1][3][2] = 1;
		
		cube[0][2][1][0] = 1;
		cube[0][2][1][1] = 1;
		cube[0][2][1][2] = 1;
		cube[0][2][1][3] = 1;
		
		cube[0][3][0][2] = 1;
		cube[0][3][1][2] = 1;
		cube[0][3][2][2] = 1;
		cube[0][3][3][2] = 1;
		
		// 系列1 @
		//       @ @ @ @
		cube[1][0][0][1] = 1;
		cube[1][0][0][2] = 1;
		cube[1][0][1][2] = 1;
		cube[1][0][2][2] = 1;
				
		cube[1][1][2][1] = 1;
		cube[1][1][1][1] = 1;
		cube[1][1][1][2] = 1;
		cube[1][1][1][3] = 1;
		
		cube[1][2][0][2] = 1;
		cube[1][2][1][2] = 1;
		cube[1][2][2][2] = 1;
		cube[1][2][2][3] = 1;
		
		cube[1][3][1][1] = 1;
		cube[1][3][1][2] = 1;
		cube[1][3][1][3] = 1;
		cube[1][3][0][3] = 1;
		
		// 系列2  @
		// 		@ @ @
		cube[2][0][1][1] = 1;
		cube[2][0][0][2] = 1;
		cube[2][0][1][2] = 1;
		cube[2][0][2][2] = 1;
				
		cube[2][1][2][2] = 1;
		cube[2][1][1][1] = 1;
		cube[2][1][1][2] = 1;
		cube[2][1][1][3] = 1;
		
		cube[2][2][0][2] = 1;
		cube[2][2][1][2] = 1;
		cube[2][2][2][2] = 1;
		cube[2][2][1][3] = 1;
		
		cube[2][3][1][1] = 1;
		cube[2][3][1][2] = 1;
		cube[2][3][1][3] = 1;
		cube[2][3][0][2] = 1;
		
		// 系列3  @ @
		//          @ @
		cube[3][0][0][1] = 1;
		cube[3][0][1][1] = 1;
		cube[3][0][1][2] = 1;
		cube[3][0][2][2] = 1;
				
		cube[3][1][1][2] = 1;
		cube[3][1][1][3] = 1;
		cube[3][1][2][2] = 1;
		cube[3][1][2][1] = 1;
		
		cube[3][2][0][1] = 1;
		cube[3][2][1][1] = 1;
		cube[3][2][1][2] = 1;
		cube[3][2][2][2] = 1;
		
		cube[3][3][1][2] = 1;
		cube[3][3][1][3] = 1;
		cube[3][3][2][2] = 1;
		cube[3][3][2][1] = 1;
		
		// 系列4   @ @
		// 		   @ @
		cube[4][0][1][1] = 1;
		cube[4][0][1][2] = 1;
		cube[4][0][2][1] = 1;
		cube[4][0][2][2] = 1;
		
		cube[4][1][1][1] = 1;
		cube[4][1][1][2] = 1;
		cube[4][1][2][1] = 1;
		cube[4][1][2][2] = 1;
		
		cube[4][2][1][1] = 1;
		cube[4][2][1][2] = 1;
		cube[4][2][2][1] = 1;
		cube[4][2][2][2] = 1;
		
		cube[4][3][1][1] = 1;
		cube[4][3][1][2] = 1;
		cube[4][3][2][1] = 1;
		cube[4][3][2][2] = 1;
	};
	
	initCube();
	loadCube();
	displayMain();
	timeInterval = setInterval(function(){ 
		return function(){
			var flag = checkStop(order, xpos, ypos);
			if(flag){
				//消肿
				cleanCube();
				if(checkOver()){
					alert("game over!");
					clearInterval(timeInterval);
					return;
				}
				xpos = 3;
				ypos = -4;
				
				order = Math.floor(Math.random() * 20);
				//order = 10;
				oldorder = order;
			}
			clearCube();
			ypos++;
			loadCube();
			displayMain();
		}
	}(), 1000);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值