自己用as3做的一个俄罗斯方块小游戏,预览图: 主程序如下: package { import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.KeyboardEvent; import flash.text.TextField; public class Main extends Sprite{ var mainBlock:Array; //存储主游戏区方块 var nextBlock:Array; //存储提示区方块 var timer:Timer; var mainField:GameField; var blockX:int; var blockY:int; var map:Array; var mc_gameOver:GameOver; var scoreField:TextField; var score:int; public function Main() { blockX = 0; blockY = 0; score = 0; mc_gameOver = new GameOver(); mc_gameOver.visible = false; addChild(mc_gameOver); scoreField = new TextField(); scoreField.text = "分数:" + score; scoreField.x = 375; scoreField.y = 150; addChild(scoreField); new Block(this, true); new Block(this, false); mainField = new GameField(30, 20, 300, 450); map = mainField.map; mainField.x = 50; mainField.y = 50; addChild(mainField); var nextField:GameField = new GameField(4, 4, 60, 60); nextField.x = 375; nextField.y = 50; addChild(nextField); timer = new Timer(1000, 0); timer.addEventListener(TimerEvent.TIMER, down); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler); timer.start(); } //下移 public function down(e:TimerEvent):void { if (!canMove()) { map[Block.mainBlock[0].pos.x][Block.mainBlock[0].pos.y] = Block.mainBlock[0].name; map[Block.mainBlock[1].pos.x][Block.mainBlock[1].pos.y] = Block.mainBlock[1].name; map[Block.mainBlock[2].pos.x][Block.mainBlock[2].pos.y] = Block.mainBlock[2].name; map[Block.mainBlock[3].pos.x][Block.mainBlock[3].pos.y] = Block.mainBlock[3].name; removeRows(); if(gameOver()) { timer.removeEventListener(TimerEvent.TIMER, down); stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyHandler); mc_gameOver.visible = true; trace(2); return } Block.mainBlock = Block.nextBlock; Block.mainBlockType = Block.nextBlockType; new Block(this, false); Block.mainBlock[0].x -= 325; Block.mainBlock[1].x -= 325; Block.mainBlock[2].x -= 325; Block.mainBlock[3].x -= 325; blockX = 0; blockY = 0; trace(score); return; } blockY++; Block.mainBlock[0].y += 15; Block.mainBlock[1].y += 15; Block.mainBlock[2].y += 15; Block.mainBlock[3].y += 15; Block.mainBlock[0].pos.x++; Block.mainBlock[1].pos.x++; Block.mainBlock[2].pos.x++; Block.mainBlock[3].pos.x++; } public function keyHandler(evt:KeyboardEvent):void { switch (evt.keyCode) { case 38: up(); break; case 37: left(); break; case 39: right(); break; case 40: down(null); break; default: return; } } //变形 public function up():void { var tempBlock:Array = []; for (var i = 0; i < 4; i++) { tempBlock[i] = []; for (var j = 0; j < 4; j++) { tempBlock[i][j] = Block.mainBlockType[3 - j][i]; if (tempBlock[i][j] == 1) { if (map[i + blockY][j + blockX] != 0 || j + blockX < 0 || j + blockX > 19) { return; } } } } Block.mainBlockType = tempBlock; var k:int = 0; for (var m = 0; m < 4; m++) { for (var n = 0; n < 4; n++) { if (Block.mainBlockType[m][n] == 1) { Block.mainBlock[k].x = (n + blockX) * 15 + 50; Block.mainBlock[k].y = (m + blockY) * 15 + 50; Block.mainBlock[k].pos.x = blockY + m; Block.mainBlock[k].pos.y = blockX + n; k++; } } } } //左移 public function left():void { for (var i = 0; i < 4; i++) { if (Block.mainBlock[i].x <= 50 || map[Block.mainBlock[i].pos.x][Block.mainBlock[i].pos.y - 1] != 0) { return; } } for (var m = 0; m < 4; m++) { Block.mainBlock[m].x -= 15; Block.mainBlock[m].pos.y--; } blockX--; } //右移 public function right():void { for (var i = 0; i < 4; i++) { if (Block.mainBlock[i].x >= 335 || map[Block.mainBlock[i].pos.x][Block.mainBlock[i].pos.y + 1] != 0) { return; } } for (var m = 0; m < 4; m++) { Block.mainBlock[m].x += 15; Block.mainBlock[m].pos.y++; } blockX++; } //消行 public function removeRows():void { var tempArr:Array = new Array(); var fullRows:int = 0; var sq:Square; for (var i:int = 29; i >= 0; i--) { if (map[i].every(isFull)) { for (var j:int = 0; j<= 19; j++) { this.stage.removeChild(this.stage.getChildByName(map[i][j])); map[i][j] = 0; } fullRows++; } else { if(fullRows > 0) { for (var k:int = 0; k <= 19; k++) { if (map[i][k] != 0) { sq = this.stage.getChildByName(map[i][k]) as Square; sq.y += 15 * fullRows; map[i + fullRows][k] = map[i][k]; map[i][k] = 0; score += fullRows; updateScore(); } } } } } } private function updateScore():void { scoreField.text = "分数:" + score; } //判断是否满行 private function isFull(item:*, index:int, arr:Array):Boolean { return (item != 0); } //判断游戏是否结束 private function gameOver():Boolean { return map[1].some(isFull); } //判断是否能继续向下移动 public function canMove() { if (Block.mainBlock[0].y >= 485 || Block.mainBlock[1].y >= 485 || Block.mainBlock[2].y >= 485 || Block.mainBlock[3].y >= 485) { return false; } if (map[Block.mainBlock[0].pos.x + 1][Block.mainBlock[0].pos.y] != 0 || map[Block.mainBlock[1].pos.x + 1][Block.mainBlock[1].pos.y] != 0 || map[Block.mainBlock[2].pos.x + 1][Block.mainBlock[2].pos.y] != 0 || map[Block.mainBlock[3].pos.x + 1][Block.mainBlock[3].pos.y] != 0) { return false; } return true; } } }