# würfelaufgabe mit eindimensionalem array



## lennero (16. Dez 2015)

bei der aufgabe hab ich keinen blassen schimmer ... es sollte an sich nicht ganz anders sein als die min/max aufgabe die ich gemacht habe aber ich komme trotzdem nicht wirklich weiter..

es soll ein programm geschrieben werden das ermittelt wie oft man mit 5 würfeln würfeln muss um 5 gleiche zahlen rauszubekommen. das array hat eine festgelegte größe von 6. es sollen alle werte im array verglichen werden. es soll verglichen werden bis 5 gleiche entstehen und am ende ausgegeben werden wie oft verglichen wurde sowie die zahl die herauskam.

ich hab die würfel mit hilfe einer for schleife und die anzahl zwischen 1-6 mit math.random geschrieben doch mehr schaffe ich irgendwie nicht.... kann mir jemand auf die sprünge helfen ?



```
import javax.swing.JOptionPane;
class minmax{
    public static void main(String[]args){
      
        int [] a = new int [6];
      
        for (int i=1; i<a.length;i++){
            a[i] = (int)(Math.random()*6)+1;
            System.out.print(a[i]);          
            }
    }
}
```


----------



## lennero (16. Dez 2015)

habs mittlerweile hinbekommen


----------



## Joose (17. Dez 2015)

Es wäre für andere mit einem ähnlichen Problem vielleicht gut deine Lösung zu kennen


----------



## lennero (17. Dez 2015)

klar. man kann ja auch das array auf länge 5 setzen wenn man dann die schleifenanfangsbedingung auch um 1 reduziert sowie die variable fill auf a[0]. so müsste es denke ich auch gehen

```
class wurfel {
    public static void main(String[]args) {     
        int [] a = new int[6];
        int fill,zahler;
        zahler=1;
        boolean yes = false;
     
        while (true){
            for(int i=1;i<a.length;i++) {
                a[i] = (int) (Math.random()*6)+1;
            }         
            fill = a[1];         
            for(int i=1;i<a.length;i++) {
                if(a[i]!=fill) {
                    yes=false;
                    break;
                } else {
                    yes=true;
                }
            }
         
            zahler++;         
            if(yes) {
                System.out.println("Alle Zahlen sind gleich: "+fill);
                System.out.println("Durchläufe: "+zahler);             
                System.exit(0);
            }
```


----------



## Joose (17. Dez 2015)

Hinweis: Eine Endlosschleife mit "while(true)" ist schlecht! Das Problem an der Sache ist du kannst diese Schleife nicht von außen beenden (was vor allem bei Multithreaded Programmen hinderlich ist). Außerdem hat jede Schleife eine Abbruchbedingung (es gibt also keinen Grund while(true) zu verwenden). in deinem Fall setzt du "yes" auf true, gibst ein paar Sachen aus und beendest dein Programm. Du solltest "while(!yes)" verwenden und die Ausgabe nach der Schleife tätigen (ohne if drum herum).

Ausnahmen kann man machen wenn man etwas flott testen will oder ähnliches ... aber grundsätzlich sollte man immer ein Abbruchbedingung definieren!


----------



## lennero (17. Dez 2015)

hmm alles klar ich werds sobald ich wiederzuhause bin mal ändern!


----------



## Jardcore (17. Dez 2015)

Und wie viele Schleifendurchläufe hast du gebraucht?


----------



## Jardcore (17. Dez 2015)

Hier mal ein wenig mehr objektorientierter Ansatz, bestehend aus einer Starter-Klasse, einem Würfelspieler und dem Würfel himself 


```
public class Main {
    public static void main(String[] args) {
        Crapshooter crapshooter = new Crapshooter();
      
        System.out.printf("Es wurden %d Schleifendurchläufe benötigt\n", crapshooter.getNumberOfRollsTillAllDicesAreEqual());
        System.out.printf("Alle Würfel haben den Wert: %d\n", crapshooter.getFirstDice().getValue());
    }
}
```


```
public class Crapshooter {
    private static final int NUMBER_OF_DICES = 6;
  
    private Dice[] dices = new Dice[NUMBER_OF_DICES];
  
    public Crapshooter() {
        for(int i = 0; i < NUMBER_OF_DICES; i++) {
            dices[i] = new Dice();
        }
    }
  
    public int getNumberOfRollsTillAllDicesAreEqual() {
        int count = 0;
        do {
            rollAllDices();
            count++;
        } while(!onlyEqualDices());
      
        return count;
    }
  
    private void rollAllDices() {
        for(Dice dice : dices) {
            dice.roll();
        }
    }
  
    private boolean onlyEqualDices() {
        boolean result = true;
        int value = getFirstDice().getValue();
      
        for(Dice dice : dices) {
            result &= (value == dice.getValue());
        }
        return result;
    }
  
    public Dice getFirstDice() {
        return dices[0];
    }
}
```


```
public class Dice {
  
    public static final int MAX_VALUE = 6;
  
    private int value;
  
    public void roll() {
        value = getRandomValue();
    }
  
    private int getRandomValue() {
        return (int)(Math.random() * MAX_VALUE + 1);
    }
  
    public int getValue() {
        return value;
    }
}
```


----------

