package {
import com.ui.Block;
import com.ui.Shape;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
[SWF(backgroundColor = "0xfffffff", frameRate = "24")]
/**
* 俄罗斯方块应用程序
* 主程序入口
*
* **/
public class FangKuai extends Sprite{
private const BLOCKWH:uint=15; //每个矩形的边长
private const KEY_LEFT:uint=37; //响应键盘 的值 左
private const KEY_UP:uint =38; //上
private const KEY_RIGHT:uint=39; //右
private const KEY_DOWN:uint=40;//下
private var shape:uint = 1; //形状值。默认为1
private var tempL:int = 0;//方块的左边空白距离
private var tempR:int = 0;//右边空白距离
private var tempD:int = 0;//下边空白距离
private var moveType:String;//存储移动状态
private var timer:Timer; //计时器
private var tetrisX:int;//Tetris的世界X坐标(不是stage的x)
private var tetrisY:int;//Tetris的世界y坐标
private var worldArr:Array = new Array();//世界方块数组,由10*20的格子构成世界
private var tetrisShape:Array;//Tetris的数组(形状)
private var tetrisBrickArr:Array = [];//所有添加到场景的小格子方块储存到一个数组
public function FangKuai(){//构造
init();
}
/*
*响应键盘事件
*/
private function keyevent(keyev:KeyboardEvent):void{
if(keyev.keyCode == KEY_LEFT){
moveType = "l";
go( -1, 0);
}
if(keyev.keyCode == KEY_RIGHT){
moveType = "r";
go( 1, 0);
}
if(keyev.keyCode == KEY_DOWN){
moveType = "d";
go( 0, 1);
}
if(keyev.keyCode == KEY_UP){
moveType = "ro";
revolves();
}
createStageOfTrtris();
}
/*
*创建可视化的舞台
*/
private function createStageOfTrtris():void{
clearStageOfTrtris();
for(var world_x:uint=0;world_x<20;world_x++){
var clearState:int=0;
for(var world_y:uint=0;world_y<10;world_y++){
if(worldArr[world_x][world_y] == 0){ //添加背景方格
var block:Block = new Block(0xCCCCCC); //黄
block.x = world_y * BLOCKWH;
block.y = world_x * BLOCKWH;
tetrisBrickArr.push(block);
stage.addChild(block);
}
if(worldArr[world_x][world_y] == 2){
clearState++;
var block2:Block = new Block(0xff0000);
block2.x = world_y * BLOCKWH;
block2.y = world_x * BLOCKWH;
tetrisBrickArr.push(block2);
stage.addChild(block2);
}
if(world_x >= tetrisY &&
world_x < tetrisY + tetrisShape.length &&
world_y >= tetrisX &&
world_y < tetrisX + tetrisShape.length ){ //将形状数组tetrisShape 变为舞台上的可视图形
if(tetrisShape[world_x -tetrisY][world_y-tetrisX] == 1){
var block1:Block = new Block(0xff0000);
block1.x = world_y * BLOCKWH;
block1.y = world_x * BLOCKWH;
tetrisBrickArr.push(block1);
stage.addChild(block1);
}
}
}
if (clearState >= 10) { //清屏
worldArr.splice(world_x, 1) ;
worldArr.unshift([0,0,0,0,0,0,0,0,0,0]);
}
}
}
/*
*旋转
*/
private function revolves():void{
var reShpaeArr:Array = new Array(4);
for(var a:int=0;a<tetrisShape.length;a++){
reShpaeArr[a]=new Array(4);
for(var b:int=0;b<tetrisShape.length;b++){
reShpaeArr[a][b] = tetrisShape[3-b][a];
}
}
//判断翻转后是否会与原有方块重合,如果重合return,不让翻转
for ( var i :int= 0; i <4;i++ ) {
for ( var j :int= 0; j <4; j++ ) {
if (reShpaeArr[i][j] == 1) {
if (i+tetrisY>19) return;
if (worldArr[i + tetrisY][j + tetrisX] == 2 ) return;
}
}
}
this.tetrisShape = reShpaeArr;
getTempXy();
//考虑在左右板边翻转超出舞台的情况
if ( tetrisX + tempL <0 ){
tetrisX = 0;
}
if ( tetrisX + tempL+tetrisShape[0].length-tempR>10 ) {
tetrisX = 10 - tetrisShape[0].length-tempR;
}
}
/*
*清除舞台
* 检测方块是否到达顶部? 如果到达, init();
*/
private function clearStageOfTrtris():void{
for (var i:int = 0; i <10;i++ ) {
if (worldArr[0][i] == 2
|| worldArr[1][i] == 2
|| worldArr[2][i] == 2
|| worldArr[3][i] == 2) {
init();
return;
}
}
if (tetrisBrickArr.length> 0) {
for ( var j:uint=0; j <tetrisBrickArr.length;j++ ) {
stage.removeChild(tetrisBrickArr[j]);
}
tetrisBrickArr = [];
}
}
/*
*计时器 函数
*/
private function run(ev:TimerEvent):void{
moveType = 'd';//更改移动状态为下
go(0,1);
createStageOfTrtris();
}
/*
*移动 左 右 下的移动
*/
private function go(lr:int,ud:int):void{
getTempXy();
var hit:Array = hitTest();
if (this.tetrisX+tempL + lr>= 0 &&
this.tetrisX + lr-tempR <= 10 - tetrisShape[0].length &&
hit[0]==0) {//左右移动
this.tetrisX += lr;
}
if (hit[0] == 1 && hit[1] == 2 ){
floor();//判断落地
}
if(lr==0 && tetrisY - tempD +3 < 19) {
this.tetrisY += ud;//在场景内下移动
}
}
//计算tetris数组四周的空白距离
private function getTempXy():void {
var tempint1:int = 0;
var tempint2:int = 0;
var tempint3:int = 0;
tempL = 0;
for ( var j:int= 0; j <2;j++) {
for (var i:int = 0; i <4; i++ ) {
if (tetrisShape[i][j] == 1 ) tempint1++;
}
if (tempint1 == 0) tempL ++;
}
tempR = 0;
for ( j= 3; j>1;j-- ) {
for ( i = 0; i <4; i++ ) {
if (tetrisShape[i][j] == 1 ) tempint2++;
}
if (tempint2 == 0) tempR ++;
}
tempD = 0;
for ( j = 3; j>1;j-- ) {
for ( i = 0; i <4; i++ ) {
if (tetrisShape[j][i] == 1 ) tempint3++;
}
if (tempint3 == 0) tempD ++;
}
}
private function hitTest():Array {
//检测左右是否有方格
getTempXy();
for (var i:int = 0; i <4;i++ ) {
for (var j:int = 0; j <4;j++ ) {
if (tetrisShape[i][j] == 1) {
if (moveType == 'l' || moveType == 'ro') {
if (this.worldArr[i+tetrisY][j+tetrisX-1]==2) return [1,0];
}
if(moveType=='r' || moveType=='ro'){
if (this.worldArr[i+tetrisY][j+tetrisX+1]==2) return [1,1];
}
if (moveType == 'd' || moveType=='ro') {
if(i+tetrisY+1<20){
if (this.worldArr[i + tetrisY + 1][j + tetrisX] == 2) return [1, 2];
}
}
}
}
}
//检测是否到下边界
if (this.tetrisY-tempD >= 20 - tetrisShape.length &&
(moveType=="d" || moveType=='ro')) {
return [1,2];
}else {
return [0,0];
}
}
//落地 的检测
private function floor():void {
for ( var i:int = 0; i <4;i++ ) {
for ( var j:int = 0; j <4;j++ ) {
if (tetrisShape[i][j] == 1) {
this.worldArr[i + tetrisY ][j + tetrisX] = 2;
}
}
}
getTrtrisShape();//创建新的tetris
}
/*
*获得形状数组
*随机产生一个形状
*/
private function getTrtrisShape():void{
var shape:uint = Math.floor(Math.random()*6 + 1);
//shape = 2;
tetrisShape = Shape.getShape(shape);
tetrisX=0;
tetrisY=0;
}
private function init():void{ //初始化
//对数组worldArr初始化
for(var world_row:uint=0;world_row<20;world_row++ ){
worldArr[world_row]=[];
for(var world_col:uint=0;world_col<10;world_col++){
worldArr[world_row][world_col]=0;
}
}
getTrtrisShape();
timer = new Timer(500);
timer.addEventListener(TimerEvent.TIMER,run);
timer.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyevent);
}
}
}
----------------------------------------------------------------------
package com.ui{
import flash.display.Shape;
/**
* 工具类
* 产生格子
* **/
public class Block extends Shape{
public function Block(color:uint){
this.graphics.lineStyle(1,.8);
this.graphics.beginFill(0x660099,.8);
this.graphics.drawRect(0,0,15,15);
this.graphics.endFill();
}
}
}
-----------------------------------------------------------------------------
package com.ui{
/**
* 形状类
* 创建俄罗斯方块(Tetris)的类型,用一个4*4的数组(tetrisType)存储
* */
public class Shape{
public function Shape(){
}
public static function getShape(shape:uint):Array{
var tetrisShape:Array=[];
switch(shape){
case 1:
tetrisShape = [
[0,0,0,0],
[0,1,0,0],
[0,1,0,0],
[0,1,1,0]
];
break;
case 2 :
tetrisShape = [
[0,0,0,0],
[0,1,1,0],
[0,1,1,0],
[0,0,0,0]
];
break;
case 3:
tetrisShape = [
[0,1,0,0],
[0,1,0,0],
[0,1,0,0],
[0,1,0,0]
];
break;
case 4:
tetrisShape = [
[0,0,0,0],
[0,1,0,0],
[1,1,1,0],
[0,0,0,0]
];
break;
case 5:
tetrisShape = [
[0,0,0,0],
[1,1,0,0],
[0,1,1,0],
[0,0,0,0]
];
break;
case 6:
tetrisShape = [
[0,0,0,0],
[0,1,1,0],
[1,1,0,0],
[0,0,0,0]
];
break;
default:
tetrisShape = [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
];
break;
}
return tetrisShape;
}
}
}
------------------------------------------------
要求不高,来的留个言..........在此感谢!