# Enum-werte als Methoden-Parameter übergeben



## fischebr (29. Dez 2016)

Hallo liebe Java-Gemeinde,
ich programmiere ein Spiel, bei dem ich Spielfeldplatten kodieren muss. Die Kodierung wird an einen Server übertragen. Sie besteht aus zwei Werten, einem Buchstaben und einer Zahl, die konkateniert werden. Die Buchstaben stehen für bestimmte Plattengrößen, die Zahl sagt etwas über die spätere Belegung der Platten aus und ändert sich während des Spiels. Ich habe für beide Werte Enums erstellt:

```
public enum EFieldStatePlate {
   
// die verschiedenen Plates
   
    A10, B6, C6, D6, E6, F4, G4, H4, I4, J4, K3, L3, M3, N3, O2, P2, Q2, R2;
   
    @Override
    public String toString() {
        switch (this) {
        case B6:
            return "b";
        case C6:
            return "c";
        case D6:
            return "b";
        case E6:
            return "c";
        case F4:
            return "b";
        case G4:
            return "c";
        case H4:
            return "b";
        case I4:
            return "c";
        case J4:
            return "b";
        case K3:
            return "c";
        case L3:
            return "b";
        case M3:
            return "c";
        case N3:
            return "b";
        case O2:
            return "c";
        case P2:
            return "b";
        case Q2:
            return "c";
        case R2:
            return "b";
        default:
            return "a";
        }
    }

}
```


```
public enum EFieldStateMarble {
   
// rote Murmel, schwarze Murmel, keine Murmel
   
    RED, BLACK, EMPTY;
   
    @Override
    public String toString() {
        switch (this) {
        case RED:
            return "1";
        case BLACK:           
            return "2";
        default:
            return "0";
            }
       }
}
```

Die Platte B6 ohne Belegung wäre 2x3 Felder groß mit der Kodierung
b0b0b0
b0b0b0
die Platte F4 mit der Kodierung
f1f2
f0f2
wäre 2x2 Felder groß, mit einer roten Murmel und zwei schwarzen Murmeln belegt und hätte noch ein freies Feld.
Zum Erstellen dieser Platten habe ich folgende Klasse (noch nicht ganz fertig) erstellt:

```
public class Plate extends JPanel {

   // Eigenschaften
   public String plate[][];

   // Konstruktor
   public Plate(int r, int c,) {
       plate = new String[r][c];
       for (r = 0; r < plate.length; r++) { // waagerecht
           for (c = 0; c < plate[r].length; c++) { // senkrecht
               plate[r][c] = EFieldStatePlate.B6.toString()
                        + EFieldStateMarble.EMPTY.toString(); // Codierung Feld
           }

       }
   }

   // Methoden
   public void showPlate() { // Konsolenausgabe Spielfeldplatte
       for (int r = 0; r < plate.length; r++) {
           for (int c = 0; c < plate[r].length; c++) {
               System.out.print(plate[r][c]);
           }
           System.out.println();
       }
   }
@Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);
       Graphics2D g2d = (Graphics2D) g;
       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

       drawPlateField(g2d, 2, 3);

   }

   private void drawPlateField(Graphics2D g2d, int x, int y) {
       int posX = x;
       int posY = y;
       g2d.setColor(Color.BLACK);
       g2d.drawRect(posX, posY, 60, 60);
       g2d.setColor(new Color(242, 203, 130));
       g2d.fillRect(posX + 1, posY + 1, 59, 59);
       g2d.setColor(Color.BLACK);
       g2d.drawOval(x + 15, y + 15, 30, 30);
       g2d.setColor(new Color(242, 203, 130));
       g2d.fillOval(x + 16, y + 16, 29, 29);
   }

   private void drawPlate(Graphics g2d, int x, int y) {

       try {
           for (int r = 0; r < x; r++) {
               for (int c = 0; c < y; c++) {
                   drawPlateField((Graphics2D) g2d, c * 60, r * 60);
               }

           }

       } catch (Exception e) {
           System.out.print(e);
           }

   }
}
```
Aufgerufen werden die Platten mit folgender Main-Methode:

```
public class Test {

   public static void main(String[] args) {

        Plate b0 = new Plate(2, 3);
        Plate c0 = new Plate(2, 3);
        Plate d0 = new Plate(2, 3);
        Plate e0 = new Plate(2, 3);
        Plate f0 = new Plate(2, 2);
        Plate g0 = new Plate(2, 2);
        Plate h0 = new Plate(2, 2);
        Plate i0 = new Plate(2, 2);
        Plate j0 = new Plate(2, 2);
        Plate k0 = new Plate(1, 3);
        Plate l0 = new Plate(1, 3);
        Plate m0 = new Plate(1, 3);
        Plate n0 = new Plate(1, 3);
        Plate o0 = new Plate(1, 2);
        Plate p0 = new Plate(1, 2);
        Plate q0 = new Plate(1, 2);
        Plate r0 = new Plate(1, 2);

        b0.showPlate();
        c0.showPlate();
        d0.showPlate();
        e0.showPlate();
        f0.showPlate();
        g0.showPlate();
        h0.showPlate();
        i0.showPlate();
        j0.showPlate();
        k0.showPlate();
        l0.showPlate();
        m0.showPlate();
        n0.showPlate();
        o0.showPlate();
        p0.showPlate();
        q0.showPlate();
        r0.showPlate();
       }
}
```
Mit diesen Klassen kann ich mir schon mal jede Plattengröße ausgeben lassen, sowohl auf der Konsole, als auch zeichnen lassen bei entsprechendem Aufruf. Logischerweise hat aber jede Platte die Kodierung "b0" für jedes einzelne Feld, weil ich im Augenblick diese Werte im Konstrukor zuweise. Ich möchte meinen Konstruktor jetzt dahingehend ändern, dass ich die beiden Enum-Werte als Parameter im Aufruf übergebe, etwa in dieser Art:

