Bowling-Simulation

Eine Programmieraufgabe von LordCyrix:

Es ist ein Programm zu schreiben dass ein Bowlingturnier simuliert. Dabei sollen maximal 100 Spieler teilnehmen können. Jeder Spieler hat 10 Würfe am Stück. Wirft ein Spieler alle 10 Kegel um, dann hat er einen Strike und darf noch einmal. Maximal wären also pro Spieler 20 Würfe möglich. Es soll immer erst ein Spieler komplett seine Würfe fertig spielen. Anschliessend soll eine Bestenliste mit dem Spielernamen und der Punktzahl erscheinen. Die Bestenliste soll bis zum Ende des Programms im Speicher bleiben. Die Anzahl der teilnehmenden Spieler ist beim Start des Programms durch den User einzugeben und anschliessend die Namen der einzelnen Spieler. Die Würfe selbst sollen per Zufallsgenerator erzeugt werden.

Als Zusatzaufgabe könnte man die Bestenliste noch in einer Textdatei ausgeben lassen.
 
Hiho Freaks :)

Damit es nicht zu C und Perl-lastig wird, hier mal eine zwar schnell zusammengetippte
aber wie ich finde recht elegante Loesung (wollte schon immer mal das Comparator
Interface benutzen)... also hier die "Insel" Version :)

Bowling.java:
Code:
import java.util.Arrays;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Bowling
{
  private final static int maxPlayers = 100;

  public static void main(String[] args)
  {
    int playerCount;
    Player[] players;
    
    playerCount = getInteger("Anzahl der Mitspieler eingeben (1-100): ");
  
    if (playerCount<1 || playerCount>maxPlayers) return;
    
    players = new Player[playerCount];
    
    for (int i=0;i<playerCount;i++)
    {
      players[i] = new Player(getString("Namen fuer Spieler "+(i+1)+":"));
      players[i].play();
    }
    
    Arrays.sort(players,new PlayerComparator());
    
    for (int i=0;i<playerCount;i++)
      System.out.println(players[i].getName()+" Punkte: "+players[i].getPoints());
        
  }
  
  public static String getString(String prompt)
  {
    BufferedReader reader;
    String input;
      
    try
    {
      reader = new BufferedReader(new InputStreamReader(System.in));
      System.out.print(prompt);
      input = reader.readLine();
    }
    catch (IOException ioEx)
    {
      ioEx.printStackTrace();
      return "";
    }
    
    return input;
  }
  
  public static int getInteger(String pr)
  {
    boolean okflag = false;
    int result = 0;
    
    do
    {  
      try
      {
        result = Integer.parseInt(getString(pr));
        okflag = true;
      }
      catch (NumberFormatException nfEx)
      {
      }
    }
    while(!okflag);
    
    return result;
  }
  
}

Player.java:
Code:
public class Player 
{
  private int points;
  private String name;
  
  public Player(String name)
  {
    this.name = name;
    points = 0;
  }
  
  public void play()
  {
    int thisRound;
    
    for (int i=0;i<10;i++)
    {
      thisRound = (int)(Math.random()*11);
      points+=thisRound;
      if (thisRound==10) points+=(int)(Math.random()*11);
    }
  }
  
  public int getPoints()
  {
    return points;
  }
  
  public String getName()
  {
    return name;
  }
  
}

PlayerComparator.java:
Code:
import java.util.Comparator;

public class PlayerComparator implements Comparator
{
  public int compare(Object a, Object b)
  {
    return ((Player)b).getPoints() - ((Player)a).getPoints();
  }
}
 
Hier einmal mein Programm in der Sprache C++.
Das Programm wurde mit dem C++ Trainer 2.0 erstellt, welches den Borland C++ Compiler verwendet.

Code:
#include <iostream.h>
#include <conio.h>

int Bestenliste[100]; // globale Deklaration der Arrays
int Durchgang[20][100];

int Konfiguration(void); // Vorausdeklaration der Funktionen ...
void Bowlen(int);
void Bestenliste_sortieren(void);
void Bestenliste_ausgeben(void);

int main() { // Hauptfunktion

  int Spieler; // lokale Deklaration der Variablen Spieler -> gilt nur in main();
  
  Spieler=Konfiguration(); /* Aufruf der Funktion Konfiguration(); der Rückgabewert dieser
                              Funktion wird der Variablen Spieler übergeben */

  Bowlen(Spieler); /* Aufruf der Funktion Bowlen mit gleichzeitiger Übergabe der Variablen
                      Spieler */
  return 0;
  }
  
