Zum Inhalt springen

BlueJ "Fuchsjagd"


UnitySquuad

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.:

  1. 5 Clients am Server anmelden
  2. Steuerung eines Clients mit den Pfeiltasten (noch ohne Abfragen bezüglich ungültiger Züge)
  3. Jetzt die ungültigen Züge abfangen
  4. ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

}

}}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Monate später...

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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? :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...