[程序中使用的数据结构和符号说明]
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
|