```
public class Test {

   public static void main(String[] args) {

        Plate b0 = new Plate(2, 3, EFieldStatePlate, EFieldStateMarble);
        b0.showPlate();
       }
}
```
Ich habe aber leider keine Idee, wie ich meinen Konstruktor in der Klasse Plate die Enum-Werte als Parameter übergeben kann. Kann mir jemand helfen?
Vielen Dank!


----------



## mrBrown (29. Dez 2016)

Genauso wie den alles andere auch übergibst, den Konstruktor um die beiden Argumente erweitern, und die dann ganz normal übergeben:


```
public Plate(int r, int c,EFieldStatePlate fieldStatePlate, EFieldStateMarble fFieldStateMarble)
```

und

```
Plate b0 = new Plate(2, 3, EFieldStatePlate.A10, EFieldStateMarble.RED);
```

Allerdings finde ich die Verwendung von Enums da eher zweifelhaft, Buchstabe und Zahl haben doch sicher irgendwelche sinnvollen Bedeutungen?

-----

Sollen es abwechselnd 'b' und 'c' sein, die toString zurückgibt?


----------



## fischebr (30. Dez 2016)

Vielen Dank für deine schnelle Antwort.
Die Buchstaben bezeichnen die Spielplatten, 'b', 'c', 'd' und 'e' zum Beispiel kennzeichnen jeweils, dass eine 6er Platte (2x3 Felder) verwendet wird, 'f' und 'g' bezeichnen eine 4er Platte (2x2), 'k' eine 3er Platte (1x3), etc. Es gibt insgesamt 4 x 6er Platten, 5 x 4er Platten, 4 x 3er Platten und 4 x 2er Platten, insgesamt 17 Platten. Lege ich jetzt meine Platte B6, habe ich insgesamt 6 Felder die mit 'b0' kodiert sind, 'b', weil ich die Platte B6 verwendet habe, '0', weil noch keine Spielstein drauf liegt. Lege ich jetzt eine 3er Platte an, kann die z.B. die Kodierung 'k0' haben, lege ich noch ein 3er Platte an, erhält sie z.B. die Kodierung 'l0', eine 2er Platte könnte 'p0' kodiert sein. Wird jetzt z.B. auf die B6-Platte eine schwarze Murmel gelegt, ändert sich die Kodierung auf diesem Feld in 'b2'. Dann enthält die B6-Platte ein Feld mit 'b2' und fünf Felder mit 'b0'. 
Die Buchstaben werden im Grunde genommen pro Spielpartie einmal gesetzt, weil man sich mit den Platten das Spielfeld zusammensetzt. Die Zahlen ändern sich, wenn man auf dem jeweiligen Feld gesetzt hat. 
Beginnt ein neues Spiel, können die Platten natürlich ganz anders gelegt werden, und dann wird auch auf die Buchstaben wieder neu zugegriffen.


----------



## fischebr (30. Dez 2016)

Nachtrag: 'a' kodiert die maximal zulässige Spielfeldfläche, die in Länge und Höhe maximal 10 Felder betragen darf. Das ganze Spielfeld ist also mit 100 Feldern mit der Kodierung 'a0' initialisiert. Legt man alle 17 Platten ab, bleiben ein paar Felder mit der Kodierung 'a0' übrig, auf die auch keine Spielsteine gelegt werden dürfen.


----------



## fischebr (30. Dez 2016)

Ich habe das jetzt gerade mal umgesetzt:

```
// Konstruktor
   public Plate(int r, int c, EFieldStatePlate fieldStatePlate, EFieldStateMarble fieldStateMarble) {
       plate = new String[r][c];
       for (r = 0; r < plate.length; r++) { // waagerecht
           for (c = 0; c < plate[r].length; c++) { // senkrecht
               plate[r][c] = fieldStatePlate + fieldStateMarble; // Codierung Feld
           }

       }
   }
```
Ich erhalte jetzt aber eine Fehlermeldung in der letzten Zeile mit dem Code "plate[r][c] = fieldStatePlate + fieldStateMarble; // Codierung Feld".
Sie lautet "The operator + is undefined for the argument type(s) EFieldStatePlate, EFieldStateMarble"
Sorry, ich bin in Java noch sehr unerfahren. Wie konkateniere ich den jetzt die beiden Variablen miteinander?


----------



## mrBrown (30. Dez 2016)

fischebr hat gesagt.:


> Ich erhalte jetzt aber eine Fehlermeldung in der letzten Zeile mit dem Code "plate[r][c] = fieldStatePlate + fieldStateMarble; // Codierung Feld".
> Sie lautet "The operator + is undefined for the argument type(s) EFieldStatePlate, EFieldStateMarble"
> Sorry, ich bin in Java noch sehr unerfahren. Wie konkateniere ich den jetzt die beiden Variablen miteinander?




```
plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString();[/icode]

Du willst ja deren String-Repräsentation aneinanderhängen, nicht die Werte addieren ;)
```


----------



## fischebr (30. Dez 2016)

Hallo mrBrown, das hat wunderbar funktioniert. Vielen, vielen Dank für deine kompetente Hilfe!!


----------

