Enum-werte als Methoden-Parameter übergeben

Diskutiere Enum-werte als Methoden-Parameter übergeben im Allgemeine Java-Themen Forum; Hallo liebe Java-Gemeinde, ich programmiere ein Spiel, bei dem ich Spielfeldplatten kodieren muss. Die Kodierung wird an einen Server übertragen....

  1. fischebr
    fischebr Mitglied
    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:
    Code (Text):

    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";
            }
        }

    }
     
    Code (Text):

    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:
    Code (Text):

    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:
    Code (Text):

    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:
    Code (Text):

    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!
     
  2. Vielleicht hilft dir das kostenlose Training weiter --> (hier klicken)
  3. mrBrown
    mrBrown Bekanntes Mitglied
    Genauso wie den alles andere auch übergibst, den Konstruktor um die beiden Argumente erweitern, und die dann ganz normal übergeben:

    Code (Java):
    public Plate(int r, int c,EFieldStatePlate fieldStatePlate, EFieldStateMarble fFieldStateMarble)
    und
    Code (Java):

    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?
     
  4. fischebr
    fischebr Mitglied
    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.
     
  5. fischebr
    fischebr Mitglied
    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.
     
  6. fischebr
    fischebr Mitglied
    Ich habe das jetzt gerade mal umgesetzt:
    Code (Text):

        // 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?
     
  7. mrBrown
    mrBrown Bekanntes Mitglied
    Code (Text):

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

    Du willst ja deren String-Repräsentation aneinanderhängen, nicht die Werte addieren ;)
     
  8. fischebr
    fischebr Mitglied
    Hallo mrBrown, das hat wunderbar funktioniert. Vielen, vielen Dank für deine kompetente Hilfe!!
     
  9. Schau dir jetzt hier den Kurs an und lerne Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)
Die Seite wird geladen...

Enum-werte als Methoden-Parameter übergeben - Ähnliche Themen

Enum-Werte Bestanteil von anderem Enum
Enum-Werte Bestanteil von anderem Enum im Forum Allgemeine Java-Themen
Einlesen eines Enum-Wertes per console
Einlesen eines Enum-Wertes per console im Forum Java Basics - Anfänger-Themen
Basisklassen als Methoden-Parameter ähnlich, wie in C++ ?
Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? im Forum Java Basics - Anfänger-Themen
Objekt als Methoden-Parameter - Kein call-by-reference?
Objekt als Methoden-Parameter - Kein call-by-reference? im Forum Java Basics - Anfänger-Themen
Thema: Enum-werte als Methoden-Parameter übergeben