# Würfelaufgabe



## Don Joan (6. Jul 2009)

Hi, ich hab ein paar Würfel zusammengebastelt, doch irgendwie bekomm ich die Augenzahl nicht auf die Würfel, ich hoffe ihr könnt mir helfen...ich habs deshalb vorerst mit Wuf1, Wurf2 etc. versucht.

```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Kniffel extends Applet implements ActionListener {



public int wurf1 = 0;
public int wurf2 = 0;	
public int wurf3 = 0;	
public int wurf4 = 0;	
public int wurf5 = 0;
public int [] Würfel = {0,0,0,0,0}; 
int augenzahl, x, y;
int[] fest = {0,0,0,0,0}; 


private Button wuerfelnKnopf = new Button("Würfeln");	
private Button HalteKnopf1 = new Button("Halten1");
private Button HalteKnopf2 = new Button("Halten2");
private Button HalteKnopf3 = new Button("Halten3");
private Button HalteKnopf4 = new Button("Halten4");
private Button HalteKnopf5 = new Button("Halten5");
private Button NeuesSpiel = new Button("NeuesSpiel");
private Kniffel Würfel1, Würfel2, Würfel3, Würfel4, Würfel5;

public boolean istVerfuegbar = false;



public void init()
{
resize(200,200);					
wuerfelnKnopf.addActionListener(this);	
add(wuerfelnKnopf);	
resize(200,200);					
add(HalteKnopf1);
resize(200,200);					
add(HalteKnopf2);
resize(200,200);					
add(HalteKnopf3);
resize(200,200);					
add(HalteKnopf4);
resize(200,200);					
add(HalteKnopf5);                  
resize(200,200);
NeuesSpiel.addActionListener(this);				
add(NeuesSpiel);
};
public void zeichneAugen(Graphics g, int x, int y, int Augen, int f)
{ 

if (Augen!=0) { 
if (f==0) { 
g.setColor(Color.black); 
} else { 
g.setColor(Color.red); 
} 
 // links oben 
if (Augen!=1) g.fillArc(x+3,y+3,8,8,0,360); 
// rechts oben 
if (Augen>=4) g.fillArc(x+29,y+3,8,8,0,360); 
// links mitte 
if (Augen==6) g.fillArc(x+3,y+16,8,8,0,360); 
// mitte mitte 
if (Augen%2==1) g.fillArc(x+16,y+16,8,8,0,360); 
// rechts mitte 
if (Augen==6) g.fillArc(x+29,y+16,8,8,0,360); 
// links unten 
if (Augen>=4) g.fillArc(x+3,y+29,8,8,0,360); 
// rechts unten 
if (Augen!=1) g.fillArc(x+29,y+29,8,8,0,360); 
g.setColor(Color.black); 
}
}
public void zeichneWürfel()
{ 

Graphics g = getGraphics(); 
g.clearRect(10,10,241,41); 
g.setColor(Color.black); 
g.drawRect(230,70,40,40);
zeichneAugen(g,10,10,Würfel[1],fest[1]);        
g.drawRect(380,70,40,40);  
zeichneAugen(g,60,10,Würfel[2],fest[2]);     
g.drawRect(530,70,40,40);   
zeichneAugen(g,110,10,Würfel[3],fest[3]);    
g.drawRect(680,70,40,40);
zeichneAugen(g,160,10,Würfel[4],fest[4]);      
g.drawRect(830,70,40,40);
zeichneAugen(g,210,10,Würfel[5],fest[5]); 
      
}


public void paint(Graphics g)
{
wuerfelnKnopf.setBounds(50,30,100,30);
HalteKnopf1.setBounds(200,30,100,30);
HalteKnopf2.setBounds(350,30,100,30);
HalteKnopf3.setBounds(500,30,100,30);
HalteKnopf4.setBounds(650,30,100,30);
HalteKnopf5.setBounds(800,30,100,30);
NeuesSpiel.setBounds(800,300,100,30);
g.drawString("Wurf1: "+wurf1,50,100);
g.drawString("Wurf2: "+wurf2,50,150);
g.drawString("Wurf3: "+wurf3,50,200);
g.drawString("Wurf4: "+wurf4,50,250);
g.drawString("Wurf5: "+wurf5,50,300);

};         
						
public void actionPerformed(ActionEvent event) {
wurf1 = (int)Math.floor(1+6*Math.random());
wurf2 = (int)Math.floor(1+6*Math.random());
wurf3 = (int)Math.floor(1+6*Math.random());
wurf4 = (int)Math.floor(1+6*Math.random());
wurf5 = (int)Math.floor(1+6*Math.random());
zeichneWürfel();// Zufallswert 1..6
istVerfuegbar = true;				
repaint();	
}

}
```


