技術源於分享,因此今天抽空把本身以前用java作過的小遊戲整理貼出來給你們參考學習。java確實不適合寫桌面應用,這裏只是經過這個遊戲讓你們理解oop面向對象編程的過程,純屬娛樂。代碼寫的很簡單,也很容易理解,而且註釋寫的很清楚了,還有問題,本身私下去知海匠庫補課學習。java
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
|
import
java.util.Random;
敵飛機: 是飛行物,也是敵人
public
class
Airplane
extends
FlyingObject
implements
Enemy {
private
int
speed =
3
;
//移動步驟
/** 初始化數據 */
public
Airplane(){
this
.image = ShootGame.airplane;
width = image.getWidth();
height = image.getHeight();
y = -height;
Random rand =
new
Random();
x = rand.nextInt(ShootGame.WIDTH - width);
}
/** 獲取分數 */
@Override
public
int
getScore() {
return
5
;
}
/** //越界處理 */
@Override
public
boolean
outOfBounds() {
return
y>ShootGame.HEIGHT;
}
/** 移動 */
@Override
public
void
step() {
y += speed;
}
}
|
1
2
3
4
5
6
7
8
9
|
/**
* 獎勵
*/
public
interface
Award {
int
DOUBLE_FIRE =
0
;
//雙倍火力
int
LIFE =
1
;
//1條命
/** 得到獎勵類型(上面的0或1) */
int
getType();
}
|
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
|
import
java.util.Random;
/** 蜜蜂 */
public
class
Bee
extends
FlyingObject
implements
Award{
private
int
xSpeed =
1
;
//x座標移動速度
private
int
ySpeed =
2
;
//y座標移動速度
private
int
awardType;
//獎勵類型
/** 初始化數據 */
public
Bee(){
this
.image = ShootGame.bee;
width = image.getWidth();
height = image.getHeight();
y = -height;
Random rand =
new
Random();
x = rand.nextInt(ShootGame.WIDTH - width);
awardType = rand.nextInt(
2
);
//初始化時給獎勵
}
/** 得到獎勵類型 */
public
int
getType(){
return
awardType;
}
/** 越界處理 */
@Override
public
boolean
outOfBounds() {
return
y>ShootGame.HEIGHT;
}
/** 移動,可斜着飛 */
@Override
public
void
step() {
x += xSpeed;
y += ySpeed;
if
(x > ShootGame.WIDTH-width){
xSpeed = -
1
;
}
if
(x <
0
){
xSpeed =
1
;
}
}
}
|
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
|
/**
* 子彈類:是飛行物
*/
public
class
Bullet
extends
FlyingObject {
private
int
speed =
3
;
//移動的速度
/** 初始化數據 */
public
Bullet(
int
x,
int
y){
this
.x = x;
this
.y = y;
this
.image = ShootGame.bullet;
}
/** 移動 */
@Override
public
void
step(){
y-=speed;
}
/** 越界處理 */
@Override
public
boolean
outOfBounds() {
return
y<-height;
}
}
|
1
2
3
4
5
6
7
|
/**
* 敵人,能夠有分數
*/
public
interface
Enemy {
/** 敵人的分數 */
int
getScore();
}
|
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
|
import
java.awt.image.BufferedImage;
/**
* 飛行物(敵機,蜜蜂,子彈,英雄機)
*/
public
abstract
class
FlyingObject {
protected
int
x;
//x座標
protected
int
y;
//y座標
protected
int
width;
//寬
protected
int
height;
//高
protected
BufferedImage image;
//圖片
public
int
getX() {
return
x;
}
public
void
setX(
int
x) {
this
.x = x;
}
public
int
getY() {
return
y;
}
public
void
setY(
int
y) {
this
.y = y;
}
public
int
getWidth() {
return
width;
}
public
void
setWidth(
int
width) {
this
.width = width;
}
public
int
getHeight() {
return
height;
}
public
void
setHeight(
int
height) {
this
.height = height;
}
public
BufferedImage getImage() {
return
image;
}
public
void
setImage(BufferedImage image) {
this
.image = image;
}
/**
* 檢查是否出界
* @return true 出界與否
*/
public
abstract
boolean
outOfBounds();
/**
* 飛行物移動一步
*/
public
abstract
void
step();
/**
* 檢查當前飛行物體是否被子彈(x,y)擊(shoot)中
* @param Bullet 子彈對象
* @return true表示被擊中了
*/
public
boolean
shootBy(Bullet bullet){
int
x = bullet.x;
//子彈橫座標
int
y = bullet.y;
//子彈縱座標
return
this
.x<x && x<
this
.x+width &&
this
.y<y && y<
this
.y+height;
}
}
|
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
|
import
java.awt.image.BufferedImage;
/**
* 英雄機:是飛行物
*/
public
class
Hero
extends
FlyingObject{
private
BufferedImage[] images = {};
//英雄機圖片
private
int
index =
0
;
//英雄機圖片切換索引
private
int
doubleFire;
//雙倍火力
private
int
life;
//命
/** 初始化數據 */
public
Hero(){
life =
3
;
//初始3條命
doubleFire =
0
;
//初始火力爲0
images =
new
BufferedImage[]{ShootGame.hero0, ShootGame.hero1};
//英雄機圖片數組
image = ShootGame.hero0;
//初始爲hero0圖片
width = image.getWidth();
height = image.getHeight();
x =
150
;
y =
400
;
}
/** 獲取雙倍火力 */
public
int
isDoubleFire() {
return
doubleFire;
}
/** 設置雙倍火力 */
public
void
setDoubleFire(
int
doubleFire) {
this
.doubleFire = doubleFire;
}
/** 增長火力 */
public
void
addDoubleFire(){
doubleFire =
40
;
}
/** 增命 */
public
void
addLife(){
//增命
life++;
}
/** 減命 */
public
void
subtractLife(){
//減命
life--;
}
/** 獲取命 */
public
int
getLife(){
return
life;
}
/** 當前物體移動了一下,相對距離,x,y鼠標位置 */
public
void
moveTo(
int
x,
int
y){
this
.x = x - width/
2
;
this
.y = y - height/
2
;
}
/** 越界處理 */
@Override
public
boolean
outOfBounds() {
return
false
;
}
/** 發射子彈 */
public
Bullet[] shoot(){
int
xStep = width/
4
;
//4半
int
yStep =
20
;
//步
if
(doubleFire>
0
){
//雙倍火力
Bullet[] bullets =
new
Bullet[
2
];
bullets[
0
] =
new
Bullet(x+xStep,y-yStep);
//y-yStep(子彈距飛機的位置)
bullets[
1
] =
new
Bullet(x+
3
*xStep,y-yStep);
return
bullets;
}
else
{
//單倍火力
Bullet[] bullets =
new
Bullet[
1
];
bullets[
0
] =
new
Bullet(x+
2
*xStep,y-yStep);
return
bullets;
}
}
/** 移動 */
@Override
public
void
step() {
if
(images.length>
0
){
image = images[index++/
10
%images.length];
//切換圖片hero0,hero1
}
}
/** 碰撞算法 */
public
boolean
hit(FlyingObject other){
int
x1 = other.x -
this
.width/
2
|