# Würfel-Programm



## Carolinum (18. Feb 2010)

Hallo liebe Community,

Ich bin ein blutiger Anfänger und habe ein kleines Problem. Zunächst einmal mein bisheriger Code:


```
import java.util.Random;

public class Wuerfel1{
  Random zufall = new Random();
  int wurf[] = new int[3];
  
  
  public Wuerfel1(){
    wuerfeln();
    ausgabe();
  }
  
  public static void main(String[] args){
    new Wuerfel1();
  }
  public void wuerfeln(){
    for(int i=0; i<3; i=i+1)
    wurf[i] = zufall.nextInt(0)+1;
  }
  public void ausgabe(){
    for(int i=0; i<3; i=i+1)
    System.out.println("Es wurde eine "+wurf[i] +" gewürfelt.");
    System.out.println("Ergebnis: " +augensumme());
  }
  public int augensumme(){
    return (wurf[0] + wurf[1] + wurf[2]);
  }
}
```

So dieses Programm würfelt jetzt quasi einmal mit drei Würfeln. Die einzelnen Würfelergebnisse werden ausgegeben. Dann werden diese drei Zahlen zusammengezählt und auch ausgegeben. Mein Problem ist jetzt, dass ich dieses Programm noch so erweitern möchte, dass man mehrmals mit drei Würfeln würfelt, also meinetwegen 100x  und die jeweiligen Augensummen der Dreierwürfe gezählt werden.
D.h.
Ich würfel 
6,2,4        A: 12 //Soweit das bisherige Programm
dann aber halt mehrmals: 
2,5,2        A: 9 
1,6,5        A: 12
usw. 
Dann soll ausgegeben werden wie oft jede Augensumme kam, also: 3 = 0, 4 = 0........9 = 1.......12 = 2......

Ich hoffe ihr habt mein Problem verstanden und haltet ein paar Tipps für mich bereit. Vielen Dank schonmal im Vorraus.


----------



## Landei (18. Feb 2010)

Wenn du von vornherein die Anzahl der Würfel-"serien" kennst, kannst du einfach aus deinem eindimensionalen ein zweidimensionales Array machen. Der erste Index gibt dann z.B. die Nummer der Serie an, und der zweite Index die Nummer des Wurfs innerhalb der Serie:
(ungetestet)

```
public class Wuerfel1{
  Random zufall = new Random();
  int wurf[][] = new int[100][3];
  
  
  public Wuerfel1(){
    wuerfeln();
    ausgabe();
  }
  
  public static void main(String[] args){
    new Wuerfel1();
  }
  public void wuerfeln(){
    for(int s = 0; s < 100; s++) {
       for(int i=0; i<3; i++) {
         wurf[s][i] = zufall.nextInt(6)+1;
       }
     }
  }
  public void ausgabe(){
    for(int s = 0; s < 100; s++) {
      System.out.println("Serie " + (s+1) + ":");
      for(int i=0; i<3; i++) {
        System.out.println("Es wurde eine "+wurf[s][i] +" gewürfelt.");
        System.out.println("Ergebnis: " +augensumme(s));
      }
    }
  }
  public int augensumme(int serie){
    return (wurf[serie][0] + wurf[serie][1] + wurf[serie][2]);
  }
}
```


----------



## Carolinum (18. Feb 2010)

Hi, erstmal vielen Dank für deine Antwort. Das System mit den mehrdimensionalen Arrays habe ich jetzt halbwegs verstanden. Der Code war auch bis auf zwei Fehler, die ich beheben konnte, korrekt. Es klappr alles soweit, bloß ich möchte ja die einzelnen Ergebnisse noch zusammenzählen. Also wie oft z.B. eine 11 als Augensumme nach den Hundert Dreier Würfen geworfen wurde.


----------



## Landei (18. Feb 2010)

Du kannst sowas machen:

```
int[] haeufigkeit = new int[37]; //36 ist maximale Summe
for(int s = 0; s < 100; s++) {
   haeufigkeit[augensumme(s)]++; 
}
for(int i = 3; i <= 36; i++) {
  System.out.println("Augensumme " + i + " wurde " + haeufigkeit[i] + "-mal geworfen");
}
```


----------



## Antwort (18. Feb 2010)

Ok, vielen vielen Dank, das Ergebnis kann sich sehen lassen. Es wird ohne Probleme compiliert und es funktioniert alles. Danke!
Wenn ich das Programm ausführe kommt am Ende: 

Exception in thread "main" .java.lang.ArrayIndexOutOfBoundsException: 19
      at Wuerfel1.ausgabe<Wuerfel1.java:36>
      at Wuerfel1.<init><Wuerfel1.java:10>
      at Wuerfel1.main<Wuerfel1.java:14>

