# Abzählreim



## jens0n (3. Apr 2012)

Moin Moin,

ich bin neu hier im forum, hab schon mal nach dem thema gesucht, aber zu meinem fall nix gefunden.
also hier mein problem, ich bin medientechnik student und habe eine aufgabe im kurs java2 gestellt bekommen.

Aufgabe :

Abzählreime werden in Kinderspielen benutzt, um pseudozufällig ein Kind aus einer Gruppe auszuwählen. Daher ist ein Abzählreim auch eine Art vermeintlicher Zufallsgenerator. Bekannt ist z.B. der Abzählreim "Ene, mene, muh und raus bist du", der solange wiederholt wird, bis nur noch ein Spieler (Gewinner) übrig bleibt.

In dieser Aufgabe soll ein Programm entwickelt werden, mit dem man vorhersagen kann, welcher Spieler den Abzählreim gewinnt. Dazu soll eine Klasse Abzaehlreim mit folgenden Methoden implementiert werden:

Abzaehlreim(int anzahlSpieler, int anzahlSilben)
Der Konstruktor erwartet die Anzahl der Spieler und die Silbenanzahl des Abzählreims als Parameter.

int getSieger()
Diese Methode gibt die Nummer des Spielers zurück, der nach wiederholter Anwendung des Abzählreims übrigbleibt und somit gewinnt. Zu beachten ist, dass der erste Spieler die Nummer 0 hat.

Die Aufgabe muss mit einer Klasse Spieler gelöst werden, die eine Objektvariable next enthält, die jeweils auf den nachfolgenden Spieler verweist. Durch diese Verkettung wird ein "Ring" der Mitspieler erzeugt, aus dem entsprechend dem Abzählreim nach und nach Spieler entfernt werden:

Für dieses Beispiel müsste das Programm mit dem Abzählreim "Ene mene muh ..." (9 Silben) als Sieger die Nummer 2 (somit Spieler 3) ermitteln:
Abzaehlreim azr = new Abzaehlreim(4,9);
System.out.println("Sieger: "+azr.getSieger());

Beispielhafte Ausgabe:
Spieler 0 entfernt
Spieler 3 entfernt
Spieler 1 entfernt
Sieger: 2

Folgender Programmcode könnte hilfreich sein (Spieler sp; sp ist Variable vom Typ Spieler). Überlegen Sie selbst, was die Programmzeilen bewirken und wozu Sie diese nutzen können:
sp = sp.next;
sp.next = sp.next.next;


soweit die Aufgabe...
Mein Ansatz ist bisher nur folgender code :


```
public class Abzaehlreim {
	
	int spieler;
	int silben;
	
	Abzaehlreim(int anzahlSpieler, int anzahlSilben){
		
		if(anzahlSpieler>0 && anzahlSilben>0){
			
			spieler=anzahlSpieler;
			silben=anzahlSilben;
		}
		else{
			
			System.out.println("zu wenig silben oder spieler");
		}
		
	}

}
```

das ist also quasi mein constructor...
ja und nun brauche ich einen Denkanstoß wie ich das problem lösen könnte ! 

Vielen Dank schon mal im Vorraus für Hilfe 
Mfg


----------



## nillehammer (3. Apr 2012)

Das ist ja nohc nicht viel. Mit ein bisschen Nachdenken, kommt man drauf, dass es hier auf eine Division evtl. mit Rest hinausläuft. Division ist in Java "/", Division mit Rest ist in Java das Modulo "%".


----------



## jens0n (4. Apr 2012)

Alles klar, danke schon mal, ich werd mich mal ranhalten und alles geben


----------



## Jbeush (12. Apr 2012)

so sieht meine Spielerklasse aus, allerdings bin ich jetzt mit der getSieger Methode völlig überfordert. Wie kann ich dem Computer klarmachen, dass er pro Silbe einen Spieler weitergeht?? 



```
public class Spieler {
	
	int Spielernummer; // Zählvariable
	Spieler next; //Objektvariable wird erzeugt ( next ist Spielervariable)
	
	
	public Spieler (int a){   // weißt dem Spieler eine Nummer zu
		
		Spielernummer = a;
	}
	
	
	public void setNext (Spieler a){  // verweis auf nächsten Spieler 
		
		next = a;
	}
	
	public int getSpielernummer (){  // gibt die Spielernummer zurück
		return Spielernummer;
	}
	
	public Spieler getNext(){  // gibt den nächsten Spieler zurück 
		return next;
		
	}
```


