java俄罗斯方块游戏代码

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 }

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。