-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMyGridLayout.java
More file actions
224 lines (216 loc) · 10.5 KB
/
MyGridLayout.java
File metadata and controls
224 lines (216 loc) · 10.5 KB
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
/**
*alle componenten worden in deze class aangemaakt en op de juiste plek gezet
*
* @Madelon
* @1.1
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.SplittableRandom;
import javax.swing.SwingUtilities;
import java.lang.*;
public class MyGridLayout extends JLayeredPane implements ActionListener {
int columns; //we werken met een gridlayout, hiervoor zijn kolommen en rijen nodig
int rows;//we werken met een gridlayout, hiervoor zijn kolommen en rijen nodig
int numButtons; //het totaal aantal cellen (dus het totaal aantal buttons) in de grid
JPanel top; //van het LayeredPane de twee na hoogste laag, namelijk de knoppen.
JPanel bottom; //van het LayeredPane de laagste laag, namelijk de waardes
Map<String, Spot> buttons; //de map waarin alle vakjes worden opgeslagen op basis van hun ID
Map<String, Spot> flags; //de map waarin op welke bommen al een vlag staat wordt aangegeven
int numBombs; //om te tellen hoeveel bommen er totaal in het spel zijn
MyGridLayout(int height, int width) {
columns = width;
rows = height;
numButtons = width*height;
int sizeHeight = 30*rows;
int sizeWidth = 30*columns;
int i = 0; // definieërt de i voor de loop van de buttons
int j = 0; // definieërt de j voor de loop van de waardes
top = new JPanel();
top.setLayout(new GridLayout(rows, columns)); //zorgt ervoor dat de knoppen op vaste plekken komen.
top.setOpaque(false); //zorgt ervoor dat wanneer een knopje wordt ingedrukt de lagen eronder zichtbaar zijn.
top.setSize(sizeWidth,sizeHeight);
bottom = new JPanel();
bottom.setLayout(new GridLayout(rows, columns));
bottom.setSize(sizeWidth,sizeHeight);
/* -- Loop 1: de knoppen --
* In deze loop maken we voor elke cel een nieuwe instantie van spot aan.
*We geven deze ook een nieuwe waarde, met een kans van een op 10 dat deze een bom is.
*We slaan elk nieuw object op in een nieuwe map, waardoor we elk object op basis van hun ID
*terug kunnen vinden, en zodat we deze kunnen koppelen aan een JLabel.
*/
buttons = new HashMap<>();//de hashmap waarin de knoppen worden opgeslagen.
flags = new HashMap<>();
for (i = 0; i < numButtons; i++) { //de loop
//de waarde eventueel naar bom veranderen door een random int te trekken.
SplittableRandom random = new SplittableRandom();
int chance = random.nextInt(20);
String r;
Spot btn = new Spot(i);
r = " ";
if (chance < 3) {
r = "B";
btn.changeValue("B");
} else {
r = "0";
btn.changeValue("0");
}
/*
hier krijgt elke knop een mouselistener om de vlaggen bij te houden
*/
btn.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) { // if right click
if(btn.getHasFlag()){
btn.setText("");
btn.changeHasFlag();
if(btn.getValue() == "B"){ //als de waarde een bom is wordt dit opgeslagen
flags.remove(btn.getID());
}
} else {
btn.setText("F");
btn.changeHasFlag();
if(btn.getValue() == "B"){ //als er geen vlag meer op een bepaalde bom staat wordt deze uit de lijst gehaald
flags.put(btn.getID(), btn);
}
}
}
if(flags.size() == numBombs){ //als het totaal aantal bommen gelijk is aan het totaal aantal vlaggen op een bom heb je gewonnen.
JOptionPane.showInputDialog(null, "Results", "You've won :D");
top.setVisible(false);
}
}
});
btn.addActionListener( this ); //om de knoppen en omringende knoppen weg te halen.
//de knop in de hashmap zetten
buttons.put(btn.getID(), btn);
//de knop in het frame zetten.
top.add(btn);
}
/* -- Loop 2: de waardes --
* In deze loop zorgen we ervoor dat elke spot de juiste waarde krijgt,
*door te controleren of een van de omliggende vakjes een bom is.
*Hierna slaan we alle waarden van de vakjes op in een nieuwe hashmap, met
*dezelfde ID als de bijbehorende ID van de spot.
*daarna zetten we alle waarden in een nieuwe laag, identiek aan de vorige,
*zodat onder elke knop de juiste waarde ligt.
*/
Map<String, JLabel> ButtonValues = new HashMap<>(); //de hashmap waar de waarden in worden opgeslagen
for (j = 0; j < numButtons; j++){//de loop
Spot current = buttons.get(Integer.toString(j)); //haalt uit de hashmap met de spots telkens een object met dezelfde ID als j
if (!(current.getValue() == "B")) { //alleen als het geen bom is moet de waarde verandert worden.
//wat rekensommen om ongeacht de grootte van de grid de omliggende acht waardes te vinden.
int[] checkID = new int[8];
checkID[0] = j-columns-1;
checkID[1] = j-columns;
checkID[2] = j-columns+1;
checkID[3] = j-1;
checkID[4] = j+1;
checkID[5] = j+columns-1;
checkID[6] = j+columns;
checkID[7] = j+columns+1;
int k;
int newValue = 0;
for (k = 0; k < 8; k++) { //loopt door de acht mogelijke andere vakjes heen
if (!(checkID[k] < 0) && !(checkID[k] > (numButtons-1))){ //checkt of het vakje bestaat
Spot control;
control = buttons.get(Integer.toString(checkID[k])); //pakt het vakje dat om het current vakje heen ligt
if (control.getValue() == "B") { //controleert of het een bom is
newValue = newValue + 1; //verhoogt de waarde met een.
}
}
}
current.changeValue(Integer.toString(newValue)); //verandert de waarde van de spot.
if (newValue == 0) { //maakt vakken met 0 leeg
current.changeValue("");
}
} else {
numBombs = numBombs + 1; //als het niet niet een bom is, gaat de telling van bommen een omhoog.
}
//Maakt de JLabel met de value als tekst, stopt hem in de map en stopt hem in de JPanel
JLabel ButtonValue = new JLabel();
ButtonValue.setText(current.getValue());
ButtonValues.put(Integer.toString(j), ButtonValue);
bottom.add(ButtonValue);
ButtonValue.setHorizontalAlignment(JLabel.CENTER);
}
add(top, Integer.valueOf(3)); //voegt de laag met de knoppen toe aan de JLayeredPane
add(bottom, Integer.valueOf(2)); //voegt de laag met de waardes toe aan de JLayeredPane
setSize(sizeWidth,sizeHeight);
setVisible(true);
}
public void actionPerformed( ActionEvent e ) {
//for loop die door alles loopt om te kijken welke knop is ingedrukt
int l;
Spot ebtn;
for (l = 0; l < numButtons; l++) {
//controleren of de huidige cell de juiste knop bevat
if(e.getSource() == buttons.get(Integer.toString(l))) {
ebtn = buttons.get(Integer.toString(l));
if(!(ebtn.getHasFlag())){
ebtn.setVisible(false); //wanneer er op de knop gedrukt wordt is deze niet meer zichtbaar
if (ebtn.getValue() == "B") {
ebtn.setVisible(false);
top.setVisible(false);
JOptionPane.showInputDialog(null, "Results", "You've lost :(");
}
//code om alle vakjes rondom een leeg vakje weg te halen
if (ebtn.getValue() == "") {
//rekensommen om de vakjes om het vakje heen te berekenen.
int[] checkID = new int[8];
checkID[0] = l-columns-1;
checkID[1] = l-columns;
checkID[2] = l-columns+1;
checkID[3] = l-1;
checkID[4] = l+1;
checkID[5] = l+columns-1;
checkID[6] = l+columns;
checkID[7] = l+columns+1;
int k;
for (k = 0; k < 8; k++) { //loopt door de acht mogelijke andere vakjes heen
if (!(checkID[k] < 0) && !(checkID[k] > (numButtons-1))){ //checkt of het vakje bestaat
Spot control;
control = buttons.get(Integer.toString(checkID[k])); //pakt het vakje dat om het current vakje heen ligt
try {
control.setVisible(false);
} catch(Exception ce) {
}
while (control.getValue() == "") { //code om nog meer vakjes rond weer nieuwe lege vakjes leeg te maken.
try
{
int m = Integer.parseInt(control.getID());
int[] checkID2 = new int[8];
checkID2[0] = m-columns-1;
checkID2[1] = m-columns;
checkID2[2] = m-columns+1;
checkID2[3] = m-1;
checkID2[4] = m+1;
checkID2[5] = m+columns-1;
checkID2[6] = m+columns;
checkID2[7] = m+columns+1;
int n;
for (n = 0; n < 8; n++) {
control = buttons.get(Integer.toString(checkID2[n])); //pakt het vakje dat om het current vakje heen ligt
try {
control.setVisible(false);
} catch(Exception ce) {
}
}
}
catch (NumberFormatException nfe)
{
break;//zodat het programma niet crashed terwijl je ook het vakje aan kan klikken.
}
}
}
}
}
}
}
}
}
}