一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java編程經典小游戲設計-打磚塊小游戲源碼

Java編程經典小游戲設計-打磚塊小游戲源碼

2021-02-04 11:07LeoZhan Java教程

這篇文章主要介紹了Java編程經典小游戲設計-打磚塊小游戲源碼,還是挺不錯的,具有一定參考價值,需要的朋友可以了解下。

[程序中使用的數據結構和符號說明]

HitBrick類

GreenBallThread控制小球路線

xUp,yUp,bouncing定義變量存儲16位數值形式

x,y小球坐標

xDx,yDy坐標增量

MAX_X,MAX_Y坐標最大值

renew初始化

label標簽

Rx,Ry橫板坐標

Brick[]磚塊

ball小球

HitBrick()定義小球橫板及磚塊位置坐標

keyPressd(keyEent)定義小球啟動鍵(按空格鍵啟動)

keyReleased(keyEvent)接收鍵盤事件偵聽器接口)

keyTyped(keyEvent)鍵入空格鍵時調用keyEvent

paint(Graphics)對磚塊填充顏色

move定義小球的運動軌跡和磚塊的消失

main主函數

BallThread類

通過繼承Thread類使Ball類線程化,并把小球的彈跳動作放進Run()中執行

Brick類

定義磚塊坐標位置和磚塊按鈕

Ball類

定義小球坐標位置

[程序設計流程]

程序中使用的部分方法解釋

開始命令:空格鍵

privateJLabellabel;定義一個標簽,label=newJLabel("按空格鍵開始");內容為空格鍵開始,addKeyListener(this);定義一個鍵盤監聽器,

?
1
2
3
4
5
6
7
8
9
if (e.getKeyCode() ==e.VK_SPACE) {
   if(renew){
    greenBallThread=new BallThread(this);
    bouncing = true;
    greenBallThread.start();
    label.setVisible(false);
   }
   renew=false;
  }

重置并開始游戲

移動命令:方向鍵左鍵和右鍵

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(e.getKeyCode()==e.VK_LEFT){
   Rx=Rx-20;
   if(bouncing){
    if(Rx<0){
     Rx=0;
    }
   }
   else{
    if(Rx<0){
     Rx=0;
    }
    else{
     x=x-20;
     ball.ball_x=x;
    }
   }
   repaint();
  }

同開始命令原理,如果鍵入左鍵,橫版向左移動20個單位(Rx為橫板坐標),如果小球還在運動,當橫板移到最左側(Rx=0),不能再向左移動,則橫板靠在最左側(Rx=0),

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(e.getKeyCode()==e.VK_RIGHT){
   Rx=Rx+20;
   if(bouncing){
    if(Rx+80>300){
     Rx=220;
    }
   }
   else{
    if(Rx+80>300){
     Rx=220;
    }
    else{
     x=x+20;
     ball.ball_x=x;
    }
   }
   repaint();
  }
 }

向右移動同向左移動原理,因為定義界面橫坐標最大值為300,橫板長度80,故Rx=220時碰最右側

磚塊設定:

?
1
2
3
4
5
6
7
brick[0]=new Brick(0,60,50,20);
  brick[1]=new Brick(50,60,50,20);
  brick[2]=new Brick(100,60,50,20);
