-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPartie.java
403 lines (347 loc) · 11.7 KB
/
Partie.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
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.math.*;
public class Partie implements Serializable{
/* Attributs */
/**
* Hauteur de la grille
*/
public final static int hauteur = 10;
/**
* Largeur de la grille
*/
public final static int largeur = 10;
/**
* Tableau à 2 dimensions représentant
*/
private char grille[][];
/**
* Liste des pièces posées
*/
private ArrayList<Piece> piPosees;
/**
* Liste des pièces à poser
*/
private ArrayList<Piece> piaPosees;
/**
* Score de la partie
*/
private double score;
/**
* Constructeur
*/
public Partie() {
this.grille = new char [Partie.largeur][Partie.hauteur];
this.remplirGrille(); // On remplit la grille de .
this.piaPosees = this.listePieceAlea(3);
this.piPosees = new ArrayList<Piece>();
}
/**
* méthode chargée de remplir la grille d'une partie
*/
public void remplirGrille() {
for (int i = 0; i < Partie.largeur; i++) {
for (int j = 0; j < Partie.hauteur; j++) {
this.grille[i][j] = '.';
}
}
}
/**
* méthode qui ajoute une pièce à poser dans la liste
* @param n nombre de pièces à ajouter
*/
public void addPieceAlea(int n) {
for (int i = 0; i < n; i++) {
int nbAlea = (int) (Math.random()*10);
switch (nbAlea) {
case 0:
this.piaPosees.add(new C(0, 0));
break;
case 1:
this.piaPosees.add(new L(0, 0));
break;
case 2:
this.piaPosees.add(new T(0, 0));
break;
case 3:
this.piaPosees.add(new I(0, 0));
break;
case 4:
this.piaPosees.add(new P(0, 0));
break;
case 5:
this.piaPosees.add(new Q(0, 0));
break;
case 6:
this.piaPosees.add(new S(0, 0));
break;
case 7:
this.piaPosees.add(new X(0, 0));
break;
case 8:
this.piaPosees.add(new Z(0, 0));
break;
default:
this.piaPosees.add(new U(0, 0));
break;
}
}
}
/**
* méthode qui retourne une liste de pièce aléatoire
* @param taille nombre de pièce que l'on veut dans notre liste
* @return la liste de pièce
*/
public ArrayList<Piece> listePieceAlea(int taille) {
ArrayList<Piece> tab = new ArrayList<Piece>();
for (int i = 0; i < taille; i++) {
int nbAlea = (int) (Math.random()*10);
switch (nbAlea) {
case 0:
tab.add(new C(0, 0));
break;
case 1:
tab.add(new L(0, 0));
break;
case 2:
tab.add(new T(0, 0));
break;
case 3:
tab.add(new I(0, 0));
break;
case 4:
tab.add(new P(0, 0));
break;
case 5:
tab.add(new Q(0, 0));
break;
case 6:
tab.add(new S(0, 0));
break;
case 7:
tab.add(new X(0, 0));
break;
case 8:
tab.add(new Z(0, 0));
break;
default:
tab.add(new U(0, 0));
break;
}
}
return tab;
}
/**
* méthode qui indique si une pièce déborde ou non
* @param p piece que l'on souhaite poser
* @param x position en largeur de la pièce
* @param y position en hauteur de la pièce
* @return un booleen indiquant si la pièce dépasse de la grille
*/
public boolean debordeGrille(Piece p, int x, int y) {
ArrayList<Carre> lCarre = p.getListe();
int largMax = 0;
int largMin = Partie.largeur;
int hautMax = 0;
int hautMin = Partie.hauteur;
for (Carre carre : lCarre) {
if(carre.getX() > largMax)
largMax = carre.getX();
if(carre.getX() < largMin)
largMin = carre.getX();
if(carre.getY() > hautMax)
hautMax = carre.getY();
if(carre.getY() < hautMin)
hautMin = carre.getY();
}
/* On vérifie si des carrés de la pièce dépassent d'un des bord,
on retourne true */
if(largMax + x >= Partie.largeur)
return true;
if(largMin + x < 0)
return true;
if(hautMax + y >= Partie.hauteur)
return true;
if(hautMin + y < 0)
return true;
return false;
}
/**
* méthode qui indique si un pièce est superposée à une autre
* @param p pièce que l'on souhaite vérifier
* @return un booléen indiquant si la pièce est superposée
*/
public boolean pieceSuperposee(Piece p,int x,int y) {
for (Piece p2 : this.piPosees) {
if (p2.superpose(p,x,y)) {
return true;
}
}
return false;
}
/**
* méthode qui ajoute une pièce à la grille de jeu
* @param p pièce que l'on souhaite ajouter
* @param x position hozizontale
* @param y position verticale
* @throws CaseDejaRemplieException
* @throws PieceDebordeException
*/
public void ajouterPiece(Piece p, int x, int y) throws CaseDejaRemplieException, PieceDebordeException {
// On vérifie si la pièce va déborder ou si elle va être superposée
if(pieceSuperposee(p,x,y)) {
throw new CaseDejaRemplieException("Deux carres se superposent");
}
if (debordeGrille(p, x, y)) {
System.out.println("ca throw PieceDeborde");
throw new PieceDebordeException("La piece deborde de la grille de jeu");
}
// On vérifie que la pièce est bien dans la liste d'éléments à poser
int place = this.piaPosees.indexOf(p);
if (place != -1) {
this.piaPosees.remove(place);
this.piPosees.add(p);
// On ajoute les coordonnées à la pièce
p.setXY(x, y);
// On place la pièce sur la grille grâce à ses coordonnées relatives
ArrayList<Carre> listeCarre = p.getListe();
for (Carre carre : listeCarre) {
this.grille[y + carre.getY()][x + carre.getX()] = p.getId();
}
}
}
public void forcerPlacementDebutant(Piece p, int x, int y) {
// On prend les carres qui rentrent bien dans la grille
ArrayList<Carre> listeCarres = p.CarresPlacable(x, y);
// On les place
int place = this.piaPosees.indexOf(p);
if (place != -1) {
this.piaPosees.remove(place);
this.piPosees.add(p);
// On ajoute les coordonnées à la pièce
p.setXY(x, y);
// On place la pièce sur la grille grâce à ses coordonnées relatives, sans mettre celles qui dépassent
for (Carre carre : listeCarres) {
this.grille[y + carre.getY()][x + carre.getX()] = p.getId();
}
}
}
public void forcerPlacementIntermediaire(Piece p, int x, int y) {
// On prend les carres qui ne
ArrayList<Carre> listeCarres = p.CarresNonSuperposes(x, y);
// On les place
int place = this.piaPosees.indexOf(p);
if (place != -1) {
this.piaPosees.remove(place);
this.piPosees.add(p);
// On ajoute les coordonnées à la pièce
p.setXY(x, y);
// On place la pièce sur la grille grâce à ses coordonnées relatives, sans mettre celles qui dépassent
for (Carre carre : listeCarres) {
this.grille[y + carre.getY()][x + carre.getX()] = p.getId();
}
}
}
/**
* méthode qui permet de retirer la dernière pièce de la grille de jeu
* et la remet dans les pièces à poser
*/
public void retirerDernierePiece() {
// On récupère la place de la dernière pièce ajoutée
int place = this.piPosees.size() - 1;
Piece p = this.piPosees.get(place);
this.piPosees.remove(place);
this.piaPosees.add(p);
// On récupère les coordonnées de la pièce
int x = p.getX();
int y = p.getY();
// On place des . aux emplacements de la pièce
ArrayList<Carre> listeCarre = p.getListe();
for (Carre carre : listeCarre) {
if (carre.getX() + x < Partie.largeur && carre.getY() + y < Partie.hauteur) {
this.grille[y + carre.getY()][x + carre.getX()] = '.';
}
}
// On redessine toutes les pièces sur la grille
for(Piece pi : Jeu.game.piPosees){
listeCarre = pi.getListe();
for(Carre c : listeCarre){
if (c.getX() + x < Partie.largeur && c.getY() + y < Partie.hauteur) {
this.grille[pi.getY() + c.getY()][pi.getX() + c.getX()] = pi.getId();
}
}
}
}
/**
* méthode qui supprime la dernière pièce de la liste à poser
*/
public void supprimerDernierePieceAPoser() {
this.piaPosees.remove(this.piaPosees.size()-1);
}
/**
* méthode qui affiche la liste des pièces à poser
*/
public void afficherListePiece() {
for (int i = 0; i < this.piaPosees.size(); i++) {
System.out.println("piece " + i + " :" );
this.piaPosees.get(i).afficherPiece();
}
}
/**
* méthode qui affiche la grille de jeu
*/
public void afficherGrille() {
System.out.println("-----------------------");
System.out.println("0 1 2 3 4 5 6 7 8 9");
for (int i = 0; i < Partie.largeur; i++) {
for (int j = 0; j < Partie.hauteur; j++) {
System.out.print(this.grille[i][j] + " ");
}
System.out.printf(" %d", i);
System.out.println();
}
}
/**
* méthode qui affiche le nombre de pièces restantes à poser d'une partie
*/
public void afficherDetails() {
int nbPieces = this.piaPosees.size();
System.out.println("Il reste " + nbPieces + " pieces a poser dans cette partie ! (Score : "+this.score+")");
}
/**
* méthode qui indique le nombre de pièces posées
* @return un double indiquant combien de pièces sont posées
*/
public double nbPiPosees() {
return (double) this.piPosees.size();
}
/**
* méthode qui retourne la liste de pièces à poser
* @return liste de pièces à poser
*/
public ArrayList<Piece> getPiaPosees() {
return this.piaPosees;
}
/**
* méthode qui retourne le score actuel de la partie
* @return un double le score de la partie
*/
public double getScore(){
return this.score;
}
/**
* méthode qui change le score de la partie
* @param sc le nouveau score
*/
public void setScore(double sc){
this.score=sc;
}
/**
* méthode qui retourne la grille de jeu
* @return grille de jeu
*/
public char[][] getGrille() {
return this.grille;
}
}