-
Notifications
You must be signed in to change notification settings - Fork 0
/
Asteroids.java
477 lines (359 loc) · 17 KB
/
Asteroids.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
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
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
package asteroidymodyfikacja;
//martapalka
import java.awt.*;
import java.io.IOException;
import java.util.Random;
import java.util.Vector;
import javax.swing.JFrame;
/**
*KLASA: Asteroids
*OPIS: Dziedziczy po abstrakcyjnej klasie Game
*UWAGA: W tej klasie znajduje się metoda main
*Instrukcja obsługi:
* 1.Rozszerzenie w postaci zmiany prędkości na szybszą przy naciśnięciu spacji
* 2.Kiedy gracz porusza się szybciej punkty też odpowiednio rosną szybciej
* 3.Poziom zmienia się po upłynięciu czasu określonego w pliku konfiguracyjnym config.txt
* 4.Grę można wygrać "wytrzymując" do końca czasu określonego w pliku konfiguracyjnym
* 5.Wraz ze zmianą poziomu dochodzi do zwiększenia prędkości statku i asteroid
* 6.Co poziom dodawane są nowe asteroidy
* 7.Po utracie życia graczowi przysługuje okres w którym nie może zostać trafiony przez asteroidy
* 8.Naciskając przycisk p na klawiaturze, gracz uruchamia pauzę
* 9.Za strącenie dużej asteroidy graczowi przysługuje 500 punktów
* 10.Za strącenie małej asteroidy graczowi przysługuje 1000 punktów
* 11.Gracz ma 3 życia
* 12.Niektóre asteroidy rozpadają się na dwie mniejsze
*/
public class Asteroids extends Game{
// do pauzowania gry
static boolean pause = false;
// do synchronizacji gry przy rozpoczynaniu, pauzowaniu i kończeniu
static int delay = 100;
static int start = 1;
static int immunity = 100;
static int score = 0;
static int topScore = 0;
Ship ship = new Ship();
int live = 3;
// wektor asteroid inicjuję liczbą wskazaną w pliku konfiguracyjnym
Vector asV = Asteroid.astV(getInnitialAsteroidsNumber());
ReadFile rf = new ReadFile();
boolean alreadyExecuted = false;
boolean alreadyCalled =false;
int helpful=0; //pomoc podczas zmiany poziomów
boolean end=false;
Random random = new Random();
int level = 1;
int time=0;
//punkty za dużą asteroidę
int scoreIn = 0;
//punkty za małą asteroidę
int scoreInsmall=0;
Bullet[] bullets = Bullet.bullets(3);
static int bullet = 0;
static int bulletDelay = 0;
JFrame frame;
//wysokość i szerokość
static int w = getWindowWidthorHeight("width");
static int h = getWindowWidthorHeight("height");
//zmienne używane podczas operacji na plikach
int howManyGamesAlready=1;
boolean statChange = false;
String name;
private String[] results = new String[5];
public Asteroids() {
super("Asteroids", w, h);
this.requestFocus();
this.addKeyListener(ship);
}
/**
* Metoda pozwalająca na pobranie wysokości i szerokości okna z pliku konfiguracyjnego
* @param s parametr mówiący, czy prosimy o wysokość czy szerokość
* @return zwraca wysokość i szerokość okna
*/
static public int getWindowWidthorHeight(String s){
int x = 0;
ReadFile r = new ReadFile();
r.openFile();
r.readFile();
if(s=="width")
{
x= r.width;
}
else if(s=="height"){
x= r.height;
}
return x;
}
/**
* Metoda pozwalająca na pobranie początkowej ilości asteroid z pliku konfiguracyjnego
* @return
*/
public int getInnitialAsteroidsNumber(){
ReadFile r = new ReadFile();
r.openFile();
r.readFile();
int a=r.GetAstNumber(1);
return a;
}
/**
* Metoda która tworzy mniejszą asteroidę
* @param pos
* @return zwraca asteroidę
*/
public Asteroid getSmallAsteroid(Point pos){
Asteroid asteroid = new Asteroid(pos);
asteroid.changeShape();
asteroid.hit=true;
return asteroid;
}
/**
* Główna metoda gry: to w niej rysowana jest plansza
* @param brush typu Graphics
*/
public void paintAll(Graphics brush) {
delay++;
brush.setColor(Color.black);
brush.fillRect(0, 0, w+250, h+250);
if(!alreadyExecuted) {
rf.openFile();
rf.readFile();
alreadyExecuted = true;
}
//włączamy lub wyłączamy pauzę
if (delay > 30) {
if (ship.pKey) {
if (pause) {
pause = false;
delay = 0;
} else {
pause = true;
delay = 0;
}
}
}
if (pause) {
// ekran pauzy
brush.setColor(Color.white);
brush.drawString("GAME PAUSE", 0, (int)(rf.width/55));
brush.drawString("Up Key - Move Forward", 0, (int)(rf.width/3)+(int)(rf.width/55));
brush.drawString("Left Key - Rotate Left", 0, (int)(rf.width/3)+2*(int)(rf.width/55));
brush.drawString("Right Key - Rotate Right", 0, (int)(rf.width/3)+3*(int)(rf.width/55));
brush.drawString("Space Key w/ Up Key - Activate Thrust", 0, (int)(rf.width/3)+4*(int)(rf.width/55));
brush.drawString("P Key - Pause/Resume Game", 0, (int)(rf.width/3)+5*(int)(rf.width/55));
brush.drawString("HIGH SCORE: " + topScore, (int)(rf.height)/2, (int)(rf.width/3));
brush.drawString("Current Score:" + score, ((int)(rf.height)/2)-(int)(rf.height/55), (int)(rf.width/3)+(int)(rf.width/55));
}
else if(end){
brush.setColor(Color.white);
brush.setFont(new Font("Dialog", Font.BOLD, (int)(rf.height)/24));
brush.drawString("YOU", (int)(rf.height)/3, (int)(rf.width/3));
brush.drawString("WON!", (int)(rf.height)/3, (int)(rf.width/3)+(int)(rf.width/30));
brush.drawString("SCORE:" + score, (int)(rf.height)/3, (int)(rf.width/3)+2*(int)(rf.width/30));
brush.setFont(new Font("Dialog", Font.PLAIN, 16));
try {
if (!statChange) {
if(howManyGamesAlready<=5){
results[howManyGamesAlready-1]=Integer.toString(score);
if(howManyGamesAlready==5){
rf.write(results);
rf.highscore(score);
}
}
results[howManyGamesAlready-1]=Integer.toString(score);
statChange = true;
}
} catch (IOException e) {
System.err.println("File error");
}
brush.drawString("Press any key to start again", (int)(rf.height)/3, (int)(rf.width/3)+3*(int)(rf.width/30));
// reset
if ((ship.otherKey || ship.upKey || ship.leftKey || ship.rightKey || ship.space
|| ship.shift) && delay > 50) {
immunity = 100;
live = 3;
score = 0;
time=0;
level=1;
start = 0;
bullets[bullet].counter = bullets[bullet].getCounterLimit(level);
statChange = false;
ship.reset();
asV = Asteroid.astV(getInnitialAsteroidsNumber());
delay = 0;
alreadyExecuted = false;
//alreadyCalled =false;
helpful=0;
end=false;
howManyGamesAlready++;
}
}
else {
brush.setColor(Color.white);
if (live > 0) {
immunity++;
bullets[0].move(ship, level);
if (bullets[0].shoot == true) {
brush.setColor(Color.blue);
bullets[0].paint(brush);
brush.setColor(Color.black);
bullets[0].square.paint(brush);
brush.setColor(Color.white);
brush.drawString("Bullets: 0", 10, 80);
} else {
brush.drawString("Bullets: 1", 10, 80);
}
if (ship.space) {
//punkty rosą szybciej kiedy podróżujemy z wciśniętą spacją
score += 5;
//czas płynie szybciej
time+=2;
if (ship.upKey) {
if (immunity < 100) {
brush.drawString("Protection:" + (300 - immunity), 10, 120);
ship.move(level);
if (immunity % 10 != 0) {
ship.thrust.paint(brush);
}
} else {
ship.move(level);
ship.thrust.paint(brush);
}
} else {
if (immunity < 100) {
brush.drawString("Protection:" + (100 - immunity), 10, 120);
ship.move(level);
if (immunity % 10 != 0) {
ship.paint(brush);
}
} else {
ship.move(level);
ship.paint(brush);
}
}
} else {
if (immunity < 100) {
brush.drawString("Protection:" + (100 - immunity), 10, 120);
ship.move(level);
if (immunity % 10 != 0) {
ship.paint(brush);
}
} else {
ship.move(level);
ship.paint(brush);
}
score++;
time++;
}
brush.drawString("Score:" + score, 10, 20);
brush.drawString("Lives " + live, 10, 40);
brush.drawString("Time "+time, 10, 100);
//tu rysujemy asteroiidy
for (int i = 0; i < asV.size(); i++) {
brush.setColor(Color.pink);
((Asteroid) asV.elementAt(i)).paint(brush);
((Asteroid) asV.elementAt(i)).move(level);
// przypadek stłuczki asteroidy i statku: tracimy życie
if (ship.intersection(((Asteroid) asV.elementAt(i))) && immunity > 100 ) {
live--;
immunity = 0;
ship.reset();
((Asteroid) asV.elementAt(i)).reset();
// delay for end screen
if (live == 0) {
delay = 0;
}
break;
}
// stłuczka asteroidy z pociskiem : asteroida roztrzaskuje się na dwie mniejsze
if (((Asteroid) asV.elementAt(i)).intersection(bullets[bullet].square)
&& bullets[bullet].shoot == true && ((Asteroid) asV.elementAt(i)).hit==false) {
((Asteroid) asV.elementAt(i)).hit=true;
((Asteroid) asV.elementAt(i)).changeShape();
asV.add(i+1, getSmallAsteroid(((Asteroid)asV.elementAt(i)).position));
score += scoreIn;
bullets[bullet].counter = bullets[bullet].getCounterLimit(level);
break;
}
//stłuczka pocisku z małą asteroidą: asteroida znika
if (((Asteroid) asV.elementAt(i)).intersection(bullets[bullet].square) && bullets[bullet].shoot == true && ((Asteroid) asV.elementAt(i)).hit==true) {
((Asteroid) asV.elementAt(i)).reset();
score += scoreInsmall;
bullets[bullet].counter = bullets[bullet].getCounterLimit(level);
}
}
brush.setColor(Color.white);
if (time < rf.getTotalGameTime()) {
brush.drawString("Level: " + level, 10, 60);
scoreIn = 500;
scoreInsmall=1000;
if((time-helpful)>rf.getPlayTime(level)){
helpful+=rf.getPlayTime(level);
level+=1;
//dodajemy ilość asteroid określoną w pliku konfiguracyjnym
int astToAdd=rf.GetAstNumber(level)-rf.GetAstNumber(level-1);
for(int i=0; i<astToAdd; i++) {
asV.addElement(new Asteroid(Asteroid.pos()));
}
}
} else {
//gra wygrana-czas się skończył
alreadyExecuted=false;
end=true;
}
} else {
brush.setFont(new Font("Dialog", Font.BOLD, (int)(rf.height)/24));
brush.drawString("GAME", (int)(rf.height)/3, (int)(rf.width/3));
brush.drawString("OVER", (int)(rf.height)/3, (int)(rf.width/3)+(int)(rf.width/30));
brush.drawString("Score:" + score, (int)(rf.height)/3, (int)(rf.width/3)+2*(int)(rf.width/30));
brush.setFont(new Font("Dialog", Font.PLAIN, (int)(rf.height)/37));
try {
if (!statChange) {
if(howManyGamesAlready<=5){
results[howManyGamesAlready-1]=Integer.toString(score);
if(howManyGamesAlready==5){
rf.write(results);
rf.highscore(score);
}
}
statChange = true;
}
} catch (IOException e) {
System.err.println("File error");
}
brush.drawString("Press any key to start again", (int)(rf.height)/3, (int)(rf.width/3)+3*(int)(rf.width/30));
// reset
if ((ship.otherKey || ship.upKey || ship.leftKey || ship.rightKey || ship.space
|| ship.shift) && delay > 50) {
immunity = 100;
live = 3;
score = 0;
time=0;
level=1;
start = 0;
bullets[bullet].counter = bullets[bullet].getCounterLimit(level);
statChange = false;
ship.reset();
asV = Asteroid.astV(getInnitialAsteroidsNumber());
delay = 0;
alreadyExecuted = false;
//alreadyCalled =false;
helpful=0;
end=false;
howManyGamesAlready++;
}
}
}
}
/**
* KLASA: main
* OPIS: Tworzymy w niej główne okienko aplikacji (MainWindow)
*
*
*/
public static void main(String[] args) {
ReadFile rf= new ReadFile();
rf.openFile();
rf.readFile();
MainWindow a = new MainWindow(rf.height,rf.width);
}
}