package my.pack;
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import
android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class eluosi extends
SurfaceView implements Callback,Runnable {
private SurfaceHolder sfh;
private Paint paint;
private Canvas canvas;
private Thread th;
int
textX=100,textY=100;
private boolean
flag,isNew=true,canBian=true,isEnd,isOver,isPause;
private boolean isLeft,isRight,isDi;
private int dir=0;
private int score;
private long speed=1000;
private boolean hang[];
private final int UP=1;
private final int DOWN=2;
private final int LEFT=3;
private final int RIGHT=4;
private int
zh[][][]={{{0,0,0,0},{0,1,1,0,},{0,1,1,0},{0,0,0,0}},
{{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}},
{{0,0,0,0},{0,1,0,0},{1,1,1,0},{0,0,0,0}},
{{0,0,0,0},{0,1,0,0},{1,1,0,0},{0,1,0,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},{0,1,1,0},{0,1,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,0},{1,0,0,0},{1,1,1,0}},
{{0,0,0,0},{0,0,1,0},{0,0,1,0},{0,1,1,0}},
{{0,0,0,0},{1,1,1,0},{0,0,1,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},{1,1,1,0},{1,0,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,1,0},{1,1,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,0,0},{0,1,1,0},{0,0,1,0}},
{{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}},
{{0,0,0,0},{0,0,1,0},{0,1,1,0},{0,1,0,0}}
};
private int kb;//每一次产生新块的标号
private int s[][]; //记录背景方块20*10,1为填充,0为空
private int x[],y[];
private int nextkb;
private int cx=4,cy=0;
private Rect[] kuai;
public eluosi(Context context) {
super(context);
sfh=this.getHolder();
sfh.addCallback(this);
paint=new Paint();
paint.setColor(Color.WHITE);
setFocusable(true);
s=new int[20][10];
x=new int[4];
y=new int[4];
kuai=new Rect[4];
hang=new boolean[20];
}
@Override
public void run() {
while(flag){
if(!isPause&&!isOver){
logic();
}
myDraw();
try{
Thread.sleep(speed);
}catch(Exception e){
e.printStackTrace();
}
}
}
private void logic() {
Random r=new Random();
if(isEnd){
endkuai();
xiaohang();
}
if(isNew){
newkuai();
getkuai();
collision();
isNew=false;
nextkb=r.nextInt(18);
}
if(speed<0){
speed=0;
}
if(speed>1000){
speed=1000;
}
getnext();
getkuai();
}
private void xiaohang() {
int i,j,w;
int js=0;
for(i=1;i<=19;i++){
hang[i]=canxiao(i);
if(hang[i]){
for(w=i;w>0;w--){
for(j=0;j<=9;j++){
s[w][j]=s[w-1][j];
}
}
js++;
}
}
switch(js){
case 1: score+=10;break;
case 2: score+=20;break;
case 3: score+=40;break;
case 4: score+=60;break;
default:;
}
}
public boolean canxiao(int hb){
int i=0;
while(i<10){
if(s[hb][i]==1){
i++;
}else{
break;
}
}
if(i==10){
return true;
}else{
return false;
}
}
public void bian() {
int i,j,k=0;
int m,n;
int x1[],y1[];
boolean flg=false;
x1=new int[4];
y1=new int[4];
for(i=0;i<4;i++){
x1[i]=x[i];
y1[i]=y[i];
}
kb++;
if(kb==1){
kb=0;
}else if(kb==3){
kb=1;
}else if(kb==7){
kb=3;
}else if(kb==11){
kb=7;
}else if(kb==15){
kb=11;
}else if(kb==17){
kb=15;
}else if(kb==19){
kb=17;
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(zh[kb][i][j]==1){
x1[k]=i;
y1[k]=j;
k++;
}
}
}
for(i=0;i<4;i++){
m=cx+x1[i];
n=cy+y1[i];
if(m<0||m>9||n>19){
flg=true;
}
}
if(!flg){
for(i=0;i<4;i++){
x[i]=x1[i];
y[i]=y1[i];
}
}else{
kb--;
}
clearflag();
yuejie();
collision();
}
private void myDraw() {
try{
canvas=sfh.lockCanvas();
if(canvas!=null){
canvas.drawRGB(0, 0, 0);
drawinfo();
drawkuai();
drawbg();
drawnext();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas!=null){
sfh.unlockCanvasAndPost(canvas);
}
}
}
private void drawbg() {
int i,j;
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(3);
canvas.drawRect(new Rect(100,100,300,500), paint);
canvas.drawRect(new Rect(300,100,450,500), paint);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
for(i=0;i<20;i++){
for(j=0;j<10;j++){
if(s[i][j]==1){
canvas.drawRect(new
Rect(100+j*20,100+i*20,118+j*20,118+i*20), paint);
}
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
flag=true;
initgame();
th=new Thread(this);
th.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
flag=false;
}
public void initgame(){
int i,j;
cx=4;
cy=0;
for(i=0;i<20;i++){
for(j=0;j<10;j++){
s[i][j]=0;
}
}
}
public void regame(){
initgame();
clearflag();
isNew=true;
canBian=true;
isEnd=false;
isOver=false;
isPause=false;
}
public void clearflag(){
isLeft=false;
isRight=false;
isDi=false;
}
public void newkuai(){
int i,j,k=0;
kb=nextkb;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(zh[kb][i][j]==1){
x[k]=i;
y[k]=j;
k++;
}
}
}
isEnd=false;
cx=4;
cy=0;
}
public void getnext(){
int i;
yuejie();
collision();
switch(dir){
case UP:
if(canBian&&!isEnd){
bian();
isDi=false;
}
break;
case DOWN:
if(!isDi&&!isEnd){
cy++;
}
break;
case LEFT:
if(!isLeft&&!isEnd){
cx--;
isRight=false;
}
break;
case RIGHT:
if(!isRight&&!isEnd){
cx++;
isLeft=false;
}
break;
default:;
}
dir=DOWN;
}
public void getkuai(){
int i;
int m,n;
for(i=0;i<4;i++){
m=cx+x[i];
n=cy+y[i];
kuai[i]=new Rect(100+m*20,100+n*20,118+m*20,118+n*20);
}
}
public void yuejie(){
int i;
int tx,ty;
for(i=0;i<4;i++){
tx=cx+x[i];
ty=cy+y[i];
if(tx==0){
isLeft=true;
}
if(tx==9){
isRight=true;
}
if(ty==19){
isDi=true;
isEnd=true;
}
}
}
public void collision(){
int i;
int tx,ty;
for(i=0;i<4;i++){
tx=cx+x[i];
ty=cy+y[i];
if(tx>=1){
if(s[ty][tx-1]==1){
isLeft=true;
}
}
if(tx<=8){
if(s[ty][tx+1]==1){
isRight=true;
}
}
if(ty<=18){
if(s[ty+1][tx]==1){
isDi=true;
isEnd=true;
if(isNew){
isOver=true;
}
}
}
}
}
public void endkuai(){
int i;
int m,n;
for(i=0;i<4;i++){
m=cx+x[i];
n=cy+y[i];
s[n][m]=1;
}
isEnd=false;
isNew=true;
clearflag();
}
public void drawkuai(){
int i;
paint.setColor(Color.YELLOW);
for(i=0;i<4;i++){
canvas.drawRect(kuai[i], paint);
}
paint.setColor(Color.WHITE);
}
public void drawinfo(){
paint.setTextSize(20);
canvas.drawText("俄罗斯方块 V1.0", 140, 80, paint);
canvas.drawText("得分 "+String.valueOf(score), 340, 250, paint);
canvas.drawText("速度 "+String.valueOf(speed), 360, 270, paint);
if(isOver){
canvas.drawText("GAME OVER!",300,200, paint);
}
}
public void drawnext(){
int i,j;
paint.setColor(Color.GREEN);
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(zh[nextkb][i][j]==1){
canvas.drawRect(new
Rect(330+i*20,150+j*20,348+i*20,168+j*20), paint);
}
}
}
paint.setColor(Color.WHITE);
}
@Override
public boolean onKeyDown(int keyCode,KeyEvent
event){
if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
dir=UP;
}else
if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
dir=DOWN;
}else
if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
dir=LEFT;
}else
if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
dir=RIGHT;
}else if(keyCode==KeyEvent.KEYCODE_5){
isPause=!isPause;
}else if(keyCode==KeyEvent.KEYCODE_2){
speed-=100;
}else if(keyCode==KeyEvent.KEYCODE_8){
speed+=100;
}else if(keyCode==KeyEvent.KEYCODE_R){
regame();
}
return super.onKeyDown(keyCode, event);
}
}