# Hilfe beim Programmieren[JAVA]



## GTA 3 (1. Juni 2013)

Hallo,
ein Kumpel und ich versuchen derzeit UNO als ein Schulprojekt zu programmieren.
Leider sind wir jetzt bzw. ich bei meinem Teil auf ein Problem gestoßen. Wir benutzen Arrays für die Karten als sozu sagen ein Stapel.

Somit haben wir in der Klasse Stapel mit der Methode Kartenbennung ein Stapel der die Karten (sortiert nach Farben) darstellt.
Deklariert haben die das Array mit private Karte[] kdata;

Ich habe jetzt in der Klasse GUI ein Button mit einem listener erstellt der jetzt ein zufälliges Feld aus der Klasse Stappel aussuchen soll. (Verständlich gesagt: Durch das Aussuchen eines Random Feldes wird irgend eine bestimmte UNO karte ausgesucht).

Wie mach ich das genau ?
Ich bin leider kein Vollprofi in Java und komme erst nach und nach rein. Aber ein totaler anfänger bin ich auch keiner mehr.


----------



## GTA 3 (1. Juni 2013)

Noch hinzuzufügen ist,dass ich die dafür erfoderliche zahl mit einer variable in der klasse GUI generieren lassen.
einigen wir uns auf den Namen und Typ int generiereZahl = (int) ((Math.random()*99)+1);. (random ist noch nicht angepasst)

Wir haben nur 40 Felder.


----------



## Leandros (1. Juni 2013)

Das Array ist gefüllt, oder? 

Du kannst dir entweder eine Methode zum Randomizen des ganzen Arrays bauen, oder du generierst einfach eine Random Number und holst dir diese Karte aus dem Array


```
Random rand = new Random();
int min = 1;
int max = 10;
int randomNum = rand.nextInt(max - min + 1) + min;
kdata[randomNum];
```


----------



## GTA 3 (1. Juni 2013)

Gut, ich denk so könnte es dann klappen. 


```
public void verarbeiteButtonKarteziehen(){
        Random feld = new Random();
        int randomKarte = feld.nextInt((40)+1);
        //int zufallZahl = (int) ((Math.random()*40)+0);
        kdata[randomKarte];
    }
```
Ein Problem gibt es aber mit kdata. der code mit random rand befindet sich ja in der klasse GUI.

Die Arrays kdata sind aber in Stapel. Das ist das, was mir er probleme macht. wie greif ich auf kdata zu ?

Zwar sollte die Klasse Steuerung die Hauptklasse sein, aber die verfeinerungen werde ich irgendwann später machen. Zu erst kann die Klasse GUI direkt auf Stapel zugreifen.

EDIT WICHTIG: Der Array in Stapel befindet sich dort nicht in einer Methode sondern im Konstruktor.


----------



## Leandros (1. Juni 2013)

Du hast das + min vergessen.

Warum genau hast du die Random generierung im GUI?  Das hat irgendwie nichts mit dem GUI zu tun ...

Um auf kdata zu zugreifen kannst du dir einen simplen getter/setter erstellen. 


```
private static Karte[] kdata;

protected static Karte[] getKarte() {
    return kdata;
}

protected static void setKarte(Karte[] karte) {
    kdata = karte;
}
```


----------



## GTA 3 (1. Juni 2013)

Leandros schrieb:


> Du hast das + min vergessen.
> 
> Warum genau hast du die Random generierung im GUI?  Das hat irgendwie nichts mit dem GUI zu tun ...
> 
> ...


 Für was ist die zweite Methode nötig ?


----------



## GTA 3 (1. Juni 2013)

Also ich bin jetzt soweit gekommen. 

In der Klasse Stapel(wo das Array ist) habe ich das hier eingetragen:


```
protected Karte[]getKarte() {
        return kdata;
}
    protected void setKarte(Karte[] karte) {
        this.kdata = kdata;
}
```
Und die Steuerung will jetzt darauf zugreifen. Steuerung sieht jetzt so bei mir aus.

