Java Array durch Methode in ein anderes Array übergeben

evilf

Cadet 4th Year
Registriert
Dez. 2010
Beiträge
103
Hey,

wir haben seit kurzem in Informatik mit Array begonnen.
In dem Zusammenhang bastel ich grad für eine Gruppenarbeit ein Black Jack Spiel...

Zu meinem Problem:
In der Klasse Kartenstapel befindet sich die Methode mischen().
In ihr wird aus einem Array aller Karten eine zufällige ausgewählt.
In der Klasse Spieler möchte ich für eine spätere Gewinnermittlung nun diese Methode 8 mal ausführen & die jeweils ausgewählte Karte in einem neuen Array zwischenspeichern.
An dieser Stelle komme ich nicht weiter...

Wär cool, wenn ihr mir sagt wo der Fehler steckt...
Schon mal Vielen Dank im voraus...

MfG, evilf


Klasse Kartenstapel:
Code:
import java.util.Random;
import javax.swing.ImageIcon;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Fabi
 */
public class Kartenstapel {

  private int wert = 0;
  private String farbe = "";
  private int rang = 0;
  private String name = "";
  private ImageIcon bild;
  private int gesetzt = 0;
    
  // Kartenstapel  
  public Kartenstapel[] kartenstapel = new Kartenstapel[52];
  public int kartenergebnis;
  
  public Kartenstapel(int wert, String farbe, int rang, String name, ImageIcon bild, int gesetzt) // Rangordnung und Kartenwert sollen ausschlaggebend sein
  {
    kartenstapel[0] = new Kartenstapel(11, "Kreuz", 1, "KreuzAss", new ImageIcon("KreuzAss.jpg"), 0);
    kartenstapel[1] = new Kartenstapel(11, "Piek", 2, "PikAss", new ImageIcon("PikAss.jpg"), 0);
    kartenstapel[2] = new Kartenstapel(11, "Herz", 3, "HerzAss", new ImageIcon("HerzAss.jpg"), 0);
    kartenstapel[3] = new Kartenstapel(11, "Karo", 4, "KaroAss", new ImageIcon("KaroAss.jpg"), 0);
    kartenstapel[4] = new Kartenstapel(10, "Kreuz", 5, "KreuzKönig", new ImageIcon("KreuzKönig.jpg"), 0);
    kartenstapel[5] = new Kartenstapel(10, "Piek", 6, "PikKönig", new ImageIcon("PikKönig.jpg"), 0);
    kartenstapel[6] = new Kartenstapel(10, "Herz", 7, "HerzKönig", new ImageIcon("HerzKönig.jpg"), 0);
    kartenstapel[7] = new Kartenstapel(10, "Karo", 8, "KaroKönig", new ImageIcon("KaroKönig.jpg"), 0);
    kartenstapel[8] = new Kartenstapel(10, "Kreuz", 9, "KreuzDame", new ImageIcon("KreuzDame.jpg"), 0);
    kartenstapel[9] = new Kartenstapel(10, "Pik", 10, "PikDame", new ImageIcon("PikDame.jpg"), 0);
    kartenstapel[10] = new Kartenstapel(10, "Herz", 11, "HerzDame", new ImageIcon("HerzDame.jpg"), 0);
    kartenstapel[11] = new Kartenstapel(10, "Karo", 12, "KaroDame", new ImageIcon("KaroDame.jpg"), 0);
    kartenstapel[12] = new Kartenstapel(10, "Kreuz", 13, "KreuzBube", new ImageIcon("KreuzBube.jpg"), 0);
    kartenstapel[13] = new Kartenstapel(10, "Pik", 14, "PikBube", new ImageIcon("PikBube.jpg"), 0);
    kartenstapel[14] = new Kartenstapel(10, "Herz", 15, "HerzBube", new ImageIcon("HerzBube.jpg"), 0);
    kartenstapel[15] = new Kartenstapel(10, "Karo", 16, "KaroBube", new ImageIcon("KaroBube.jpg"), 0);
    kartenstapel[16] = new Kartenstapel(10, "Kreuz", 17, "Kreuz10", new ImageIcon("Kreuz10.jpg"), 0);
    kartenstapel[17] = new Kartenstapel(10, "Pik", 18, "Pik10", new ImageIcon("Pik10.jpg"), 0);
    kartenstapel[18] = new Kartenstapel(10, "Herz", 19, "Herz10", new ImageIcon("Herz10.jpg"), 0);
    kartenstapel[19] = new Kartenstapel(10, "Karo", 20, "Karo10", new ImageIcon("Karo10.jpg"), 0);
    kartenstapel[20] = new Kartenstapel(9, "Kreuz", 21, "Kreuz9", new ImageIcon("Kreuz9.jpg"), 0);
    kartenstapel[21] = new Kartenstapel(9, "Pik", 22, "Pik9", new ImageIcon("Pik9.jpg"), 0);
    kartenstapel[22] = new Kartenstapel(9, "Herz", 23, "Herz9", new ImageIcon("Herz9.jpg"), 0);
    kartenstapel[23] = new Kartenstapel(9, "Karo", 24, "Karo9", new ImageIcon("Karo9.jpg"), 0);
    kartenstapel[24] = new Kartenstapel(8, "Kreuz", 25, "Kreuz8", new ImageIcon("Kreuz8.jpg"), 0);
    kartenstapel[25] = new Kartenstapel(8, "Pik", 26, "Pik8", new ImageIcon("Pik8.jpg"), 0);
    kartenstapel[26] = new Kartenstapel(8, "Herz", 27, "Herz8", new ImageIcon("Herz8.jpg"), 0);
    kartenstapel[27] = new Kartenstapel(8, "Karo", 28, "Karo8", new ImageIcon("Karo8.jpg"), 0);
    kartenstapel[28] = new Kartenstapel(7, "Kreuz", 29, "Kreuz7", new ImageIcon("Kreuz7.jpg"), 0);
    kartenstapel[29] = new Kartenstapel(7, "Pik", 30, "Pik7", new ImageIcon("Pik7.jpg"), 0);
    kartenstapel[30] = new Kartenstapel(7, "Herz", 31, "Herz7", new ImageIcon("Herz7.jpg"), 0);
    kartenstapel[31] = new Kartenstapel(7, "Karo", 32, "Karo7", new ImageIcon("Karo7.jpg"), 0);
    kartenstapel[32] = new Kartenstapel(6, "Kreuz", 33, "Kreuz6", new ImageIcon("Kreuz6.jpg"), 0);
    kartenstapel[33] = new Kartenstapel(6, "Pik", 34, "Pik6", new ImageIcon("Pik6.jpg"), 0);
    kartenstapel[34] = new Kartenstapel(6, "Herz", 35, "Herz6", new ImageIcon("Herz6.jpg"), 0);
    kartenstapel[35] = new Kartenstapel(6, "Karo", 36, "Karo6", new ImageIcon("Karo6.jpg"), 0);
    kartenstapel[36] = new Kartenstapel(5, "Kreuz", 37, "Kreuz5", new ImageIcon("Kreuz5.jpg"), 0);
    kartenstapel[37] = new Kartenstapel(5, "Pik", 38, "Pik5", new ImageIcon("Pik5.jpg"), 0);
    kartenstapel[38] = new Kartenstapel(5, "Herz", 39, "Herz5", new ImageIcon("Herz5.jpg"), 0);
    kartenstapel[39] = new Kartenstapel(5, "Karo", 40, "Karo5", new ImageIcon("Karo5.jpg"), 0);
    kartenstapel[40] = new Kartenstapel(4, "Kreuz",41, "Kreuz4", new ImageIcon("Kreuz4.jpg"), 0);
    kartenstapel[41] = new Kartenstapel(4, "Pik", 42, "Pik4", new ImageIcon("Pik4.jpg"), 0);
    kartenstapel[42] = new Kartenstapel(4, "Herz", 43, "Herz4", new ImageIcon("Herz4.jpg"), 0);
    kartenstapel[43] = new Kartenstapel(4, "Karo", 44, "Karo4", new ImageIcon("Karo4.jpg"), 0);
    kartenstapel[44] = new Kartenstapel(3, "Kreuz", 45, "Kreuz3", new ImageIcon("Kreuz3.jpg"), 0);
    kartenstapel[45] = new Kartenstapel(3, "Pik", 46, "Pik3", new ImageIcon("Pik3.jpg"), 0);
    kartenstapel[46] = new Kartenstapel(3, "Herz", 47, "Herz3", new ImageIcon("Herz3.jpg"), 0);
    kartenstapel[47] = new Kartenstapel(3, "Karo", 48, "Karo3", new ImageIcon("Karo3.jpg"), 0);
    kartenstapel[48] = new Kartenstapel(2, "Kreuz", 49, "Kreuz2", new ImageIcon("Kreuz2.jpg"), 0);
    kartenstapel[49] = new Kartenstapel(2, "Pik", 50, "Pik2", new ImageIcon("Pik2.jpg"), 0);
    kartenstapel[50] = new Kartenstapel(2, "Herz", 51, "Herz2", new ImageIcon("Herz2.jpg"), 0);
    kartenstapel[51] = new Kartenstapel(2, "Karo", 52, "Karo2", new ImageIcon("Karo2.jpg"), 0);
  }
  
