# Programm zum Würfeln



## Shaun (17. Mrz 2009)

Hallo alle zusammen,
da ich mich im Moment wieder angefangen habe, meine wenigen Programmierkenntnisse aufzufrischen hab ich heute zu Übungszwecken ein kleines Programm erstellt, womit eine beliebige Anzahl an W10 Würfelwürfen simuliert wird. 

Mein Problem ist eigentlich relativ klein. Beim if Fall möchte ich nachher vom return nichts ausgeben lassen, wie kann ich das bewerstelligen?

Vorweg noch etwas: Da ich gerade Rekursionen übe, hab ich das ganze mal in das Programm mit eingebaut . 

Code:

```
import java.util.Random;

class wzehn
{
    int wuerfeln(int n)
    { 
        if (n ==1)
        {
            Random r=new Random();
             int d = r.nextInt(10)+1; 
                System.out.println("Würfelwurf " + n +" hat das Ergebniss " +d );
            return n;
        }
        else
        {
            Random r=new Random();
         int d = r.nextInt(10)+1; 
            System.out.println("Würfelwurf " + n +" hat das Ergebniss " +d );
            
        return wuerfeln(n-1);
        }
    }
}
public class ausfuehrung 
{
    public static void main (String [] args)
    {        
        wzehn f = new wzehn(); 
        
        System.out.println (f.wuerfeln(10));        
    }
}
```

Was jetzt als nächstes folgen soll, wäre die Eingabe des Benutzers, damit er selbst wählen kann, wie oft gewürfelt wird. Kann ich dafür den "Scanner" benutzen?


----------



## Schandro (17. Mrz 2009)

Scanner ist gut, um input von der Konsole zu bekommen, ja

Warum hat wuerfeln den einen Rückgabewert? Mach es void // musst dann natürlich noch ein bisschen den Code anpassen...

Ersten Buchstaben vom Klassenname sollte man übrigens großschreiben


----------



## Shaun (17. Mrz 2009)

Wie müsste ich den bei void den Code anpassen? Geht mir dadurch dann nicht die Rekursion verloren? 

Das mit den Klassennamen ist eine alte Angewohnheit, ich versuch es zu ändern .


----------



## Mostly_Harmless (17. Mrz 2009)

Die Rekursion geht übrigens auch schöner. ;-)

[HIGHLIGHT="Java"]
class Wuerfel
{
	int augenzahl = 10;

	public Wuerfel( int augenzahl ) {
		this.augenzahl = augenzahl;
	}

	void wuerfeln(int n) {
		if (n <= 0) {
			return;
        }

		wuerfeln(n-1);
		Random r = new Random();
		int d = r.nextInt(this.augenzahl)+1;
		System.out.println("Würfelwurf " + n + ":\t" + d );
	}
}

public class Main
{
    public static void main (String [] args) {

    	System.out.println("Wie oft soll gewürfelt werden? ");
    	int anzahlWuerfe = (new Scanner(System.in)).nextInt();

    	Wuerfel w = new Wuerfel(10);
        w.wuerfeln(anzahlWuerfe);
    }
}
[/HIGHLIGHT]

1. stehen die Würfe so in der richtigen Reihenfolge und
2. ist kein doppelter Code mehr vorhanden.



Shaun hat gesagt.:


> Wie müsste ich den bei void den Code anpassen? Geht mir dadurch dann nicht die Rekursion verloren?



Die Rekursion hat nichts mit dem Rückgabewert zu tun.


----------



## Shaun (17. Mrz 2009)

Vielen Dank erstmal . 

Ich kannte die Rekursion bis jetzt leider nur in Kombination mit return :/. 

Aber irgendwie finde ich die Rekursion gerade im Code bei dir nicht, ist die im Random Befehl drin?

System.out.println("Würfelwurf " + n + ":\t" + d );

Was bedeutet diese ":\t" , das sagt mir im Moment leider nichts :/.


​


----------



## Mostly_Harmless (17. Mrz 2009)

Shaun hat gesagt.:


> Aber irgendwie finde ich die Rekursion gerade im Code bei dir nicht, ist die im Random Befehl drin?



Schau mal in Zeile 14.



Shaun hat gesagt.:


> Was bedeutet diese ":\t" , das sagt mir im Moment leider nichts :/.



\t steht für Tabulator.


----------



## hdi (17. Mrz 2009)

Die Dinger nennt man btw Escape-Zeichen.

Sie werden immer mit einem "\" eingeleitet und dahinter dann das jeweilige
Zeichen.

Hier ne Liste:

Escape Characters


----------



## Schandro (17. Mrz 2009)

noch was zum Code von Mostly_Harmless:
anstatt[highlight=Java]        if (n <= 0) {
    return;
}
// restlicher Code[/highlight]
Ist es LAUT DER JAVA-KONVENTION besser, das hier zu schreiben:
[highlight=Java]if (n > 0) {
   // restlicher Code
}
[/highlight]
    Da man dann den Code besser umstrukturieren kann da er nicht an eine feste Reihenfolge der Ausführung gebunden ist ... oder so^^ wers genau wissen will sollte lieber in der Konvention nachgucken.


----------



## hdi (17. Mrz 2009)

Die ganze Klasse verstösst so ziemlich gegen jede Konvention.
Member-Variablen nicht private, und das Random-Objekt sollte auch static final sein.
Kein Grund, 500 Random Objekte zu erstellen wenn man mal ne Würfel-Session macht.


----------



## Shaun (17. Mrz 2009)

Mostly_Harmless hat gesagt.:


> Schau mal in Zeile 14.



Ok jetzt seh ichs auch . 

Danke  an alle nochmal für die Hilfe .


----------



## Schandro (17. Mrz 2009)

hdi hat gesagt.:


> Die ganze Klasse verstösst so ziemlich gegen jede Konvention.


Türlich tut sie das, wollt nur auf diese eine Konvention aufmerksam machen weil sie nicht ganz so bekannt ist.


----------



## Mostly_Harmless (17. Mrz 2009)

Mein Ziel war's auch nicht, mich an Konventionen zu halten, sondern Shaun einen schöneren Lösungsweg zu zeigen.

Dennoch danke an Schando, die Konvention kannte ich wirklich noch nicht. ;-)
Ich weiß aber noch nicht genau, ob ich mich an die halten werde, denn so, wie ich Rekursionen bisher gelöst habe, halte ich persönlich es für logischer und verständlicher.


----------



## hdi (17. Mrz 2009)

Ich find das mit dem return auch nich so wild.
Du siehst sofort was die Methode voraussetzt (nicht nur bei Rekursion),
und musst nicht evlt. 25 if-Abfragen abchecken.
Wobei eine Methode auch nicht 25 if-Abfragen haben sollte.
Naja...sowas is denk ich mal guad egal.


----------

