Hallo zusammen, ich versuche mir momentan mit dem Buch Programmieren für Dummies Java ein wenig das Programmieren mit Java beizubringen. Momentan stoße ich jedoch auf eine Projektaufgabe im Buch bei der ich nicht weiterkomme.... Sehr wahrscheinlich habe ich da Zusammenhänge noch nicht so ganz verstanden 
Es geht darum, dass ich "Fussballspieler" erstellen soll, welche dann auf einem "Spielfeld" (Breite 50: 0 bis 49; Länge 100: 0 bis 99) verschiedene Aktionen machen sollen z.B. laufen(). Die Spieler sollen als Attribute eine positionHorizontal und eine positionVertikal haben. Folgender Code soll umstrukturiert werden:
[CODE lang="java" title="Fussballspieler"]package interaktion;
public class FussballspielerKopie
{
private int schusskraft;
private int faehigkeitAlsTorwart;
private int passGenauigkeit;
private boolean hatDenBall;
public int rueckenNummer;
private int erschoepfung;
public String spielerName;
public static int maxFaehigkeitWert = 100;
public FussballspielerKopie(int schuss, int torFaehigkeit,
int pass, boolean hatBall, int ruecken, String name)
{
schusskraft = begrenzeAttribut(schuss);
faehigkeitAlsTorwart = begrenzeAttribut(torFaehigkeit);
passGenauigkeit = begrenzeAttribut(pass);
hatDenBall = hatBall;
rueckenNummer = ruecken;
erschoepfung = 0;
spielerName = name;
}
public void laufen(int distanz)
{
erschoepfung += distanz/4;
System.out.println(String.format("%s läuft mit dem Ball %d Meter.", spielerName, distanz));
}
public boolean halteDenSchuss(int schusskraft)
{
return faehigkeitAlsTorwart > schusskraft;
}
public boolean passeDenBallZu(FussballspielerKopie empfaenger, int distanz)
{
if (!hatDenBall)
return false;
hatDenBall = false;
if (passGenauigkeit - erschoepfung > distanz)
{
empfaenger.hatDenBall = true;
System.out.println(String.format("%s spielt einen Pass über %d Meter zu %s.",
spielerName, distanz, empfaenger.spielerName));
return true;
}
System.out.println(String.format("%s spielt einen Fehlpass.", spielerName));
return false;
}
public boolean schiesseAufsTor(FussballspielerKopie torwart)
{
if (!hatDenBall)
return false;
boolean isTor = !torwart.halteDenSchuss(schusskraft-erschoepfung);
if (isTor)
{
System.out.println(
String.format("%s schießt auf das Tor von %s und trifft. Tor!",
spielerName, torwart.spielerName));
}
else
{
System.out.println(
String.format("%s schießt auf das Tor, doch %s kann den Ball halten.",
spielerName, torwart.spielerName));
}
return isTor;
}
public static int begrenzeAttribut(int wert)
{
if (wert <= maxFaehigkeitWert)
return wert;
return maxFaehigkeitWert;
}
public static void main(String[] args)
{
FussballspielerKopie tKroos =
new FussballspielerKopie(90, 2, 90, true, 18, "T. Kroos");
FussballspielerKopie aSchurrle =
new FussballspielerKopie(85, 3, 87, false, 9, "A. Schürrle");
FussballspielerKopie mGotze =
new FussballspielerKopie(90, 1, 90, false, 19, "M. Götze");
FussballspielerKopie sRomero =
new FussballspielerKopie(50, 80, 50, false, 1, "S. Romero");
tKroos.passeDenBallZu(aSchurrle, 10);
aSchurrle.laufen(35);
aSchurrle.passeDenBallZu(mGotze, 17);
mGotze.schiesseAufsTor(sRomero);
}
}[/CODE]
Nicht wundern das hier die Klasse FussballspielerKopie heißt, ich habe nur eine KopieKlasse erstellt, da mein erster Versuche nicht gut verlief....
Naja, jedenfalls soll z.B. die Methode laufen() so verändert werden, dass der Spieler zu der Position läuft die ich möchte, beispielsweise P (20, 30).
Meine Idee ist folgende....
[CODE lang="java" title="Mein veränderte Klasse"]package interaktion;
public class Fussballspieler
{
private int schusskraft;
private int faehigkeitAlsTorwart;
private int passGenauigkeit;
private boolean hatDenBall;
public int rueckenNummer;
private static int erschoepfung;
private static int positionHorizontal;
private static int positionVertikal;
public String spielerName;
public static int maxFaehigkeitWert = 100;
public static int maxPosHor = 50;
public static int maxPosVer = 100;
public Fussballspieler(int schuss, int torFaehigkeit,
int pass, boolean hatBall, int ruecken, String name, int positionH, int positionV)
{
schusskraft = begrenzeAttribut(schuss);
faehigkeitAlsTorwart = begrenzeAttribut(torFaehigkeit);
passGenauigkeit = begrenzeAttribut(pass);
hatDenBall = hatBall;
rueckenNummer = ruecken;
erschoepfung = 0;
spielerName = name;
positionHorizontal = begrenztPosHorAtt(positionH);
positionVertikal = begrenztPosVerAtt(positionV);
}
public int distanzZu (int zielX, int zielY) // ziel X, Y = Punkt zu dem Distanz berechnet werden soll.
{
int horizont = Fussballspieler.positionHorizontal - zielX;
double ergebnis = Math.pow(horizont, 2);
double Wurzel1 = Math.sqrt(ergebnis);
int WurzelInt1 = (int) Wurzel1;
int vertikal = Fussballspieler.positionVertikal - zielY;
double ergebnis2 = Math.pow(vertikal, 2);
double Wurzel2 = Math.sqrt(ergebnis2);
int WurzelInt2 = (int) Wurzel2;
int abstand = WurzelInt1 + WurzelInt2;
System.out.println(String.format("%s ist zu P(%d, %d) %d Meter entfernt.", name, zielX, zielY, abstand));
return (int) abstand;
}
public int laufen(int X, int Y)
{
int h = Fussballspieler.positionHorizontal - X;
double ergebnis3 = Math.pow(h, 2);
double Wurzel3 = Math.sqrt(ergebnis3);
int WurzelInt3 = (int) Wurzel3;
int v = Fussballspieler.positionVertikal - Y;
double ergebnis4 = Math.pow(v, 2);
double Wurzel4 = Math.sqrt(ergebnis4);
int WurzelInt4 = (int) Wurzel4;
int w = WurzelInt3 + WurzelInt4;
Fussballspieler.erschoepfung += w/4;
System.out.println(String.format("%s läuft zu P(%d, %d), %d Meter.", spielerName, X, Y, w));
Fussballspieler.positionHorizontal = X;
Fussballspieler.positionVertikal = Y;
return w;
}
public boolean halteDenSchuss(int schusskraft)
{
return faehigkeitAlsTorwart > schusskraft;
}
public boolean passeDenBallZu(Fussballspieler empfaenger, int distanz)
{
if (!hatDenBall)
return false;
hatDenBall = false;
if (passGenauigkeit - erschoepfung > distanz)
{
empfaenger.hatDenBall = true;
System.out.println(String.format("%s spielt einen Pass über %d Meter zu %s.",
spielerName, distanz, empfaenger.spielerName));
return true;
}
System.out.println(String.format("%s spielt einen Fehlpass.", spielerName));
return false;
}
public boolean schiesseAufsTor(Fussballspieler torwart)
{
if (!hatDenBall)
return false;
boolean isTor = !torwart.halteDenSchuss(schusskraft-erschoepfung);
if (isTor)
{
System.out.println(
String.format("%s schießt auf das Tor von %s und trifft. Tor!",
spielerName, torwart.spielerName));
}
else
{
System.out.println(
String.format("%s schießt auf das Tor, doch %s kann den Ball halten.",
spielerName, torwart.spielerName));
}
return isTor;
}
public static int begrenztPosHorAtt(int wert)
{
if(wert <= maxPosHor)
return wert;
return maxPosHor;
}
public static int begrenztPosVerAtt(int wert)
{
if(wert <= maxPosVer)
return wert;
return maxPosVer;
}
public static int begrenzeAttribut(int wert)
{
if (wert <= maxFaehigkeitWert)
return wert;
return maxFaehigkeitWert;
}
public static void main(String[] args)
{
Fussballspieler tKroos =
new Fussballspieler(90, 2, 90, true, 18, "T. Kroos", 33, 44);
Fussballspieler aSchurrle =
new Fussballspieler(85, 3, 87, false, 9, "A. Schürrle", 20, 22);
// Fussballspieler mGotze =
// new Fussballspieler(90, 1, 90, false, 19, "M. Götze");
// Fussballspieler mNeuer =
// new Fussballspieler(50, 80, 50, false, 1, "M. Neuer");
tKroos.laufen(34, 45);
aSchurrle.laufen(21, 23); // bei mehr Spielern treten Probleme auf....
tKroos.laufen(35, 44);
}
}[/CODE]
Bei nur einem Spieler z.B. tKroos hat meine Methode distanzZu() und laufen() funktioniert, soweit ich das beurteilen konnte.... Aber wenn ich jetzt mehrere Spieler erstelle, klappt das ganze nicht mehr. Ich glaube in der Methode laufen() wird dann mit den falschen Werten gerechnet. Meine Idee war eig, dass die Methode die Werte des erstellten Fussballspielers nimmt und damit weiterrechnet. Das klappt aber nicht so wie ich es mir vorgestellt habe.... Es soll außerdem die Position zu der gelaufen wird, als die neue Position des Spielers gespeichert werden, für zukünftige Berechnungen.
Ich hoffe ich konnte mein Anliegen halbwegs verständlich erklären und bitte um Eure Hilfe. Habt bitte etwas Nachsicht, da ich noch nicht alles so genau nachvollziehen kann
Vielen Dank schon mal im Vorraus!
Gruß
Liroyd
Es geht darum, dass ich "Fussballspieler" erstellen soll, welche dann auf einem "Spielfeld" (Breite 50: 0 bis 49; Länge 100: 0 bis 99) verschiedene Aktionen machen sollen z.B. laufen(). Die Spieler sollen als Attribute eine positionHorizontal und eine positionVertikal haben. Folgender Code soll umstrukturiert werden:
[CODE lang="java" title="Fussballspieler"]package interaktion;
public class FussballspielerKopie
{
private int schusskraft;
private int faehigkeitAlsTorwart;
private int passGenauigkeit;
private boolean hatDenBall;
public int rueckenNummer;
private int erschoepfung;
public String spielerName;
public static int maxFaehigkeitWert = 100;
public FussballspielerKopie(int schuss, int torFaehigkeit,
int pass, boolean hatBall, int ruecken, String name)
{
schusskraft = begrenzeAttribut(schuss);
faehigkeitAlsTorwart = begrenzeAttribut(torFaehigkeit);
passGenauigkeit = begrenzeAttribut(pass);
hatDenBall = hatBall;
rueckenNummer = ruecken;
erschoepfung = 0;
spielerName = name;
}
public void laufen(int distanz)
{
erschoepfung += distanz/4;
System.out.println(String.format("%s läuft mit dem Ball %d Meter.", spielerName, distanz));
}
public boolean halteDenSchuss(int schusskraft)
{
return faehigkeitAlsTorwart > schusskraft;
}
public boolean passeDenBallZu(FussballspielerKopie empfaenger, int distanz)
{
if (!hatDenBall)
return false;
hatDenBall = false;
if (passGenauigkeit - erschoepfung > distanz)
{
empfaenger.hatDenBall = true;
System.out.println(String.format("%s spielt einen Pass über %d Meter zu %s.",
spielerName, distanz, empfaenger.spielerName));
return true;
}
System.out.println(String.format("%s spielt einen Fehlpass.", spielerName));
return false;
}
public boolean schiesseAufsTor(FussballspielerKopie torwart)
{
if (!hatDenBall)
return false;
boolean isTor = !torwart.halteDenSchuss(schusskraft-erschoepfung);
if (isTor)
{
System.out.println(
String.format("%s schießt auf das Tor von %s und trifft. Tor!",
spielerName, torwart.spielerName));
}
else
{
System.out.println(
String.format("%s schießt auf das Tor, doch %s kann den Ball halten.",
spielerName, torwart.spielerName));
}
return isTor;
}
public static int begrenzeAttribut(int wert)
{
if (wert <= maxFaehigkeitWert)
return wert;
return maxFaehigkeitWert;
}
public static void main(String[] args)
{
FussballspielerKopie tKroos =
new FussballspielerKopie(90, 2, 90, true, 18, "T. Kroos");
FussballspielerKopie aSchurrle =
new FussballspielerKopie(85, 3, 87, false, 9, "A. Schürrle");
FussballspielerKopie mGotze =
new FussballspielerKopie(90, 1, 90, false, 19, "M. Götze");
FussballspielerKopie sRomero =
new FussballspielerKopie(50, 80, 50, false, 1, "S. Romero");
tKroos.passeDenBallZu(aSchurrle, 10);
aSchurrle.laufen(35);
aSchurrle.passeDenBallZu(mGotze, 17);
mGotze.schiesseAufsTor(sRomero);
}
}[/CODE]
Nicht wundern das hier die Klasse FussballspielerKopie heißt, ich habe nur eine KopieKlasse erstellt, da mein erster Versuche nicht gut verlief....
Naja, jedenfalls soll z.B. die Methode laufen() so verändert werden, dass der Spieler zu der Position läuft die ich möchte, beispielsweise P (20, 30).
Meine Idee ist folgende....
[CODE lang="java" title="Mein veränderte Klasse"]package interaktion;
public class Fussballspieler
{
private int schusskraft;
private int faehigkeitAlsTorwart;
private int passGenauigkeit;
private boolean hatDenBall;
public int rueckenNummer;
private static int erschoepfung;
private static int positionHorizontal;
private static int positionVertikal;
public String spielerName;
public static int maxFaehigkeitWert = 100;
public static int maxPosHor = 50;
public static int maxPosVer = 100;
public Fussballspieler(int schuss, int torFaehigkeit,
int pass, boolean hatBall, int ruecken, String name, int positionH, int positionV)
{
schusskraft = begrenzeAttribut(schuss);
faehigkeitAlsTorwart = begrenzeAttribut(torFaehigkeit);
passGenauigkeit = begrenzeAttribut(pass);
hatDenBall = hatBall;
rueckenNummer = ruecken;
erschoepfung = 0;
spielerName = name;
positionHorizontal = begrenztPosHorAtt(positionH);
positionVertikal = begrenztPosVerAtt(positionV);
}
public int distanzZu (int zielX, int zielY) // ziel X, Y = Punkt zu dem Distanz berechnet werden soll.
{
int horizont = Fussballspieler.positionHorizontal - zielX;
double ergebnis = Math.pow(horizont, 2);
double Wurzel1 = Math.sqrt(ergebnis);
int WurzelInt1 = (int) Wurzel1;
int vertikal = Fussballspieler.positionVertikal - zielY;
double ergebnis2 = Math.pow(vertikal, 2);
double Wurzel2 = Math.sqrt(ergebnis2);
int WurzelInt2 = (int) Wurzel2;
int abstand = WurzelInt1 + WurzelInt2;
System.out.println(String.format("%s ist zu P(%d, %d) %d Meter entfernt.", name, zielX, zielY, abstand));
return (int) abstand;
}
public int laufen(int X, int Y)
{
int h = Fussballspieler.positionHorizontal - X;
double ergebnis3 = Math.pow(h, 2);
double Wurzel3 = Math.sqrt(ergebnis3);
int WurzelInt3 = (int) Wurzel3;
int v = Fussballspieler.positionVertikal - Y;
double ergebnis4 = Math.pow(v, 2);
double Wurzel4 = Math.sqrt(ergebnis4);
int WurzelInt4 = (int) Wurzel4;
int w = WurzelInt3 + WurzelInt4;
Fussballspieler.erschoepfung += w/4;
System.out.println(String.format("%s läuft zu P(%d, %d), %d Meter.", spielerName, X, Y, w));
Fussballspieler.positionHorizontal = X;
Fussballspieler.positionVertikal = Y;
return w;
}
public boolean halteDenSchuss(int schusskraft)
{
return faehigkeitAlsTorwart > schusskraft;
}
public boolean passeDenBallZu(Fussballspieler empfaenger, int distanz)
{
if (!hatDenBall)
return false;
hatDenBall = false;
if (passGenauigkeit - erschoepfung > distanz)
{
empfaenger.hatDenBall = true;
System.out.println(String.format("%s spielt einen Pass über %d Meter zu %s.",
spielerName, distanz, empfaenger.spielerName));
return true;
}
System.out.println(String.format("%s spielt einen Fehlpass.", spielerName));
return false;
}
public boolean schiesseAufsTor(Fussballspieler torwart)
{
if (!hatDenBall)
return false;
boolean isTor = !torwart.halteDenSchuss(schusskraft-erschoepfung);
if (isTor)
{
System.out.println(
String.format("%s schießt auf das Tor von %s und trifft. Tor!",
spielerName, torwart.spielerName));
}
else
{
System.out.println(
String.format("%s schießt auf das Tor, doch %s kann den Ball halten.",
spielerName, torwart.spielerName));
}
return isTor;
}
public static int begrenztPosHorAtt(int wert)
{
if(wert <= maxPosHor)
return wert;
return maxPosHor;
}
public static int begrenztPosVerAtt(int wert)
{
if(wert <= maxPosVer)
return wert;
return maxPosVer;
}
public static int begrenzeAttribut(int wert)
{
if (wert <= maxFaehigkeitWert)
return wert;
return maxFaehigkeitWert;
}
public static void main(String[] args)
{
Fussballspieler tKroos =
new Fussballspieler(90, 2, 90, true, 18, "T. Kroos", 33, 44);
Fussballspieler aSchurrle =
new Fussballspieler(85, 3, 87, false, 9, "A. Schürrle", 20, 22);
// Fussballspieler mGotze =
// new Fussballspieler(90, 1, 90, false, 19, "M. Götze");
// Fussballspieler mNeuer =
// new Fussballspieler(50, 80, 50, false, 1, "M. Neuer");
tKroos.laufen(34, 45);
aSchurrle.laufen(21, 23); // bei mehr Spielern treten Probleme auf....
tKroos.laufen(35, 44);
}
}[/CODE]
Bei nur einem Spieler z.B. tKroos hat meine Methode distanzZu() und laufen() funktioniert, soweit ich das beurteilen konnte.... Aber wenn ich jetzt mehrere Spieler erstelle, klappt das ganze nicht mehr. Ich glaube in der Methode laufen() wird dann mit den falschen Werten gerechnet. Meine Idee war eig, dass die Methode die Werte des erstellten Fussballspielers nimmt und damit weiterrechnet. Das klappt aber nicht so wie ich es mir vorgestellt habe.... Es soll außerdem die Position zu der gelaufen wird, als die neue Position des Spielers gespeichert werden, für zukünftige Berechnungen.
Ich hoffe ich konnte mein Anliegen halbwegs verständlich erklären und bitte um Eure Hilfe. Habt bitte etwas Nachsicht, da ich noch nicht alles so genau nachvollziehen kann
Vielen Dank schon mal im Vorraus!
Gruß
Liroyd