Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
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.

Bowling-Simulation

Diskussion: Bowling-Simulation im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Da ich ja auch schon die Aufgabe mit den Tagen gelöst habe, wollte ich gleich noch eine Lösen. Macht ...

Antwort
Alt 10.12.05, 20:29   #16 (permalink)
 
Registriert seit: 01.12.03
Tybalt0125 Leistung: Facit NTK
Likes: 0
Standard

Anzeige

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;
}
Tybalt0125 ist offline   Mit Zitat antworten
Alt 03.01.06, 16:00   #17 (permalink)
 
Registriert seit: 08.11.05
Manuel Leistung: Facit NTK
Manuel eine Nachricht über ICQ schicken
Likes: 0
Standard 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
Manuel ist offline   Mit Zitat antworten
Alt 21.05.07, 00:34   #18 (permalink)
 
Registriert seit: 12.01.07
Ivan Dolvich Leistung: Facit NTK
Likes: 0
Standard RE: Bowling-Simulation

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 }
Ivan Dolvich ist offline   Mit Zitat antworten
Alt 21.04.08, 16:14   #19 (permalink)
 
Registriert seit: 31.01.08
nhBps Leistung: Facit NTK
Likes: 0
Standard

Habe das auch mal Versucht ^^
Ist meine erste Programmieraufgabe, die ich löse

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

Bowling-Simulation   
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 :]
nhBps ist offline   Mit Zitat antworten
Alt 21.04.08, 17:16   #20 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

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.
Eydeet ist offline   Mit Zitat antworten
Alt 21.04.08, 17:55   #21 (permalink)
 
Registriert seit: 31.01.08
nhBps Leistung: Facit NTK
Likes: 0
Standard

jup, hab vergessen zu initialisieren
THX für die Hilfe
nhBps ist offline   Mit Zitat antworten
Alt 21.05.08, 02:55   #22 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

Hallo!

Meine Java Lösung

BowlingMain.java
Code:
public class BowlingMain {

	public static void main(String[] args) {
		System.out.println("*** Bowling-Turnier ***\n");
		System.out.print("Wie viele Spieler spielen mit? ");
		
		Tourney tourney = new Tourney(Integer.parseInt(readValue()));
		
		for(int i=0; i<tourney.getPlayerCount(); i++) {
			System.out.print("Name von Spieler "+ (i+1) +": ");
			tourney.initPlayer(i, readValue());
		}
		tourney.startTourney();
		System.out.println("\nErgebnisse:\n"+ tourney.getResults());
	}
	
	public static String readValue() {
		try { return new BufferedReader(new InputStreamReader(System.in)).readLine(); }
		catch(IOException ex) { return "-1"; }
	}

}
Tourney.java
Code:
public class Tourney {

	private Player[] players = null;
	private int playerCount = 0;
	
	public Tourney(int playerCount) {
		this.players = new Player[playerCount];
		this.playerCount = playerCount;
	}
	
	public int getPlayerCount() {
		return playerCount;
	}
	
	public void initPlayer(int idx, String name) {
		players[idx] = new Player(name);
	}
	
	public void startTourney() {
		for(int i=0; i<players.length; i++)
			players[i].playTourney();
	}
	
	public String getResults() {
		String results = "";
		for(int i=0; i<players.length; i++)
			results += players[i].getPlayerResult() +"\n";
		return results.substring(0, results.length()-2);
	}
	
}
Player.java
Code:
public class Player {

	static Random random = new Random();
	
	private String name;
	private int pointsResult;
	private int[] pointsRounds;
	
	public Player(String name) { 
		this.name = name;
		this.pointsResult = 0;
		this.pointsRounds = new int[20];
	}
	
	public void playTourney() {
		int rounds = 10;
		for(int i=0; i<rounds; i++) {
			int hits = Player.random.nextInt(10) + 1;
			
			if(hits == 10)
				rounds++;
			pointsResult += hits;
			pointsRounds[i] = hits;
		}
	}
	
	public String getPlayerResult() {
		String player = "*** "+ name +" ***\n";
		
		for(int i=0; i<pointsRounds.length; i++)
			if(pointsRounds[i] > 0)
				player += (i+1) +") Runde: "+ ((pointsRounds[i] == 10) ? "STRIKE " : pointsRounds[i]) +"\n";
		player += "Ergebnis: "+ pointsResult;
		
		return player + "\n";
	}
	
}
Gruß
Felix
Ook! ist offline   Mit Zitat antworten
Alt 24.01.11, 08:45   #23 (permalink)
 
Registriert seit: 10.11.10
DMRMcK Leistung: Z3
Likes: 0
Standard als Konsolenanwendgund in VB.NET 2005

VB   
Code:
Imports System.Console
 
Module Module1
    Public spielerAnz As Integer = 0
    Public namen As String(,)
    Public wurf As Integer = 0
    Public ergebnis As Integer = 0
 
 
    Sub Main()
        Randomize()
        Do Until spielerAnz > 0 And spielerAnz <= 100
            Write("Spieleranzahl: ")
            spielerAnz = ReadLine()
        Loop
        WriteLine()
        ReDim namen(1, spielerAnz - 1)
        For x As Integer = 0 To spielerAnz - 1
            Write("Namen für Spieler " & x + 1 & " eingeben: ")
            namen(0, x) = ReadLine()
        Next
 
        WriteLine()
 
        For x As Integer = 0 To spielerAnz - 1
            For y As Integer = 0 To 9
                wurf = CInt(Int((10 * Rnd()) + 1))
                ergebnis += wurf
                If wurf = 10 Then
                    wurf = CInt(Int((10 * Rnd()) + 1))
                    ergebnis += wurf
                End If
            Next
            namen(1, x) = ergebnis.ToString
            ergebnis = 0
        Next
 
        Sortieren(namen)
 
        For x As Integer = 0 To spielerAnz - 1
            WriteLine(namen(0, x).ToString & " hat " & namen(1, x).ToString & " Punkte erspielt.")
        Next
        ReadLine()
    End Sub
 
    Public Sub Sortieren(ByRef arr As Array)
        Dim getauscht As Boolean
        Do
            getauscht = False
            For x As Integer = 0 To spielerAnz - 2
                If arr(1, x) < arr(1, x + 1) Then
                    Dim name, wert As String
                    name = arr(0, x)
                    wert = arr(1, x)
                    arr(0, x) = arr(0, x + 1)
                    arr(1, x) = arr(1, x + 1)
                    arr(0, x + 1) = name
                    arr(1, x + 1) = wert
                    getauscht = True
                End If
            Next
        Loop While getauscht = True
    End Sub
 
End Module


sollte natürlich "Konsolenanwendung" heißen in der Überschrift
Angehängte Dateien
Dateityp: zip BowlingSim.zip (5,0 KB, 1x aufgerufen)

Geändert von DMRMcK (31.01.11 um 15:32 Uhr)
DMRMcK ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Bowling-Simulation
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Physik Simulation Sven Applikationen 7 17.07.06 20:59


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61