int Konfiguration() { // 1. Unterfunktion

  int Spieleranzahl=0;

  do { /* Eingabeabsicherung für Falscheingabe des Anwenders */
  
    clrscr();
    cout << "Spieleranzahl eingeben: ";
    cin >> Spieleranzahl;
    
    if(Spieleranzahl<0 || Spieleranzahl>100) {
    
      clrscr();
      cout << "Es muß ein Wert von 0 bis 100 eingegeben werden!";
      getchar();
      }
    }
    while(Spieleranzahl<0 || Spieleranzahl>100); /* wird solange wiederholt, bis für Spieleranzahl
                                                    ein Wert von 0 bis 100 eingegeben wurde */
  
  return Spieleranzahl; // gibt den Wert von Spieleranzahl an die aufrufende Funktion zurück
  }
  
void Bowlen(int Spieler) { // 2. Unterfunktion

  int Strikes; // Deklaration von Strikes

  clrscr();
  for(int j=0; j<Spieler; j++) {
  
    Strikes=0;
    
    for(int i=0; i<10+Strikes; i++) {
    
      Durchgang[i][j]=rand()%11; // Zufallswert von 0 bis 10
      
      if(Durchgang[i][j]==10 && Strikes<10) { /* wenn ein Strike geworfen wurde und ausserdem noch
                                                 weniger als 10 Strikes von diesem Spieler geworfen
                                                 wurden */
      
        Strikes++;
        } // begrenzt die Anzahl der Würfe pro Spieler auf 10 + max. 10 Strikes
        
      Bestenliste[j]+=Durchgang[i][j]; /* aktueller Punktwert wird zum aktuellen Eintrag in der
                                          Bestenliste des Spielers hinzu addiert */
      }

    Bestenliste_sortieren(); // sortiert die Einträge in der Bestenliste
    Bestenliste_ausgeben(); // gibt die Bestenliste sortiert aus
    }
  }
  
void Bestenliste_sortieren() { // 3. Unterfunktion

  int cache;

  for(int j=0; j<100; j++) { // Bubble-Sort Algorithmus
  
    for(int i=0; i<99; i++) {
  
      if(Bestenliste[i]<Bestenliste[i+1]) {
      
        cache=Bestenliste[i];
        Bestenliste[i]=Bestenliste[i+1];
        Bestenliste[i+1]=cache;
        }
      }
    }
  }
  
void Bestenliste_ausgeben() {

  clrscr();
  cout << "Aktuelle Bestenliste:\n\n";
  
  for(int i=0; i<9; i++) {
    
    cout << i+1 <<". Platz:  " << Bestenliste[i] << " Punkte \n";
    }
    
  cout << "10.Platz:  " << Bestenliste[9] << " Punkte \n";
  getchar();
  }

Vielleicht kann mir ja von euch noch jemand sagen wie ich das hinbekomme, dass ich bei der Bestenliste zusätzlich noch Namen mit sortieren lassen kann. In einem Array darf man ja immer nur Daten vom selben Datentyp verwenden. Mit einer Struktur müsste es vielleicht funktionieren, nur weiss ich nicht wie ich dort dann sortieren lassen soll.


Übrigens @darkdieter:

Dein Programm hat einen logischen Fehler...
Sobald ein Spieler bei dir einen Strike wirft, darf er nochmal. Du hast dabei aber nicht bedacht, dass bei einem Strike ebenfalls nochmal eine 10 geworfen werden kann. Damit hast Du dann eine Endlosschleife, wenn der Spieler jedesmal eine 10 werfen sollte. Es sollte so sein, dass nach einem Standardwurf, maximal ein Strike geworfen werden darf. Also insgesamt maximal 20 Würfe pro Spieler. ;)
 
Dein Programm hat einen logischen Fehler...
Sobald ein Spieler bei dir einen Strike wirft, darf er nochmal. Du hast dabei aber nicht bedacht, dass bei einem Strike ebenfalls nochmal eine 10 geworfen werden kann. Damit hast Du dann eine Endlosschleife, wenn der Spieler jedesmal eine 10 werfen sollte. Es sollte so sein, dass nach einem Standardwurf, maximal ein Strike geworfen werden darf. Also insgesamt maximal 20 Würfe pro Spieler.

Hmmm aeh, oeh, noe? Die for-Schleife wird genau 10 mal durchlaufen und der Spieler darf nach einem Strike genau EINMAL nochmal werfen... das sollte schon stimmen.
 
Ahh stimmt, Du hast Recht.

Da Du ja den Wert direkt auf points zuaddierst und nur thisRound überprüfst funktioniert das.
Wirklich eine sehr schöne Lösung. Sollte ich auch nochmal in mein Programm mit aufnehmen. ;)
 
Habe es in C# gemacht:

CHauptklasse:
Code:
using System;

namespace Bowlingturnier
{
	class CHauptklasse
	{
		internal static int anzahl;			//Anzahl der Spieler
		internal static Spieler[] spieler;	//Strukturarray referenzieren
		internal static Random zz = new Random();	// Um Zufallszahlen zu generieren