  public int getWert(int wert) {
    return wert;
  }
  public void setWert(int wert) {
    this.wert = wert;
  }

  public String getFarbe(String farbe) {
    return farbe;
  }
  public void setFarbe(String farbe) {
    this.farbe = farbe;
  }

  public int getRang(int rang) {
    return rang;
  }
  public void setRang(int rang) {
    this.rang = rang;
  }

  public ImageIcon getBild(ImageIcon bild) {
    return bild;
  }
  public void setBild(ImageIcon bild) {
    this.bild = bild;
  }

  public int getGesetzt(int gesetzt) {
    return gesetzt;
  }
  public void setGesetzt(int gesetzt) {
    this.gesetzt = gesetzt;
  }

  
  public Kartenstapel mischen()
  {
    Random zufallsgenerator = new Random();
    int a = zufallsgenerator.nextInt(52);

    while(kartenstapel[a].getGesetzt(1) == 1)
    {
      int b = zufallsgenerator.nextInt(52);
      a = b;
      while (a == b)
      {
        b = zufallsgenerator.nextInt(52);
        a = b;
      }
    }
    
    kartenstapel[a].setGesetzt(1);
    return kartenstapel[a];
  }
}

Klasse Spieler:
Code:
import javax.swing.ImageIcon;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Fabi
 */
public class Spieler {
  public Kartenstapel[] kartenstapel1 = new Kartenstapel[8];
  public int punktzahl;
  public int i = 0;
  public ImageIcon karte1 = new ImageIcon();
  public ImageIcon karte2 = new ImageIcon();
  public ImageIcon karte3 = new ImageIcon();
  public ImageIcon karte4 = new ImageIcon();
  public ImageIcon karte5 = new ImageIcon();
  public ImageIcon karte6 = new ImageIcon();
  public ImageIcon karte7 = new ImageIcon();
  public ImageIcon karte8 = new ImageIcon();
  

  public Spieler()
  {
      kartenstapel1[0] = Kartenstapel.mischen.kartenstapel[a];
      kartenstapel1[1] = Kartenstapel.mischen.kartenstapel[a];
      kartenstapel1[2] = Kartenstapel.mischen.kartenstapel[a];
      kartenstapel1[3] = Kartenstapel.mischen.kartenstapel[a]; 
      kartenstapel1[4] = Kartenstapel.mischen.kartenstapel[a];
      kartenstapel1[5] = Kartenstapel.mischen.kartenstapel[a]; 
      kartenstapel1[6] = Kartenstapel.mischen.kartenstapel[a]; 
      kartenstapel1[7] = Kartenstapel.mischen.kartenstapel[a];       
  }

  public int ergebnis_wert()
  {
      punktzahl = kartenstapel1[0].getWert() + kartenstapel1[1].getWert(); // Spieler bekommt sein Würfelpaar
      return punktzahl;
  }
  
  public int ergebnis_wert_again()
  {
      punktzahl = punktzahl + kartenstapel1[2 + i].getWert();
      return punktzahl;
  }
  
  public void handkarten()
  {
      karte1 = kartenstapel1[0].getBild();
      karte2 = kartenstapel1[1].getBild(); 
      
      if (i >= 1)
      {
         karte3 = kartenstapel1[2].getBild();
      
         if (i >= 1)
         {
            karte4 = kartenstapel1[3].getBild();
      
            if (i >= 2)
            {
               karte5 = kartenstapel1[4].getBild(); 
                    
               if  (i >= 3)
               {
                  karte6 = kartenstapel1[5].getBild();
                 
                  if (i >= 4)
                  {
                     karte7 = kartenstapel1[6].getBild(); 
                
                     if (i >= 5)
                     {
                        karte8 = kartenstapel1[7].getBild(); 
                     }
                  }
               }   
            }
         }
      } 
      
      
  }
  
  
}
 
Also du willst 8 mal eine Zufallskarte habe, aber nicht 2x mal die selbe?

Moment .... der Konstruktor von Kartenstapel instantiiert sich selbst über die selbe Methode? Das ist doch unendlich rekursive was du da programmiert hast?

Leg am Besten mal eine Klasse "Karte" an. Und verwalte das in einem Array von Karten. Das wiederum kannst du als Variablennamen Kartenstapel nennen. Alles andere ist eher verwirrend falsch.
Die Klasse Kartenstapel kann dann dein Array von Karten enthalten.

Vielleicht hilft das ja schon, dass dann ein mischen auch geht.
 
ich seh da gleich mehrere kritische Probleme in deinem Code...


1. dein Konstruktor hängt sich in einer endlosen Rekursion auf! gleich in der ersten Zeile rufst du den Konstruktor nochmal auf, dort in der ersten Zeile wird wieder der Konstruktor aufgerufen usw. das wird zwangsläufig zu einer Stackoverflowexeption führen. Oder einem Systemerror weil der JVM der Speicher ausgegangen ist.

Der Konstruktor sollte so aussehen, während der alte Inhalt in eine Methode ausgelagert wird:
public Kartenstapel(int wert, String farbe, int rang, String name, ImageIcon bild, int gesetzt) {
this.wert = wert;
this.farbe = farbe;
this.rang = rang;
this.name = name;
this.bild = bild;
this.gesetzt = gesetzt;
}

Wobei das nicht objektorientiert wäre. Denn eigentlich beschreibt dieser Konstruktor nicht einen Kartenstapel, sondern nur eine Karte.


Zweiter Fehler: die Getter!
public int getWert(int wert) {
return wert;
}

hat überhaupt keinen Sinn, da du damit einfach den übergebenen Parameter wieder zurückerhälst. Der Parameter "int wert" ist lokal in der Methode sichtbar. Die Methode priorisiert diesen dann gegenüber dem Klassenattribut, sofern du nicht explizit mit "this" darauf zeigst.
Richtig beim getter: kein Parameter. Also: public int getWert() {
return wert;
}

3. (Folge-)Fehler: dementsprechend macht bei dir while(kartenstapel[a].getGesetzt(1) == 1) keinen Sinn. Du könntest genausogut while(true) schreiben. Die Bedingung kann niemals false werden.

4. Fehler: a = b;
while (a == b)