----------



## Marco13 (6. Jul 2009)

Schau dir die Console an: Da fliegt eine ArrayIndexOutOfBoundsException, weil du auf Indizes 1...5 zugreifst - das müßte aber 0...4 sein.

Ansonsten:
- getGraphics ist böse - alles, was gezeichnet wird, muss von der paint-Methode aus gezeichnet werden (in das Graphics, das man dort übergeben bekommt)
- in der paint-Methode sollte NUR gezeichnet werden - und auf keinen Fall irgendwelche Bounds gesetzt oder so


```
// Von http://www.java-forum.org/hausaufgaben/85383-wuerfelaufgabe.html
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Kniffel extends Applet implements ActionListener {



public int wurf1 = 0;
public int wurf2 = 0;
public int wurf3 = 0;
public int wurf4 = 0;
public int wurf5 = 0;
public int [] Würfel = {0,0,0,0,0};
int augenzahl, x, y;
int[] fest = {0,0,0,0,0};


private Button wuerfelnKnopf = new Button("Würfeln");
private Button HalteKnopf1 = new Button("Halten1");
private Button HalteKnopf2 = new Button("Halten2");
private Button HalteKnopf3 = new Button("Halten3");
private Button HalteKnopf4 = new Button("Halten4");
private Button HalteKnopf5 = new Button("Halten5");
private Button NeuesSpiel = new Button("NeuesSpiel");
private Kniffel Würfel1, Würfel2, Würfel3, Würfel4, Würfel5;

public boolean istVerfuegbar = false;



public void init()
{
resize(200,200);
wuerfelnKnopf.addActionListener(this);
add(wuerfelnKnopf);
resize(200,200);
add(HalteKnopf1);
resize(200,200);
add(HalteKnopf2);
resize(200,200);
add(HalteKnopf3);
resize(200,200);
add(HalteKnopf4);
resize(200,200);
add(HalteKnopf5);
resize(200,200);
NeuesSpiel.addActionListener(this);
add(NeuesSpiel);
};
public void zeichneAugen(Graphics g, int x, int y, int Augen, int f)
{

if (Augen!=0) {
if (f==0) {
g.setColor(Color.black);
} else {
g.setColor(Color.red);
}
 // links oben
if (Augen!=1) g.fillArc(x+3,y+3,8,8,0,360);
// rechts oben
if (Augen>=4) g.fillArc(x+29,y+3,8,8,0,360);
// links mitte
if (Augen==6) g.fillArc(x+3,y+16,8,8,0,360);
// mitte mitte
if (Augen%2==1) g.fillArc(x+16,y+16,8,8,0,360);
// rechts mitte
if (Augen==6) g.fillArc(x+29,y+16,8,8,0,360);
// links unten
if (Augen>=4) g.fillArc(x+3,y+29,8,8,0,360);
// rechts unten
if (Augen!=1) g.fillArc(x+29,y+29,8,8,0,360);
g.setColor(Color.black);
}
}
public void zeichneWürfel(Graphics g)
{
g.clearRect(10,10,241,41);
g.setColor(Color.black);
g.drawRect(230,70,40,40);
zeichneAugen(g,10,10,Würfel[0],fest[0]);
g.drawRect(380,70,40,40);
zeichneAugen(g,60,10,Würfel[1],fest[1]);
g.drawRect(530,70,40,40);
zeichneAugen(g,110,10,Würfel[2],fest[2]);
g.drawRect(680,70,40,40);
zeichneAugen(g,160,10,Würfel[3],fest[3]);
g.drawRect(830,70,40,40);
zeichneAugen(g,210,10,Würfel[4],fest[4]);

}


public void paint(Graphics g)
{
wuerfelnKnopf.setBounds(50,30,100,30);
HalteKnopf1.setBounds(200,30,100,30);
HalteKnopf2.setBounds(350,30,100,30);
HalteKnopf3.setBounds(500,30,100,30);
HalteKnopf4.setBounds(650,30,100,30);
HalteKnopf5.setBounds(800,30,100,30);
NeuesSpiel.setBounds(800,300,100,30);
g.drawString("Wurf1: "+wurf1,50,100);
g.drawString("Wurf2: "+wurf2,50,150);
g.drawString("Wurf3: "+wurf3,50,200);
g.drawString("Wurf4: "+wurf4,50,250);
g.drawString("Wurf5: "+wurf5,50,300);
zeichneWürfel(g);
};

public void actionPerformed(ActionEvent event) {
wurf1 = (int)Math.floor(1+6*Math.random());
wurf2 = (int)Math.floor(1+6*Math.random());
wurf3 = (int)Math.floor(1+6*Math.random());
wurf4 = (int)Math.floor(1+6*Math.random());
wurf5 = (int)Math.floor(1+6*Math.random());
Würfel[0] = wurf1;
Würfel[1] = wurf2;
Würfel[2] = wurf3;
Würfel[3] = wurf4;
Würfel[4] = wurf5;
istVerfuegbar = true;
repaint();
}

}
```