Weißt du wie ich das wegbekommen kann??


----------



## Marco7757 (18. Feb 2010)

Das bedeuted, dass du auf einen Array mit dem Index 19 zugreifst, dieses Array-Element jedoch nicht existiert.


----------



## Landei (18. Feb 2010)

Was steht denn in Zeile 36?


----------



## Carolinum (18. Feb 2010)

achso entschuldigung hier nochmal der Code: 

```
import java.util.Random;

public class Wuerfel1{
  Random zufall = new Random();
  int wurf[][] = new int[100][3];


  public Wuerfel1(){
    wuerfeln();
    ausgabe();
  }

  public static void main(String[] args){
    new Wuerfel1();
  }
  public void wuerfeln(){
    for(int s = 0; s < 100; s++) {
       for(int i=0; i<3; i++) {
         wurf[s][i] = zufall.nextInt(6)+1;
       }
     }
  }
  public void ausgabe(){
    for(int s = 0; s < 100; s++) {
      System.out.println("Serie " + (s+1) + ":");
      for(int i=0; i<3; i++) {
        System.out.println("Es wurde eine "+wurf[s][i] +" gewürfelt.");
        System.out.println("Ergebnis: " +augensumme(s));
      }
    }
    int[] haeufigkeit = new int[19];
    for(int s = 0; s < 100; s++) {
    haeufigkeit[augensumme(s)]++;
    }
    for(int i = 3; i <= 19; i++) {
    System.out.println("Augensumme " + i + " wurde " + haeufigkeit[i] + "-mal geworfen");
    }
  }
  public int augensumme(int serie){
    return (wurf[serie][0] + wurf[serie][1] + wurf[serie][2]);
  }
}
```

Also eigentlich existiert der Array zu diesem Zeitpunkt schon oder nicht?


----------



## Landei (18. Feb 2010)

int[] haeufigkeit = new int[19]; reserviert Platz für 19 Werte, nämlich die Indizes 0,1,...,18
Wenn du auf index 19 zugreifen willst, meckert er natürlich. Also for(int i = 3; i *<* 19; i++) schreiben.

OT- Wie bin ich eigentlich auf 36 gekommen? Oh Mann, ich brauch Urlaub....


----------



## Carolinum (18. Feb 2010)

Ok jetzt läuft alles, vielen vielen Dank. 
Ja das mit 36 passier, also bei mir bist du freigestellt, d.h. du kannst jetzt gerne in deinen wohlverdienten Urlaub fahren


----------



## Landei (18. Feb 2010)

Mitte März, drei Wochen Japan


----------



## RXQEJn (18. Feb 2010)

Japan, ja da werde ich irgendwann auch nochmal meinen Urlaub verbringen.
Hab mir die Ausgabe jetzt noch mal genauer angeguckt und hätte noch zwei Fragen: 
1. Warum beginnt er bei Serie 61. Also er erzeugt 40 Augensummen, kommt am Ende bei der Endausgabe auf genau 100. Der Code ist immer noch derselbe wie oben.

2. Kannst du mir diesen Teil bitte genauer erklären, kann mir das nicht ganz genau erklären. 

```
31 for(int s = 0; s < 100; s++) {
32 haeufigkeit[augensumme(s)]++;
```


----------



## Landei (18. Feb 2010)

RXQEJn hat gesagt.:


> Japan, ja da werde ich irgendwann auch nochmal meinen Urlaub verbringen.
> Hab mir die Ausgabe jetzt noch mal genauer angeguckt und hätte noch zwei Fragen:
> 1. Warum beginnt er bei Serie 61. Also er erzeugt 40 Augensummen, kommt am Ende bei der Endausgabe auf genau 100. Der Code ist immer noch derselbe wie oben.


Verstehe nicht ganz, was du meinst???



> 2. Kannst du mir diesen Teil bitte genauer erklären, kann mir das nicht ganz genau erklären.
> 
> ```
> 31 for(int s = 0; s < 100; s++) {
> ...



OK, wir haben das Häufigkeiten-Array, am Anfang voller Nullen. Jetzt gehe ich alle Augensummen durch. Sagen wir, die erste Augensumme ist 11. Dann erhöhe ich das elfte Feld im Häufigkeiten-Array um eins. Ausführlich hätte ich auch schreiben können:

```
for(int s = 0; s < 100; s++) {
   int sum = augensumme(s);
   haeufigkeit[sum] = haeufigkeit[sum] + 1;
}
```


----------