		static void Main()
		{
			
			do		// Schleife zur Abfrage der Spielteilnehmer
			{
				Console.WriteLine("\nBitte geben Sie die Spieleranzahl (1-100) ein: ");
				anzahl = Convert.ToInt32(Console.ReadLine());
				if (anzahl < 1 || anzahl > 100)
					Console.WriteLine("\nBitte geben sie eine gültige Spieleranzahl zwischen " +
						"1 und 100 ein.\n\n");
			}
				while(anzahl < 1 || anzahl > 100);

			spieler = new Spieler[anzahl];	//Strukturarray erzeugen

			CSpieler.namenDefinieren(ref spieler);	//Methode für Namensgebung aufrufen und
                                                                //den Array als Referenzparameter übergeben

			CSpieler.spielen(ref spieler);	       //Methode für Punktevergabe aufrufen und
                                                               //den Array als Referenzparameter übergeben
			
			CSpieler.bestenlisteAusgeben(spieler); //Methode für das Ausgeben der Bestenliste
                                                               //den Array als Parameter übergeben


		}
	}
}

CSpieler:
Code:
using System;

namespace Bowlingturnier
{
	public struct Spieler	// Struktur für die verschiedenen Spieler
	{
		public string name;
		public int punkte;
	}

	public class CSpieler
	{

		internal static void namenDefinieren(ref Spieler[] spieler)	//Methode zum Namen definieren
		{
			int i = 0;
			while (i != CHauptklasse.anzahl)
			{
				Console.Write("Bitte geben Sie den Namen für den {0}. Spieler ein: ", i+1);
				spieler[i].name = Convert.ToString(Console.ReadLine());
				i++;
			}
		}
		internal static void spielen(ref Spieler[] spieler) //Methode zum Punkte vergeben
		{
			int i = 0;
			int j = 0;
			int punkte = 0;
			while (i != CHauptklasse.anzahl)
			{
				while (j != 10)
				{
					punkte = CHauptklasse.zz.Next(11);	//Zufallszahl 1-10
					spieler[i].punkte += punkte;
					if (punkte == 10)	//Wenn Strike, dann nochmal werfen
					{
						punkte = CHauptklasse.zz.Next(11);
						spieler[i].punkte += punkte;
					}

					j++;
				}
				i++;
				j = 0;
			}
		}

		internal static void bestenlisteAusgeben(Spieler[] spieler) //Methode zum Ausgeben der Bestenliste
		{			
			int i = 0;
			string[] namen = new string[CHauptklasse.anzahl];
			while (i != CHauptklasse.anzahl)	//Strukturarray in Stringarray packen
			{
				namen[i] = Convert.ToString(spieler[i].punkte) + " Punkte    -> " + spieler[i].name;
				i++;
			}
			Array.Sort(namen);
			Array.Reverse(namen);	//Stringarray sortieren

			Console.WriteLine("\n\n ----BESTENLISTE----\n");
			foreach (string elem in namen)
				Console.WriteLine(elem);
			
			Console.ReadLine();
		} 



		}

	}
 
zovax:

Seh ich das richtig das du einfach Punkte + Spielernamen in ein Stringarray packst und das dann sortieren laesst... sehr hinterlistig :)
 
Original von darkdieter
zovax:

Seh ich das richtig das du einfach Punkte + Spielernamen in ein Stringarray packst und das dann sortieren laesst... sehr hinterlistig :)

ja *schäm* :)
Wüsste auch keinen anderen Weg, wie man es in einem Strukturarray sonst sortieren könnte.
Wenn jemand dazu nen Vorschlag hat, her damit..
 
Bowling

Also ich hab beide Bowling-Threads mal zusammen gefügt :)

Als ich den zweiten erstellt hab war ich wohl etwas verpeilt :)

Norna
 
Lösung in C# mit Datei-Bestenliste:

CMain.cs
Code:
using System;

namespace Bowlingsimulation
{
	class CMain
	{
		private static int auswahl;
		private static int anzahl;

		[STAThread]
		static void Main(string[] args)
		{

			Hauptmenu();


		}

		private static void Hauptmenu()
		{
			Console.WriteLine("Bowlingsimulation");
			Console.WriteLine("------------------------------");
			Console.WriteLine("(1) Neues Spiel beginnen");
			Console.WriteLine("(2) Bestenliste ausgeben");
			Console.WriteLine("(3) Spiel Beenden");
			Console.WriteLine("------------------------------");
			
			while(true)
			{
				Console.Write("Ihre Eingabe: ");
				
				try
				{
					auswahl = Convert.ToInt32(Console.ReadLine());
				}
				catch (Exception ex)
				{
					;
				}
			
				if(auswahl == 1)
				{
					auswahl = 0;
					NeuesSpiel();
					break;
				}
				else if(auswahl == 2)
				{
					auswahl = 0;
					BestenlisteLaden();
					break;
				}
				else if(auswahl == 3)
				{
					
					break;
				}
			}
		}
		