----------



## Don Joan (6. Jul 2009)

Herzlichen Dank, dass du mir geholfen hast, Marco13.


----------



## Don Joan (9. Jul 2009)

Hi, ich bins wieder, ich habe jetzt Probleme mit der Methode public void actionPerformed(ActionEvent event) 

Ich will mit den Knopf Halten1, nochmal würfeln (nur mit dem Würfel, welcher sich unter diesen Knopf befindet), jedoch bezieht sich der Vorgang immer auf alle Würfel. Deshalb wollte ich fragen wie ich einen zweiten Action Listener erstellen kann...und wie dann diese Methode aussieht.


----------



## Marco13 (9. Jul 2009)

Wenn http://www.java-forum.org/java-faq-beitraege/49255-componenten-und-listener.html  nicht hilft, sag nochmal bescheid (und poste dann ggf. den code, in JAVA-Tags eingesclossen)


----------



## Don Joan (9. Jul 2009)

Hat mir nicht geholfen... -.-

```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Kniffel extends Applet implements ActionListener {



public int wurf1 = 0;
public int wurf2 = 0;
public int wurf3 = 0;
public int wurf4 = 0;
public int wurf5 = 0;
public int [] Würfel = {0,0,0,0,0};
int augenzahl, x, y;
int[] fest = {0,0,0,0,0};
int WurfAnzahl = 0; 



private Button wuerfelnKnopf = new Button("Würfeln");
private Button Einbechern1 = new Button("Einbechern1");
private Button Einbechern2 = new Button("Einbechern2");
private Button Einbechern3 = new Button("Einbechern3");
private Button Einbechern4 = new Button("Einbechern4");
private Button Einbechern5 = new Button("Einbechern5");
private Button NeuesSpiel = new Button("NeuesSpiel");
private Button eins = new Button("1er");
private Button zwei = new Button("2er");
private Button drei = new Button("3er");
private Button vier = new Button("4er");
private Button fünf = new Button("5er");
private Button sechs = new Button("6er");
private Button dreiGleiche = new Button("dreiGleiche");
private Button vierGleiche = new Button("vierGleiche");
private Button kleineStraße = new Button ("kleineStraße");
private Button großeStraße = new Button ("großeStraße");
private Button FullHouse = new Button("FullHouse");
private Button Yahtzee = new Button("Yahtzee");
private Button Chance = new Button("Chance");

private Kniffel Würfel1, Würfel2, Würfel3, Würfel4, Würfel5;

public boolean istVerfuegbar = false;

public void init()
{
resize(200,200);
wuerfelnKnopf.addActionListener(this);
add(wuerfelnKnopf);
resize(200,200);
Einbechern1.addActionListener(this);
add(Einbechern1);
resize(200,200);
add(Einbechern2);
resize(200,200);
add(Einbechern3);
resize(200,200);
add(Einbechern4);
resize(200,200);
add(Einbechern5);
resize(200,200);
add(eins);
resize(200,200);
add(zwei);
resize(200,200);
add(drei);
resize(200,200);
add(vier);
resize(200,200);
add(fünf);
resize(200,200);
add(sechs);
resize(200,200);
add(dreiGleiche);
resize(200,200);
add(vierGleiche);
resize(200,200);
add(kleineStraße);
resize(200,200);
add(großeStraße);
resize(200,200);
add(FullHouse);
resize(200,200);
add(Yahtzee);
resize(200,200);
add(Chance);
resize(200,200);
System.out.println(WurfAnzahl = 0);
add(NeuesSpiel);
};
public void zeichneAugen(Graphics g, int x, int y, int Augen, int f)
{

if (Augen!=0) {
if (f==0) {
g.setColor(Color.blue);
} else {
g.setColor(Color.black);
}
 // links oben
if (Augen!=1) g.fillArc(x+3,y+3,8,8,0,360);
// rechts oben
if (Augen>=4) g.fillArc(x+29,y+3,8,8,0,360);
// links mitte
if (Augen==6) g.fillArc(x+3,y+16,8,8,0,360);
// mitte mitte
if (Augen%2==1) g.fillArc(x+16,y+16,8,8,0,360);
// rechts mitte
if (Augen==6) g.fillArc(x+29,y+16,8,8,0,360);
// links unten
if (Augen>=4) g.fillArc(x+3,y+29,8,8,0,360);
// rechts unten
if (Augen!=1) g.fillArc(x+29,y+29,8,8,0,360);
g.setColor(Color.green);
}
}
public void zeichneWürfel(Graphics g)
{
g.clearRect(10,10,241,41);
g.setColor(Color.green);
g.drawRect(230,70,40,40);
zeichneAugen(g,230,70,Würfel[0],fest[0]);
g.drawRect(380,70,40,40);
zeichneAugen(g,380,70,Würfel[1],fest[1]);
g.drawRect(530,70,40,40);
zeichneAugen(g,530,70,Würfel[2],fest[2]);
g.drawRect(680,70,40,40);
zeichneAugen(g,680,70,Würfel[3],fest[3]);
g.drawRect(830,70,40,40);
zeichneAugen(g,830,70,Würfel[4],fest[4]);
g.drawString("Gesamt: ",80, 550);
}


public void paint(Graphics g)
{
wuerfelnKnopf.setBounds(50,80,100,30);
Einbechern1.setBounds(200,30,100,30);
Einbechern2.setBounds(350,30,100,30);
Einbechern3.setBounds(500,30,100,30);
Einbechern4.setBounds(650,30,100,30);
Einbechern5.setBounds(800,30,100,30);
NeuesSpiel.setBounds(50,30,100,30);
eins.setBounds(50,125,100,30);
zwei.setBounds(50,155,100,30);
drei.setBounds(50,185,100,30);
vier.setBounds(50,215,100,30);
fünf.setBounds(50,245,100,30);
sechs.setBounds(50,275,100,30);
dreiGleiche.setBounds(50,305,100,30);
vierGleiche.setBounds(50,335,100,30);
kleineStraße.setBounds(50,365,100,30);
großeStraße.setBounds(50,395,100,30);
FullHouse.setBounds(50,425,100,30);
Yahtzee.setBounds(50,455,100,30);
Chance.setBounds(50,485,100,30);



zeichneWürfel(g);
};

public void actionPerformed(ActionEvent event) {
wurf1 = (int)Math.floor(1+6*Math.random());
wurf2 = (int)Math.floor(1+6*Math.random());
wurf3 = (int)Math.floor(1+6*Math.random());
wurf4 = (int)Math.floor(1+6*Math.random());
wurf5 = (int)Math.floor(1+6*Math.random());
Würfel[0] = wurf1;
Würfel[1] = wurf2;
Würfel[2] = wurf3;
Würfel[3] = wurf4;
Würfel[4] = wurf5;
istVerfuegbar = true;
repaint();
if (event.getSource() == Einbechern1)
        {
            wurf1 = (int)Math.floor(1+6*Math.random());
            System.out.println("Einbechern1");
            Einbechern1.setEnabled(false);
            Würfel[0] = wurf1;
        }

}
```