```
public void holeKarte(String[] kdata){
        Stapel derStapel = new Stapel(null);
        Random feld = new Random();
        int randomFeld = feld.nextInt((40)+1);
        derStapel.getKarte[randomFeld] = neueKarte;
        
    }
```
Wenn ich jetzt jedoch compile kommt nen error.
";" expected.
Ich weiß jetzt bloß nicht wie der Code dazu jetzt aussehen soll.


----------



## DarkMo (1. Juni 2013)

also hole karte würde ich so gestalten:

```
Stapel.getRndCard();
```


wie leandros schon sagte: das mit dem random gehört IN die karten/stapel klasse, nicht ausserhalb. baust dir halt in der karten klasse ne funktion, die dir ne zufällige karte zurück gibt und fertig. am besten wäre es dann, wenn du die "gezogene" karte auch gleich aus dem stapel löscht, sonst kannst du die selben karten ja immer wieder ziehen.

ich würde das ganze vllt so gestalten:
die klasse KartenStapel (oder wie auch immer) hat das Karten-Array (ich würde das nicht Karte, sondern Karten nennen, sind ja mehrere ^^) - also wieviele karten sich im stapel befinden und, welche karten das sind. dazu vllt ne extra klasse Karte gebaut, die dann ne farbe und ne nummer hat (oder eben nen spezial). dann erstellt man in KartenStapel das Karten array als "Karte Karten[]" und initialisierts im konstruktor mit "this.Karten = new Karte[32];" (oder wieviel karten so ein uno spiel hat).
das ganze bekommt dann noch ne funke, um es zu füllen und dort erstellt man dann in ner for schleife die ganzen karten. solange das nur nummern und farben sind geht das noch recht simpel, mit den spezialkarten wirds kniffliger ^^ aber sollte auch gehen. so grob stell ichs mir so vor (man könnte vllt noch nen array für farben anlegen -> {rot, grün, blau, gelb}):

```
for(int i = 0; i <= 12; i++) { // kA was die höchste Zahl bei uno war ^^
    for(int j = 0; j <4; j++) {
        this.Karten[(i * 4) + j] = new Karte(i, this.Farben[j], /*... irgendwas für specials */);
    }
}
// ... im anschluss die spezialkarten erstellen und adden
// ganz am ende den stapel mischen, oder beim karten geben ne zufalls karte rausrücken - ersteres währe irgendwie realistischer ^^
```