		private static void NeuesSpiel()
		{
			while(anzahl > 100 || anzahl < 1 || anzahl == 0)
			{
				Console.WriteLine();
				Console.Write("Bitte Spielerzahl zwischen 1 und 100 angeben: ");
				
				try
				{
					anzahl = Convert.ToInt32(Console.ReadLine());
				}
				catch (Exception ex)
				{
					continue;
				}
			}

			
			CSpieler[] Spieler = new CSpieler[anzahl];
			string spielername;

			for (int i = 0; i < anzahl; i++)
			{
				Console.WriteLine();
				Console.Write("Bitte Spielernamen für Spieler Nummer {0} eingeben: ",i+1);
				spielername = Console.ReadLine();
				Spieler[i] = new CSpieler(spielername);

				for (int j = 0; j < i; j++)
				{

					if (Spieler[j].Name == spielername)
					{
						Console.WriteLine("Der Name exisitiert schon");
						i--;
						break;
					}
				
				}
			}

			for (int i = 0; i < Spieler.Length; i++)
			{
				Spieler[i].Werfen();
				Console.WriteLine("{0} erzielte {1} Punkte",Spieler[i].Name, Spieler[i].Punkte);
				Bestenliste(Spieler);
				if(i != Spieler.Length - 1)
				{
					Console.WriteLine("Zum nächsten Spieler mit beliebiger Taste...");
					Console.ReadLine();
				}
			}
			
			
			while(true)
			{
				Console.WriteLine();
				Console.WriteLine("(1) Bestenliste Speichern                              (2) Hauptmenü");
			
				Console.Write("Ihre Eingabe: ");
				
				int eingabe = 0;

				try
				{
					eingabe = Convert.ToInt32(Console.ReadLine());
				}
				catch (Exception ex)
				{
					;
				}
			
				if (eingabe == 1)
				{
					Bestenlistespeichern(Spieler);
					break;
				}
				else if (eingabe == 2)
				{
					Console.WriteLine();
					Console.WriteLine();
					Hauptmenu();
					break;
				}
			}
		}

		private static void Bestenliste(CSpieler[] Spieler)
		{
			Console.WriteLine();
			Console.WriteLine("Die besten Spieler");
			Console.WriteLine("------------------------------");
			int platz;
			string[] Liste = new string[Spieler.Length];

			for (int i = 0; i < Spieler.Length; i++)
			{
				platz = Spieler.Length-1;

				for (int j = 0; j < Spieler.Length; j++)
				{
					if(Spieler[i].Punkte > Spieler[j].Punkte)
						platz -= 1;
				}
				
				while(Liste[platz] != null)
				{
					platz -= 1;
				}
				Liste[platz] = Spieler[i].Name + " -> " + Spieler[i].Punkte.ToString();
			}

			for (int i = 0; i < Liste.Length; i++)
			{
				Console.WriteLine(Liste[i]);

				if(i == 9)
				{
					break;
				}
			}
			Console.WriteLine();
		}

		private static void Bestenlistespeichern(CSpieler[] Liste)
		{
			System.IO.FileStream fs = System.IO.File.Create("Bestenliste.xml");
			fs.Close();

			System.Xml.XmlTextWriter x = new System.Xml.XmlTextWriter("Bestenliste.xml",System.Text.Encoding.UTF8);
			x.Formatting = System.Xml.Formatting.Indented;

			x.WriteStartDocument();

			x.WriteStartElement("Bestenliste");

			
			for (int i = 0; i < Liste.Length; i++)
			{

				x.WriteStartElement("Spieler");
				x.WriteStartElement("Name");
				x.WriteString(Liste[i].Name);
				x.WriteEndElement();
				x.WriteStartElement("Punkte");
				x.WriteString(Liste[i].Punkte.ToString());
				x.WriteEndElement();
				x.WriteEndElement();

			}

			x.WriteEndElement();
			x.Close();

			Console.WriteLine();
			Console.WriteLine("Bestenliste erfolgreich gespeichert!");
			Console.WriteLine();
			Console.WriteLine();
			Hauptmenu();
		}

		private static void BestenlisteLaden()
		{
			System.Xml.XmlDocument x = new System.Xml.XmlDocument();

			try
			{
				x.Load("Bestenliste.xml");
			}
			catch (Exception ex)
			{
				Console.WriteLine();
				Console.WriteLine("Keine Bestenliste gespeichert!");
				Console.WriteLine();
				Hauptmenu();
			}

			Console.WriteLine();
			Console.WriteLine("Die besten Spieler");
			Console.WriteLine("------------------------------");


			for (int i = 0; i < x["Bestenliste"].ChildNodes.Count; i++)
			{
				Console.WriteLine(x["Bestenliste"].ChildNodes[i]["Name"].InnerXml + " -> " + x["Bestenliste"].ChildNodes[i]["Punkte"].InnerXml);

				if(i == 9)
					break;
			}
			
			Console.WriteLine();
			Console.WriteLine("Mit beliebiger Taste zurück zum Hauptmenu...");
			Console.ReadLine();
			Hauptmenu();
		}

	}
}