----------



## Marco13 (9. Jul 2009)

Naja so halb. Jetzt wird ja bei JEDEM Knopfdruck neu gewürfelt - und danach wird geschaut, ob "Einbechern1" gedrückt wurde (und damit garnicht neu gewürfelt hätte werden sollen).

Ich würde dir dringend empfehlen, auch mal http://www.java-forum.org/java-faq-beitraege/62032-fragen-zu-variablennamen.html zu lesen. Die Variablen "Einbechern1" ... bis "Einbechern5" sollten EIN Array der Größe 5 sein.

Diese ganzen "resize(200,200);" solltest du einfach rausnehmen. Das ist grober Unfug.

Zur eigentlichen Frage:

```
public class Kniffel2 extends Applet /* implements ActionListener WEGMACHEN */ {

...

// wuerfelnKnopf.addActionListener(this); // WEG
// Stattdesen:
wuerfelnKnopf.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        wuerfeln();
    }
});

...
// public void actionPerformed(ActionEvent e) WEG
// Stattdessen:
private void wuerfeln()
{
wurf1 = (int)Math.floor(1+6*Math.random());
wurf2 = (int)Math.floor(1+6*Math.random());
wurf3 = (int)Math.floor(1+6*Math.random());
wurf4 = (int)Math.floor(1+6*Math.random());
wurf5 = (int)Math.floor(1+6*Math.random());
Würfel[0] = wurf1;
Würfel[1] = wurf2;
Würfel[2] = wurf3;
Würfel[3] = wurf4;
Würfel[4] = wurf5;
istVerfuegbar = true;
repaint();
}
```