du weist a den Wert von b zu und vergleichst dann a und b? Welchen Sinn macht das? das ist schon wieder ein while(true) und damit die zweite Endlosschleife..

5. in der anderen Klasse erstellst du ein leeres kartenstapel-Array der Länge 8. Damit wirst du nichts anfangen können. Sind ja keine Karten drin. Du benutzt an keiner Stelle deinen Konstruktor...


Ich glaub du kannst den ganzen Code wegwerfen, sry... und wer erteilt bitte so eine Gruppenaufgabe, wenn ihr euch noch in der imperativen Programmierung befindet und gerade mal Arrays kennengelernt habt?


Tipp: google mal danach, wie man Arrays zufällig sortiert.
 
Zuletzt bearbeitet:
Hey,

schon mal Danke für die schnelle Hilfe...
Hat mich jedoch nur bedingt weitergebracht...
Hab mal ne Klasse Karte erstellt:

Code:
import javax.swing.ImageIcon;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Fabi
 */
public class Karte {
     // Anfang Variablen
  private int wert;
  private String farbe;
  private int rang;
  private String name;
  private ImageIcon bild;
  private int gesetzt;
  // Ende Variablen

  // Anfang Ereignisprozeduren
  public int getWert() {
    return wert;
  }
  public void setWert(int wert) {
    this.wert = wert;
  }

  public String getFarbe() {
    return farbe;
  }
  public void setFarbe(String farbe) {
    this.farbe = farbe;
  }

  public int getRang() {
    return rang;
  }
  public void setRang(int rang) {
    this.rang = rang;
  }

  public ImageIcon getBild() {
    return bild;
  }
  public void setBild(ImageIcon bild) {
    this.bild = bild;
  }

  public int getGesetzt() {
    return gesetzt;
  }
  public void setGesetzt(int gesetzt) {
    this.gesetzt = gesetzt;
  }


  public Karte(int wert, String farbe, int rang, String name, ImageIcon bild, int gesetzt) {
     this.wert = wert;
     this.farbe = farbe;
     this.rang = rang;
     this.name = name;
     this.bild = bild;
     this.gesetzt = gesetzt;
  }


}
Wie muss ich den jetzt die Klasse Kartenstapel verändern?
All meine bisherigen Versuche ergaben Fehlermeldungen -.-
Am Beginn des Array ist die Klammer { makiert & der Error lautet: Missing return statement...
Aber hat das Array ist doch vom Typ Karte...

Code:
import java.util.Random;
import javax.swing.ImageIcon;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Fabi
 */
public class Kartenstapel {

    
  // Kartenstapel  
  public Karte[] kartenstapel = new Karte[52];
  public int kartenergebnis;
  
  public Karte kartenstapel() // Rangordnung und Kartenwert sollen ausschlaggebend sein
  {
    kartenstapel[0] = new Karte(11, "Kreuz", 1, "KreuzAss", new ImageIcon("KreuzAss.jpg"), 0);
    kartenstapel[1] = new Karte(11, "Piek", 2, "PikAss", new ImageIcon("PikAss.jpg"), 0);
    kartenstapel[2] = new Karte(11, "Herz", 3, "HerzAss", new ImageIcon("HerzAss.jpg"), 0);
    kartenstapel[3] = new Karte(11, "Karo", 4, "KaroAss", new ImageIcon("KaroAss.jpg"), 0);
    kartenstapel[4] = new Karte(10, "Kreuz", 5, "KreuzKönig", new ImageIcon("KreuzKönig.jpg"), 0);
    kartenstapel[5] = new Karte(10, "Piek", 6, "PikKönig", new ImageIcon("PikKönig.jpg"), 0);
    kartenstapel[6] = new Karte(10, "Herz", 7, "HerzKönig", new ImageIcon("HerzKönig.jpg"), 0);
    kartenstapel[7] = new Karte(10, "Karo", 8, "KaroKönig", new ImageIcon("KaroKönig.jpg"), 0);
    kartenstapel[8] = new Karte(10, "Kreuz", 9, "KreuzDame", new ImageIcon("KreuzDame.jpg"), 0);
    kartenstapel[9] = new Karte(10, "Pik", 10, "PikDame", new ImageIcon("PikDame.jpg"), 0);
    kartenstapel[10] = new Karte(10, "Herz", 11, "HerzDame", new ImageIcon("HerzDame.jpg"), 0);
    kartenstapel[11] = new Karte(10, "Karo", 12, "KaroDame", new ImageIcon("KaroDame.jpg"), 0);
    kartenstapel[12] = new Karte(10, "Kreuz", 13, "KreuzBube", new ImageIcon("KreuzBube.jpg"), 0);
    kartenstapel[13] = new Karte(10, "Pik", 14, "PikBube", new ImageIcon("PikBube.jpg"), 0);
    kartenstapel[14] = new Karte(10, "Herz", 15, "HerzBube", new ImageIcon("HerzBube.jpg"), 0);
    kartenstapel[15] = new Karte(10, "Karo", 16, "KaroBube", new ImageIcon("KaroBube.jpg"), 0);
    kartenstapel[16] = new Karte(10, "Kreuz", 17, "Kreuz10", new ImageIcon("Kreuz10.jpg"), 0);
    kartenstapel[17] = new Karte(10, "Pik", 18, "Pik10", new ImageIcon("Pik10.jpg"), 0);
    kartenstapel[18] = new Karte(10, "Herz", 19, "Herz10", new ImageIcon("Herz10.jpg"), 0);
    kartenstapel[19] = new Karte(10, "Karo", 20, "Karo10", new ImageIcon("Karo10.jpg"), 0);
    kartenstapel[20] = new Karte(9, "Kreuz", 21, "Kreuz9", new ImageIcon("Kreuz9.jpg"), 0);
    kartenstapel[21] = new Karte(9, "Pik", 22, "Pik9", new ImageIcon("Pik9.jpg"), 0);
    kartenstapel[22] = new Karte(9, "Herz", 23, "Herz9", new ImageIcon("Herz9.jpg"), 0);
    kartenstapel[23] = new Karte(9, "Karo", 24, "Karo9", new ImageIcon("Karo9.jpg"), 0);
    kartenstapel[24] = new Karte(8, "Kreuz", 25, "Kreuz8", new ImageIcon("Kreuz8.jpg"), 0);
    kartenstapel[25] = new Karte(8, "Pik", 26, "Pik8", new ImageIcon("Pik8.jpg"), 0);
    kartenstapel[26] = new Karte(8, "Herz", 27, "Herz8", new ImageIcon("Herz8.jpg"), 0);
    kartenstapel[27] = new Karte(8, "Karo", 28, "Karo8", new ImageIcon("Karo8.jpg"), 0);
    kartenstapel[28] = new Karte(7, "Kreuz", 29, "Kreuz7", new ImageIcon("Kreuz7.jpg"), 0);
    kartenstapel[29] = new Karte(7, "Pik", 30, "Pik7", new ImageIcon("Pik7.jpg"), 0);
    kartenstapel[30] = new Karte(7, "Herz", 31, "Herz7", new ImageIcon("Herz7.jpg"), 0);
    kartenstapel[31] = new Karte(7, "Karo", 32, "Karo7", new ImageIcon("Karo7.jpg"), 0);
    kartenstapel[32] = new Karte(6, "Kreuz", 33, "Kreuz6", new ImageIcon("Kreuz6.jpg"), 0);
    kartenstapel[33] = new Karte(6, "Pik", 34, "Pik6", new ImageIcon("Pik6.jpg"), 0);
    kartenstapel[34] = new Karte(6, "Herz", 35, "Herz6", new ImageIcon("Herz6.jpg"), 0);
    kartenstapel[35] = new Karte(6, "Karo", 36, "Karo6", new ImageIcon("Karo6.jpg"), 0);
    kartenstapel[36] = new Karte(5, "Kreuz", 37, "Kreuz5", new ImageIcon("Kreuz5.jpg"), 0);
    kartenstapel[37] = new Karte(5, "Pik", 38, "Pik5", new ImageIcon("Pik5.jpg"), 0);
    kartenstapel[38] = new Karte(5, "Herz", 39, "Herz5", new ImageIcon("Herz5.jpg"), 0);
    kartenstapel[39] = new Karte(5, "Karo", 40, "Karo5", new ImageIcon("Karo5.jpg"), 0);
    kartenstapel[40] = new Karte(4, "Kreuz",41, "Kreuz4", new ImageIcon("Kreuz4.jpg"), 0);
    kartenstapel[41] = new Karte(4, "Pik", 42, "Pik4", new ImageIcon("Pik4.jpg"), 0);
    kartenstapel[42] = new Karte(4, "Herz", 43, "Herz4", new ImageIcon("Herz4.jpg"), 0);
    kartenstapel[43] = new Karte(4, "Karo", 44, "Karo4", new ImageIcon("Karo4.jpg"), 0);
    kartenstapel[44] = new Karte(3, "Kreuz", 45, "Kreuz3", new ImageIcon("Kreuz3.jpg"), 0);
    kartenstapel[45] = new Karte(3, "Pik", 46, "Pik3", new ImageIcon("Pik3.jpg"), 0);
    kartenstapel[46] = new Karte(3, "Herz", 47, "Herz3", new ImageIcon("Herz3.jpg"), 0);
    kartenstapel[47] = new Karte(3, "Karo", 48, "Karo3", new ImageIcon("Karo3.jpg"), 0);
    kartenstapel[48] = new Karte(2, "Kreuz", 49, "Kreuz2", new ImageIcon("Kreuz2.jpg"), 0);
    kartenstapel[49] = new Karte(2, "Pik", 50, "Pik2", new ImageIcon("Pik2.jpg"), 0);
    kartenstapel[50] = new Karte(2, "Herz", 51, "Herz2", new ImageIcon("Herz2.jpg"), 0);
    kartenstapel[51] = new Karte(2, "Karo", 52, "Karo2", new ImageIcon("Karo2.jpg"), 0);
  }


  
  public Karte mischen()
  {
    Random zufallsgenerator = new Random();
    int a = zufallsgenerator.nextInt(52);

    while(kartenstapel[a].getGesetzt() == 1)
    {
      int b = zufallsgenerator.nextInt(52);
      a = b;
      while (a == b)
      {
        b = zufallsgenerator.nextInt(52);
        a = b;
      }
    }
    
    kartenstapel[a].setGesetzt(1);
    return kartenstapel[a];
  }
}
 
Zuletzt bearbeitet:
Nochmal zur Erklärung mit dem 2ten Array in der Klasse Spieler:
Die 8 Plätze im Array sollen mit 8 zufälligen Karten aus dem Kartenstapel mit der Methode mischen() zugewiesen werden.
Das 2te Array soll als Zwischenspeicher dienen, damit man so später die Karten auf eine GUI zaubern kann :)
Wie man jedoch schnell feststellt, hab ich keinen Plan, wie man Methoden im Zusammenhang mit Arrays benutzt...