CSpieler.cs
Code:
using System;

namespace Bowlingsimulation
{
	public class CSpieler
	{
		private string name;
		private int punkte;
		private System.Random z = new Random();

		public string Name
		{
			get
			{
				return name;
			}
			set
			{
				;
			}
		}

		public int Punkte
		{
			get
			{
				return punkte;
			}
			set
			{
				;
			}
		}

		public CSpieler(string name)
		{
			this.name = name;
			this.punkte = 0;
		}

		public void Werfen()
		{
			int wurfpunkte;
			int extra;

			for (int i = 0; i < 10; i++)
			{
				wurfpunkte = this.z.Next(11);
				Console.WriteLine(wurfpunkte + " Punkte!");
				
				if(wurfpunkte == 10)
				{
					extra = this.z.Next(11);
					Console.WriteLine("Durch Extrawurf {0} Punkte!",extra);
					wurfpunkte += extra;

				}

				this.punkte += wurfpunkte;
			}

			z = null;

		}

	}
}
 
Danke für die Aufgabe, habe nach einigen Monaten Codingabstinenz mal wieder den Compiler ausgegraben:

Programmiersprache: Pascal
Compiler: FreePascal 1.0.10 für Linux auf i386
Binary: Download (84 KB) (Linux i386)
Version: 0.1

Freu' mich schon auf die Kommentare... ;)
Das mit der Bestenliste in Datei muss ich noch nachreichen... *g*


Code:
program Bowling;
uses crt;
var bl:array[0..100,0..1] of integer; { bl=Bestenliste 0=ID, 1=Pkte }
    anz_spieler:byte;
    i:integer;


function spielerzahl_ok(n:byte):boolean;
{ Prüft die Anzahl der Spieler auf 0 bis 100 }
begin
  spielerzahl_ok:=FALSE;
  if (n>0) and (n<101) then spielerzahl_ok:=TRUE;
end;


function amzug(spieler:integer):integer;
{ Führt die Züge aus }
var w,pts,pts_local:integer; { Wurf-Nummer, Punkte(spieler), Punkte(Wurf) }
begin
  w:=1;  pts:=0;
  repeat
    pts_local:=random(10);
    if pts_local=10 then pts:=pts+random(10);
    pts:=pts+pts_local;
    inc(w);
  until w=10;
  amzug:=pts;
end;


procedure display;
{ Gibt die sortierte Bestenliste aus }
var bl2:array[0..100,0..1] of integer;
    j,k,max,best:integer;
begin
  bl2:=bl;
  writeln('*** Bestenlise nach ',i:0,' Spielern: ***');
  for j:=1 to anz_spieler do
  begin
    max:=0;
    best:=0;
    for k:=1 to anz_spieler do
      begin
        if bl2[k,1]>max then 
           begin
		max:=bl2[k,1];
		best:=bl2[k,0];
           end;
      end;
    bl2[best,1]:=0;
    writeln('Platz ',j:2,': ',bl[best,0],' mit ',bl[best,1],' Punkten');
  end;
  writeln('(Enter druecken...');
end;



begin
  writeln('Bowling 0.1');

  { Anzahl der Spieler eingeben }
  repeat
    write('Anzahl der Spieler eingeben: ');  readln(anz_spieler);
  until spielerzahl_ok(anz_spieler)=TRUE;

  { Bestenliste belegen }
  for i:=1 to anz_spieler do
    begin
      bl[i,0]:=i;
      bl[i,1]:=0;
    end;

  randomize;

  { Wuerfe }
  for i:=1 to anz_spieler do 
    begin
      bl[i,1]:=bl[i,1]+amzug(i);
      display;
      readln;
    end;

end.
 
Ist zwar schon lange nichts mehr drin gepostet worden aber ich stell mal meine Perl Lösung rein. Wie gesagt nutz ich die Aufgaben hier drinne zum Perl lernen also nichts großartiges Erwarten.
Momentan nur ne Ausgabe am Bildschirm aber in nem File ausgeben dürfte kein Problem sein.
Mein Lösungsweg ist etwas merkwürdig :rolleyes: aber es funktioniert und Spielerzahlen über 100 sind auch kein Problem.

Code:
print 'Bitte Anzahl der Spieler eingeben:' ;
$player = <STDIN> ;
chomp $player ;

$count = 1;


while ($count <= $player) 
{
	
	print "\nSpieler $count ist dran...\n";
	$treffer = int(rand 10) + 1 ;
	print "Spieler $count hat $treffer Treffer erziehlt.\n"	;
	if ($treffer == '10') { 
		print "STRIKE!\n" ;
		$strike = int(rand 10) +1 ;
		$count++ ;
		$treffer = $treffer+ $strike ;
		print "Zusaetzliche $strike Treffer\n" ;
		}
	
	else { $count++ ; }
	$temp = $count-1 ;
	$Ergebnis{$treffer." Punkte: Spieler $temp\n"} = 1 ;
}




