-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenemy.java
183 lines (160 loc) · 4.31 KB
/
enemy.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
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
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
/* Model : 1体nの敵に対す処理 */
class P_Enemy {
private Maze maze;
protected int rowenemy;
protected int colenemy;
protected boolean isLive; // 生きているか死んでいるか
protected static int mazesize;
protected int direction;
protected boolean isMove;
public int id = 0;
// 初期化
public P_Enemy(Maze maze) {
this.maze = maze;
mazesize = maze.getMazesize();
isMove = false;
isLive = true;
do { // 敵の座標をランダムで選ぶ。キャラの目の前に現われたらまずいので、とりあえずキャラより5マス離して生成。
Random rnd = new Random();
rowenemy = rnd.nextInt(mazesize - 3) + 1;
colenemy = rnd.nextInt(mazesize - 3) + 1;
} while (maze.getWall(rowenemy, colenemy) || (rowenemy >= mazesize - 5 && colenemy <= 5));
}
// 敵のx座標を返す
public int getRowP_Enemy() {
return rowenemy;
}
// 敵のy座標を返す
public int getColP_Enemy() {
return colenemy;
}
// 敵一体を動かす
public void moveOneEnemy() {
do {
Random rnd = new Random();
direction = rnd.nextInt(4); // 0, 1, 2, 3
if (direction == 0 && !maze.getWall(rowenemy - 1, colenemy) && rowenemy - 1 != 0) {
rowenemy--; // 上に移動
isMove = true;
} else if (direction == 1 && !maze.getWall(rowenemy, colenemy + 1)) {
colenemy++; // 右に移動
isMove = true;
} else if (direction == 2 && !maze.getWall(rowenemy + 1, colenemy) && rowenemy + 1 != maze.getRowstart()) {
rowenemy++; // 下に移動
isMove = true;
} else if (direction == 3 && !maze.getWall(rowenemy, colenemy - 1)) {
colenemy--; // 左に移動
isMove = true;
} else {
isMove = false;
}
} while (!isMove);
isMove = false;
return;
}
// 生きていればtrueを返す
public boolean getlive() {
return isLive;
}
// 敵が死ぬ
public void die() {
isLive = false;
}
// 敵のIDを設定
public void setId(int id) {
this.id = id;
}
// 敵のIDを返す
public int getId() {
return id;
}
}
/* Model : 敵全体の管理・処理 */
class Enemy extends Observable implements ActionListener {
private int maxenemy;
private Map<Integer, P_Enemy> P_ene;
private javax.swing.Timer timer;
private boolean flagdeath;
// コンストラクタ(敵生成)
public Enemy(Maze m, int mode) {
P_ene = new HashMap<>();
maxenemy = selectMaxEnemy(mode);
flagdeath = false;
for (int i = 0; i < maxenemy; i++) {
P_Enemy temp = new P_Enemy(m);
temp.setId(i);
P_ene.put(i, temp);
}
timer = new javax.swing.Timer(1000, this);
timer.start();
}
// 難易度に応じて敵の数を返す
public int selectMaxEnemy(int mode) {
if (mode == 3) {
return 200;
} else if (mode == 2) {
return 30;
} else if (mode == 1) {
return 7;
} else {
return 4;
}
}
// 敵のタイマーを停止する
public void stopTimer() {
timer.stop();
}
// x座標, y座標を渡して、その位置に敵がいればtrue
public boolean getEnemyPosition(int x, int y) {
for (P_Enemy a : P_ene.values()) {
if (a.getRowP_Enemy() == x && a.getColP_Enemy() == y) {
return true;
}
}
return false;
}
// 任意のx, y座標に敵がいればそのキーを返す。いなければ-1を返す。
public int getEnemyKey(int x, int y) {
int key = -1;
for (P_Enemy a : P_ene.values()) {
if (a.getRowP_Enemy() == x && a.getColP_Enemy() == y) {
key = a.getId();
}
}
return key;
}
// 敵の設定数を返す
public int getEnemyCount() {
return maxenemy;
}
// 任意の敵一体の値(value)を返す
public P_Enemy getOneEnemyValue(int id) {
return P_ene.get(id);
}
// 任意の敵一体を殺す
public void killOneEnemy(int id) {
P_ene.remove(id);
flagdeath = true;
setChanged();
notifyObservers();
}
// SEをbooleanで返す
public boolean getFlagDeath() {
boolean temp = flagdeath;
flagdeath = false;
return temp;
}
// timerの処理
// 敵をランダムに動かす
public void actionPerformed(ActionEvent e) {
for (P_Enemy a : P_ene.values()) {
a.moveOneEnemy();
}
setChanged();
notifyObservers();
}
}