……
brick[16]=new Brick(200,160,50,20);
  brick[17]=new Brick(250,160,50,20);
  ball=new Ball(150,450,10,10); 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void paint(Graphics g){
  super.paint(g);
  ball.rect.setLocation(x,y);
  if(bouncing){
   for(int i=0;i<=17;i++){
    if(brick[i].visible==true){
     switch(i){
      case 0 :g.setColor(Color.blue);
          break;
      case 1 :g.setColor(Color.cyan);
          break;
      case 2 :g.setColor(Color.gray);
          break;
       ……
case 17 :g.setColor(Color.yellow);
          break;
      }
    g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
    }
   }
   g.setColor(Color.red);
   g.fillOval(x, y, 10, 10);
   g.setColor(Color.blue);
   g.fillRect(Rx,Ry,80,20);

brick[0]=newBrick(0,60,50,20);設置磚塊坐標,ball=newBall(150,450,10,10);和小球的坐標

if(brick[i].visible==true)判斷磚塊存在,用switch語句,逐個對磚塊填充顏色,最后四行代碼是分別對小球和橫板顏色坐標的定義

小球的移動:

?
1
2
3
4
5
6
try{
    Thread.currentThread().sleep(25);
   }
   catch(InterruptedException exception){
    System.err.println(exception.toString());
   }

定義小球的速度,若發生錯誤,則執行catch語句,打印錯誤

?
1
2
3
4
5
6
for(int i=0;i<=17;i++){
    if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){
     brick[i].visible=false;
     yUp=!yUp;/
    }
   }

當小球接觸到磚塊時,磚塊不可見(消失)

?
1
2
3
4
5
if(x+5>Rx&&x+5<Rx+80&&y+10>=Ry){
    yUp=false;
    xDx=(int)(Math.random()*5+2);
    yDy=(int)(Math.random()*5+2);
   }

判斷小球坐標和橫板坐標,當小球落在橫板坐標之內,小球反彈,小球橫坐標和縱坐標都以一個隨機值改變后運動

?
1
2
3
4
5
6
7
8
9
10
11
12
if(xUp==true){
    x+=xDx;
   }
   else{
    x-=xDx;
   }
   if(yUp==true){
    y+=yDy;
   }
   else{
    y-=yDy;
   }

判斷小球橫坐標如果在增加,小球橫坐標=小球原橫坐標+小球橫坐標增量,否則小球橫坐標=小球原橫坐標-小球橫坐標增量;縱坐標同理

?
1
2
3
4
5
6
7
8
9
10
11
12
if(y<=0){
    y=0;
    ball.ball_y=y;
    yUp=true;
    xDx=(int)(Math.random()*5+2);
    yDy=(int)(Math.random()*5+2);
   }
   else if(y>=MAX_Y-15){
    yDy=(int)(Math.random()*5+2);
    //yUp=false;
    break;
   }

判斷小球到畫面頂部(定義頂部的縱坐標為0),小球向下反彈,原理同小球和橫板接觸的反彈規則,否則,判斷小球縱坐標是否大于MAX_Y-15(縱坐標最大值-15),反彈規則改變為橫坐標不變,縱坐標隨機改變

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(x<=0){
    x=0;
    ball.ball_x=x;
    xUp=true;
    xDx=(int)(Math.random()*5+2);
    yDy=(int)(Math.random()*5+2);
   }
   else if(x>=MAX_X-10){
    x=MAX_X-10;
    ball.ball_x=x;
    xDx=(int)(Math.random()*5+2);
    yDy=(int)(Math.random()*5+2);
    xUp=false;
   }

判斷小球到畫面最左側(定義最左側橫坐標為0),向右側反彈,反彈規則同小球和橫板接觸的反彈規則,或者小球到畫面最右側,向左反彈,反彈規則同上,(if(x>=MAX_X-10)判斷小球是否到右邊側,小球的直徑為10)

?
1
2
3
4
5
6
int i;                    
   for(i=0;i<=17&&brick[i].visible==false;i++){ 
   }
   if(i==18){
    break;
   }

如果所有磚塊都不可見,則重新玩

?
1
2
3
4
5
6
7
8
9
10
11
12
13
renew=true;     //初始化
  bouncing=false;
  for(int i=0;i<=17;i++){
   brick[i].visible=true;
  }
  xUp=true;
  yUp=false;
  xDx=1;
  yDy=1;
  x=150;
  y=450;
  Rx=120;
  Ry=460;       //

重新開始,初始化,小球靜止,所有磚塊可見,小球在橫坐標方向,可隨橫板移動而移動,縱坐標在未開時游戲前不能改變,定義小球橫坐標和縱坐標增量都為1,小球初始位置坐標(150,450)橫板初始位置坐標(120,460)

[源程序]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
public class HitBrick extends JFrame implements KeyListener{
    private BallThread greenBallThread;
    //控制小球的線程
    private Boolean xUp,yUp,bouncing;
    private int x,y,xDx,yDy;
    //小球坐標,增量
    private final int MAX_X=300,MAX_Y=500;
    private Boolean renew;
    private JLabel label;
    private int Rx,Ry;
    //橫板坐標
    private Brick brick[]=new Brick[18];
    //磚塊
    private Ball ball;
    //小球
    public HitBrick(){
        super("打磚塊");
        Container pane=getContentPane();
        //設置空白面板容器
        label=new JLabel("按空格鍵開始");
        //標簽
        label.setHorizontalAlignment(JLabel.CENTER);
        //水平
        label.setVerticalAlignment(JLabel.BOTTOM);
        //垂直
        pane.add(label);
        //向面板里添加標簽
        xUp=true;
        //橫坐標可以移動
        yUp=false;
        //縱坐標不可以移動
        xDx=1;
        yDy=1;
        x=150;
        //小球坐標
        y=450;
        Rx=120;
        //橫板坐標
        Ry=460;
        renew=true;
        bouncing=false;
        addKeyListener(this);
        //鍵盤監聽器
        brick[0]=new Brick(0,60,50,20);
        //磚塊坐標
        brick[1]=new Brick(50,60,50,20);
        brick[2]=new Brick(100,60,50,20);
        brick[3]=new Brick(150,60,50,20);
        brick[4]=new Brick(200,60,50,20);
        brick[5]=new Brick(250,60,50,20);
        brick[6]=new Brick(0,90,50,20);
        brick[7]=new Brick(50,110,50,20);
        brick[8]=new Brick(100,130,50,20);
        brick[9]=new Brick(150,130,50,20);
        brick[10]=new Brick(200,110,50,20);
        brick[11]=new Brick(250,90,50,20);
        brick[12]=new Brick(0,160,50,20);
        brick[13]=new Brick(50,160,50,20);
        brick[14]=new Brick(100,160,50,20);
        brick[15]=new Brick(150,160,50,20);
        brick[16]=new Brick(200,160,50,20);
        brick[17]=new Brick(250,160,50,20);
        ball=new Ball(150,450,10,10);
        //球的坐標
        setSize(MAX_X,MAX_Y);
        //窗口大小
        setResizable(false);
        setVisible( true );
        //可視化
    }
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() ==e.VK_SPACE) {
            if(renew){
                greenBallThread=new BallThread(this);
                bouncing = true;
                greenBallThread.start();
                label.setVisible(false);
            }
            renew=false;
        }
        if(e.getKeyCode()==e.VK_LEFT){
            Rx=Rx-20;
            if(bouncing){
                if(Rx<0){
                    Rx=0;
                }
            } else{
                if(Rx<0){
                    Rx=0;
                } else{
                    x=x-20;
                    ball.ball_x=x;
                }
            }
            repaint();
        }
        if(e.getKeyCode()==e.VK_RIGHT){
            Rx=Rx+20;
            if(bouncing){
                if(Rx+80>300){
                    Rx=220;
                }
            } else{
                if(Rx+80>300){
                    Rx=220;
                } else{
                    x=x+20;
                    ball.ball_x=x;
                }
            }
            repaint();
        }
    }
    public void keyReleased (KeyEvent e) {
    }
    public void keyTyped (KeyEvent e){
    }
    public void paint(Graphics g){
        super.paint(g);
        ball.rect.setLocation(x,y);
        if(bouncing){
            for (int i=0;i<=17;i++){
                if(brick[i].visible==true){
                    switch(i){
                        case 0 :g.setColor(Color.blue);
                        break;
                        case 1 :g.setColor(Color.cyan);
                        break;
                        case 2 :g.setColor(Color.gray);
                        break;
                        case 3 :g.setColor(Color.green);
                        break;
                        case 4 :g.setColor(Color.magenta);
                        break;
                        case 5 :g.setColor(Color.yellow);
                        break;
                        case 6 :g.setColor(Color.white);
                        break;
                        case 7 :g.setColor(Color.black);
                        break;
                        case 8 :g.setColor(Color.orange);
                        break;
                        case 9 :g.setColor(Color.pink);
                        break;
                        case 10 :g.setColor(Color.darkGray);
                        break;
                        case 11 :g.setColor(Color.red);
                        break;
                        case 12 :g.setColor(Color.blue);
                        break;
                        case 13 :g.setColor(Color.cyan);
                        break;
                        case 14 :g.setColor(Color.gray);
                        break;
                        case 15 :g.setColor(Color.green);
                        break;
                        case 16 :g.setColor(Color.magenta);
                        break;
                        case 17 :g.setColor(Color.yellow);
                        break;
                    }
                    g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
                }
            }
            g.setColor(Color.red);
            g.fillOval(x, y, 10, 10);
            g.setColor(Color.blue);
            g.fillRect(Rx,Ry,80,20);
        } else{
            for (int i=0;i<=17;i++){
                switch(i){
                    case 0 :g.setColor(Color.blue);
                    break;
                    case 1 :g.setColor(Color.cyan);
                    break;
                    case 2 :g.setColor(Color.gray);
                    break;
                    case 3 :g.setColor(Color.green);
                    break;
                    case 4 :g.setColor(Color.magenta);
                    break;
                    case 5 :g.setColor(Color.yellow);
                    break;
                    case 6 :g.setColor(Color.white);
                    break;
                    case 7 :g.setColor(Color.black);
                    break;
                    case 8 :g.setColor(Color.orange);
                    break;
                    case 9 :g.setColor(Color.pink);
                    break;
                    case 10 :g.setColor(Color.darkGray);
                    break;
                    case 11 :g.setColor(Color.red);
                    break;
                    case 12 :g.setColor(Color.blue);
                    break;
                    case 13 :g.setColor(Color.cyan);
                    break;
                    case 14 :g.setColor(Color.gray);
                    break;
                    case 15 :g.setColor(Color.green);
                    break;
                    case 16 :g.setColor(Color.magenta);
                    break;
                    case 17 :g.setColor(Color.yellow);
                    break;
                }
                g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
            }
            g.setColor(Color.red);
            g.fillOval(x, y, 10, 10);
            g.setColor(Color.blue);
            g.fillRect(Rx, Ry, 80, 20);
        }
    }
    public void move(){
        while(true){
            try{
                Thread.currentThread().sleep(25);
            }
            catch(InterruptedException exception){
                System.err.println(exception.toString());
            }
            for (int i=0;i<=17;i++){
                if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){
                    brick[i].visible=false;
                    yUp=!yUp;
                    //打到球不可見
                }
            }
            if(x+5>Rx&&x+5<Rx+80&&y+10>=Ry){
                yUp=false;
                xDx=(int)(Math.random()*5+2);
                //小球坐標增量
                yDy=(int)(Math.random()*5+2);
            }
            if(xUp==true){
                x+=xDx;
                //小球左右移動坐標改變
            } else{
                x-=xDx;
            }
            if(yUp==true){
                y+=yDy;
            } else{
                y-=yDy;
            }
            if(y<=0){
                y=0;
                ball.ball_y=y;
                yUp=true;
                xDx=(int)(Math.random()*5+2);
                yDy=(int)(Math.random()*5+2);
            } else if(y>=MAX_Y-15){
                yDy=(int)(Math.random()*5+2);
                //yUp=false;
                break;
            }
            if(x<=0){
                x=0;
                ball.ball_x=x;
                xUp=true;
                xDx=(int)(Math.random()*5+2);
                yDy=(int)(Math.random()*5+2);
            } else if(x>=MAX_X-10){
                x=MAX_X-10;
                ball.ball_x=x;
                xDx=(int)(Math.random()*5+2);
                yDy=(int)(Math.random()*5+2);
                xUp=false;
            }
            ball.rect.setLocation(ball.ball_x,ball.ball_y);
            repaint();
            int i;
            //如果所有磚塊都不可見
            for (i=0;i<=17&&brick[i].visible==false;i++){
                //則重新玩
            }
            if(i==18){
                break;
            }
            //
        }
        renew=true;
        //初始化
        bouncing=false;
        for (int i=0;i<=17;i++){
            brick[i].visible=true;
        }
        xUp=true;
        yUp=false;
        xDx=1;
        yDy=1;
        x=150;
        y=450;
        Rx=120;
        Ry=460;
        //
        repaint();
        repaint();
        label.setVisible(true);
    }
    public static void main(String[] args) {
        HitBrick mar=new HitBrick();
    }
}
class BallThread extends Thread{
    private HitBrick m;
    BallThread(HitBrick a){
        //super();
        m=a;
    }
    public void run(){
        m.move();
        m.repaint();
    }
}
class Brick{
    Rectangle rect=null;
    //長方形對象,磚塊按鈕的位置和寬高
    int brick_x,brick_y;
    //按扭的左上角坐標
    int brick_width,brick_height;
    //按扭的寬和高
    Boolean visible;
    public Brick(int x,int y,int w,int h)
       {
        brick_x=x;
        brick_y=y;
        brick_width=w;
        brick_height=h;
        visible=true;
        rect=new Rectangle(x,y,w,h);
        //創建長方形對象---磚塊按鈕的位置和寬高。
    }
}
class Ball{
    Rectangle rect=null;
    int ball_x,ball_y;
    int ball_width,ball_height;
    public Ball(int x,int y,int w,int h){
        ball_x=x;
        ball_y=y;
        ball_width=w;
        ball_height=h;
        rect=new Rectangle(x,y,w,h);
    }
}