print reverse  sort {$a<=>$b}  keys %Ergebnis ;
 
hi,
hab sehr oft probiert das programm mit objekten und klassen zusammen zu biegen. aber es funktioniert einfach nicht. hat einer von euch da einen lösungsansatz?
 
dito, hier noch eine einfache lösung in java:

Code:
import java.util.Random;

public class Turnier {

	public static void main(String[] args) {

		Turnier t = new Turnier();
		int[][] turnier = new int[100][20];

		int i = 0;		// Laufvariable
		while ( i < 100 )
			turnier = t.play(turnier,i++);
		
		for ( int x=0 ; x < 100 ; x++ ) {
			System.out.print("\nPlayer " + x + ": ");
			for ( int y=0 ; y < 20 ; y++ ) {
				System.out.print(turnier[x][y]+" ");
			}
		}
	}
	
	public int[][] play( int[][] turnier , int player ) {
		Random r = new Random();
		int wurf = 0 , erlaubtWurf = 10, i = 0;
		
		while ( erlaubtWurf-- > 0 ) {
			if ( (wurf = r.nextInt(11)) == 10) {
				turnier[player][i++] = wurf;
				turnier[player][i++] = wurf = r.nextInt(11);
			} else {
				turnier[player][i++] = wurf;
			}
		}
		return turnier;
	}
}
 
Da ich ja auch schon die Aufgabe mit den Tagen gelöst habe, wollte ich gleich noch eine Lösen.
Macht eigentlich richtig Spass... :)

Verbesserungsvorschläge sind immer willkommen.

Code:
import java.io.*;
import java.util.Random;

public class bowl {
	
	static int num_players = 0;
	static String player[] = new String[100];
	static int highscore[] = new int[100];
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	
	public static void main(String[] args) {
		
		num_players = getPlayerCount();
		
		for(int i = 0; i < num_players; i++){
			player[i] = getPlayerName(i);
		}
		
		for(int i = 0; i < num_players; i++){
			makeThrows(i);
		}
		showHighScore();
		writeHigh();
	}
	
	public static int getPlayerCount(){
		int count = 0;	
		System.out.print("Bitte Anzahl der Spieler eingeben: ");
		try{
			count = Integer.valueOf(in.readLine()).intValue();
		} catch (Exception e){
			System.out.println("Fehler bei der Eingabe");
		}
		return count;
	}
	
	public static String getPlayerName( int i ){
		String name = null;
		System.out.print("Bitte Spielername fuer Spieler " + (i+1) + " eingeben: ");
		try{
			name = in.readLine();
		} catch (Exception e){
			System.out.println("Fehler bei der Eingabe");
		}
		
		return name;
	}
	
	public static void makeThrows( int i ){
		Random gen = new Random();
		int score = 0;
		int cur=0;
		for(int j = 1; j <= 10; j++){
			cur = gen.nextInt(11);
			score += cur;
			if(cur==10){
				score += gen.nextInt(11);
			}
		}
		highscore[i] = score;
	}
	
	public static void showHighScore(){
		System.out.println("\n------------------- HighScore ------------------------------");
		for(int i = 0; i < num_players; i++){
			System.out.println(player[i] + " - " + highscore[i]);			
		}
	}
	
	public static void writeHigh(){
		try{
			File file = new File("highscore.txt");
			FileWriter fw = new FileWriter(file);
			BufferedWriter bw = new BufferedWriter(fw);
			for(int i = 0; i < num_players; i++){
				bw.write(player[i] + " -" + highscore[i]);
				bw.newLine();
			}
			bw.close();
		} catch (Exception e ){
			System.out.println("Fehler beim Schreiben des Highscores!");
		}
	}
}

jetzt wollte ich auch noch ein bisschen c++ lernen und habe es dann auch gleich nochmal gemacht, diesmal ein wenig anders.

Code:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class Player
{
	public:
		void setName(string s);
		void setPoints(int i);
		string getName();
		int getPoints();
	private:
		string name;
		int points;
};

void Player::setName(string s)
{
	name = s;
}

string Player::getName()
{
	return name;
}

void Player::setPoints(int i)
{
	points = i;
}

int Player::getPoints()
{
	return points;
}


int main(void)
{
	int numplayer;
	
	cout << "Please enter the number of players: ";
	cin >> numplayer;
	Player p[numplayer];
	
	for(int i = 0; i < numplayer; i++)
	{
		string tmp;
		cout << "Please enter name of player " << i+1 << ": ";
		cin >> tmp;
		p[i].setName(tmp);
	}
		
	for(int i = 0; i < numplayer; i++)
	{
		int points = 0;
		int cur = 0;
		
		for(int j = 0; j < 10; j++)
		{
			cur = rand()%11;
			if(cur == 10)
			{
				cur = cur + (int)rand()%11;
			}
			points = cur + points;
		}
		p[i].setPoints(points);
		cout << p[i].getName() << " hat " << p[i].getPoints() << " Punkte gemacht!" << endl;
	}
	
	ofstream fp;
	fp.open("highscore.txt",ios::trunc);
	fp << "this is the highscore list\n" << endl;
	for(int i = 0; i <numplayer; i++)
	{
		fp << p[i].getName() << " - " << p[i].getPoints() << endl;
	}
	fp.close();
	
	return 0;
}
 
