java俄罗斯方块游戏代码:
1 package com; 2 3 import java.awt.Color; 4 import java.awt.Graphics; 5 import java.awt.event.KeyEvent; 6 import java.awt.event.KeyListener; 7 import java.util.Random; 8 9 import javax.swing.JFrame; 10 import javax.swing.JPanel; 11 12 public class Eluos extends JFrame{ 13 14 15 private Eluo_panel jPanel; 16 17 private int this_width=500,this_height=500; 18 public Eluos(){ 19 20 this.setSize(this_width, this_height); 21 22 jPanel=new Eluo_panel(); 23 this.add(jPanel); 24 25 26 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 27 this.setVisible(true); 28 29 this.addKeyListener(new KeyListener() { 30 31 @Override 32 public void keyTyped(KeyEvent e) { 33 } 34 35 @Override 36 public void keyReleased(KeyEvent e) { 37 System.out.println("type"); 38 switch (e.getKeyCode()) { 39 case KeyEvent.VK_LEFT: 40 41 Eluos.this.jPanel.moveOther(Eluo_panel.MOVE_RIGHT, Eluos.this.jPanel.curt_xingzhuang); 42 break; 43 case KeyEvent.VK_RIGHT: 44 45 Eluos.this.jPanel.moveOther(Eluo_panel.MOVE_LEFT, Eluos.this.jPanel.curt_xingzhuang); 46 break; 47 48 49 50 case KeyEvent.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 @Override 61 public void keyPressed(KeyEvent e) { 62 63 64 65 } 66 }); 67 68 } 69 70 public static void main(String[] args) { 71 72 new Eluos(); 73 74 } 75 76 } 77 78 class Eluo_panel extends JPanel implements Runnable{ 79 80 Fangkuai fangkuai; 81 82 83 84 int huatu[][]=new int[20][20]; 85 long now_time=0; 86 Random random=new Random(); 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 int curt_xingzhuang[][]; 93 public Eluo_panel(){ 94 95 fangkuai=createNewFangkui(); 96 97 Thread thread=new Thread(this); 98 thread.start(); 99 100 101 } 102 @Override 103 public void paint(Graphics g) { 104 super.paint(g); 105 106 drawBack(g); 107 drawFangkui(g,curt_xingzhuang); 108 moveDown(curt_xingzhuang); 109 } 110 111 /** 112 * 画背景 113 * @param g 114 */ 115 void drawBack(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 * @param g 129 * @param curt_xing 130 */ 131 void drawFangkui(Graphics g,int curt_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 private Fangkuai createNewFangkui(){ 168 169 int index=0; 170 Random random=new Random(); 171 Fangkuai fangkuai=new Fangkuai(); 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 return fangkuai; 180 } 181 182 /** 183 * 判断是否能够向下移动 184 * @param xingzhuang 185 * @return 186 */ 187 boolean isCan_down(int xingzhuang[][]){ 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,int arr[][]){ 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 return arr; 248 } 249 } 250 } 251 252 return arr2; 253 254 } 255 /** 256 * 向下移动 257 * @param xingzhuang 258 */ 259 private void moveDown(int xingzhuang[][]){ 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 void xiaoChu(){ 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 <huatu[0].length; j++) { 321 huatu[0][j]=0; 322 } 323 324 } 325 326 } 327 } 328 /** 329 * http://www.cnblogs.com/roucheng/ 330 * @param d 331 * @param xingzhuang 332 */ 333 void moveOther(int d,int xingzhuang[][]){ 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,int xingzhuang[][]){ 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 @Override 370 public void run() { 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 class Fangkuai { 388 389 390 391 private Color 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 public Color getColor() { 411 return color; 412 } 413 414 public void setColor(Color color) { 415 this.color = color; 416 } 417 418 public int getRun_x() { 419 return run_x; 420 } 421 422 public void setRun_x(int run_x) { 423 this.run_x = run_x; 424 } 425 426 public int getRun_y() { 427 return run_y; 428 } 429 430 public void setRun_y(int run_y) { 431 this.run_y = run_y; 432 } 433 434 435 436 437 }