運行結果:

Java編程經典小游戲設計-打磚塊小游戲源碼

空格鍵開始,方向鍵控制左右,死亡重新開始。

雖然系統的基本功能都已實現,但還是存在系統不穩定等多個bug尚待解決。在做系統的過程中遇到了很多問題,有的是知識存儲不足,有的是考慮不夠周全,所以學習之路永無止境。作為一個程序編程人員,要保持清醒的頭腦,以現實為依據,讓自己的每一行代碼都能實現自己的意義。

總結

以上就是本文關于Java編程經典小游戲設計-打磚塊小游戲源碼的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/niaizhan/article/details/23104247

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频一区国产精戏刘婷30 | 国产精品美女久久久久 | 春意影院午夜爽爽爽免费 | 久久人妻少妇嫩草AV無碼 | 30分钟的高清视频在线观看 | 欧美一级激情 | 日本五十路六十30人8时间 | 国产高清在线观看 | 高清国产激情视频在线观看 | 国产久草在线 | 亚洲国产高清视频 | 久久视频精品3线视频在线观看 | 18无删减羞羞网站动漫 | 精品国产一级毛片大全 | 精品一区二区三区高清免费不卡 | 亚洲毛片免费看 | 亚洲第一色区 | 欧美涩区 | 日本福利视频一区 | 胸大的姑娘中文字幕视频 | 波多野结衣亚洲一区 | 日朝欧美亚洲精品 | 91视频a | 美女一级ba大片免色 | 波多野结衣同性系列698 | 我的家教老师 | 91精品国产91热久久久久福利 | 2021国产精品成人免费视频 | 国产精品色爱综合网 | 国产一区二区不卡视频 | 狠狠色 | 精品午夜寂寞黄网站在线 | juliaann大战两个黑人 | 大香焦在线观看 | 91精品国产高清久久久久久io | v视界影院.vsjla | 二区三区不卡不卡视频 | 国产播放器一区 | chinese圣水黄金调教 | 国产精品视频免费一区二区三区 | 高清欧美不卡一区二区三区 |