Lösung mit VB 6

Hab hier ma ne Lösung mit VB 6 erstellt. Man braucht n Textfeld mit dem Namen txtAnzahl und nen Commandbutton mit dem Namen cmdGo.

Der Code sieht dann so aus:
Code:
Option Explicit

Private A As Integer
Private Spielerzahl As Integer
Private Punkte As Integer
Private EingegebenerName As String
Private GesamtePunkte As Integer
Private Counter As Integer
Private AltePunkte As Integer
Private Spielernummer As Integer
Private AusgabeRangliste As String

Private Namen() As String
Private Rang() As Integer
Private Spielerpunkte() As Integer

Private Sub cmdGo_Click()
    'Spielerzahl bestimmen
    Spielerzahl = txtAnzahl.Text
    
    'Überprüfung auf gültigen Wert
    If IsNumeric(Spielerzahl) = True Then
        If Spielerzahl < 101 Then
            
            'Arraysgröße einstellen
            ReDim Namen(1 To Spielerzahl)
            ReDim Rang(1 To Spielerzahl)
            ReDim Spielerpunkte(1 To Spielerzahl)
            
            
            'Namen eingeben
            A = 1
            Do Until A = Spielerzahl + 1

Namenseingabe:
                EingegebenerName = InputBox("Bitte Namen für Spieler " & A & " eingeben.", "Spieler" & A)
                If EingegebenerName = "" Then
                    MsgBox ("Bitte gültigen Spielername eingeben")
                    GoTo Namenseingabe
                Else
                    Namen(A) = EingegebenerName
                End If
                A = A + 1
            Loop
            
            'Eigentliche Simulation/Würfe der Spieler
            A = 0
            
            'Zufallszahlengenerator initialisieren
            Randomize Timer
            Do Until A = Spielerzahl
                
                'Anzahl der Würfe und Punkte des Spielers zurücksetzen
                GesamtePunkte = 0
                Counter = 0
                
                'Würfe des Spielers
                Do Until Counter = 10
Kegeln:
                    Punkte = 0
                    'Zufallszahl zwischen 1 und 10 generieren
                    Punkte = Int((10 - 1 + 1) * Rnd + 1)
                    
                    'Runden der Zahl da Zufallszahlen Kommastellen enthalten können
                    Punkte = Round(Punkte)
                     GesamtePunkte = GesamtePunkte + Punkte
                    
                    'Bei Strike nochmal
                    If Punkte = 10 Then
                        GoTo Kegeln
                    End If
                    Counter = Counter + 1
                Loop
                Spielerpunkte(A + 1) = GesamtePunkte
                Call Rangliste
                A = A + 1
            Loop
            A = 1
            
            'Ausgabe der Rangliste
            AusgabeRangliste = ""
            Do Until A = Spielerzahl + 1
                If A < 10 Then
                    AusgabeRangliste = AusgabeRangliste & "  " & A & ". Platz:  " & Spielerpunkte(Rang(A)) & " Punkte         " & Namen(Rang(A)) & Chr(13) & Chr(10)
                Else
                    AusgabeRangliste = AusgabeRangliste & A & ". Platz:  " & Spielerpunkte(Rang(A)) & " Punkte         " & Namen(Rang(A)) & Chr(13) & Chr(10)
                End If
                A = A + 1
            Loop
            Dim AusgabeDialog
            AusgabeDialog = MsgBox(AusgabeRangliste, , "Rangliste")
        Else
            MsgBox ("Die eingegebene Anzahl an Spielern ist keine gültige Zahl.")
        End If
    Else
        MsgBox ("Die eingegebene Anzahl an Spielern ist keine gültige Zahl.")
    End If
End Sub

Private Sub Rangliste()
    Dim SpielerMitRang As Integer
    Dim B
    B = 1
    'Anmerkung: B entspricht dem Rang; A der Anzahl der bereits plazierten Spieler
    '           Spielernummer ist die Nummer des Spielers der jetzt an der Reihe ist.
    Spielernummer = A + 1
    Do Until B = A + 2
        Select Case A
        Case 0:
            Rang(1) = 1
            Spielernummer = A + 1
            GoTo Plaziert
        Case B:
            SpielerMitRang = A
            'Tritt ein wenn der Spieler als Vorletzter plaziert wird
            If GesamtePunkte > Spielerpunkte(Rang(B)) Then
                Rang(B + 1) = Rang(B)
                Rang(B) = Spielernummer
            GoTo Plaziert
            End If
        Case B - 1:
            Rang(B) = Spielernummer
            GoTo Plaziert
        Case Else:
            'Tritt ein wenn der Spieler irgendwo zwischen den anderen eingefügt wird
            SpielerMitRang = A
            If GesamtePunkte > Spielerpunkte(Rang(B)) Then
                Do Until SpielerMitRang = B - 1
                    Rang(SpielerMitRang + 1) = Rang(SpielerMitRang)
                    SpielerMitRang = SpielerMitRang - 1
                Loop
                Rang(B) = Spielernummer
                GoTo Plaziert
            End If
        End Select
        B = B + 1
    Loop