@ice-breaker: ????
 
Da haste Rechte ice-breaker.


Hier mal ein funktionierende Code:

Was hab ich verändert?
  • Karte hat eine neues Feld, in dem ich setzt ob die Karte aus dem Stapel schon geholt wurde. - boolean statt deinem int.
  • Aus "mischen" wurde "eindeutigeZufallskarte" was fachlich besser Stimmt.
  • Ich hab den Algorithmus für das "mischen" mehr so geschrieben wie ich so was schreiben würde.
  • Es funktioniert :)



Spieler:
PHP:
import javax.swing.ImageIcon;

/**
 * 
 * @author Fabi
 */
public class Spieler {
	public Karte[] kartenstapel1 = new Karte[8];
	public int punktzahl;
	public int i = 0;
	public ImageIcon karte1 = new ImageIcon();
	public ImageIcon karte2 = new ImageIcon();
	public ImageIcon karte3 = new ImageIcon();
	public ImageIcon karte4 = new ImageIcon();
	public ImageIcon karte5 = new ImageIcon();
	public ImageIcon karte6 = new ImageIcon();
	public ImageIcon karte7 = new ImageIcon();
	public ImageIcon karte8 = new ImageIcon();


	public static void main(String[] args) throws Exception {
		new Spieler();
	}
	
	
	public Spieler() throws Exception {

		//in voller Kartenstapel
		Kartenstapel kartenStapel = new Kartenstapel();
		
		
		kartenstapel1[0] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[1] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[2] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[3] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[4] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[5] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[6] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[7] = kartenStapel.eindeutigeZufallskarte();
	}


	public int ergebnis_wert() {
		// Spieler bekommt sein Würfelpaar
		punktzahl = kartenstapel1[0].getWert() + kartenstapel1[1].getWert();
		return punktzahl;
	}


	public int ergebnis_wert_again() {
		punktzahl = punktzahl + kartenstapel1[2 + i].getWert();
		return punktzahl;
	}


	public void handkarten() {
		karte1 = kartenstapel1[0].getBild();
		karte2 = kartenstapel1[1].getBild();

		if(i >= 1) {
			karte3 = kartenstapel1[2].getBild();

			if(i >= 1) {
				karte4 = kartenstapel1[3].getBild();

				if(i >= 2) {
					karte5 = kartenstapel1[4].getBild();

					if(i >= 3) {
						karte6 = kartenstapel1[5].getBild();

						if(i >= 4) {
							karte7 = kartenstapel1[6].getBild();

							if(i >= 5) {
								karte8 = kartenstapel1[7].getBild();
							}
						}
					}
				}
			}
		}

	}

}

Karte:
PHP:
import javax.swing.ImageIcon;

/**
 * 
 * @author Fabi
 */
public class Karte {
	// Anfang Variablen
	private int wert;
	private String farbe;
	private int rang;
	private String name;
	private ImageIcon bild;
	private int gesetzt;
	private boolean randomGeholt;


	// Ende Variablen

	// Anfang Ereignisprozeduren
	public int getWert() {
		return wert;
	}


	public void setWert(int wert) {
		this.wert = wert;
	}


	public String getFarbe() {
		return farbe;
	}


	public void setFarbe(String farbe) {
		this.farbe = farbe;
	}


	public int getRang() {
		return rang;
	}


	public void setRang(int rang) {
		this.rang = rang;
	}


	public ImageIcon getBild() {
		return bild;
	}


	public void setBild(ImageIcon bild) {
		this.bild = bild;
	}


	public int getGesetzt() {
		return gesetzt;
	}


	public void setGesetzt(int gesetzt) {
		this.gesetzt = gesetzt;
	}


	public Karte(int wert, String farbe, int rang, String name, ImageIcon bild, int gesetzt) {
		this.wert = wert;
		this.farbe = farbe;
		this.rang = rang;
		this.name = name;
		this.bild = bild;
		this.gesetzt = gesetzt;
	}

	
	@Override
	public String toString() {
		return getWert() + ":" + getFarbe() + " " + getRang();
	}

	/**
	 * @return the randomGeholt
	 */
	public boolean isRandomGeholt() {
		return randomGeholt;
	}


	/**
	 * @param pRandomGeholt
	 *           the randomGeholt to set
	 */
	public void setRandomGeholt(boolean pRandomGeholt) {
		randomGeholt = pRandomGeholt;
	}

}


Kartenstapel:
PHP:
import java.util.Random;

/**
 * 
 * @author Fabi
 */
