Guten Tag zusammen, ich bin neu hier und hoffe das ändert sich schnell 
Warnung! Nur lesen, wenn man Zeit und Lust hat, viel zu lesen und einen Programmentwurf zu zerpflücken!
Ich möchte mich kurz vorstellen, oder besser gesagt kurz umreißen wo ich wissenstechnisch stehe, ehe ich meine Frage auf das Forum loslasse. Meine Erfahrungen mit Java sind eher theoretischer Natur durch mein Studium. Produktiv programmiert habe ich bisher im .Net-Bereich vornehmlich VB.Net und hier Anpassungen für bestehende ERP-Systeme. Darüberhinaus habe ich erste Gehversuche mit PHP und C# hinter mir.
Da ich mich in letzter Zeit wieder mehr mit Linux/Unix beschäftige, wollte ich meine Java-Kenntnisse vertiefen und habe mir mal ein recht "sportliches" Objekt zurechtgelegt um einzusteigen.
Ich bastle gerade an einem Fussballmanager und habe schon einige Klassen dafür entworfen. Ich bin aber an einem Punkt, an dem mich Fragen beschäftigen die für das weitere Vorgehen durchaus wichtig sind und da ich bisher nur in bestehenden Systemen Erweiterungen programmiert habe, fehlt mir eindeutig die Erfahrung in der Bewertung und Planung meines weiteren Vorgehens.
Kurzum ich habe drei Kernprobleme die ich gerne einem erfahrenem Publikum erörtern möchte und mich über Hilfestellung freuen würde.
1. Die Datenhaltung. Bisher habe ich vornehmlich Erfahrungen mit MSSQL, da ich aber Java programmieren möchte um plattformunabhängig zu sein und wie gesagt erst richtig einsteige, frage ich mich, sollte ich auf mySQL setzen oder alle Spiel- und Speicherstände sowie Objekte einfach in XML-Dateien flanschen? Schön ist das sicher nicht, aber ich denke die wenigsten Spiele (vor allem im Eigenbau, haben ne eigene DB-Engine am laufen oder?)
2. Ich poste mal meine Klassen bisher. Da mir das Fingerspitzengefühl etwas fehlt um die Granularität gut einschätzen zu können, wäre ein Feedback hilfreich, ob ich die Klassen noch weiter aufsplitten soll oder ob ich einzelne Elemente anders lösen sollte, Stichwort Interfaces.
3. Ich habe eine Klasse Spielfeld die über eine Länge und eine Breite verfügt, wenn ich auf dem Spielfeld mit Koordinaten arbeiten möchte, sollte ich dann einen eigenen Datentyp für Koordinate mit x- und y-Wert erstellen? So dass ich den Elementen auf dem Feld, Spieler und Ball jeweils die Position zuordnen kann, oder sollte ich dabei bleiben, jedem Element zwei int Werte x_koordinate und y_koordinate zuweisen und diese dann über die Methoden ändern?
Das würde erstmal reichen und ist denke ich auch genug. Ich bedanke mich vorab schon bei allen, die sich die Mühe machen, das alles zu lesen.
Für Anregungen, Kritik und Hilfe bin ich immer dankbar.
Es folgt der Quelltext:
Klasse Team
Klasse Spieler
Klasse Stürmer die von Spieler abgeleitet wird
Klasse Spielfeld
Desweiteren umfasst das Programm noch andere Klassen, wie Liga, Pokal und Spiel( in der die Spielmechanik) implementiert werden soll. Wie gesagt ich bin was JAVA betrifft fast blutiger Anfänger und bin um alle sachdienlichen Hinweise dankbar.
P.S. Das ganze dient für mich als Lernprojekt. Ich denke es ist in den Grundzügen wirtschaftlich genug um reale Probleme abzubilden und thematisch interessant genug um mich lange zu fesseln.
Warnung! Nur lesen, wenn man Zeit und Lust hat, viel zu lesen und einen Programmentwurf zu zerpflücken!
Ich möchte mich kurz vorstellen, oder besser gesagt kurz umreißen wo ich wissenstechnisch stehe, ehe ich meine Frage auf das Forum loslasse. Meine Erfahrungen mit Java sind eher theoretischer Natur durch mein Studium. Produktiv programmiert habe ich bisher im .Net-Bereich vornehmlich VB.Net und hier Anpassungen für bestehende ERP-Systeme. Darüberhinaus habe ich erste Gehversuche mit PHP und C# hinter mir.
Da ich mich in letzter Zeit wieder mehr mit Linux/Unix beschäftige, wollte ich meine Java-Kenntnisse vertiefen und habe mir mal ein recht "sportliches" Objekt zurechtgelegt um einzusteigen.
Ich bastle gerade an einem Fussballmanager und habe schon einige Klassen dafür entworfen. Ich bin aber an einem Punkt, an dem mich Fragen beschäftigen die für das weitere Vorgehen durchaus wichtig sind und da ich bisher nur in bestehenden Systemen Erweiterungen programmiert habe, fehlt mir eindeutig die Erfahrung in der Bewertung und Planung meines weiteren Vorgehens.
Kurzum ich habe drei Kernprobleme die ich gerne einem erfahrenem Publikum erörtern möchte und mich über Hilfestellung freuen würde.
1. Die Datenhaltung. Bisher habe ich vornehmlich Erfahrungen mit MSSQL, da ich aber Java programmieren möchte um plattformunabhängig zu sein und wie gesagt erst richtig einsteige, frage ich mich, sollte ich auf mySQL setzen oder alle Spiel- und Speicherstände sowie Objekte einfach in XML-Dateien flanschen? Schön ist das sicher nicht, aber ich denke die wenigsten Spiele (vor allem im Eigenbau, haben ne eigene DB-Engine am laufen oder?)
2. Ich poste mal meine Klassen bisher. Da mir das Fingerspitzengefühl etwas fehlt um die Granularität gut einschätzen zu können, wäre ein Feedback hilfreich, ob ich die Klassen noch weiter aufsplitten soll oder ob ich einzelne Elemente anders lösen sollte, Stichwort Interfaces.
3. Ich habe eine Klasse Spielfeld die über eine Länge und eine Breite verfügt, wenn ich auf dem Spielfeld mit Koordinaten arbeiten möchte, sollte ich dann einen eigenen Datentyp für Koordinate mit x- und y-Wert erstellen? So dass ich den Elementen auf dem Feld, Spieler und Ball jeweils die Position zuordnen kann, oder sollte ich dabei bleiben, jedem Element zwei int Werte x_koordinate und y_koordinate zuweisen und diese dann über die Methoden ändern?
Das würde erstmal reichen und ist denke ich auch genug. Ich bedanke mich vorab schon bei allen, die sich die Mühe machen, das alles zu lesen.
Für Anregungen, Kritik und Hilfe bin ich immer dankbar.
Es folgt der Quelltext:
Klasse Team
Java:
// Alles was einen Fussballclub ausmacht
// @ranking wird verwendet um die Wahrscheinlichkeit von Spielerwechseln zu einem
// bestimmten Team zu bestimmen. Messi würde sicher nicht für Freiburg spielen
// ranking wird aufsteigend von 1 bis 10 gewertet.
// @fanBase gibt die Fanbase zu Spielbeginn an, mit steigendem Ranking steigt auch die Fanbase. Je mehr Fans desto höher der Umsatz an Fanartikeln.
// @tabellenPlatz gibt die aktuelle Platzierung innerhalb der Liga an
public class Team {
private String teamName;
private double startKapital;
private int fanBase;
private int ranking;
private String country;
private int tabellenPlatz;
private int staerke;
private boolean istMeister;
private boolean istAbsteiger;
private boolean istAufsteiger;
private boolean internationalerWettbewerb;
private boolean istImPokal;
private boolean istLandesPokalsieger;
private boolean istInternationalerPokalsieger;
private boolean schulden = false;
private int punkteMeisterschaft;
private int maxKaderplaetze = 25;
private int startaufstellung = 11;
private int ersatzbank = 7;
private Spieler[] spieler;
private Liga liga;
private int form;
private boolean ballbesitz;
// Methoden zum Erstellen der Teamnamen
public Team(String name, String land, int liga, double startkapital, int ranking, int fanbase, boolean istImPokal, boolean spieltInernational, boolean istAufsteiger, boolean istMeister, boolean istAbsteiger){
this.teamName = name;
this.country = land;
this.startKapital = startkapital;
}
public void setTeamName(String nameTeam) {
this.teamName = nameTeam;
}
public String getTeamName(){
return teamName;
}
// Methoden die das Kapital des Teams festsetzen und anschließend aktualisieren
public void setStartkapital(double kapital){
if (kapital < 0){
schulden = true;
this.startKapital = kapital;
}
this.startKapital = kapital;
}
public double getStartkapital(){
return startKapital;
}
public void updateKapitalKauf(double betrag){
if(startKapital >= betrag){
this.startKapital = startKapital -betrag;
}else {
this.startKapital = startKapital - betrag;
schulden = true;
}
}
// Methoden die die Fanbase betreffen
public void setFanBase(int fanBase){
this.fanBase = fanBase;
}
public int getFanbase(){
return fanBase;
}
public void updateFanBase(int fanbaseUpdate){
// Methode zum erhöhen oder verringern der Fans.
}
// Methoden die das Ranking beeinflussen
// Methoden die die Liga sowie das Land festlegen
// Methoden zur Ermittlung der Punkte der laufenden Saison
// Methoden zur Ermittlung des Meisters und der Ab- und Aufsteiger
public void getStartaufstellung(Spieler spieler[]){
}
}
Klasse Spieler
Java:
* Spieler haben folgende Attribute
* ein String der den Vornamen und ein String der den Nachnamen bildet
* ein double der den Marktwert des Spielers darstellt, dieser Marktwert ändert sich wenn sich die Attribute des Spielers ändern
*
* Folgende Attribute haben Einfluss auf die Fähigkeiten der Spieler:
* int alter, je jünger ein Spieler ist, desto höher ist seine Entwicklungserwartung, je älter ein Spieler wird, desto mehr büßt er an Fähigkeiten ein
* int ausdauer, gibt im Wertbereich von 0 bis 90 an, wie viel Ausdauer ein Spieler hat, wobei 90 für bis zu 90 Minuten reicht.
* int geschwindigkeit gibt an, wie schnell der Spieler ist, Wertbereich von 0 bis 90
* int passgenauigkeit gibt an wie wahrscheinlich ein erfolgreicher Pass ist, 90 entspricht einer Wahrscheinlichkeit von 95%
* int groeße gibt an wie groß ein Spieler ist, größere Spieler sind etwas langsamer als kleinere Spieler, haben aber dafür grundlegend höhere Ausdauer und Kopfballstärken
* int kopfball gibt an wie hoch die wahrscheinlichkeit von gewonnen Kopfballduellen ist, 90 entspricht einer Wahrscheinlichkeit von 95%
* int gewicht, gibt das Gewicht eines Spielers an, schwere Spieler sind langsamer als leichte Spieler, haben aber erhöhte Zweikampfwerte
* int zweikampfwert gibt an, mit welcher Wahrscheinlichkeit ein Zweikampf von einem Spieler gewonnen wird 90 entspricht einer Wahrscheinlichkeit von 95%
* int dribbling gibt an, wie schnell der Spieler mit dem Ball am Fuss ist, ein wert von 90 entspricht einer Geschwindigkeit mit Ball von 85
* int reflexe gibt bei Torhütern die Fähigkeit an, auf der Linie zu halten eine Stärke von 90 entspricht einer Wahrscheinlichkeit von 75% den Ball zu halten.
* string hauptposition gibt die beste Position des Spielers an z.B. LV, IV, RV, RM, LM, DM, ZM, LA, RA, HS, MS, LIB, TW,
* string nebenposition1 gibt die Nebenposition des Spielers an analog zur Hauptposition abzüglich eines Malus von 5 bis 10% der Stärke
* string nebenposition2 gibt eine zweite Nebenposition des Spielers analog zur Hauptposition an , abzüglich eines Malus von 7 bis 15% der Stärke
* int talent gibt an, wie schnell ein Spieler neue Fertigkeiten erlernt, maximalwert ist 5, bei dem Maximalwert kann ein Spieler Fähigkeiten schneller erlangen
* boolean istFit gibt an, ob ein Spieler verletzt oder fit ist.
* int muedigkeit gibt an, wie frisch ein Spieler ist, spielt ein Spieler ein Spiel durch verliert er 5 Frischepunkte und kann durch aussetzen oder Regeneration wieder hergestellt werden
* int Gesamtstärke ist ein Koeffizient der Fähigkeiten der Spieler bezogen auf die Position:
*
* Für Stürmer wie folgt: ((Ausdauer *2) + (geschwindikeit *3) + (passgenauigkeit) + ((kopfball *2) + (muedigkeit) + (dribbling *2) + zweikampf ) / 11
* Für Mittelfeldspieler: ((Ausdauer *3) + (geschwindigkeit *2) + (passgenauigkeit *2) + kopfball + muedigkeit + (dribbling *2) + (zweikampf *2) / 13
* Für Abwehrspieler: ((Ausdauer *3) + (geschwindigkeit *2) + (passgenauigkeit *2) + (kopfball *2) + (muedigkeit) + (dribbling) + (zweikampf *2) / 13
* Für Torhüter: ((Ausdauer *3) + (reflexe *3) + (muedigkeit *2) + (zweikampf *2) / 10
*
*
*
*/
public class Spieler {
private Team team;
private String vorname;
private String nachname;
private int alter;
private double marktwert;
private int ausdauer;
private int geschwindigkeit;
private int passgenauigkeit;
private int kopfball;
private int zweikampf;
private double gehalt;
private int talent;
private int dribbling;
private int muedigkeit;
private int gesStaerke;
private String hauptposition;
private boolean istFit;
private String nebenposition1;
private String nebenposition2;
private int reflexe;
boolean hatBall;
//Methoden zum setzen der Attribute
public void setVorname(String vorname){
this.vorname = vorname;
}
public String getVorname(){
return vorname;
}
public void setNachname(String nachname){
this.nachname = nachname;
}
public String getNachname(){
return nachname;
}
public void setGeschw(int geschw){
this.geschwindigkeit = geschw;
}
public int getGeschw(){
return geschwindigkeit;
}
public void setAusdauer(int ausdauer){
this.ausdauer = ausdauer;
}
public int getAusdauer(){
return ausdauer;
}
public void updateAusdauer(int updateAusdauer){
this.ausdauer = ausdauer + updateAusdauer;
}
public void setGesamtstaerkeHP(){
if (hauptposition == "ms" | hauptposition == "la" | hauptposition == "ra" |hauptposition == "hs" ){
gesStaerke = ((ausdauer *2) + (geschwindigkeit *3) + (passgenauigkeit) + (kopfball *2) + (muedigkeit) + (dribbling *2) + zweikampf ) / 11;
}
if (hauptposition =="dm" | hauptposition == "zm" | hauptposition == "lm" | hauptposition == "rm" | hauptposition == "om"){
gesStaerke = ((ausdauer *3) + (geschwindigkeit *2) + (passgenauigkeit *2) + kopfball + muedigkeit + (dribbling *2) + (zweikampf *2)) / 13 ;
}
if (hauptposition == "iv" | hauptposition == "lv" | hauptposition== "rv" | hauptposition == "lib"){
gesStaerke = ((ausdauer *3) + (geschwindigkeit *2) + (passgenauigkeit *2) + (kopfball *2) + (muedigkeit) + (dribbling) + (zweikampf *2) )/ 13;
}
if(hauptposition == "tw"){
gesStaerke = ((ausdauer *3) + (reflexe *3) + (muedigkeit *2) + (zweikampf *2)) / 10 ;
}
}
public int getGesStaerke(){
return gesStaerke;
}
public void setMarktwert (int alter, int gesStaerke, int talent){
double bonusAlter = 1.0;
if (alter >= 16 && alter <23 ){
bonusAlter = 8.5;
}
if(alter >= 23 && alter < 26 ){
bonusAlter = 5.5;
}
if (alter >= 26 && alter < 30){
bonusAlter = 3.0;
}
if (alter >=30 ){
bonusAlter = 1.0;
}
this.marktwert = (((gesStaerke *3)+ (talent * 2)) * bonusAlter ) * 10000;
}
}
Klasse Stürmer die von Spieler abgeleitet wird
Java:
public class Stuermer extends Spieler{
private Spielfeld spielfeld;
private int aktuellePosition;
private int x_koordinate;
private int y_koordinate;
private void setStartposition(){
x_koordinate = 82;
y_koordinate = 34;
}
private int laufNachLinks(){
int Stuermergeschwindigkeit = getGeschw();
if (y_koordinate > 1 && y_koordinate < 165){
y_koordinate = y_koordinate - Stuermergeschwindigkeit;
}else{
laufNachRechts();
}
return y_koordinate;
}
private int laufNachRechts(){
int Stuermergeschwindigkeit = getGeschw();
if (y_koordinate > 1 && y_koordinate < 165){
y_koordinate = y_koordinate + Stuermergeschwindigkeit;
}else{
laufNachLinks();
}
return y_koordinate;
}
Klasse Spielfeld
Java:
public class Spielfeld {
public int laenge = 165;
public int breite = 68;
public int flaeche = breite * laenge;
}
Desweiteren umfasst das Programm noch andere Klassen, wie Liga, Pokal und Spiel( in der die Spielmechanik) implementiert werden soll. Wie gesagt ich bin was JAVA betrifft fast blutiger Anfänger und bin um alle sachdienlichen Hinweise dankbar.
P.S. Das ganze dient für mich als Lernprojekt. Ich denke es ist in den Grundzügen wirtschaftlich genug um reale Probleme abzubilden und thematisch interessant genug um mich lange zu fesseln.
Zuletzt bearbeitet von einem Moderator: