| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: Bowling-Simulation im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Eine Programmieraufgabe von LordCyrix: Es ist ein Programm zu schreiben dass ein Bowlingturnier simuliert. Dabei sollen maximal 100 Spieler ...
![]() |
| | #1 (permalink) |
| Member of Honour ![]() Registriert seit: 02.10.01 ![]() Likes: 0 | Anzeige 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. |
| | |
| | #2 (permalink) |
| Registriert seit: 21.05.04 ![]() Likes: 0 | 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;
}
} 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;
}
} Code:
import java.util.Comparator;
public class PlayerComparator implements Comparator
{
public int compare(Object a, Object b)
{
return ((Player)b).getPoints() - ((Player)a).getPoints();
}
} |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| 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();
} Ü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. | |
| | |
| | #4 (permalink) | |
| Registriert seit: 21.05.04 ![]() Likes: 0 | Zitat:
| |
| | |
| | #5 (permalink) |
| 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. | |
| | |
| | #6 (permalink) |
| Registriert seit: 12.04.04 ![]() Likes: 0 | 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
}
}
} 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();
}
}
} |
| | |
| | #7 (permalink) |
| Registriert seit: 21.05.04 ![]() Likes: 0 | zovax: Seh ich das richtig das du einfach Punkte + Spielernamen in ein Stringarray packst und das dann sortieren laesst... sehr hinterlistig |
| | |
| | #8 (permalink) | |
| Registriert seit: 12.04.04 ![]() Likes: 0 | Zitat:
Wüsste auch keinen anderen Weg, wie man es in einem Strukturarray sonst sortieren könnte. Wenn jemand dazu nen Vorschlag hat, her damit.. | |
| | |
| | #9 (permalink) |
| Registriert seit: 02.10.01 ![]() Likes: 0 | Also ich hab beide Bowling-Threads mal zusammen gefügt ![]() Als ich den zweiten erstellt hab war ich wohl etwas verpeilt ![]() Norna |
| | |
| | #10 (permalink) |
| Registriert seit: 12.04.04 ![]() Likes: 0 | 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;
}
}
} |
| | |
| | #11 (permalink) |
| Senior Member Registriert seit: 27.01.02 ![]() Likes: 1 | 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. |
| | |
| | #12 (permalink) |
| Member of Honour ![]() Registriert seit: 02.10.01 ![]() Likes: 0 | Hey Norna, freut mich ja, dass du mal wieder eine Programmieraufgabe gepostet hast, aber schau mal hier: Bowling-Simulation man achte auf das Erstellungsdatum!? |
| | |
| | #13 (permalink) |
| Registriert seit: 20.07.04 ![]() Likes: 0 | 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 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 ; |
| | |
| | #14 (permalink) |
| 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? | |
| | |
| | #15 (permalink) |
| 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;
}
} | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Physik Simulation | Sven | Applikationen | 7 | 17.07.06 20:59 |