BlueJ - Benötige Hilfe

05/28/2015 16:42 apfelkaugummi#1
Hallo Community,

ich habe zum Thema BlueJ eine Aufgabe erhalten, und zwar soll ich ein "Aquarium" programmieren. Dieses soll einen Fisch enthalten, welcher automatisiert schwimmen kann, beim Kontakt mit dem Rand soll er umdrehen.


zudem soll es eine "Pflanze" geben(einfaches langes rechteck), welche der Fisch bei Berührung "auffressen" soll, bzw einen Teil davon.

Leider bin ich aus dem Thema BlueJ fast komplett raus und weiß nicht wie ich die automatisierte Bewegung/bzw die Richtungsänderung hinbekommen soll. Ansätze habe ich (Lösung soll ohne SuM-Bibliothek erfolgen und auch keine Applet sein), jedoch scheint mein bisheriger Ansatz nicht wirklich gut zu sein.

Würde mich über Hilfe freuen! Kann, falls es gewünscht ist auch mal meine Ansätze posten, hoffe aber darauf, dass ihr diese nicht benötigt ^^

LG
05/28/2015 20:16 Zunft#2
Ich schreibe dir hier mal eine Lösungsstrategie, da es eine beschissene Arbeit ist mit SuM zu "programmieren". So lernst du auch wenigstens etwas dabei.

Allgemein:
Du solltest 3 Klassen erstellen, zum einen das Aquarium, den Fisch und die Pflanze.
In der Klasse "Fisch" speicherst du die Position des Fisches, sowie die Funktionen zum zeichnen und Bewegen. Ebenfalls sollte es eine boolean-Funktion geben, die überprüft, ob die Position des Fisches gleich der Position der Pflanze, sowie der Rand erreicht wurde.
In der Pflanze solltest du ebenfalls die Position speichern und eine Funktion, die den Fisch verschluckt

Verschlucken des Fisches:
Du fragst bei jeder Bewegung zusätzlich mit ab, ob sich der Fisch in der Pflanze befindet, sollte es der Fall sein, rufst du die Verschlucken-Funktion der Pflanze auf und die Bewegung wird weiterhin so lange weiterhin ausgeführt, wie du willst.
In der Verschlucken-Funktion setzt du deinen Stift für die Pflanze in den radiere-Modus und zeichnest das Rechteck erneut und erneut bis der Fisch verschluckt wurde.

Bewegung:
Fisch wegradieren, Fisch bspw. 10 pixel in Richtung X-Achse erneut zeichnen.
Das ganze packst du am besten in eine Endlosschleife. sobald die Koordinaten des Fisches ~ Bildschirmbreite (Musst du mal ausprobieren) ist führst du die Bewegung in -10 Pixel aus. Von Vorteil wäre es natürlich, wenn der Fisch auch gespiegelt gezeichnet wird. Sobald die Position des Fisches ~ Bildschirmbreite(0) ist, das ganze Spiel erneut.


Poste doch mal deine Ansätze, dann können wir dir auch besser weiterhelfen. Allerdings kannst du nicht erwarten, dass hier jemand das komplette Programm für dich schreibt.
05/29/2015 00:08 apfelkaugummi#3
Ich danke dir schonmal für die Antwort!

Die drei Klassen hab ich bereits.
mein Fisch(ein Polygon/Vieleck) bewegt sich auch schon von rechts nach links und stoppt am Rand.

hier der Code für die Bewegung.

Ich denke die Spiegelung bekomme ich auch noch hin...muss das alles in die oben genannte Methode autoSchwimm ?

Nächstes Problem, der Fisch soll per Zufall auf und ab schwimmen? also ich habe es schon hinbekommen eine Methode zu schreiben bei der mir eine zufällige Zahl zwischen 0und6 ausgegeben wird...nur wie wende ich diese auf den Fisch an ? bzw..so würde er ja bloß nach oben schwimmen aber nicht nach unten. Zudem müsste man alle, sagen wir mal 50 Pixel eine neue Zahl generieren lassen ? Weiß dazu jemand ne Lösung bzw den Ansatz ?

hier die Methode für die Zufallszahl

Hoffe ich habe mich einigermaßen verständlich ausgedrückt :)


EDIT: Das Spielfeld (Aquarium) ist 1000*700 groß, falls das hilft
05/29/2015 00:27 Zunft#4
Quote:
muss das alles in die oben genannte Methode autoSchwimm ?
Was meinst du?


So würde ich es machen:

Code:
public class Fisch
{
	//Variablen zum Speichern der Koordinaten
	int posx, posy;
	
	//Startposition wird an x, y übergeben, sobald neue Instanz erzeugt wird
	public Fisch(int x, int y)
	{
		posx = x;
		posy = y;
	}
	
	public void autoSchwimm()
	{
		for(int distance = 1000; distance > 0; distance--)
		{
			int rnd = random();
			bewege(1, rnd);
			posx++;
			posy = posy + rnd;
		}
	}
	
	//Zufallszahl um wie viel Einheiten gestiegen/gesunken (Ebenfalls Zufall) werden soll.
	public int random()
	{
		int rnd = Math.random()*6+1;
		boolean rndBool = Math.random() < 0.5;
		
		if(!rndBool)
			rnd = 0 - rnd;
		
		return rnd;
	}
	
	public void bewege(int bewegeX, int bewegeY)
	{
		
		//... Dein Code zum bewegen z.B.
		horizontalBewegen(bewegeX);
		vertikalBewegen(bewegeY);
		
		
	}
}
05/29/2015 02:06 apfelkaugummi#5
Quote:
Was meinst du?
Ob die Spiegelung des Fisches auch in die schleife von autoSchwimm rein muss ^^


okay an eine for schleife hab ich vorerst nicht gedacht..sieht aber bei dir ganz logisch aus ! Ich probier mal weiter daran rum...ich danke dir auf jedenfall für die Mühe...naja wobei es für dich wahrscheinlich eine sehr einfach Sache ist

lg
05/29/2015 12:00 Zunft#6
Quote:
Originally Posted by apfelkaugummi View Post
Ob die Spiegelung des Fisches auch in die schleife von autoSchwimm rein muss ^^
Genau das ja eben nicht, die Spiegelung tritt ja erst ein sobald der Rand erreicht wurde also nach der Schleife.
05/29/2015 19:33 apfelkaugummi#7
Okay klingt logisch ! ^^ zumindest hab ich die automatische Bewegung hinbekommen, mit deiner Hilfe.

Aber mal was anderes, jetzt ist es ja so das der fisch die distance 1000 zurücklegt, wie mach ich es, dass er die distance entsprechend bis zum Rand zurücklegt...

Da muss man ja die xPos abfragen die während der schleife aktualisiert wird. Und wenn die xpos dem Rand entspricht soll er umdrehen...iirgendwie steh ich aufn schlauch und komm damit nicht weiter
05/30/2015 01:16 Zunft#8
Code:
Fisch fisch = new Fisch(0, 100);
if(bildschirm.gibBreite() == fisch.posx)
{
    dreheUm();
}
Hierbei muss die Variable posx in der Klasse Fisch public sein. Das gleiche Prinzip musst du auch auf der gegenüberliegenden Seite anwenden.