public class Kartenstapel {

	// Kartenstapel
	public Karte[] kartenstapel = new Karte[52];


	public Kartenstapel() // Rangordnung und Kartenwert sollen ausschlaggebend
								 // sein
	{
		//fügt alle Karten zu dem Stapel hinzu!
		kartenstapel[0] = new Karte(11, "Kreuz", 1, "KreuzAss", new ImageIcon("KreuzAss.jpg"), 0);
		kartenstapel[1] = new Karte(11, "Piek", 2, "PikAss", new ImageIcon("PikAss.jpg"), 0);
		kartenstapel[2] = new Karte(11, "Herz", 3, "HerzAss", new ImageIcon("HerzAss.jpg"), 0);
		kartenstapel[3] = new Karte(11, "Karo", 4, "KaroAss", new ImageIcon("KaroAss.jpg"), 0);
		kartenstapel[4] = new Karte(10, "Kreuz", 5, "KreuzKönig", new ImageIcon("KreuzKönig.jpg"), 0);
		kartenstapel[5] = new Karte(10, "Piek", 6, "PikKönig", new ImageIcon("PikKönig.jpg"), 0);
		kartenstapel[6] = new Karte(10, "Herz", 7, "HerzKönig", new ImageIcon("HerzKönig.jpg"), 0);
		kartenstapel[7] = new Karte(10, "Karo", 8, "KaroKönig", new ImageIcon("KaroKönig.jpg"), 0);
		kartenstapel[8] = new Karte(10, "Kreuz", 9, "KreuzDame", new ImageIcon("KreuzDame.jpg"), 0);
		kartenstapel[9] = new Karte(10, "Pik", 10, "PikDame", new ImageIcon("PikDame.jpg"), 0);
		kartenstapel[10] = new Karte(10, "Herz", 11, "HerzDame", new ImageIcon("HerzDame.jpg"), 0);
		kartenstapel[11] = new Karte(10, "Karo", 12, "KaroDame", new ImageIcon("KaroDame.jpg"), 0);
		kartenstapel[12] = new Karte(10, "Kreuz", 13, "KreuzBube", new ImageIcon("KreuzBube.jpg"), 0);
		kartenstapel[13] = new Karte(10, "Pik", 14, "PikBube", new ImageIcon("PikBube.jpg"), 0);
		kartenstapel[14] = new Karte(10, "Herz", 15, "HerzBube", new ImageIcon("HerzBube.jpg"), 0);
		kartenstapel[15] = new Karte(10, "Karo", 16, "KaroBube", new ImageIcon("KaroBube.jpg"), 0);
		kartenstapel[16] = new Karte(10, "Kreuz", 17, "Kreuz10", new ImageIcon("Kreuz10.jpg"), 0);
		kartenstapel[17] = new Karte(10, "Pik", 18, "Pik10", new ImageIcon("Pik10.jpg"), 0);
		kartenstapel[18] = new Karte(10, "Herz", 19, "Herz10", new ImageIcon("Herz10.jpg"), 0);
		kartenstapel[19] = new Karte(10, "Karo", 20, "Karo10", new ImageIcon("Karo10.jpg"), 0);
		kartenstapel[20] = new Karte(9, "Kreuz", 21, "Kreuz9", new ImageIcon("Kreuz9.jpg"), 0);
		kartenstapel[21] = new Karte(9, "Pik", 22, "Pik9", new ImageIcon("Pik9.jpg"), 0);
		kartenstapel[22] = new Karte(9, "Herz", 23, "Herz9", new ImageIcon("Herz9.jpg"), 0);
		kartenstapel[23] = new Karte(9, "Karo", 24, "Karo9", new ImageIcon("Karo9.jpg"), 0);
		kartenstapel[24] = new Karte(8, "Kreuz", 25, "Kreuz8", new ImageIcon("Kreuz8.jpg"), 0);
		kartenstapel[25] = new Karte(8, "Pik", 26, "Pik8", new ImageIcon("Pik8.jpg"), 0);
		kartenstapel[26] = new Karte(8, "Herz", 27, "Herz8", new ImageIcon("Herz8.jpg"), 0);
		kartenstapel[27] = new Karte(8, "Karo", 28, "Karo8", new ImageIcon("Karo8.jpg"), 0);
		kartenstapel[28] = new Karte(7, "Kreuz", 29, "Kreuz7", new ImageIcon("Kreuz7.jpg"), 0);
		kartenstapel[29] = new Karte(7, "Pik", 30, "Pik7", new ImageIcon("Pik7.jpg"), 0);
		kartenstapel[30] = new Karte(7, "Herz", 31, "Herz7", new ImageIcon("Herz7.jpg"), 0);
		kartenstapel[31] = new Karte(7, "Karo", 32, "Karo7", new ImageIcon("Karo7.jpg"), 0);
		kartenstapel[32] = new Karte(6, "Kreuz", 33, "Kreuz6", new ImageIcon("Kreuz6.jpg"), 0);
		kartenstapel[33] = new Karte(6, "Pik", 34, "Pik6", new ImageIcon("Pik6.jpg"), 0);
		kartenstapel[34] = new Karte(6, "Herz", 35, "Herz6", new ImageIcon("Herz6.jpg"), 0);
		kartenstapel[35] = new Karte(6, "Karo", 36, "Karo6", new ImageIcon("Karo6.jpg"), 0);
		kartenstapel[36] = new Karte(5, "Kreuz", 37, "Kreuz5", new ImageIcon("Kreuz5.jpg"), 0);
		kartenstapel[37] = new Karte(5, "Pik", 38, "Pik5", new ImageIcon("Pik5.jpg"), 0);
		kartenstapel[38] = new Karte(5, "Herz", 39, "Herz5", new ImageIcon("Herz5.jpg"), 0);
		kartenstapel[39] = new Karte(5, "Karo", 40, "Karo5", new ImageIcon("Karo5.jpg"), 0);
		kartenstapel[40] = new Karte(4, "Kreuz", 41, "Kreuz4", new ImageIcon("Kreuz4.jpg"), 0);
		kartenstapel[41] = new Karte(4, "Pik", 42, "Pik4", new ImageIcon("Pik4.jpg"), 0);
		kartenstapel[42] = new Karte(4, "Herz", 43, "Herz4", new ImageIcon("Herz4.jpg"), 0);
		kartenstapel[43] = new Karte(4, "Karo", 44, "Karo4", new ImageIcon("Karo4.jpg"), 0);
		kartenstapel[44] = new Karte(3, "Kreuz", 45, "Kreuz3", new ImageIcon("Kreuz3.jpg"), 0);
		kartenstapel[45] = new Karte(3, "Pik", 46, "Pik3", new ImageIcon("Pik3.jpg"), 0);
		kartenstapel[46] = new Karte(3, "Herz", 47, "Herz3", new ImageIcon("Herz3.jpg"), 0);
		kartenstapel[47] = new Karte(3, "Karo", 48, "Karo3", new ImageIcon("Karo3.jpg"), 0);
		kartenstapel[48] = new Karte(2, "Kreuz", 49, "Kreuz2", new ImageIcon("Kreuz2.jpg"), 0);
		kartenstapel[49] = new Karte(2, "Pik", 50, "Pik2", new ImageIcon("Pik2.jpg"), 0);
		kartenstapel[50] = new Karte(2, "Herz", 51, "Herz2", new ImageIcon("Herz2.jpg"), 0);
		kartenstapel[51] = new Karte(2, "Karo", 52, "Karo2", new ImageIcon("Karo2.jpg"), 0);
	}


