UnitySquuad Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Hallo, wir müssen in der Schule mit BlueJ ein Spiel namens Fuchsjagd programmieren. Auf Grund eines Auslandsjahres fehlen mir jedoch jegliche Grundkenntnisse im Bereich Java Programmierung mit BlueJ. Die Arbeit ist bis Ende nächster Woche fällig und wird bei Nichtabgabe "ungenügend" gewertet. Ich habe leider überhaupt keinen Durchblick, wie ich Server und Client gestallten muss. Ich habe bisher versucht einen vorhandenen TCP-Clienten auf meine Bedürfnisse abzuändern, aber serverseitig fehlt mir absolut ein Ansatz. Vielleicht wäre jemand so nett und könntem ir bei dieser Aufgabe etwas unter die Arme greifen und mir wichtige Ansätze liefern. Im Idealfall sogar eine Beispiellösung mit Grundfunktionen. Die Aufgabenstellung: Zum Schluss sollen Sie noch ein Netzwerkspiel mit dem Namen Fuchsjagd implementieren. Bei diesem Spiel müssen sich fünf Clients beim Server anmelden. Sobald der fünfte Client sich angemeldet hat, erscheinen (auf allen Clientbildschirmen gleich) fünf Punkte an zufälliger Position. Vier Punkte sind schwarz, das sind die Jäger, ein Punkt ist rot, das ist der Fuchs. Jeder dieser Punkte gehört zu einem Client, allerdings weiß kein Client am Anfang, welcher Punkt zu ihm gehört. Dies muss man erst herausfinden, indem man seinen Punkt bewegt. Dazu werden die vier Pfeiltasten benutzt. Die vier Jäger müssen nun versuchen den Fuchs zu fangen. Keiner der Punkte darf den Bildschirmrand überschreiten, entsprechende Tastendrücke sollen ignoriert werden. Sobald sich ein Jäger dem Fuchs nah genug genähert hat, also wenn die Punkte sich überschneiden, hat dieser Jäger gewonnen und das Spiel beginnt von neuem. Man kann auch eine Zeitbeschränkung einbauen, z.B. wenn der Fuchs nach zwei Minuten noch nicht gefangen wurde, hat dieser gewonnen. Ich weiß, es ist überhaupt nicht fortschrittlich, wenn ich hier um ein fertiges Programm bitte. Jedoch sehe ich momentan keine andere Möglichkeit, dass Programm sonst auf die Beine zu stellen. Vielleicht kann mir jemand ja einige Anregungen geben. Vielen Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Naja, wenn Dir jegliche Grundkenntnisse in Java fehlen, passt doch die Benotung "ungenügend" durchaus dazu. Warum solltest Du ein "sehr gut" bis "ausreichend" für Kenntnisse erhalten, die Du nicht hast. Anstatt also nach einer Lösung zu fragen (die Du hier höchstwahrscheinlich nicht bekommen wirst), solltest Du also diese Grundlagen aufholen. Für die Unterstützung bei konkreten Problemen bist Du hier dann wieder genau richtig. Also: wie ist Dein Ansatz, was hast Du noch nicht. Konkreter: Welche Klassen denkst Du, wirst Du benötigen, um das Spiel zu implementieren und was sollen die jeweils tun? Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
LadyPreis Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Auch wenn das für dich eine doofe Situation ist, dass du durch deine Abwesenheit vom Stoff hinterher bist, eine ferige Lösung kriegst du hier nicht. Später im Berufsleben wird es auch häufig genug gefragt sein, sich in möglichst kurzer Zeit in verschiedene Themen einzuarbeiten. Sieh es einfach dafür als gute Übung. Zu deinem Problem: Teil die Aufgabe doch in kleinere Stückchen und versuch dich daran. Bsp.: 5 Clients am Server anmeldenSteuerung eines Clients mit den Pfeiltasten (noch ohne Abfragen bezüglich ungültiger Züge)Jetzt die ungültigen Züge abfangen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
UnitySquuad Geschrieben 19. Januar 2010 Autor Teilen Geschrieben 19. Januar 2010 Hey, danke für die Antworten schonmal. Es ist ja nicht so, dass ich mir keine Gedanken, um dieses Thema mache. Ich habe ja bereits etwas am TCPClienten umgeschrieben, so dass man damit vllt. arbeiten kann. Ich habe, wie gesagt, relativ wenig Ahnung vom Ganzen. Was prinzipiell gemacht werden muss, ist mir schon klar. Aber an der Umsetzung hapert's ganz gewaltig. Anbei mal Auszüge aus meiner bisherigen Programmierarbeit SumAnwendung.java: /** * Die Klasse SuMAnwendung wurde automatisch erstellt: * * @author * @version 08.01.2010 */ import sum.komponenten.*; import sum.werkzeuge.*; import sum.ereignis.*; import sum.kern.*; public class SuMAnwendung extends EBAnwendung { // Objekte private Etikett hatEtikettTcpclient; private Etikett hatEtikettServer; private Etikett hatEtikettPort; private Etikett hatEtikettStatus; private Etikett hatEtikettNachricht; private Etikett hatEtikettEmpfangen; private Knopf hatKnopfVerbinden; private Knopf hatKnopfTrennen; private Knopf hatKnopfSenden; private Knopf hatKnopfBeenden; private Textfeld hatTextfeld1; private Textfeld hatTextfeld2; private Textfeld hatTextfeld3; private Zeichenbereich hatZeichenbereich1; TCPClientverbindung hatVerbindung; String lNachricht; Tastatur hatTastatur; Stift hatStift; Textwerkzeug hatTW; // Attribute /** * Konstruktor */ public SuMAnwendung() { //Initialisierung der Oberklasse super(811, 679); hatEtikettTcpclient = new Etikett(351, 86, 100, 25, "TCP-Client"); // Ausrichtung hatEtikettTcpclient.setzeAusrichtung(Ausrichtung.LINKS); hatEtikettServer = new Etikett(155, 166, 70, 25, "Server"); // Ausrichtung hatEtikettServer.setzeAusrichtung(Ausrichtung.LINKS); hatEtikettPort = new Etikett(555, 164, 46, 25, "Port"); // Ausrichtung hatEtikettPort.setzeAusrichtung(Ausrichtung.LINKS); hatEtikettStatus = new Etikett(153, 304, 388, 25, "Status"); // Ausrichtung hatEtikettStatus.setzeAusrichtung(Ausrichtung.LINKS); hatEtikettNachricht = new Etikett(149, 380, 100, 25, "Nachricht"); // Ausrichtung hatEtikettNachricht.setzeAusrichtung(Ausrichtung.LINKS); hatEtikettEmpfangen = new Etikett(145, 440, 100, 25, "Empfangen"); // Ausrichtung hatEtikettEmpfangen.setzeAusrichtung(Ausrichtung.LINKS); hatKnopfVerbinden = new Knopf(241, 232, 108, 25, "Verbinden"); hatKnopfVerbinden.setzeBearbeiterGeklickt("hatKnopfVerbindenGeklickt"); hatKnopfTrennen = new Knopf(443, 232, 100, 25, "Trennen"); hatKnopfTrennen.setzeBearbeiterGeklickt("hatKnopfTrennenGeklickt"); hatKnopfSenden = new Knopf(533, 382, 100, 25, "Senden"); hatKnopfSenden.setzeBearbeiterGeklickt("hatKnopfSendenGeklickt"); hatKnopfBeenden = new Knopf(147, 568, 100, 25, "Beenden"); hatKnopfBeenden.setzeBearbeiterGeklickt("hatKnopfBeendenGeklickt"); hatTextfeld1 = new Textfeld(253, 164, 248, 25, ""); // Ausrichtung hatTextfeld1.setzeAusrichtung(Ausrichtung.LINKS); hatTextfeld2 = new Textfeld(623, 164, 152, 25, ""); // Ausrichtung hatTextfeld2.setzeAusrichtung(Ausrichtung.LINKS); hatTextfeld3 = new Textfeld(283, 380, 168, 25, ""); // Ausrichtung hatTextfeld3.setzeAusrichtung(Ausrichtung.LINKS); hatZeichenbereich1 = new Zeichenbereich(287, 438, 372, 154, ""); lNachricht = new String(); } /** * Vorher: Ereignis GeklicktvonhatKnopfVerbinden fand statt. * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird) */ public void hatKnopfVerbindenGeklickt() { String lServeradresse; String lAntwort; int lPort; lServeradresse = hatTextfeld1.inhaltAlsText(); lPort = hatTextfeld2.inhaltAlsGanzeZahl(); hatVerbindung = new TCPClientverbindung(lServeradresse, lPort, true, hatZeichenbereich1); hatKnopfVerbinden.verstecke(); hatKnopfTrennen.zeige(); hatEtikettStatus.setzeInhalt("Verbunden :D"); } /** * Vorher: Ereignis GeklicktvonhatKnopfTrennen fand statt. * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird) */ public void hatKnopfTrennenGeklickt() { hatVerbindung.gibFrei(); hatKnopfTrennen.verstecke(); hatKnopfVerbinden.zeige(); hatKnopfSenden.verstecke(); hatEtikettStatus.setzeInhalt("nicht mehr verbunden :("); hatVerbindung = null; } /** * Vorher: Ereignis GeklicktvonhatKnopfSenden fand statt. * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird) */ public void hatKnopfSendenGeklickt() { lNachricht = hatTextfeld3.inhaltAlsText(); hatVerbindung.sende(lNachricht); } /** * Vorher: Ereignis GeklicktvonhatKnopfBeenden fand statt. * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird) */ public void hatTastaturgedrueckt() { String zV; String zH; zH = hatStift.hPosition(); zV = hatStift.vPosition(); if(hatTastatur.wurdeGedrueckt()) { switch (hatTastatur.zeichen()) { case 'w' : case 'W' : hatVerbindung.sende("@oben"+hatTW.alsText(zH)+hatTW.alsText(zV));break; case 's' : case 'S' : hatVerbindung.sende("@unten"+hatTW.alsText(zH)+hatTW.alsText(zV));break; case 'a' : case 'A' : hatVerbindung.sende("@links"+hatTW.alsText(zH)+hatTW.alsText(zV));break; case 'd' : case 'D' : hatVerbindung.sende("@rechts"+hatTW.alsText(zH)+hatTW.alsText(zV));break; } } } public void hatKnopfBeendenGeklickt() { this.gibFrei(); } } Clientverbindung.java: import sum.netz.*; import sum.komponenten.*; import sum.strukturen.*; import sum.kern.*; import sum.werkzeuge.*; /** * @author * @version */ public class TCPClientverbindung extends Clientverbindung { // Bezugsobjekte Zeichenbereich kenntZeichenbereich1; Textwerkzeug hatTW; Stift hatStift; // Attribute // Konstruktor public TCPClientverbindung(String pServer, int pPort, boolean pMitProtokoll, Zeichenbereich pEmpfangen) { super(pServer, pPort, pMitProtokoll); kenntZeichenbereich1 = pEmpfangen; } // Dienste public void bearbeiteNachricht(String pNachricht) { kenntZeichenbereich1.haengeAn(pNachricht); kenntZeichenbereich1.neuerAbsatz(); if(hatTW.istGleich(hatTW.wortAn(pNachricht,1),"@links")) { hatStift.radiere(); hatStift.hoch(); hatStift.dreheBis(0); hatStift.bewegeUm(1); hatStift.zeichneKreis(3); } if(hatTW.istGleich(hatTW.wortAn(pNachricht,1),"@rechts")) { hatStift.radiere(); hatStift.hoch(); hatStift.dreheBis(180); hatStift.bewegeUm(1); hatStift.zeichneKreis(3); } }} Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Ok, das ist ja schon mal ein Anfang. Allerdings kann da keiner von uns weiterhelfen, weil die verwendeten Klassen alle proprietär (von Dir?) geschrieben wurden und deshalb eine Schnittstelle haben, die keiner von uns kennt. Fangen wir doch mal am Anfang an: was hast Du bereits? Welche Klassen, was können die? Was an den Klassen willst Du ändern / erweitern und warum? Sind die Klassen von Dir? Wenn nein, würde ich empfehlen, dass Du bei null anfängst, weil es in meinen Augen schwieriger für einen Anfänger ist, etwas Fertiges zu ändern, als selbst auf eine Lösung zu kommen. Schließlich bringt man i.d.R nicht das entsprechende Wissen mit, sich in einer fertigen Lösung sofort zurechtzufinden. Das kostet dann meistens so viel Zeit, dass man es selbst auch geschrieben hätte. Schöne Grüße, Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
UnitySquuad Geschrieben 19. Januar 2010 Autor Teilen Geschrieben 19. Januar 2010 Naja, der Cleint hat bis auf die SumAnwendung nur die Klasse "Clientverbindung", welche ich auch hier gepostet habe. Die Klasse war in fragmenten bereits vorgegeben und musste ergänzt werden. Als TCPClient hat alles funktioniert. Ich denke, man kann den TCPClienten als SPielclient umgestalten. Würde sich evtl. auch bei meinem Wissen anbieten, da ich so nicht ganz von null anfangen muss. Ich denke, es müsste jetzt erstmal serverseitig weitergehen. Es Muss ja auch geklärt werden, in welcher Sprache Client und Server kommunizieren. Ich hab nur leider nichtmals einen Ansatz, wie ich den Server implementieren muss. Zum TCPClient gehört natürlcih auch ein TCPServer, der mir auch vorliegt. Denke nur, dass der Spielserver wesentlich aufwenidiger ist, da er Spieler bzw. ihre Koordinaten verwalten muss. Spieler zuweisen, Koordinaten vergeleichen (Spieler & Fuchs), er muss das Spiel starten, wenn 5 Clients angemeldet sind und er muss über die Abbruchbedingungen verfügen. Wie das im Quelltext aussähe? Genau das ist mein Problem.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Nein, die von Dir gepostete Klasse verwendet eine ganze Menge von Klassen aus den Packages import sum.komponenten.*; import sum.werkzeuge.*; import sum.ereignis.*; import sum.kern.*; Und diese Klassen kennen wir nicht und wissen deshalb auch nicht, was damit so alles möglich ist. Z.B. die Klassen (Interfaces) lServeradresse, lPort, TCPClientverbindung. Das sind keine Standardklassen (-interfaces), also können wir nicht wissen, welche Schnittstelle sie haben. Ich gehe aber davon aus, dass Ihr die verwenden sollt, quasi als "Framework" für die Implementierung, weil sie Euch vermutlich die Low Level Arbeit abnehmen. Das sind für mich leider zu viele Unbekannte, um qualifiziert helfen zu können. Zum Server: Ein Server lauscht auf einer bestimmten Adresse, nimmt eingehende Anfragen auf und baut eine Verbindung auf, auf der die Anfragen und Antworten ausgetauscht werden. Diese enthalten in einer Struktur Deiner Wahl (Protokoll) die Informationen über Koordinaten, Bewegungsänderungen, aktuelle Position von Spielern, usw. Ein Client gibt immer dann Bescheid, wenn er seine Position ändert, daraufhin errechnet der Server, wie sich das Spielfeld ändert und gibt die neuen Informationen an alle Clients zurück. Spezieller kann ich leider nicht helfen, weil die Ausgangslage zu schwammig ist. Schöne Grüße, Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jest3r Geschrieben 17. Mai 2010 Teilen Geschrieben 17. Mai 2010 Ich arbeite grade auch an dem Thema, die Server-Client-Verbindung steht bei mir schon nur hänge ich grade an der Tastaturbewegung String zV; String zH; zH = hatStift.hPosition(); zV = hatStift.vPosition(); if(hatTastatur.wurdeGedrueckt()) { switch (hatTastatur.zeichen()) { case 'w' : case 'W' : hatVerbindung.sende("@oben"+hatTW.alsText(zH)+hatT W.alsText(zV));break; case 's' : case 'S' : hatVerbindung.sende("@unten"+hatTW.alsText(zH)+hat TW.alsText(zV));break; case 'a' : case 'A' : hatVerbindung.sende("@links"+hatTW.alsText(zH)+hat TW.alsText(zV));break; case 'd' : case 'D' : hatVerbindung.sende("@rechts"+hatTW.alsText(zH)+ha tTW.alsText(zV));break; } } } public void hatKnopfBeendenGeklickt() { this.gibFrei(); } } wollte nach Hilfe fragen, inwieweit ich die Tastatureingaben zu lösen habe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 18. Mai 2010 Teilen Geschrieben 18. Mai 2010 Ich würde evtl für die Netzwerkkommunikation auf Remote Method Invocation ? Wikipedia setzen, denn damit musst Du kein eigenes Protokoll schreiben, sondern kannst einfach als Objekte über das Netz ansprechen. Da Du einen zentralen Server hast, stellt dieser den Dienst zur Verfügung und alle Clients können sich anmelden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jest3r Geschrieben 18. Mai 2010 Teilen Geschrieben 18. Mai 2010 wenn ich es mit RMI händeln könnte, wäre auch nicht schlecht nur hab ich in dem fall kein plan was ich machen müsste und ich wollte heute schon gern fertig werden weil ich die nächsten tage keine zeit habe, mir fehlen ja nur die tastaturbefehle, d.h wenn ich pfeilhoch drücke soll er den aktuellen kreis löschen und den nächsten dann etwas höher neu zeichnen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jest3r Geschrieben 18. Mai 2010 Teilen Geschrieben 18. Mai 2010 Ich arbeite an dem Projekt Fuchsjagd da ich die Aufgabe bekommen habe, die folgendermaßen lautet: "Modelliere mit Hilfe einer geeigneten Software eine Server-Client-Umgebung und stelle Netzwerkzusammenhänge mit Hilfe eines Simulationsprogrammes dar." Ich denke mal das das Programm mit der Server-Client funktion es doch schon einigermaßen abdeckt oder? oder hat einer ne bessere idee? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jest3r Geschrieben 18. Mai 2010 Teilen Geschrieben 18. Mai 2010 wie kann ich denn die maximale anzahl an teilnehmern festlegen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 18. Mai 2010 Teilen Geschrieben 18. Mai 2010 wie kann ich denn die maximale anzahl an teilnehmern festlegen? In dem Du das eben im Code passend programmierst Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.