1 packagecom;2
3 importjava.awt.Color;4 importjava.awt.Graphics;5 importjava.awt.event.KeyEvent;6 importjava.awt.event.KeyListener;7 importjava.util.Random;8
9 importjavax.swing.JFrame;10 importjavax.swing.JPanel;11
12 public class Eluos extendsJFrame{13
14
15 privateEluo_panel jPanel;16
17 private int this_width=500,this_height=500;18 publicEluos(){19
20 this.setSize(this_width, this_height);21
22 jPanel=newEluo_panel();23 this.add(jPanel);24
25
26 this.setDefaultCloseOperation(EXIT_ON_CLOSE);27 this.setVisible(true);28
29 this.addKeyListener(newKeyListener() {30
31 @Override32 public voidkeyTyped(KeyEvent e) {33 }34
35 @Override36 public voidkeyReleased(KeyEvent e) {37 System.out.println("type");38 switch(e.getKeyCode()) {39 caseKeyEvent.VK_LEFT:40
41 Eluos.this.jPanel.moveOther(Eluo_panel.MOVE_RIGHT, Eluos.this.jPanel.curt_xingzhuang);42 break;43 caseKeyEvent.VK_RIGHT:44
45 Eluos.this.jPanel.moveOther(Eluo_panel.MOVE_LEFT, Eluos.this.jPanel.curt_xingzhuang);46 break;47
48
49
50 caseKeyEvent.VK_UP:51 System.out.println(Eluos.this.jPanel.curt_xingzhuang);52 Eluos.this.jPanel.curt_xingzhuang=
53 Eluos.this.jPanel.bianXing(Eluos.this.jPanel.fangkuai.d, Eluos.this.jPanel.curt_xingzhuang);54
55 break;56 }57
58 }59
60 @Override61 public voidkeyPressed(KeyEvent e) {62
63
64
65 }66 });67
68 }69
70 public static voidmain(String[] args) {71
72 newEluos();73
74 }75
76 }77
78 class Eluo_panel extends JPanel implementsRunnable{79
80 Fangkuai fangkuai;81
82
83
84 int huatu[][]=new int[20][20];85 long now_time=0;86 Random random=newRandom();87 Color color=new Color(0);88 static final int MOVE_LEFT=1;89 static final int MOVE_RIGHT=2;90
91 boolean game_over=false;92 intcurt_xingzhuang[][];93 publicEluo_panel(){94
95 fangkuai=createNewFangkui();96
97 Thread thread=new Thread(this);98 thread.start();99
100
101 }102 @Override103 public voidpaint(Graphics g) {104 super.paint(g);105
106 drawBack(g);107 drawFangkui(g,curt_xingzhuang);108 moveDown(curt_xingzhuang);109 }110
111 /**
112 * 画背景113 *@paramg114 */
115 voiddrawBack(Graphics g){116
117
118 for (int i = 0; i < huatu.length; i++) {119 for (int j = 0; j < huatu[i].length; j++) {120 if(huatu[i][j]!=0)121 g.fillRect(j*20, i*20, Fangkuai.width-1,Fangkuai.height-1);122 }123 }124 }125
126 /**
127 * 画一个方块128 *@paramg129 *@paramcurt_xing130 */
131 void drawFangkui(Graphics g,intcurt_xing[][]){132
133
134 if(fangkuai==null)135 {136 fangkuai=createNewFangkui();137
138 }139
140 if(curt_xing!=null){141 int y=0;boolean b=false;142 for (int i = 0; i < curt_xing.length; i++) {143 for (int j = 0; j < curt_xing[i].length; j++) {144 if(curt_xing[i][j]!=0)145 {146
147 g.setColor(fangkuai.getColor());148 g.fillRect((fangkuai.run_x+j)*Fangkuai.width, (fangkuai.run_y+y)*Fangkuai.height,149 Fangkuai.width-1, Fangkuai.height-1);150 b=true;151
152 }153
154 }155 if(b)156 y++;157
158
159 }160
161 }162 }163 /**
164 * 创建一个方块165 *@return
166 */
167 privateFangkuai createNewFangkui(){168
169 int index=0;170 Random random=newRandom();171 Fangkuai fangkuai=newFangkuai();172 Color color=new Color(random.nextInt(255),173 random.nextInt(255),random.nextInt(255));174
175 index=random.nextInt(4);176 fangkuai.setColor(color);177 curt_xingzhuang=Fangkuai.xingzhuangs[index];178
179 returnfangkuai;180 }181
182 /**
183 * 判断是否能够向下移动184 *@paramxingzhuang185 *@return
186 */
187 boolean isCan_down(intxingzhuang[][]){188
189
190 int y=0;boolean b=false;191 for (int i = 0; i < xingzhuang.length; i++) {192 for (int j = 0; j < xingzhuang[i].length; j++) {193 if(xingzhuang[i][j]!=0)194 {195 b=true;196 if(fangkuai.run_y+y>=19||huatu[fangkuai.run_y+y+1][fangkuai.run_x+j]!=0){197 return false;198 }199
200 }201
202 }203 if(b)204 y++;205
206 }207
208 return true;209 }210 /**
211 * 变形212 */
213
214 public int[][] bianXing(int d,intarr[][]){215
216 if(arr==null||arr[0]==null)217 return null;218
219 int arr2[][]=new int[arr.length][arr[0].length];220
221
222 switch(d) {223 case 1:224
225
226 for (int i = 0; i < arr.length; i++) {227 for (int j = 0; j < arr[i].length; j++) {228 arr2[j][arr[i].length-1-i]=arr[i][j];229 }230 }231
232
233 break;234
235 default:236 break;237 }238
239 for (int i = 0; i < arr2.length; i++) {240
241 for (int j = 0; j < arr2[i].length; j++) {242
243 if(arr2[i][j]!=0)244 {245 if(fangkuai.run_x+j>19||fangkuai.run_y+i>19||fangkuai.run_x+i<0
246 ||huatu[fangkuai.run_y+i][fangkuai.run_x+j]!=0)247 returnarr;248 }249 }250 }251
252 returnarr2;253
254 }255 /**
256 * 向下移动257 *@paramxingzhuang258 */
259 private void moveDown(intxingzhuang[][]){260
261 if(isCan_down(xingzhuang))262 fangkuai.run_y++;263
264 else
265 {266
267 /**
268 * 如果不能向下移动就把当前方块的0和1 映射到整个面板上,重新创建一个方块269 */
270 int y=0;boolean b=false;271 for (int i = 0; i < xingzhuang.length; i++) {272 for (int j = 0; j < xingzhuang[i].length; j++) {273 if(xingzhuang[i][j]!=0)274 {275 huatu[fangkuai.run_y+y][fangkuai.run_x+j]=1;276 b=true;277 }278
279 }280 if(b)281 y++;282
283 }284
285
286 xiaoChu();287 for (int i = 0; i < huatu[0].length; i++) {288 if(huatu[0][i]!=0)289 game_over=true;290 }291
292 fangkuai=createNewFangkui();293 }294
295 }296 public voidxiaoChu(){297
298 boolean xiao=false;299
300 for (int i = huatu.length-1; i >=0; i--) {301
302 xiao=false;303 int j=0;304 for ( j = 0; j < huatu[i].length; j++) {305 if(huatu[i][j]==0)306 break;307 }308
309 if(j==huatu[i].length)310 xiao=true;311
312
313 if(xiao){314
315 for ( j = i; j >0; j--) {316 for (int j2 = 0; j2 < huatu[j].length; j2++) {317 huatu[j][j2]=huatu[j-1][j2];318 }319 }320 for ( j = 0; j
324 }325
326 }327 }328 /**
329 *http://www.cnblogs.com/roucheng/
330 *@paramd331 *@paramxingzhuang332 */
333 void moveOther(int d,intxingzhuang[][]){334
335 int dx=d==MOVE_LEFT?1:-1;336 if(is_CanMoveOther(d, xingzhuang)){337 fangkuai.run_x+=dx;338 }339 }340 private boolean is_CanMoveOther(int d,intxingzhuang[][]){341
342 int dx=d==MOVE_LEFT?1:-1;343 int y=0;boolean has=false;344 for (int i = 0; i < xingzhuang.length; i++) {345 has=false;346 for (int j = 0; j < xingzhuang[i].length; j++) {347
348 if(xingzhuang[i][j]!=0)349 {350 if(d==MOVE_LEFT&&fangkuai.run_x+j>=19||d==MOVE_RIGHT&&fangkuai.run_x+j<=0)351
352 return false;353 has=true;354 if(huatu[fangkuai.run_y+y][fangkuai.run_x+j+dx]!=0){355 return false;356 }357 }358 }359 if(has)360 y++;361 }362
363 return true;364 }365
366
367
368
369 @Override370 public voidrun() {371
372
373 while(!game_over)374 {375
376
377 this.repaint();378 try{379 Thread.sleep(300);380 } catch(InterruptedException e) {381 e.printStackTrace();382 }383 }384 }385
386 }387 classFangkuai {388
389
390
391 privateColor color;392
393 int run_x=10,run_y;394
395 int d=1;396
397 static final int width=20,height=20;398
399 public static final int xingzhuangs[][][]={400 {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},401 {0,0,0,0,1,1,1,1},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}},402
403 {{0,0,1,0},{0,1,1,1},{0,0,0,0},{0,0,0,0}},//土形
404 {{0,0,0,0},{1,0,0,0},{1,1,0,0},{0,1,0,0}},405 {{1,1,1,1},{1,0,0,0},{0,0,0,0},{0,0,0,0}},//T形
406 {{1,1},{1,1}}407
408 };409
410 publicColor getColor() {411 returncolor;412 }413
414 public voidsetColor(Color color) {415 this.color =color;416 }417
418 public intgetRun_x() {419 returnrun_x;420 }421
422 public void setRun_x(intrun_x) {423 this.run_x =run_x;424 }425
426 public intgetRun_y() {427 returnrun_y;428 }429
430 public void setRun_y(intrun_y) {431 this.run_y =run_y;432 }433
434
435
436
437 }