-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDamen.java
195 lines (170 loc) · 4.92 KB
/
Damen.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
package demos;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import javax.swing.WindowConstants;
import plotter.Graphic;
import plotter.LineStyle;
import plotter.Plotter;
import plotter.Shapes;
import plotter.Sleep;
import plotter.TextObject;
public class Damen {
public String DAME = "\u2655"; // unicode for white queen
private int pause = 100; // pause time in msec
private int N = 20; // size of the board
private boolean zeigeBesetzt = false;
private Graphic graphic = new Graphic(N + "-Queens Problem");
private Plotter plotter = graphic.getPlotter();
private TextObject[][] felder = new TextObject[N + 1][N + 1];
private TextObject header;
private int[][] besetzt = new int[N + 1][N + 1];
private Font font = new Font("Arial", Font.BOLD, 16);
private Font fontDame = new Font("Arial", Font.BOLD, 24);
public static void main(String[] args) {
Damen queens = new Damen();
queens.zeichneSchachbrett();
queens.spalte(1);
}
public Damen() {
fontDame = testFonts().deriveFont(22.f).deriveFont(Font.BOLD);
System.out.println(fontDame);
plotter.setStatusLine("");
graphic.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
plotter.setRange(-0.5, N + 1.5);
plotter.setPreferredSize(new Dimension(600, 600));
graphic.pack();
}
/**
* Search a font with a glyph for chess pieces
*
* @return the font or null if no matching font was found
*/
private static Font testFonts() {
// erfrage alle verfügbaren Fonts
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
// das Feld fonts enthält alle fonts
Font[] fonts = ge.getAllFonts();
System.out.println("total of " + fonts.length + " fonts found");
for (Font f : fonts) {
if (f.canDisplay(0x2655)) {
System.out.println("Font : " + f);
return f;
}
}
System.out.println("No Font found");
return null;
}
/**
* search in a column for free squares. Each free square is then tested.
*
* @param s
*/
private void spalte(int s) {
for (int i = 1; i <= N; i++) {
if (besetzt[s][i] > 0)
continue;
setDame(s, i, 1);
graphic.repaint();
Sleep.sleep(pause);
if (s < N) {
spalte(s + 1);
} else {
System.out.println("SOLUTION");
Sleep.sleep(1000000);
;
}
setDame(s, i, -1);
Sleep.sleep(pause);
}
}
/**
* sets or removes a queen.
*
* @param linie
* the column (file) of the square
* @param reihe
* the row (rank) of the square
* @param mode
* -1 for remove and +1 for setting
*/
private void setDame(int linie, int reihe, int mode) {
for (int i = 1; i <= N; i++) {
add(mode, linie, i);
add(mode, i, reihe);
}
set_diag(linie, reihe, 1, 1, mode);
set_diag(linie, reihe, 1, -1, mode);
set_diag(linie, reihe, -1, 1, mode);
set_diag(linie, reihe, -1, -1, mode);
if (mode == 1) {
felder[linie][reihe].setColor(Color.BLACK);
felder[linie][reihe].setFont(fontDame);
felder[linie][reihe].setText(DAME);
header.setText("# Queens: " + linie);
} else {
if (zeigeBesetzt) {
felder[linie][reihe].setText("" + besetzt[linie][reihe]);
felder[linie][reihe].setColor(Color.RED);
felder[linie][reihe].setFont(font);
} else {
felder[linie][reihe].setText("");
}
header.setText("# Queens: " + linie);
}
}
void set_diag(int linie, int reihe, int incr, int incl, int mode) {
for (;;) {
linie += incl;
reihe += incr;
if (linie < 1 || linie > N)
return;
if (reihe < 1 || reihe > N)
return;
besetzt[linie][reihe] += mode;
if (zeigeBesetzt & !felder[linie][reihe].getText().equals(DAME)) {
felder[linie][reihe].setText(niceText(besetzt[linie][reihe]));
}
}
}
private String niceText(int i) {
if (i == 0)
return "";
return "" + i;
}
private void add(int inc, int z, int s) {
besetzt[z][s] += inc;
if (zeigeBesetzt & !felder[z][s].getText().equals(DAME)) {
felder[z][s].setText(niceText(besetzt[z][s]));
}
}
public void zeichneSchachbrett() {
// zeichne Schachbrett
String border = Shapes.rect(plotter, 0.5, 0.5, N + .5, N + .5);
plotter.setDataColor(border, Color.BLUE);
header = plotter.setText("#Queens: ", N / 2., N + 1.8, Color.BLACK,
font);
for (int i = 1; i <= N; i++) {
String labels = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (N < labels.length()) {
char c = labels.charAt(i);
plotter.setText("" + c, i, 0, Color.BLACK, font);
plotter.setText("" + c, i, N + 1, Color.BLACK, font);
plotter.setText("" + i, 0, i, Color.BLACK, font);
plotter.setText("" + i, N + 1, i, Color.BLACK, font);
}
for (int j = 1; j <= N; j++) {
felder[i][j] = plotter.setText("", i, j, Color.RED, font);
if ((i + j) % 2 == 0) {
String name = Shapes.rect(plotter, i - 0.5, j - 0.5,
i + 0.5, j + 0.5);
plotter.setDataColor(name, new Color(0, 0, 200, 100));
plotter.setDataLineStyle(name, LineStyle.FILL);
}
}
}
graphic.repaint();
}
}