弑月繁枫
helloworld
posts - 0,comments - 0,trackbacks - 0
  1 
  2 /** 以下为俄罗斯方块的方块积木,因为每一个落下的积木经过操作后就由移动的状态变为静止状态,
  3  *  这些积木的动作可以看作是多个进程在经过一系列操作后结束,所以可以通过继承Thread进程类来实现*/
  4 public class ErsBlock extends Thread{
  5     //这里和ErsBox中的静态参数一样,作为参考值
  6     public final static int BOXES_ROWS=4;
  7     public final static int BOXES_COLS=4;
  8     //每一个积木移下一次所需的时间
  9     public int BETWEEN_LEVEls_DEGRESS_TIME=430;
 10     //有7种积木,每种4个变化
 11     public final static int BLOCK_KIND_NUMBER=7;
 12     public final static int BLOCK_STATUS_NUMBER=4;
 13     //16进制表示每种每一个变化的积木
 14     public final static int[][] STYLES={
 15         {0x0f00,0x4444,0x0f00,0x4444},
 16         {0x04e0,0x0464,0x00e4,0x04c4},
 17         {0x4620,0x6c00,0x4620,0x6c00},
 18         {0x2640,0xc600,0x2640,0xc600},
 19         {0x6220,0x1700,0x2230,0x0740},
 20         {0x6440,0x0e20,0x44c0,0x8e00},
 21         {0x0660,0x0660,0x0660,0x0660},
 22     }; 
 23     //画布类+参数
 24     private GameCanvas canvas;
 25     //显示积木,为一个4x4的格组
 26     private ErsBox[][] boxes=new ErsBox[BOXES_ROWS][BOXES_COLS];
 27     private int style,y,x;
 28     //记录积木状态
 29     private boolean pausing=false,moving=true;
 30     //主类构造,带有每一个积木的位置信息,
 31     public ErsBlock(int style,int y,int x,GameCanvas canvas) {
 32         this.style=style;
 33         this.y=y;
 34         this.x=x;
 35         this.canvas=canvas;
 36         int key=0x8000;
 37         for(int i=0;i<boxes.length;i++){
 38             for(int j=0;j<boxes[i].length;j++){
 39                 boolean isColor=((style&key)!=0);
 40                 boxes[i][j]=new ErsBox(isColor);
 41                 key>>=1;
 42             }
 43         }
 44         display();
 45     }
 46     //时间与级数有关
 47     public void setLevelTime(int lev){
 48         BETWEEN_LEVEls_DEGRESS_TIME=lev;
 49     }
 50     //thread类,必须实现run函数,没有停止前每到一个时间周期下落一次
 51     public void run(){
 52         while(moving){
 53             try{
 54                 sleep(BETWEEN_LEVEls_DEGRESS_TIME);//*(ErsBlocksGame.MAX_LEVEL-level+LEVEL_FLATNESS_GENE));
 55             }
 56             catch(InterruptedException ie){
 57                 ie.printStackTrace();
 58             }
 59             if(!pausing)
 60                 moving=(moveTo(y+1,x)&&moving);
 61         }
 62     }
 63     //3个方向移动
 64     public void moveLeft(){
 65         moveTo(y,x-1);
 66     }
 67     public void moveRight(){
 68         moveTo(y,x+1);
 69     }
 70     public void moveDown(){
 71         moveTo(y+1,x);
 72     }
 73     //变化为下一个
 74     public void turnNext(){
 75         for(int i=0;i<BLOCK_KIND_NUMBER;i++)
 76             for(int j=0;j<BLOCK_STATUS_NUMBER;j++){
 77                 if(STYLES[i][j]==style){
 78                     int newStyle=STYLES[i][(j+1)%BLOCK_STATUS_NUMBER];
 79                     turnTo(newStyle);
 80                     return ;
 81                 }
 82             }
 83     }
 84     //设置状态
 85     public void pauseMove(){
 86         pausing=true;
 87     }
 88     public void resumeMove(){
 89         pausing=false;
 90     }
 91     public void stopMove(){
 92         moving=false;
 93     }
 94     //每一次移动都要先抹去痕迹
 95     private void erase(){
 96         for(int i=0;i<boxes.length;i++)
 97             for(int j=0;j<boxes[i].length;j++){
 98                 if(boxes[i][j].isColorBox()){
 99                     ErsBox box=canvas.getBox(i+y,j+x);
100                     if(box==null)
101                         continue;
102                     box.setColor(false);
103                 }
104             }
105     }
106     //显示操作后的积木
107     private void display(){
108         for(int i=0;i<boxes.length;i++)
109             for(int j=0;j<boxes[i].length;j++){
110                 if(boxes[i][j].isColorBox()){
111                     ErsBox box=canvas.getBox(i+y,j+x);
112                     if(box==null)
113                         continue;
114                     box.setColor(true);
115                 }
116             }
117     }
118     //判断是否可以移动
119     private boolean isMoveAble(int newRow,int newCol){
120         erase();
121         for(int i=0;i<boxes.length;i++)
122             for(int j=0;j<boxes[i].length;j++){
123                 if(boxes[i][j].isColorBox()){
124                     ErsBox box=canvas.getBox(i+newRow,j+newCol);
125                     if(box==null||(box.isColorBox())){
126                         display();
127                         return false;
128                     }
129                 }
130             }
131         display();
132         return true;
133     }
134     //移动到下一个位置,这里synchronized表示这个动作不受其他进程的影响,单独进行,
135     //也就是可以边下落,边接受操作
136     private synchronized boolean moveTo(int newRow,int newCol){
137         if(!isMoveAble(newRow,newCol)||!moving)
138             return false;
139         erase();
140         y=newRow;
141         x=newCol;
142         display();
143         canvas.repaint();
144         return true;
145     }
146     //判断是否可以变化
147     private boolean isTurnAble(int newStyle){
148         int key=0x8000;
149         erase();
150         for(int i=0;i<boxes.length;i++)
151             for(int j=0;j<boxes[i].length;j++){
152                 if((newStyle&key)!=0){
153                     ErsBox box=canvas.getBox(y+i,x+j);
154                     if(box==null||box.isColorBox()){
155                         display();
156                         return false;
157                     }
158                 }
159                 key>>=1;
160             }
161         display();
162         return true;
163     }
164     //变化到下一个状态
165     private boolean turnTo(int newStyle){
166         if(!isTurnAble(newStyle)||!moving)
167             return false;
168         erase();
169         int key=0x8000;
170         for(int i=0;i<boxes.length;i++)
171             for(int j=0;j<boxes[i].length;j++){
172                 boolean isColor=((newStyle&key)!=0);
173                 boxes[i][j].setColor(isColor);
174                 key>>=1;
175             }
176         style=newStyle;
177         display();
178         canvas.repaint();
179         return true;
180     }
181 }
182 
posted on 2012-03-10 20:49 吖鑵_sysu 阅读(468) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: