package com.test;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class TetrisView extends TileView {
private static final String TAG = "TetrisView";
/**
* 游戏的四种状态
*/
private int mMode = READY;
public static final int PAUSE = 0;
public static final int READY = 1;
public static final int RUNNING = 2;
public static final int LOSE = 3;
/**
* 三种背景图片,由这些图片拼装成游戏的基本界面
*/
private static final int RED_STAR = 1;
private static final int YELLOW_STAR = 2;
private static final int GREEN_STAR = 3;
/**
* 产生随机数,根据随机数决定方块的形状
*/
private static final Random RNG = new Random();
/**
* 当前游戏的分数
*/
private long mScore = 0;
/**
* 历史最高分
*/
public static long historyScore = 0;
/**
* 是否超出了最高分,如果超出了,则在退出时会保存数据
*/
public static boolean overhistroy=false;
/**
* 方块移动的速度,数值越小则方块的速度越高,难度也就越大
*/
private long mMoveDelay;
/**
* 当前方块移动的速度,和mMoveDelay配合使用,在游戏中更改游戏的速度都是更改此变量值
* 在每个方块产生的时候,将此变量值赋给mMoveDelay。之所以采用两个变量是因为当按下加速 方块落下之后,下一个方块的速度还要保持原来的速度。
*/
private long currentDelay;
/**
* 预先显示的方块,在前一个方块落下后,使其变为当前方块
*/
private ArrayList preShape = new ArrayList();
/**
* 当前正在下落的方块
*/
private ArrayList mShape = new ArrayList();
private ArrayList oldShape = new ArrayList();
/**
* 显示历史最高分的文本框
*/
private TextView highestScore;
/**
* 显示当前分数的文本框
*/
private TextView currentScore;
/**
* 显示当前游戏级别的文本框
*/
private TextView currentLevel;
/**
* 记录游戏的级别
*/
private int gameLevel = 1;
/**
* 在屏幕中央显示提示信息的文本框
*/
private TextView info;
/**
* 记录目前落下的方块的最高层数
*/
private int highLevel = 0;
/**
* 当前方块类型,主要用来标示田形方块,从而在旋转方块的时候可以让田形方块不旋转
*/
private int shapeType;
/**
* 预先显示方块的类型
*/
private int preType;
/**
* 构造方法
*/
public TetrisView(Context context, AttributeSet attrs) {
super(context, attrs);
initGame();
}
public TetrisView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initGame();
}
/**
* 通过一个handler来更新界面的显示,以及方块下落的速度
*/
private RefreshHandler mRedrawHandler = new RefreshHandler();
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
TetrisView.this.update();
TetrisView.this.invalidate();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
/**
* 初始化游戏
*/
private void initGame() {
setFocusable(true);
Resources r = this.getContext().getResources();
resetTiles(4);
loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));
loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));
loadTile(GREEN_STAR, r.getDrawable(R.drawable.greens