Auf ähnliche Weise kann man dann den Knopf "Einbechern1" mit einer Methode "einbechern1" verbinden. Oder besser das ganze in einen Array packen, und dann den Knopf "Einbechern_" mit der Methode "einbechern(int i)" verbinden._


----------



## Don Joan (9. Jul 2009)

```
wuerfelnKnopf.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        wuerfeln();
    }
});
```
<identifer> expected


----------



## Marco13 (9. Jul 2009)

Das dort hin, wo vorher
wuerfelnKnopf.addActionListener(this); 
stand.


----------



## Don Joan (12. Jul 2009)

Hi,
ich bin gerade dabei eine große Straße in meinem Würfelspiel zu programieren, jedoch weis ich nicht, wie ich anfangen soll. Ich hab die Buttons schon programmiert, falls ich beispielsweise eine große Straße würfle, möchte ich auf den Button klicken, welcher dann die Punkte (40) ausgibt...


----------



## Marco13 (12. Jul 2009)

```
grosseStrasseKnopf.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("42");
    }
});
```
!?


----------



## Don Joan (12. Jul 2009)

Ich meinte eher, wie ich überhaupt eine großeStraße programmiere. Eine große Straße bestehend aus den Augenzahlen der fünf Würfel, die müssen nämlich 2,3,4,5,6 sein. Wenn ich diese Augenzahl letztendlich gewürfelt habe, möchte ich auch den Knopf drücken und die Punkte (40) werden angezeigt...


----------



## Marco13 (12. Jul 2009)

Beschreib' was deine Frage ist. "Wie programmiere ich das?" ist zu allgemein. Da kann man nur antworten "Indem man den passenden Code eintippt". Geht es um das Anzeigen der Punkte, die Abfrage, ob es eine Strasse IST, die Aktion beim Buttonklickt...!? (Kann doch nicht so schwer sein...  )


----------



## Don Joan (12. Jul 2009)

Entschuldige, dass ich mich zu unpräzise ausdrückt habe. Nehmen wir mal an, ich würfle in meinem Würfelspiel eine große Straße, dies soll erstmal mein Java-Applet erkennen können (d.h die Würfelkombination). Dann klicke ich auf den Knopf große Straße, welcher dafür die Punkte ausgibt.


----------



## Marco13 (12. Jul 2009)

Das ist schon etwas präziser. Nicht viel, aber etwas. (Es scheint also doch so schwer zu sein....)

Wenn es um das Erkennen der Kombination geht: Man kann ja verschiedene Situationen mit den 5 Würfeln haben:
2 3 4 5 6
2 3 4 6 5
...
6 5 4 3 2

Und alle davon sind eine Große Straße. Du hast ja den "Würfel"-Array, der die letzten Würfelaugen enthält. Du kannst jetzt eine Methode machen

```
private boolean istGrosseStrasse(int Würfel[])
{
}
```
in der du prüfst, ob die übergebenen Würfel eine große Straße bilden. Da gibt's verschiedene Möglichkeiten. Eine wäre sowas wie

```
boolean present[] = new int[6];
for (int i=0; i<5; i++)
{
    present[Würfel[i]-1] = true;
}
for (int i=1; i<6; i++)
{
    if (!present[i]) return false;
}
return true;
```


----------