	public Karte eindeutigeZufallskarte() throws Exception {
		
		//check ob mehr  eine oder mehr Karten noch verfügbar ist
		boolean karteAvailable = false;
		for (Karte karte : kartenstapel) {
			if(!karte.isRandomGeholt()) {
				karteAvailable = true;
			}
		}
		if(!karteAvailable) {
			throw new Exception("Keine Karte mehr verfügbar");
		}
		
		// hole ein zufällige:
		
		return getRandomKarte();
	}
	
	private Karte getRandomKarte() {
		int kartenNummer = new Random().nextInt(52);
		if(kartenstapel[kartenNummer].isRandomGeholt()) {
			return getRandomKarte();
		}
		
		
		kartenstapel[kartenNummer].setRandomGeholt(true);
		return kartenstapel[kartenNummer];
		
	}
}
 
Zuletzt bearbeitet:
Es gibt dir einen Fehler zurück, weil das, was du für einen Konstruktur hälst, keiner ist.

Code:
  public Karte kartenstapel()

Das ist eine Methodensignatur. Hier wird ein Rückgabewert vom Typ "Karte erwartet".

Code:
  public  [B]K[/B]artenstapel()
müsste es heißen.

Rest siehe Vorposter :)

@ice-breaker: dito!
 
Erstmal vielen Dank :)
Ich schaus mir gleich nachdem Basketballtrain nochmal genauer an :)

Nur noch eine Frage:
PHP:
 @Override 
    public String toString() { 
        return getWert() + ":" + getFarbe() + " " + getRang(); 
    } 

    /** 
     * @return the randomGeholt 
     */ 
    public boolean isRandomGeholt() { 
        return randomGeholt; 
    } 


    /** 
     * @param pRandomGeholt 
     *           the randomGeholt to set 
     */ 
    public void setRandomGeholt(boolean pRandomGeholt) { 
        randomGeholt = pRandomGeholt; 
    } 

}

Was bewirkt das in Karte???

Könnt ihr mir das bitte nochmal erklärn?
Weil bin recht neu in der Sprache (sieht man ja auch^^) & kenn mich da noch nicht so mit den ganzen Befehlen aus...
 
public String toString()

Die hab ich "überschrieben" damit ich im Debugger bessere Übersicht habe. Sonst nichts. Ansonsten sehe ich da nur Karte@234234 oder so. Nun kommt da der Inhalt zu sehen.

Diese isRandomGeholt/setRandomGeholt sind die sogenannten "Getter und Setter" für randomGeholt. So was hast du ja auch schon. Meine wurden mir von Eclipse generiert - so was tipp ich nicht selbst :) Verwende diese in der eindeutigeZufallskarte() Methode
Ergänzung ()

Hier nochmal mit Enums (eine mögliche Variante)

Karte:
PHP:
import javax.swing.ImageIcon;

/**
 * 
 * @author Fabi
 */
public class Karte {
	public enum Deckblatt {
		KreuzAss(11, Farbe.Kreuz, 1, "KreuzAss.jpg"),
		PikAss(11, Farbe.Pik, 2, "PikAss.jpg"),
		HerzAss(11, Farbe.Herz, 3, "HerzAss.jpg"),
		KaroAss(11, Farbe.Karo, 4, "KaroAss.jpg"),
		KreuzKönig(10, Farbe.Kreuz, 5, "KreuzKönig.jpg"),
		PikKönig(10, Farbe.Pik, 6, "PikKönig.jpg"),
		HerzKönig(10, Farbe.Herz, 7, "HerzKönig.jpg"),
		KaroKönig(10, Farbe.Karo, 8, "KaroKönig.jpg"),
		KreuzDame(10, Farbe.Kreuz, 9, "KreuzDame.jpg"),
		PikDame(10, Farbe.Pik, 10, "PikDame.jpg"),
		HerzDame(10, Farbe.Herz, 11, "HerzDame.jpg"),
		KaroDame(10, Farbe.Karo, 12, "KaroDame.jpg"),
		KreuzBube(10, Farbe.Kreuz, 13, "KreuzBube.jpg"),
		PikBube(10, Farbe.Pik, 14, "PikBube.jpg"),
		HerzBube(10, Farbe.Herz, 15, "HerzBube.jpg"),
		KaroBube(10, Farbe.Karo, 16, "KaroBube.jpg"),
		Kreuz10(10, Farbe.Kreuz, 17, "Kreuz10.jpg"),
		Pik10(10, Farbe.Pik, 18, "Pik10.jpg"),
		Herz10(10, Farbe.Herz, 19, "Herz10.jpg"),
		Karo10(10, Farbe.Karo, 20, "Karo10.jpg"),
		Kreuz9(9, Farbe.Kreuz, 21, "Kreuz9.jpg"),
		Pik9(9, Farbe.Pik, 22, "Pik9.jpg"),
		Herz9(9, Farbe.Herz, 23, "Herz9.jpg"),
		Karo9(9, Farbe.Karo, 24, "Karo9.jpg"),
		Kreuz8(8, Farbe.Kreuz, 25, "Kreuz8.jpg"),
		Pik8(8, Farbe.Pik, 26, "Pik8.jpg"),
		Herz8(8, Farbe.Herz, 27, "Herz8.jpg"),
		Karo8(8, Farbe.Karo, 28, "Karo8.jpg"),
		Kreuz7(7, Farbe.Kreuz, 29, "Kreuz7.jpg"),
		Pik7(7, Farbe.Pik, 30, "Pik7.jpg"),
		Herz7(7, Farbe.Herz, 31, "Herz7.jpg"),
		Karo7(7, Farbe.Karo, 32, "Karo7.jpg"),
		Kreuz6(6, Farbe.Kreuz, 33, "Kreuz6.jpg"),
		Pik6(6, Farbe.Pik, 34, "Pik6.jpg"),
		Herz6(6, Farbe.Herz, 35, "Herz6.jpg"),
		Karo6(6, Farbe.Karo, 36, "Karo6.jpg"),
		Kreuz5(5, Farbe.Kreuz, 37, "Kreuz5.jpg"),
		Pik5(5, Farbe.Pik, 38, "Pik5.jpg"),
		Herz5(5, Farbe.Herz, 39, "Herz5.jpg"),
		Karo5(5, Farbe.Karo, 40, "Karo5.jpg"),
		Kreuz4(4, Farbe.Kreuz, 41, "Kreuz4.jpg"),
		Pik4(4, Farbe.Pik, 42, "Pik4.jpg"),
		Herz4(4, Farbe.Herz, 43, "Herz4.jpg"),
		Karo4(4, Farbe.Karo, 44, "Karo4.jpg"),
		Kreuz3(3, Farbe.Kreuz, 45, "Kreuz3.jpg"),
		Pik3(3, Farbe.Pik, 46, "Pik3.jpg"),
		Herz3(3, Farbe.Herz, 47, "Herz3.jpg"),
		Karo3(3, Farbe.Karo, 48, "Karo3.jpg"),
		Kreuz2(2, Farbe.Kreuz, 49, "Kreuz2.jpg"),
		Pik2(2, Farbe.Pik, 50, "Pik2.jpg"),
		Herz2(2, Farbe.Herz, 51, "Herz2.jpg"),
		Karo2(2, Farbe.Karo, 52, "Karo2.jpg");

		private int wert;
		private Farbe farbe;
		private int rang;
		private ImageIcon bild;


		private Deckblatt(int wert, Farbe farbe, int rang, String bildName) {
			this.wert = wert;
			this.farbe = farbe;
			this.rang = rang;
			this.bild = new ImageIcon(bildName);
		}


		/**
		 * @return the wert
		 */
		public int getWert() {
			return wert;
		}


		/**
		 * @return the farbe
		 */
		public Farbe getFarbe() {
			return farbe;
		}


		/**
		 * @return the sortierung
		 */
		public int getRang() {
			return rang;
		}