joa, so in etwa. setzt natürlich vorraus, das die Karten-Klasse nen konstruktor hat, der die zahl aufnimmt, die farbe als string und in irgendeiner weise irgendwas für die specials (2 ziehen, farbenwähler...). und es fehlt noch ne addKarte(Karte) methode. im hauptteil erstellt man dann zum bsp 4 objekte dieser klasse -> Stapel, Tisch, Spieler1, Spieler2 (oder allgemeiner Spieler[0] und Spieler[1] oder so ^^). beim Stapel wird die füll methode noch aufgerufen, die spieler bleiben leer. dann bekommen die spieler ihre karten (sprich man holt karten aus dem stapel (welche dabei aus dem stapel gelöscht wird und added diese den spielern. Am ende bekommt der Tisch noch ne karte und es kann losgehn. passt ne karte, kann man diese vom spieler getten (wobei es wieder gelöscht wird - siehtse, hier wäre dann nen random-get auch blöde) und dem tisch adden bis irgend ein spieler keine karten mehr hat.


----------



## GTA 3 (1. Juni 2013)

Also das meiste haben wir noch. Mit dem Array löschen werden wir erst später hinzufügen.

Was wir grad nur wollen ist von der Klasse Steuerung auf Stapel zugreifen so siehts im Moment aus:

```
import java.util.*;
import java.util.Random.*;
public class Steuerung{
    GUI dieGUI;
    Spieler derSpieler;
    Stapel derStapel;
    private Karte[] kdata;
    public Steuerung(){
        //konstruktior der steuerung, erstellt u.a. die anderen klassen
        dieGUI = new GUI(this);
        
    }
    
    public static void main(String[] args){
        //Das ist die Startmethode, sie erstellt sich selbst (Die Steuerung)
        Steuerung dieSteuerung = new Steuerung();
    }
    
    public void holeKarte(){
        //Zufallszahl für Feld
        Random feld = new Random();
        int randomFeld = feld.nextInt((40)+1);
        // Wie greif ich jetzt auf Stapel ?!
    }

}
```
Und hier ist Stapel

```
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class Stapel{
    private Karte[] kdata; //Feld mit kartendaten
    private int dgroesse = 0; //groesse des Stapels
    private int dkartenzahl = 0; //wie viele karten noch im stapel enthalten sind
    private int dletztekarte = 0; //position der letzten karte die zum stapel hinzugefügt wurde
       
        
    
    public Stapel(Stapel hand){ //zweites deck, das die Handkarten simuliert
        kdata = new Karte[hand.kdata.length];
        for(int r = 0; r < kdata.length; ++r){
            //erschafft jede neue karte
            kdata[r] = new Karte();
            //setzt die kartendaten im deck auf "leer"
            kdata[r].ktyp = '0';
            kdata[r].kfarbe = '0';
            kdata[r].kanzahl = 0;
        }
        dgroesse = dkartenzahl = dletztekarte = 0;    //deck wird geleert
    }
    
    public void Kartenbenennung(){
        dgroesse = 40;
        kdata = new Karte[dgroesse];
               
        for(int i = 0; i < dgroesse; ++i){
            //neue Karte "erschaffen"
            kdata[i] = new Karte();
            //karten daten bestimmen (Wert der Karte)
            if(i == 1 || i == 11 || i == 21 || i == 31){
                kdata[i].ktyp = '0';
                kdata[i].kanzahl = 2;
            }
            else if(i == 2 || i == 12 || i == 22 || i == 32){
                kdata[i].ktyp = '1';
                kdata[i].kanzahl = 2;
            }
            else if(i == 3 || i == 13 || i == 23 || i == 33){
                kdata[i].ktyp = '2';
                kdata[i].kanzahl = 2;
            }
            else if(i == 4 || i == 14 || i == 24 || i == 34){
                kdata[i].ktyp = '3';
                kdata[i].kanzahl = 2;
            }
            else if(i == 5 || i == 15 || i == 25 || i == 35){
                kdata[i].ktyp = '4';
                kdata[i].kanzahl = 2;
            }
            else if(i == 6 || i == 16 || i == 26 || i == 36){
                kdata[i].ktyp = '5';
                kdata[i].kanzahl = 2;
            }
            else if(i == 7 || i == 17 || i == 27 || i == 37){
                kdata[i].ktyp = '6';
                kdata[i].kanzahl = 2;
            }
            else if(i == 8 || i == 18 || i == 28 || i == 38){
                kdata[i].ktyp = '7';
                kdata[i].kanzahl = 2;
            }
            else if(i == 9 || i == 19 || i == 29 || i == 39){
                kdata[i].ktyp = '8';
                kdata[i].kanzahl = 2;
            }
            else if(i == 10 || i == 20 || i == 30 || i == 40){
                kdata[i].ktyp = '9';
                kdata[i].kanzahl = 2;
            }
                       
             //Kartenfarbe zuweisen
            if(i <= 10){
                 kdata[i].kfarbe = 'B';
            }
            else if(i <= 20){
                 kdata[i].kfarbe = 'G';
            }
            else if(i <= 30){
                 kdata[i].kfarbe = 'R';
            }
            else if(i <= 40){
                 kdata[i].kfarbe = 'Y';
            }
                       
            //karten anzahl updaten
            dkartenzahl += kdata[i].kanzahl;
        }
        
        
    }
    
    //damit steuerung auf array in stapel zugreifen kann
    public Karte[] getKarte() { //getter
        return kdata;
    }
    public void setKarte(Karte[] karte) {  //setter
        this.kdata = kdata;
    }
}
```
Wir haben uns entschieden die Arrays nicht zu mischen sondern zufällig ein Array auszusuchen. 
Die Spezialkarten kommen auch erst später viel später rein. Erst kümmern wir uns um die Hauptkarten. Wir haben uns entschieden die Hauptkarten nach Farbe und aufsteigende Zahl zu sortieren, wobei auch noch jede karte 2 vorkommt.

Ich probiers mal in der Stapelklasse.


----------



## Leandros (2. Juni 2013)

Ich antworte jetzt nicht ausführlich (weil Grad vom Saufen heimgekommen), das mach ich nachher. Aber kleiner Tipp, ließ die setKarte Funktion nochmal, du hast sie Falsch abgeschrieben.


----------



## Evandar (2. Juni 2013)

Irgendwie blicke ich bei deinen Code nicht durch. Aber der Reihe nach.

Der Zugriff auf den Stapel bzw. auf eine Karte darin ist einfach über 

```
public void holeKarte(){
        //Zufallszahl für Feld
        Random feld = new Random();
        int randomFeld = feld.nextInt((40)+1);
        // Wie greif ich jetzt auf Stapel ?!
        Karte neueKarte = derStapel[randomFeld];
    }
```

möglich, aber hier endet es auch schon, mit dem was ich direkt verstehe.

Ist es bei Uno nicht so, dass jede Karte nur einmal im Stapel ist/sein darf? Wenn dem so ist, wie verhindert ihr dann, dass Karten doppelt vorkommen? Bei reinen "zufalls ziehen", ohne die Karte im Spielstapel zu entfernen bzw. sperren wird das immer wieder vorkommen.

Ich persönlich würde das ganze umbauen. Ich würde ein statischen Stapel verwenden, in den alle Karten zum Start der Anwendung erzeugt werden, das macht die spätere Arbeit leichter, dann würde ich aus den geordneten Stapel ein "Zufallsstapel" erzeugen und die Karten aus diesen  neuen Stapel bei der Vergabe entfernen. So stellst du auf einfache Art sicher, dass es immer nur eine Instanz einer Karte im Spiel geben kann.


----------



## GTA 3 (2. Juni 2013)

Ich hab ein anderes Problem:

Und zwar habe ich jetzt eine Abfrage für den Namen erstellt, der diesen dann in das GUI reinzeichnet. Leider gibt es mir beim Starten der Anwendung einen nullpointer exception raus. Warum ?

Hier die Codes.

Klasse GUI:


```
import java.awt.*;          //Abstract Windowing Toolkit
import java.awt.event.*;    //Ereignisse wie Klick auf Button
import javax.swing.*;       //Swing Komponente fuer GUI
import javax.imageio.*;
import java.util.*;
import javax.swing.JTextArea;
import java.io.*;            //Für BufferedReader

public class GUI extends JPanel{
    //Deklarieren
    Steuerung dieSteuerung;
    JFrame frameGUI;
    private JMenuBar menuBar;
    private JMenu datei;
    private JMenu help;
    private JLabel lblBlank;
    private JMenuItem main;
    private JMenuItem aboutUNO;
    private JMenuItem readme;
    private JButton karteziehen;
    private JLabel spielerName[] = new JLabel[3];
    
    //erstellen der Oberflaeche   
    public GUI(Steuerung dieSteuerung){
        //übergeben der Klasse Steuerung an die Oberfläche
        this.dieSteuerung=dieSteuerung;
        
        
        
        //Initialisieren & Abfrage der Spielernamen via showInputDialog und Uebergabe an Konstruktor
        String player0 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 1. Spielers (User) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player1 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 2. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player2 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 3. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player3 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 4. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        datei = new JMenu("Hauptmenue");
        help = new JMenu("Hilfe");
        main = new JMenuItem("Neues Spiel");
        aboutUNO = new JMenuItem("About UNO");
        readme = new JMenuItem("Readme");
        frameGUI = new JFrame("UNO");
        lblBlank = new JLabel();   //leeres Label
        menuBar = new JMenuBar();
        
        //Hinzufuegen
        menuBar.add(datei);         //Hauptmenue
        menuBar.add(help);          //Menue Hilfe
        menuBar.add(lblBlank);
        datei.add(main);            //Unterpunkt Neues Spiel unter Hauptmenue
        help.add(aboutUNO);         //Unterpunkt About UNO unter Help
        help.add(readme);           //Unterpunkt Readme unter Help
        
        frameGUI.setSize(1024,768);             // zeichnet auto x und y 
        frameGUI.getContentPane().add(this);    
        frameGUI.setJMenuBar(menuBar);          //Menueleiste
        frameGUI.setResizable(false);           //Groesse nicht aenderbar
        frameGUI.setVisible(true);              //Sichtbarkeit
        frameGUI.setLayout(null);               //Nulllayout
        frameGUI.setLocationRelativeTo(null);   //Fenster zentrieren 
        repaint();                              //Vorsichtsmaßnahme
        
        //Anzeigen der Namen im GUI
        spielerName[0] = new JLabel(dieSteuerung.getName(0));
        spielerName[0].setBounds(200,342,208,230);
        spielerName[0].setFont(spielerName[0].getFont().deriveFont(16f));
        spielerName[0].setForeground(Color.red);
        add(spielerName[0]);
        
        spielerName[1] = new JLabel(dieSteuerung.getName(1));
        spielerName[1].setBounds(200,342,208,230);
        spielerName[1].setFont(spielerName[1].getFont().deriveFont(16f));
        spielerName[1].setForeground(Color.red);
        add(spielerName[1]);
        
        //Spieler erstellen
        dieSteuerung.makePlayer(player0, player1, player2, player3);
        
        //neues Spiel starten
        main.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                
                //Button wird hinzugefügt, angepasst und bereit gestellt
                karteziehen = new JButton("Karte ziehen"); //Button erstellt
                frameGUI.add(karteziehen);              //Button hinzugefügt
                karteziehen.setBounds(850,20,150,50);   //Button Karteziehen position
                karteziehen.addMouseListener(new java.awt.event.MouseAdapter(){ //Buttonlistener wird aktiviert
                public void mousePressed(MouseEvent e){
                    zieheKarte();
                }});
            }
        });
        
        //AboutUNO-Popup  aufrufen
        aboutUNO.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                JOptionPane.showMessageDialog(null,"Game created by Jonas.S and Cem.G \nVersion 0.1\nBased on Java 7", "About UNO",JOptionPane.INFORMATION_MESSAGE,new ImageIcon("unologo.jpg"));             
            }
        });
        
        //Readme aufrufen
        readme.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                try{ 
                    Desktop desktop = Desktop.getDesktop();
                    desktop.edit(new File("README.TXT"));
                }catch (Exception exp){
                }    
            }
        });
    }
    
    /**CODE NÖTIG,FUNKT NOCH NICHT!**/
    //Methode für KarteziehenButton
    public void zieheKarte(){
        //dieSteuerung.macheKarte();
    }
    
    //Anzeigen des Hintergrundbildes
    public void paintComponent(Graphics g) {
        g.drawImage(getToolkit().getImage("hintergrund.jpg"),0,0,1024,768,null);
    }

}
```


```
import java.util.*;
import java.util.Random.*;
public class Steuerung{
    GUI dieGUI;
    Spiel derSpieler;
    Stapel derStapel;
    private static Spiel player0;
    private static Spiel player1;
    private static Spiel player2;
    private static Spiel player3;
    private static int anzahlSpielzuege = 0;
    private static int currentPlayer = 0;
    private static int kartenFelder[] = {0,0,0,0,0,0,0,0,0};

    public Steuerung(){
        //Konstruktor der Steuerung, erstellt u.a. die anderen Klassen
        dieGUI = new GUI(this);        
    }
    
    public static void main(String[] args){
        //Das ist die Startmethode, sie erstellt sich selbst (Die Steuerung)
        Steuerung dieSteuerung = new Steuerung();
    }
    
    // Methode zum Erstellen von zwei neuen Objekten vom Typ Spiel (-> die beiden Spieler)
    public void makePlayer(String namePlayer0, String namePlayer1,String namePlayer2, String namePlayer3){
       player0 = new Spiel(namePlayer0);
       player1 = new Spiel(namePlayer1);
       player2 = new Spiel(namePlayer2);
       player3 = new Spiel(namePlayer3);
    }
    
    public static void newGame(){
        /**Code nötig**/
        reset(0);
        
    }
    
    // Methode zum zuruecksetzen der Spielerdaten sowie der Informationen ueber Spielzuege 
    //und gelegte Karten auf dem Spielfeld
    public static void reset(int startspieler){
        /**Code nötig**/
        player0.reset();
        player1.reset();
        for(int i = 0; i <= 8; i++) {
           kartenFelder[i] = 0;
        }
        anzahlSpielzuege = 0;
        currentPlayer = startspieler;
    }
    
   [U] // Methode zum Auslesen der Spielernamen
    public String getName(int player) {
       if(player == 0) {
           return player0.getName();
       }else if(player == 1){
           return player1.getName();
       }else if(player == 2){
           return player2.getName();
       }else{
           return player3.getName();
       }[/U]
    }
    
    // Methode um zu pruefen, ob Karte gespielt oder nicht
    public int pruefeGespielt(int feld) {
       return kartenFelder[feld];
    }
    
    // Methode um eine gespielt als "verwendet" zu markieren , nötig damit die karte in die Mitte wandert
    public void setzeSpielzug(int feld) {
       kartenFelder[feld] = 1;
       
       if(currentPlayer == 0) {
           player0.setCard(feld);
       }else{
           /**CODE NÖTIG FÜR KI BEFEHLIGEN**/  
       }
       anzahlSpielzuege++;
    }
    
    // Methode zum auslesen der Anzahl der Enemykarten
    public String getPunktestand(int player){
       if(player == 1) {
           return String.valueOf(player1.getEnemycards());
       }else if(player == 2){
           return String.valueOf(player2.getEnemycards());
       }else if(player > 2){
           return String.valueOf(player3.getEnemycards());
       }else{
           return null;
       }
    }
    
    // Methode zum auslesen des aktuellen Spielers
    public int getPlayer() {
       return currentPlayer;
    }

    /**Versuch um eine random Karte aus dem Feld der Klasse Stapel zu holen, CODE NÖTIG**/
    public void macheKarte(){
        //Zufallszahl für Feld
        Random feld = new Random();
        int randomFeld = feld.nextInt((40)+1);
        // Wie greif ich jetzt auf Stapel ?!
        derStapel.getKarte();
        
    }    
}
```
 Der Fehlerbericht verweist mich auf die Unterstrichene Stelle in der Klasse Steuerung. Wo ist da  der Fehler ?


----------



## Evandar (2. Juni 2013)

OK, mein Fehler. Nulll Pointer Exception.

Eines, oder alle, der Objekte player0 bis player3 ist nicht gültig, wurde ich vermuten. Leg dir doch mal ein Break Point in die Funktion und für das ganze im Debugger aus.


----------



## GTA 3 (2. Juni 2013)

Ich versteh den Debugger nicht ganz. Auf was muss ich achten ? 

EDit: Ich habs. Ich muss zuerst die Spieler erstellen und nicht erst nach dem Anzeigen.


----------



## Evandar (2. Juni 2013)

Ich weis jetzt nicht was du al Umgebung verwendest, von daher nur eine grobe Beschreibung.

Setz den BP auf das erst if der Funktion und schau nach den Werten der Variablen player0-3. Entweder geht es einfach indem du mit der Maus drüber gehst oder du musst sie zur Überwachung hinzufügen. Wenn da Null drin steht hast du die Ursache.

Das wir sicherlich so sein, ohne deine weiteren Code zu kennen. Dann würde ich an stelle schauen warum der Teil nicht initialisiert ist.


----------



## GTA 3 (2. Juni 2013)

Ich verwende BlueJ. Hat alles geklappt danke.


----------



## Evandar (2. Juni 2013)

Noch ein Tip der euch die Arbeit erleichtert. 

So Sachen wie player0, player1 sind sehr unschön und führen zu "komplizierteren" Code. Verwendet am besten direkt Arrays oder Listen. Das macht zwar die erste Zeit mehr Arbeit, hilft aber eigentlich überall.


----------



## GTA 3 (3. Juni 2013)

Alles klar danke. Für die Zukunft werden wir es so machen.

Jedoch:

Neuer Tag neues Problem. Ich habe heute versuch, dass erste mal eine Karte reinzuzeichnen. Jedoch klappt man mit der Methode drawIamge nicht ganz ?! Warum ? Der Hintergrund wird gezeichnet ?!


```
import java.awt.*;          //Abstract Windowing Toolkit
import java.awt.event.*;    //Ereignisse wie Klick auf Button
import javax.swing.*;       //Swing Komponente fuer GUI
import javax.imageio.*;
import java.util.*;
import javax.swing.JTextArea;
import java.io.*;            //Für BufferedReader

public class GUI extends JLabel{
    //Deklarieren
    Steuerung dieSteuerung;
    JFrame frameGUI;
    private JMenuBar menuBar;
    private JMenu datei;
    private JMenu help;
    private JLabel lblBlank;
    private JMenuItem main;
    private JMenuItem aboutUNO;
    private JMenuItem readme;
    private JButton karteziehen;
    private JLabel spielerName[] = new JLabel[4];
    private Image grafikFelder[] = new Image[40];
    private int n = 0;
    //erstellen der Oberflaeche   
    public GUI(Steuerung dieSteuerung){
        //übergeben der Klasse Steuerung an die Oberfläche
        this.dieSteuerung=dieSteuerung;
        
        //bestimmen der Bilder für die Werte!
        for(n=0; n<40; n++){
            if(n>=10 && n<=19){
                grafikFelder[n]=new ImageIcon("karten/blau/"+ n +".jpg").getImage();
            }
            else if(n>=20 && n<=29){
                grafikFelder[n]=new ImageIcon("karten/gelb/"+(-10)).getImage();
            }
            else if(n>=30 && n<=39){
                grafikFelder[n]=new ImageIcon("karten/gruen/"+(n-20)).getImage();
            }else if(n>=30 && n<=39){
                grafikFelder[n]=new ImageIcon("karten/rot/"+(n-30)).getImage();
            }
        }

        //Abfrage der Spielernamen via showInputDialog und Uebergabe an Konstruktor
        String player0 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 1. Spielers (User) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player1 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 2. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player2 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 3. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        String player3 = JOptionPane.showInputDialog(new JFrame(), "Bitte gebe den Namen des 4. Spielers (Com) ein:", "Willkommen!", JOptionPane.QUESTION_MESSAGE);
        
        //Spieler erstellen
        dieSteuerung.makePlayer(player0, player1, player2, player3);
        
        //Initialisierung
        spielerName[0] = new JLabel(dieSteuerung.getName(0));
        spielerName[1] = new JLabel(dieSteuerung.getName(1));
        spielerName[2] = new JLabel(dieSteuerung.getName(2));
        spielerName[3] = new JLabel(dieSteuerung.getName(3));

        datei = new JMenu("Hauptmenue");
        help = new JMenu("Hilfe");
        main = new JMenuItem("Neues Spiel");
        aboutUNO = new JMenuItem("About UNO");
        readme = new JMenuItem("Readme");
        frameGUI = new JFrame("UNO");
        lblBlank = new JLabel();   //leeres Label
        menuBar = new JMenuBar();

        //Hinzufuegen
        menuBar.add(datei);         //Hauptmenue
        menuBar.add(help);          //Menue Hilfe
        menuBar.add(lblBlank);
        datei.add(main);            //Unterpunkt Neues Spiel unter Hauptmenue
        help.add(aboutUNO);         //Unterpunkt About UNO unter Help
        help.add(readme);           //Unterpunkt Readme unter Help
        
        frameGUI.setSize(1024,768);             // zeichnet auto x und y 
        frameGUI.getContentPane().add(this);    
        frameGUI.setJMenuBar(menuBar);          //Menueleiste
        frameGUI.setResizable(false);           //Groesse nicht aenderbar
        frameGUI.setVisible(true);              //Sichtbarkeit
        frameGUI.setLayout(null);               //Nulllayout
        frameGUI.setLocationRelativeTo(null);   //Fenster zentrieren 
        
        
        //Anzeigen der Namen im GUI nachdem man erst ein neues Spiel startet
        spielerName[0].setBounds(835,370,650,500);
        spielerName[0].setLayout(null);     
        spielerName[0].setFont(spielerName[0].getFont().deriveFont(32f));
        spielerName[0].setForeground(Color.black);
        add(spielerName[0]);
        
        spielerName[1].setBounds(35,0,500,367);
        spielerName[1].setFont(spielerName[1].getFont().deriveFont(32f));
        spielerName[1].setForeground(Color.black);
        add(spielerName[1]);
        
        spielerName[2].setBounds(535,-40,500,150);
        spielerName[2].setFont(spielerName[2].getFont().deriveFont(32f));
        spielerName[2].setForeground(Color.black);
        add(spielerName[2]);
        
        spielerName[3].setBounds(833,4,500,367);
        spielerName[3].setFont(spielerName[3].getFont().deriveFont(32f));
        spielerName[3].setForeground(Color.black);
        add(spielerName[3]);
        repaint();
        
        //neues Spiel starten
        main.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                
                //Button wird hinzugefügt, angepasst und bereit gestellt
                karteziehen = new JButton("Karte ziehen"); //Button erstellt
                frameGUI.add(karteziehen);              //Button hinzugefügt
                karteziehen.setBounds(850,20,150,50);   //Button Karteziehen position
                karteziehen.addMouseListener(new java.awt.event.MouseAdapter(){ //Buttonlistener wird aktiviert
                public void mousePressed(MouseEvent e){
                    zieheKarte();
                }});
            }
        });
        
        //AboutUNO-Popup  aufrufen
        aboutUNO.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                JOptionPane.showMessageDialog(null,"Game created by Jonas.S and Cem.G \nVersion 0.1\nBased on Java 7", "About UNO",JOptionPane.INFORMATION_MESSAGE,new ImageIcon("unologo.jpg"));             
            }
        });
        
        //Readme aufrufen
        readme.addMouseListener(new java.awt.event.MouseAdapter(){ 
            public void mousePressed(MouseEvent e){
                try{ 
                    Desktop desktop = Desktop.getDesktop();
                    desktop.edit(new File("README.TXT"));
                }catch (Exception exp){
                }    
            }
        });
    }
    
    /**CODE NÖTIG,FUNKT NOCH NICHT!**/
    //Methode für KarteziehenButton
    public void zieheKarte(){
        //dieSteuerung.macheKarte();
    }
    
    //Anzeigen des Hintergrundbildes
    public void paintComponent(Graphics g) {
        g.drawImage(getToolkit().getImage("hintergrund.jpg"),0,0,1024,768,null);
        g.drawImage(grafikFelder[1],0,0,100,100,null);
    }
    
    /**public void paintCards(Graphics g) {
        g.drawImage(grafikFelder[1],0,0,100,100,this);
    }**/
}
```


----------



## Leandros (3. Juni 2013)

Wenn ich die Imports schon sehe ... 
Ich werde mir ganz bestimmt nicht ellenlangen Code durchlesen, poste das relevante snipped und nicht mehr oder weniger.

Und auch mal bisschen Selbständig sein, Google und StackOverflow sind nicht weit weg.


----------



## fadade (3. Juni 2013)

Leandros schrieb:


> das relevante snipped


 -> Die Besetzung des Arrays grafikfelder oben in der Schleife, soweit ich das gesehen habe.

Unten in der drawMethode wird eisern hardcoded das 2. Element gezeichnet und das sieht auch nicht falsch aus, aber ob es auch auch ungleich NULL ist (also tatsächlich etwas zum Zeichnen enthält), überlass ich mal der Diskussionsrunde/dem Programmierer ^^


----------



## Leandros (3. Juni 2013)

Ich habe mir den Code gar nicht erst durchgelesen, als ich gesehen habe der hat ein Scrollbalken. 

Aber du hast recht, das hier sieht nicht Richtig aus: 





> //Anzeigen des Hintergrundbildes
> public void paintComponent(Graphics g) {
> g.drawImage(getToolkit().getImage("hintergrund.jpg"),0,0,1024,768,null);
> g.drawImage(grafikFelder[1],0,0,100,100,null);
> }




PS: Bei so einem Codinsstil bekomm ich auch mittlere Kotzkrämpfe.


----------



## GTA 3 (4. Juni 2013)

Ja hab mittlerweile fixen können.

Habs einfach nur in eine neue Methode gepackt.

zeichneKarte()

```
for(int i = 0; i<=9; i++){ 
                    Graphics a= getGraphics();
                    int randomFeld=(int) Math.round(Math.random()*39);
                    if(i==0)
                        a.drawImage(grafik[randomFeld],1,505,150,200,null);
....
```

Das wichtige hierbei war nur gewesen, dass irgendwie die Karte als erstes gezeichnet werden soll und und dann der Hintergrund.


----------

