js版俄罗斯方块(三)

斌斌 (给我写信) 原创博文(http://blog.csdn.net/binbinxyz),转载请注明出处

俄罗斯方块是一个经典的游戏,想必地球上找不到没玩过这个游戏的人吧?发布一个javascript版的俄罗斯方块,该版本基于之前开发的俄罗斯方块,算是该程序的升级版本吧~

既然是升级,就顺道把本次升级内容也发上来吧:

1、解决了旧版IE不兼容的问题,目前可以支持IE、360、Firefox等浏览器

2、优化了源代码,使之更加规范。

本系列第二版请参考:js版俄罗斯方块(二)

资源下载地址: 俄罗斯方块(http://download.csdn.net/detail/binbinxyz/7054513)



  
    俄罗斯方块_经典游戏
	
    
    
    
	
    
    
	
    
    
	
    
    

	 rel="icon" href="http://www.ifeng.com/favicon.ico" type="image/x-icon" />
	 rel="shortcut icon" href="http://www.ifeng.com/favicon.ico" type="image/x-icon" />
	 rel="bookmark" href="http://www.ifeng.com/favicon.ico" type="image/x-icon" />

	
    
    

	

  
  
  
    
    

俄罗斯方块  V1.3

俄罗斯方块的基本规则
  1. 一个用于摆放小型正方形的平面虚拟矩形,标准大小:宽为10,高为20,以小正方形为单位。
  2. 一组由4个小型正方形组成的图形(即方块,Tetromino)共7种,分别以S、Z、L、J、I、O、T这7个字母来命名。
  3. 部分游戏有单格方块,可以穿透方块到达最下层空位。
  4. 玩家的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。
  5. 方块移到区域最下方或是落到其他方块上会固定在该处,而新的方块从区域上方开始落下。
  6. 当区域中某一行格子全部由方块填满时,该行会消失。
  7. 当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
  8. 游戏会提示下一个要落下的方块。
  9. 计分标准:下落一个方块1分,一次消一行10分、2行30分、3行60分、4行100分。
游戏按键提示
:旋转方块:方块下移:方块左移:方块右移
空格键(Spacebar):方块降落(直接下移到位)
显示屏幕
显示区域
当前级别:1
当前分数:0
运行时间:00:00
控制区域
<script type="text/javascript"> var COLUMN = 10; //显示屏幕的宽度(相对列数) var ROW = 20; //显示屏幕的高度(相对行数) //定义方块数据数组,存储所有的方块数据 var TETROMINO_DATA = [ [ [[0,0,0,0],[1,1,1,1], [0,0,0,0], [0,0,0,0]], [[0,1,0,0], [0,1,0,0], [0,1,0,0], [0,1,0,0]] ], [ [[1,1,1,0], [1,0,0,0], [0,0,0,0], [0,0,0,0]], [[1,1,0,0], [0,1,0,0], [0,1,0,0], [0,0,0,0]], [[0,0,1,0], [1,1,1,0], [0,0,0,0], [0,0,0,0]], [[0,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,0,0]] ], [ [[0,0,0,0], [1,1,1,0], [0,1,0,0], [0,0,0,0]], [[0,1,0,0], [1,1,0,0], [0,1,0,0], [0,0,0,0]], [[0,1,0,0], [1,1,1,0], [0,0,0,0], [0,0,0,0]], [[0,1,0,0], [0,1,1,0], [0,1,0,0], [0,0,0,0]] ], [ [[0,0,0,0], [1,1,1,0], [0,0,1,0], [0,0,0,0]], [[0,1,0,0], [0,1,0,0], [1,1,0,0], [0,0,0,0]], [[1,0,0,0], [1,1,1,0], [0,0,0,0], [0,0,0,0]], [[0,1,1,0], [0,1,0,0], [0,1,0,0], [0,0,0,0]] ], [ [[0,0,0,0], [1,1,0,0], [0,1,1,0], [0,0,0,0]], [[0,0,1,0], [0,1,1,0], [0,1,0,0], [0,0,0,0]] ], [ [[0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,0,0]], [[0,0,0,0], [0,1,1,0], [1,1,0,0], [0,0,0,0]] ], [ [[0,0,0,0], [0,1,1,0], [0,1,1,0], [0,0,0,0]] ] ]; var POSSIBLE_COLORS = [ "aqua", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "purple", "red", "silver", "teal", "yellow"]; //可能使用的颜色库 var DEFAULT_TETROMINO_COLOR = "GRAY"; //生成方块的默认颜色 var DEFAULT_BOTTOM_COLOR = "GRAY"; //底部方块的默认颜色 var DEFAULT_BLOCK_X = 4; //方块出现时左上角默认位置的X坐标 var bottom = []; //底部方块堆(实际是与屏幕大小相同的二维数组) var bottomColor = []; //底部方块堆中各块的颜色 var level; //当前级别 var period; //各后续任务之间的时间间隔,单位是毫秒 var score; //当前分数 var runTime; //运行时间,单位秒 var block; //显示屏幕中的方块 var block_x; //方块出现时左上角的X坐标 var block_y; //方块出现时左上角的y坐标 var gameStatus; //游戏状态(offDuty|run|pause|end) var lineVisible; //屏幕辅助线是否可见 var randomTetrominoColor; //生成的方块颜色随机 var randomBottomColor; //底部方块的颜色随机 var taskTimer = function(){}; //计时器,用于循环执行方块下落等事件 var updateTimer = function(){}; //计时器,游戏运行时用于更新游戏运行时间 //定义方块对象的构造方法 function Tetromino(color, index, status){ this.color = color; //方块的颜色 this.index = index; this.status = status; this.data = TETROMINO_DATA[index][status]; }; //获取当前方块的高度 Tetromino.prototype.getHeight = function(){ for(var i=3;i>=0;i--) { for(j=0;j<4;j++) { if(this.data[i][j] == 1) { return i + 1; } } } }; //获取方块对象的下一个状态 Tetromino.prototype.getNextStatus = function(){ this.status ++; this.status %= TETROMINO_DATA[this.index].length; return TETROMINO_DATA[this.index][this.status]; }; //alert(new Tetromino("blue", 2, 0).data); //定义屏幕显示的方块 function Block(x, y, tetromino){ this.x = x; //方块所在4×4矩形的左上角x坐标 this.y = y; //方块所在4×4矩形的左上角y坐标 this.tetromino = tetromino; //方块 }; //方块工厂,用于生成各种方块 var TetrominoFactory = { tetromino: [], //方块属性 createTetromino: function(){ //生成一个新的方块 var color = DEFAULT_TETROMINO_COLOR; //使用默认颜色初始化 //如果生成的方块颜色随机 if(randomTetrominoColor) { var i = Math.floor(Math.random() * POSSIBLE_COLORS.length); color = POSSIBLE_COLORS[i]; //alert("0:" + color); } var index = Math.floor(Math.random() * TETROMINO_DATA.length); var status = Math.floor(Math.random() * TETROMINO_DATA[index].length); //alert(color + ":" + index + ":" + status); this.tetromino = new Tetromino(color, index, status); return this.getCurrentTetromino(); }, getCurrentTetromino: function(){ //返回当前的方块 return this.tetromino; } }; //alert("a:" + TetrominoFactory.createTetromino().data); //alert("b:" + TetrominoFactory.getCurrentTetromino().data); //初始化整个页面 function initBody() { //初始化控制区域的按钮 //document.getElementById("btnstart").removeAttribute("disabled"); //document.getElementById("btnpause").disabled = "disabled"; //document.getElementById("btnend").disabled = "disabled"; initButtonStatus(); //初始化全局变量 level = 1; period = 800; score = 0; runTime = 0; block_x = DEFAULT_BLOCK_X; block_y = -3; gameStatus = "offDuty"; lineVisible = true; randomTetrominoColor = true; randomBottomColor = true; initScreen(); initSmallScreen(); //初始化底部方块堆及堆中各块的颜色 for(var i=0;i =block.y && i =block.x && j =COLUMN && tetromino.data[i][j] == 1) { return false; } //到达底部了 if(block.y+tetromino.getHeight()>ROW) { return false; } //方块重合 if(block.y+i>=0 && tetromino.data[i][j]==1 && bottom[block.y + i][block.x + j] == 1) { return false; } } } return true; } //接收一个block function accept(){ var tetromino = block.tetromino; for(var i=0;i < 0) gameover(); return; } bottom[block.y i][block.x j]="DEFAULT_BOTTOM_COLOR;" if(randombottomcolor) bottomcolor[block.y else var line score changelevel(); document.getelementbyid("score").innerhtml="score;" movetetromino2screen(); 消去满行 function disappear() 此次消去行数 r="block.y" block.tetromino.getheight() - 1; alert(bottom[i].length); 当前行是否可以消去,默认可消去 disapperable="false;" alert(r ":" bottom[r][j]); 如果有单元格为空,则当前行不可消去 if(bottom[r][j]="=" break; if(disapperable) ++; 更新消去行数 消去当前满行 k="r;k"> 0;k--) { for(var j=0;j n) { level += 1; changeSpeed(); //升级后,方块下落的速度需要发生变化,所以清除旧的计时器,再新建一个 clearInterval(taskTimer); taskTimer = setInterval("down();", period); document.getElementById("level").innerHTML = level; } } //求1+2+3+...+n的结果 function sum(n) { if(n <= 1) { return 1; } return n + sum(n - 1); } //修改方块下落的速度 function changeSpeed() { //每升一级,方块下落的时间间隔减少40毫秒 period = 1200 - 40 * level; } function gameOver() { clearInterval(taskTimer); clearInterval(updateTimer); alert("您的得分是:" + score + "!\n游戏结束!"); initBody(); if(confirm("您想重新挑战吗?")) { startGame(); } } //更新显示区域的时间 function updateTime() { var runTimeLabel = document.getElementById("runTime"); runTime ++; runTimeLabel.innerHTML = formatTime(runTime); } //格式化时间 function formatTime(time) { var m = Math.floor(time / 60); //分钟 var s = time % 60; //秒数 var str = ""; if(m < 10) { str = "0"; } str += m + ":"; if(s < 10) { str += "0"; } str += s; return str; } function keyEvent(e) { if(navigator.appName == "Microsoft Internet Explorer") { //var keycode = event.keyCode; //var realkey = String.fromCharCode(event.keyCode); //alert("按键码: " + keycode + " 字符: " + realkey); keyAction(event.keyCode); }else { //alert(e.which); keyAction(e.which); } } function keyAction(key) { switch(key) { case 32: //向下快速移动 quickDown(); break; case 37: //向左移动 left(); break; case 38: //向上移动 up(); break; case 39: //向右移动 right(); break; case 40: //向下移动 down(); break; } } //开始游戏 function startGame() { changeButtonStatus(); if(gameStatus == "offDuty") { gameStatus = "run"; moveTetromino2screen(); } taskTimer = setInterval("down()", period); updateTimer = setInterval("updateTime()", 1000); } //暂停游戏 function pauseGame() { var btnpause = document.getElementById("btnpause"); if(btnpause.value=="暂停") { btnpause.value = "恢复"; clearInterval(taskTimer); clearInterval(updateTimer); } else { btnpause.value = "暂停"; taskTimer = setInterval("down();", period); updateTimer = setInterval("updateTime()", 1000); } } //结束游戏 function endGame() { if(confirm("你确定要结束游戏吗?")) { clearInterval(taskTimer); clearInterval(updateTimer); initBody(); } } //更改按钮状态 function initButtonStatus() { document.getElementById("btnstart").disabled = false; document.getElementById("btnpause").disabled = true; document.getElementById("btnpause").value = "暂停"; document.getElementById("btnend").disabled = true; document.getElementsByName("lineVisible")[0].disabled = false; document.getElementsByName("lineVisible")[0].checked = "checked"; document.getElementsByName("lineVisible")[1].disabled = false; document.getElementsByName("randomTetrominoColor")[0].disabled = false; document.getElementsByName("randomTetrominoColor")[1].disabled = false; document.getElementsByName("randomTetrominoColor")[1].checked = "checked"; document.getElementsByName("randomBottomColor")[0].disabled = false; document.getElementsByName("randomBottomColor")[1].disabled = false; document.getElementsByName("randomBottomColor")[1].checked = "checked"; if(document.getElementsByName("randomTetrominoColor")[0].checked) { randomTetrominoColor = true; } else { randomTetrominoColor = false; } if(document.getElementsByName("randomBottomColor")[0].checked) { randomBottomColor = true; } else { randomBottomColor = false; } } //初始化按钮状态 function changeButtonStatus() { document.getElementById("btnstart").disabled = true; document.getElementById("btnpause").disabled = false; document.getElementById("btnend").disabled = false; document.getElementsByName("lineVisible")[0].disabled = true; document.getElementsByName("lineVisible")[1].disabled = true; document.getElementsByName("randomTetrominoColor")[0].disabled = true; document.getElementsByName("randomTetrominoColor")[1].disabled = true; document.getElementsByName("randomBottomColor")[0].disabled = true; document.getElementsByName("randomBottomColor")[1].disabled = true; } //设置方块颜色的生成方式(即是否随机) function setRTColor(flag) { randomTetrominoColor = flag; } //设置底部方块颜色的生成方式(即是否随机) function setRBColor(flag) { randomBottomColor = flag; } //设置是否显示屏幕辅助线 function setLineVisible(flag) { lineVisible = flag; } initBody(); document.onkeydown = keyEvent; </script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值