		/**
		 * @return the bildName
		 */
		public ImageIcon getBil() {
			return bild;
		}

	}

	public enum Farbe {
		Pik, Herz, Kreuz, Karo
	}

	// Anfang Variablen
	private Deckblatt deckblatt;
	private ImageIcon bild;

	private boolean randomGeholt;


	// Ende Variablen

	// Anfang Ereignisprozeduren

	public ImageIcon getBild() {
		return bild;
	}


	public void setBild(ImageIcon bild) {
		this.bild = bild;
	}


	public Karte(Deckblatt beschriftung) {
		this.deckblatt = beschriftung;
	}


	@Override
	public String toString() {
		return deckblatt.getWert() + ":" + deckblatt.getFarbe() + " " + deckblatt.getRang();
	}


	/**
	 * @return the randomGeholt
	 */
	public boolean isRandomGeholt() {
		return randomGeholt;
	}


	/**
	 * @param pRandomGeholt
	 *           the randomGeholt to set
	 */
	public void setRandomGeholt(boolean pRandomGeholt) {
		randomGeholt = pRandomGeholt;
	}


	/**
	 * @return the beschriftung
	 */
	public Deckblatt getDeckblatt() {
		return deckblatt;
	}


	/**
	 * @param pBeschriftung
	 *           the beschriftung to set
	 */
	public void setDeckblatt(Deckblatt pDeckblatt) {
		deckblatt = pDeckblatt;
	}

}

Spieler:
PHP:
import javax.swing.ImageIcon;

/**
 * 
 * @author Fabi
 */
public class Spieler {
	public Karte[] kartenstapel1 = new Karte[8];
	public int punktzahl;
	public int i = 0;
	public ImageIcon karte1 = new ImageIcon();
	public ImageIcon karte2 = new ImageIcon();
	public ImageIcon karte3 = new ImageIcon();
	public ImageIcon karte4 = new ImageIcon();
	public ImageIcon karte5 = new ImageIcon();
	public ImageIcon karte6 = new ImageIcon();
	public ImageIcon karte7 = new ImageIcon();
	public ImageIcon karte8 = new ImageIcon();


	public static void main(String[] args) throws Exception {
		new Spieler();
	}


	public Spieler() throws Exception {

		// in voller Kartenstapel
		Kartenstapel kartenStapel = new Kartenstapel();

		kartenstapel1[0] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[1] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[2] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[3] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[4] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[5] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[6] = kartenStapel.eindeutigeZufallskarte();
		kartenstapel1[7] = kartenStapel.eindeutigeZufallskarte();
	}


	public int ergebnis_wert() {
		// Spieler bekommt sein Würfelpaar
		punktzahl = kartenstapel1[0].getDeckblatt().getWert() + kartenstapel1[1].getDeckblatt().getWert();
		return punktzahl;
	}


	public int ergebnis_wert_again() {
		punktzahl = punktzahl + kartenstapel1[2 + i].getDeckblatt().getWert();
		return punktzahl;
	}


	public void handkarten() {
		karte1 = kartenstapel1[0].getBild();
		karte2 = kartenstapel1[1].getBild();

		if(i >= 1) {
			karte3 = kartenstapel1[2].getBild();

			if(i >= 1) {
				karte4 = kartenstapel1[3].getBild();

				if(i >= 2) {
					karte5 = kartenstapel1[4].getBild();

					if(i >= 3) {
						karte6 = kartenstapel1[5].getBild();

						if(i >= 4) {
							karte7 = kartenstapel1[6].getBild();

							if(i >= 5) {
								karte8 = kartenstapel1[7].getBild();
							}
						}
					}
				}
			}
		}

	}

}


Kartenstapel:
PHP:
import java.util.Random;

/**
 * 
 * @author Fabi
 */
public class Kartenstapel {

	// Kartenstapel
	public Karte[] kartenstapel = new Karte[52];


	public Kartenstapel() {
		// fügt alle Karten zu dem Stapel hinzu!
		int counter = 0;
		for (Karte.Deckblatt beschriftung : Karte.Deckblatt.values()) {
			kartenstapel[counter] = new Karte(beschriftung);
			counter++;
		}
	}


	public Karte eindeutigeZufallskarte() throws Exception {

		// check ob mehr  eine oder mehr Karten noch verfügbar ist
		boolean karteAvailable = false;
		for (Karte karte : kartenstapel) {
			if(!karte.isRandomGeholt()) {
				karteAvailable = true;
			}
		}
		if(!karteAvailable) {
			throw new Exception("Keine Karte mehr verfügbar");
		}

		// hole ein zufällige:

		return getRandomKarte();
	}


	private Karte getRandomKarte() {
		int kartenNummer = new Random().nextInt(52);
		if(kartenstapel[kartenNummer].isRandomGeholt()) {
			return getRandomKarte();
		}

		kartenstapel[kartenNummer].setRandomGeholt(true);
		return kartenstapel[kartenNummer];

	}
}



+/- Ein paar Tippfehler :D
 
Zuletzt bearbeitet:
Hey,

nochmals vielen vielen Dank für eure Mühen :)
Aber nochmal ne Frage:
Ist es möglich, dass ganze auch auf diesen Weg zu machen (Code steht unten)?
Weil eure Schreibweise ist zwar richtig und super professionell, aber unsere Infolehrerin würde mir niemals abnehmen, dass der Code von mir ist...
& ich möchte ja auch nicht eure Arbeit klauen...
Außerdem verstehe ich wegen meiner sehr beschränkten Kenntnisse die "neue" mischen() Methode von TheNexior nicht...

Mischenmethode in Kartenstapel:
PHP:
 public Karte mischen()
  {
    Random zufallsgenerator = new Random();
    int a = zufallsgenerator.nextInt(52);

    while(kartenstapel[a].getGesetzt() == 1)
    {
      int b = zufallsgenerator.nextInt(52);
      //a = b;
      while (a == b)
      {
        b = zufallsgenerator.nextInt(52);
        a = b;
      }
    }
    
    kartenstapel[a].setGesetzt(1);
    return kartenstapel[a];
  }
Aufruf in der Klasse Spieler:
PHP:
import javax.swing.ImageIcon;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Fabi
 */
public class Spieler {
  public Karte[] kartenstapel_zw = new Karte[8];
  public int punktzahl;
  public int i = 0;
  public ImageIcon karte1 = new ImageIcon();
  public ImageIcon karte2 = new ImageIcon();
  public ImageIcon karte3 = new ImageIcon();
  public ImageIcon karte4 = new ImageIcon();
  public ImageIcon karte5 = new ImageIcon();
  public ImageIcon karte6 = new ImageIcon();
  public ImageIcon karte7 = new ImageIcon();
  public ImageIcon karte8 = new ImageIcon();
  

  public Spieler()
  {
      Kartenstapel kartenstapel2 = new Kartenstapel();
      
      kartenstapel_zw[0] = kartenstapel2.mischen();
      kartenstapel_zw[1] = kartenstapel2.mischen();
      kartenstapel_zw[2] = kartenstapel2.mischen();
      kartenstapel_zw[3] = kartenstapel2.mischen(); 
      kartenstapel_zw[4] = kartenstapel2.mischen();
      kartenstapel_zw[5] = kartenstapel2.mischen(); 
      kartenstapel_zw[6] = kartenstapel2.mischen(); 
      kartenstapel_zw[7] = kartenstapel2.mischen();       
  }

  public int ergebnis_wert()
  {
      punktzahl = kartenstapel_zw[0].getWert() + kartenstapel_zw[1].getWert(); // Spieler bekommt sein Würfelpaar
      return punktzahl;
  }
  
  public int ergebnis_wert_again()
  {
      punktzahl = punktzahl + kartenstapel_zw[2 + i].getWert();
      return punktzahl;
  }
  
