Also ich habe folgende Klassen:
und folgende Logik Methoden:
und folgende Main:
Jetzt stellt sich mir natürlich die Frage, wie im Dropdown-Menue nicht "dame_b" usw. angezeigt wird, sonder der jeweilige String "q Dame schwarz" usw.
Java:
enum FigClazz {
leer ("0 leer ", '0', 0f ),
turm_b ("r Turm schwarz ", 'r', -1 / 6f),
turm_w ("R Turm weiß ", 'R', +1 / 6f),
springer_b ("n Springer schwarz ", 'n', -2 / 6f),
springer_w ("N Springer weiß ", 'N', +2 / 6f),
laeufer_b ("b Läufer schwarz ", 'b', -3 / 6f),
laeufer_w ("B Läufer weiß ", 'B', +3 / 6f),
dame_b ("q Dame schwarz ", 'q', -4 / 6f),
dame_w ("Q Dame weiß ", 'Q', +4 / 6f),
koenig_b ("k König schwarz ", 'k', -5 / 6f),
koenig_w ("K König weiß ", 'K', +5 / 6f),
bauer_b ("p Bauer schwarz ", 'p', -1f ),
bauer_w ("P Bauer weiß ", 'P', +1f );
String s;
char c;
float f;
FigClazz(String s, char c, float f) {
this.s = s;
this.c = c;
this.f = f;
}
static FigClazz getFicClazz(char c) {
for (FigClazz f : FigClazz.values()) {
if (f.c == c) {
return f;
}
}
return null;
}
}
class Fig {
ArrayList<BufferedImage> bis = new ArrayList<BufferedImage>();
FigClazz fc;
boolean search(BufferedImage b) {
al: for (BufferedImage a : bis) {
for (int k = 0; k < a.getHeight(); k++) {
for (int l = 0; l < a.getWidth(); l++) {
if (a.getRGB(l, k) != b.getRGB(l, k)) {
continue al;
}
}
}
return true;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(fc.c);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Fig other = (Fig) obj;
return fc.c == other.fc.c;
}
@Override
public String toString() {
return String.format("Fig [bis=%s, type=%s, value=%s]", bis.size(), fc.c, fc.f);
}
}
class Imgs {
BufferedImage[][] bis = new BufferedImage[8][8];
}
und folgende Logik Methoden:
Java:
static BufferedImage resize(BufferedImage img, int newW, int newH) {
Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = dimg.createGraphics();
g2d.drawImage(tmp, 0, 0, null);
g2d.dispose();
return dimg;
}
static Imgs getImgs(BufferedImage b, Loc l) {
Imgs ret = new Imgs();
BufferedImage a = b.getSubimage(l.r.x, l.r.y, l.r.width * 8, l.r.height * 8);
a = resize(a, a.getWidth() / 2, a.getHeight() / 2);
int n = a.getWidth() / 8;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
ret.bis[i][j] = a.getSubimage(j * n + 2, i * n + 2, n - 4, n - 4);
}
}
return ret;
}
static HashMap<Character, Fig> getFigs(Imgs imgs) {
HashMap<Character, Fig> ret = new HashMap<Character, Fig>();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
BufferedImage b = imgs.bis[i][j];
Character chr = null;
for (Fig fig : ret.values()) {
if (fig.search(b)) {
chr = fig.fc.c;
break;
}
}
if (chr == null) {
// displayImg(imgs, i, j, 0, 0);
// String[] sa = {
// "0 leer ", "r Turm schwarz ", "R Turm weiß ",
// "n Springer schwarz ", "N Springer weiß ", "b Läufer schwarz ", "B Läufer weiß ",
// "q Dame schwarz ", "Q Dame weiß ", "k König schwarz ", "K König weiß ",
// "p Bauer schwarz ", "P Bauer weiß " };
FigClazz[] values = FigClazz.values();
chr = ((FigClazz) JOptionPane.showInputDialog(null, "Figur?", "Figur?",
JOptionPane.QUESTION_MESSAGE, new ImageIcon(imgs.bis[i][j]), values, values[0])).c;
}
if (ret.containsKey(chr)) {
ret.get(chr).bis.add(b);
} else {
Fig f = new Fig();
f.bis.add(b);
f.fc = FigClazz.getFicClazz(chr);
ret.put(chr, f);
}
}
}
return ret;
}
und folgende Main:
Java:
public static void main(String[] args) throws AWTException, InterruptedException {
BufferedImage b = /*...*/;
Imgs imgs = getImgs(b, l);
HashMap<Character, Fig> figs = getFigs(imgs);
System.out.println(figs);
}
Jetzt stellt sich mir natürlich die Frage, wie im Dropdown-Menue nicht "dame_b" usw. angezeigt wird, sonder der jeweilige String "q Dame schwarz" usw.