----------



## Jbeush (12. Apr 2012)

ok hab das mit dem verweis pro silbe auf den jweils nächsten spieler doch noch hinbekommen.


```
for (int i=0 ; i < Silben; i++){
		verweisen();
	}
```

war nicht ganz so schwer  

trotzdem danke! ich meld mich sicherlich nochmal


----------



## Jbeush (12. Apr 2012)

ein problem gibts trotzdem noch... ;-) 

wie kann ich denn Spieler 1, Spieler 2, Spieler 3 usw erstellen?? 

muss man das irgendwie oben deklarieren oder sowas?

sorry für die dummen fragen, aber bin ganz neu in dem Thema und versuch nun schon mehrere Stunden mich dareinzufinden. 
Bin für jede hilfe dankbar. 

Gruß


----------



## SlaterB (12. Apr 2012)

da du variabel viele Spieler hast musst du sie in einer Schleife erzeugen,
eine Liste brauchst du nicht, die Spieler werden ja untereinander zu einem Ring verknüpft,
von dem du dir zum Anfang sicherlich Spieler0 merkst, später vielleicht andere wenn 0 rausfliegt..

alles fängt aber mit der Definition eines Spielers, eines Objektes an
X x = new X();
usw., sagt dir das nichts?
Klassen schreiben und Objekte erstellen sind die Grundlage,
dazu musst du doch irgendwo was nachlesen können

ist das die allererste Aufgabe überhaupt? sonst musst du doch schon irgendwo mal ein Objekt zu einer Klasse erstellt haben


-----

'Division mit Rest' und 'Modulo' sind hier übrigens eher Fehl am Platze,
man soll nicht per Formel direkt die letzte Person berechnen sondern den gesamten Ablauf simulieren


----------



## Jbeush (13. Apr 2012)

moin, danke für die antwort.. Xx = new X () sagt mir etwas  hab's auch jetzt soweit hinbekommen. Danke.

und nein, das ist nicht die erste Aufgabe ;-) stand da nur insgesamt etwas auf dem Schlauch.

Danke, 

mfg


----------



## Jbeush (13. Apr 2012)

> da du variabel viele Spieler hast musst du sie in einer Schleife erzeugen,
> eine Liste brauchst du nicht, die Spieler werden ja untereinander zu einem Ring verknüpft,



könnte man die verbindung zwischen den spieler mit dieser methode herstellen? ich habe in spieler eine hilfsmethode "setNext" geschrieben. 


```
if(anzahlSpieler>0){
    spieler a=new spieler(0);
    if(anzahlSpieler>=1){
        spieler b=new spieler(1);
        a.setNext(b);
        spieler c;
        for(int i=2; i<anzahlSpieler;i++){
            spieler c=new spieler(i);
            b.setNext(c);
            b=c;
        }
    }
}
```


----------



## SlaterB (13. Apr 2012)

wozu das zweite if? 
a separat anzulegen mag sein, danach dann aber doch gleich ne Schleife


----------



## Jbeush (13. Apr 2012)

```
if(anzahlSpieler>0){
    spieler a=new spieler(0);
    
        spieler b;
      
        for(int i=1; i<anzahlSpieler;i++){
            spieler b=new spieler(i);
            a.setNext(b);
            a=b;
        
    }
}
```

meinst du das so in etwa?
ist glaub ich später unpraktisch weil du so deinen "start-spieler" immer überschreibst. .. das müsste doch spätestens bei dem verweis von dem letzten zum ersten spieler schief gehen. 
oder stehe ich schon wieder aufn schlauch?:autsch:


----------



## SlaterB (13. Apr 2012)

ok, wenn du dafür b und c brauchst, dann bitte,
wobei in etwa auch

```
if(anzahlSpieler>0){
    spieler a=new spieler(0);
    
        spieler b= a; // besser z.B. ende benennen, Klassen immer groß schreiben!
      
        for(int i=1; i<anzahlSpieler;i++){
            spieler c=new spieler(i);
            b.setNext(c);
            b=c;
        
    }
}
```
gehen müsste


----------