  public void handkarten()
  {
      karte1 = kartenstapel_zw[0].getBild();
      karte2 = kartenstapel_zw[1].getBild(); 
      
      if (i >= 1)
      {
         karte3 = kartenstapel_zw[2].getBild();
      
         if (i >= 1)
         {
            karte4 = kartenstapel_zw[3].getBild();
      
            if (i >= 2)
            {
               karte5 = kartenstapel_zw[4].getBild(); 
                    
               if  (i >= 3)
               {
                  karte6 = kartenstapel_zw[5].getBild();
                 
                  if (i >= 4)
                  {
                     karte7 = kartenstapel_zw[6].getBild(); 
                
                     if (i >= 5)
                     {
                        karte8 = kartenstapel_zw[7].getBild(); 
                     }
                  }
               }   
            }
         }
      } 
      
      
  }
  
  
}
LG, evilf :)
 
Du musst dir die Sache mit dem

PHP:
while (a == b)
      {
        b = zufallsgenerator.nextInt(52);
        a = b;
      }

Nochmal ansehen.

Deine Bedingung, das die while-Schleife was macht ist "a == b".
Am Ende setzt du nun auch noch "a = b". Somit wird diese Schleife ewig dauern, da "a" niemals ungleich "b" sein kann.


Sprich du könntest es so schreibe, damit es gehen sollte:


PHP:
 public Karte mischen()
  {
    Random zufallsgenerator = new Random();
    int a = zufallsgenerator.nextInt(52);
    
    //gehe so lange durch, bis wir eine Karte gefunden habe, die noch nicht gesetzt isz  
    while(kartenstapel[a].getGesetzt() == 1)
    {
    	//oh die Karte ist schon gesetzt
    	//dann holen wir einen neuen Zufallswert
    	
      int b = zufallsgenerator.nextInt(52);
      //a = b;
      
      //prüfen ob der Zufallswert dem alten Wert entspricht
      while (a == b)
      {
      	//oh ja, er entspricht den alten wert
      	
      	//weiteren neuen Wert holen
        b = zufallsgenerator.nextInt(52);
       
      }
      //neuer Zufallswert ist einen neue Zahl, 
      //probieren wir diese mal für kartenstapel
      a = b;
    }
    
    kartenstapel[a].setGesetzt(1);
    return kartenstapel[a];
  }


Dein while (a == b) verhindert aber nur das der vorherige und nächste nicht gleich sein.

Theoretisch könnte der zufallsgenerator.nextInt(52); folgende Zahlenreihe zurückgeben
5
10
5
10
5
10

Dein while würde nie was machen. Aber egal, passiert eh nicht.
An sich brauchst du das while gar nicht.
Wenn die Zahl schon mal da war, wird er eh "getGesetzt" 1 sein. Somit geht er das erste While wieder durch, solang bis er eine Zahl hat, dessen Karte noch nicht gesetzt ist und das willst du ja.

Bei mir hatte ich noch eingebaut, dass er mir, wenn gar keine "freien" Karten mehr da sind, eine Fehler wirft. Sonst würde er unendlich lange durchgehen und irgendwann mit einem StackOverflow sich beenden :)

Sprich das reicht eigentlich:
PHP:
 public Karte mischen()
  {
    Random zufallsgenerator = new Random();
    int a = zufallsgenerator.nextInt(52);
    
    //gehe so lange durch, bis wir eine Karte gefunden habe, die noch nicht gesetzt isz  
    while(kartenstapel[a].getGesetzt() == 1)
    {
    	//oh die Karte ist schon gesetzt
    	//dann holen wir einen neuen Zufallswert
    	
      a = zufallsgenerator.nextInt(52);
     
    }
    
    kartenstapel[a].setGesetzt(1);
    return kartenstapel[a];
  }
Ergänzung ()

Sehe gerade noch das wir 0-51 als Index haben

zufallsgenerator.nextInt(52) liefert aber 0-52

Also
zufallsgenerator.nextInt(51) !

Nox
 
Zuletzt bearbeitet:
Nein, Random.nextInt() liefert 0-51:
... between 0 (inclusive) and the specified value (exclusive) ...
Code:
Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All n possible int values are produced with (approximately) equal probability. The method nextInt(int n) is implemented by class Random as if by: 

 
 public int nextInt(int n) {
   if (n <= 0)
     throw new IllegalArgumentException("n must be positive");

   if ((n & -n) == n)  // i.e., n is a power of 2
     return (int)((n * (long)next(31)) >> 31);

   int bits, val;
   do {
       bits = next(31);
       val = bits % n;
   } while (bits - val + (n-1) < 0);
   return val;
 }}
The hedge "approximately" is used in the foregoing description only because the next method is only approximately an unbiased source of independently chosen bits. If it were a perfect source of randomly chosen bits, then the algorithm shown would choose int values from the stated range with perfect uniformity. 

The algorithm is slightly tricky. It rejects values that would result in an uneven distribution (due to the fact that 2^31 is not divisible by n). The probability of a value being rejected depends on n. The worst case is n=2^30+1, for which the probability of a reject is 1/2, and the expected number of iterations before the loop terminates is 2. 

The algorithm treats the case where n is a power of two specially: it returns the correct number of high-order bits from the underlying pseudo-random number generator. In the absence of special treatment, the correct number of low-order bits would be returned. Linear congruential pseudo-random number generators such as the one implemented by this class are known to have short periods in the sequence of values of their low-order bits. Thus, this special case greatly increases the length of the sequence of values returned by successive calls to this method if n is a small power of two.

Parameters:
n the bound on the random number to be returned. Must be positive.
Returns:
the next pseudorandom, uniformly distributed int value between 0 (inclusive) and n (exclusive) from this random number generator's sequence
Throws:
IllegalArgumentException - if n is not positive
Since:
1.2
 
könntest auch switch case benutzen, anstatt den endlosen ifs, oder welche werte kann i annehmen?


switch(i) {
default:
case 5: karte8 = kartenstapel_zw[7].getBild();
case 4: karte7 = kartenstapel_zw[6].getBild();
case 3: karte6 = kartenstapel_zw[5].getBild();
case 2: karte5 = kartenstapel_zw[4].getBild();
case 1: karte4 = kartenstapel_zw[3].getBild();
karte3 = kartenstapel_zw[2].getBild();
case0: break;
}
 
Zuletzt bearbeitet:
@shh
Stimmt das wars. Deswegen ist es mir vorher auch micht aufgefallen, weil es da nichts aufzufallen gibt :)
 
Nur ein paar Anmerkungen zur Form:

Code:
public class [B]Kartenstapel [/B]{

    // Kartenstapel
    public Karte[] [B]kartenstapel [/B]= new Karte[52];

das Array Karte, Kartenstapel zu nennen finde ich sehr unschön und verwirrend.
Schließlich heisst ja die Klasse selbst so ....
ich würd

Code:
public Karte[] [B]karten[/B]= new Karte[52]

schreiben, dann gehts auch viel einfacher die Begriffe auseinanderzuhalten
 
@timurinamanu
Recht hast du.
Aber wenn es darum geht, würde ich sicherlich einiges an Änderungen vorschlagen, aber ich hoffe evilf kommt mittlerweile mit dem vorhanden schon zurecht :)
 
Jo, nochmals vielen Dank an alle hier :)
Endlich tut das Programm das, was es soll :D
Ihr habt mir das echt gut & verständlich erklärt.

MfG, evilf
 
Kleiner Tipp am Rande:
Bastel Dir zu deinem Quellcode noch die passenden JavaDoc Kommentar :)
 
Ironischerweise wäre es hier sinnvoller gewesen Listen zu benutzen, oder irre ich mich da?
 
Zurück
Oben