大家好,又见面了,我是全栈君
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 }
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120738.html原文链接:https://javaforall.cn