Plaziert:
End Sub

Ich weiß das das nich sehr sauber Programmiert is, aber für GoTo is mir kein Ersatz eingefallen.

Manuel
 
Hier eine quick & dirty Variante in Groovy. Ist prozedural, einzige Datenstruktur ist ein Array für die Punkte. Finde aber den Ansatz mit der Player-Klasse deutlich besser.

Code:
rand = new Random()
players = 5
points = new int[players]

println "*** Turnier startet ***"
players.times { player ->
    print "  Spieler ${player}: "
    10.times {
        hits = bowle(player)
        if (hits == 10)
            bowle(player)
    }
    println ""
}

def bowle(player) {
    hits = rand.nextInt(10) + 1
    print "${hits}, "
    points[player] += hits
    return hits
}

println "*** Punkte ***"
println points

Ausgabe:
Code:
*** Turnier startet ***
  Spieler 0: 6, 10, 10, 8, 1, 10, 10, 9, 1, 2, 3, 7, 
  Spieler 1: 7, 3, 7, 8, 8, 6, 3, 6, 9, 1, 
  Spieler 2: 3, 6, 6, 2, 10, 2, 8, 5, 3, 8, 6, 
  Spieler 3: 2, 6, 9, 3, 3, 10, 8, 8, 7, 6, 5, 
  Spieler 4: 5, 10, 5, 3, 9, 2, 5, 9, 3, 8, 3, 
*** Punkte ***
[77, 58, 59, 67, 62]

Und hier ist die objektorientierte Variante, ganz nach dem Vorbild von darkdieter:
Code:
class Player 
{
    static Random rand = new Random()
    
    String name
    Integer points = 0
    
    void play() {
        print "  ${name}: "
        10.times {
            int hits = bowle()
            if (hits == 10)
                bowle()
        }
        println ""
    }
    
    int bowle() {
        int hits = rand.nextInt(11)  // [0..10]
        print "${hits}, "
        points += hits
        return hits    
    }
    
    String toString() {
        return "${name}: ${points}"
    }
}

println "*** Spieler werden erzeugt ***"
players = []
5.times { players.add(new Player(name:"Spieler ${it}")) }

println "*** Turnier startet ***"
players.each { it.play() }

println "*** Punkte ***"
comparator = { p0, p1 -> (p1.points - p0.points) }
players.sort(comparator).each { println it }
 
Habe das auch mal Versucht ^^
Ist meine erste Programmieraufgabe, die ich löse :p

Hier die gannnnnz grobe Lösung in C++:

Code:
#include <iostream>

using namespace std;

int main()
{
    int Spieler;     int Zufall;
    
    int Summe[Spieler];
    
    for (int z = 0; z <= Spieler; z++)
    {
        Summe[z] = 0;
    }
    
    cout <<"Anzahl der Spieler angeben: \t";
    cin >> Spieler;
    
    cout <<"\nDie Berechnung folgt...\n";
    
    
    for( int y = 0; y < Spieler ; y++)
    {
         for ( int x = 0; x <= 10; x++)
         {
             cout <<"Runde "<< x <<" von Spieler " << y << endl;
             
             Zufall = (rand() % 10) + 1;
             Summe[y] = Summe[y] + Zufall;
             
             cout <<"Summe "<< Summe[y] <<" und Zufall " << Zufall << endl;
             
                         
             if( Zufall == 10 )
             {
                 cout <<"WoW, Strike!\n";
                 Zufall = (rand() % 10) + 1;
                 Summe[y] = Summe[y] + Zufall;
             }
         }
     }
     
     cout << Summe[0];
     
    int Ende;
    cin >> Ende;
    
    return 0;
}

PS: Wie gesagt, ist das grobste und da ist auch ein Fehler drin, aber ich weiß nicht wo der Fehler ist...
Es kommen immer die gleichen Ergebnisse raus und bei Summe[0] kommt 4470149 ! raus.

Wenn jemand den Fehler kennt, auf eine Antwort würde ich mich freuen :]
 
Du hast auf jeden Fall vergessen, dein Array "Summe" zu initalisieren, d.h. am Anfang alle Werte auf 0 zu setzen. Vielleicht funktioniert es dann. ;)
 
Zurück
Oben