virtuelle Würmer - formelle Fehlerbeseitigung

Status
Nicht offen für weitere Antworten.

diemydarling

Mitglied
Ich programmiere noch nicht sehr lange und habe hier ein kleines Projekt für die schule. Es soll um das Thema KI gehen. Es handelt sich hierbei um virtuelle Würmer, die über ein 2D-Feld wandern und länger werden wenn sie sich über Futter bewegen.

hier ist der Quelltext mit Applet zu finden: worms

Der Quelltext funktioniert soweit, allerdings bin ich mir nicht sicher ob das formell so stimmt und ob es nicht zu unübersichtlich oder kompliziert geschrieben ist.
Wäre nett wenn mich jemand auf eventuelle Fehler aufmerksam macht oder ein paar Tips gibt.

vielen Dank diemydarling
 

javimka

Top Contributor
Ich finde, es sieht ganz gut aus. Mir fällt nur eine Kleinigkeit auf, die ich anders gemacht hätte. In deiner paint() Methode des Applets, rufst du Thread.sleep und repaint auf. Das würde ich vermeiden.

Ich hätte dazu zwei Lösungsansaätze:
1. Einen javax.swing.Timer zu verwenden, der in regelmässigen Abständen zuerst die neuen Wurm-Positionen berechned und dann neuzeichnen lässt. Allerdings habe ich gesehen, dass du sonst keine Swing Komponenten verwendet hast.

2. Den try { sleep... } aus Worms_02 komplett streichen und stattdessen in WormThread_02 vor dem sleep() das applet neuzeichnen lassen. Dazu müsste WormThread_02 eine Referenz auf Worms_02 haben und dann rufst du einfach worms_02.repaint(); auf.
 

diemydarling

Mitglied
ok danke ich werd mal versuchen das so umzusetzen. bin halt noch nich allzu lange dabei...
hast du eine Idee wie ich das Ruckeln wegbekomme, sobald es mehr würmer werden? so dass zB einfach nur die geschwindigkeit gedrosselt wird.
 

javimka

Top Contributor
gerade das Ruckeln könnte natürlich ein Artefakt deiner doppel-sleep-Strategie sein. Du könntest dein delay von 100ms etwas verkleinern, aber das wäre mehr Symptombekämpfung als Lösungsansatz.

Was du sicher machen könntest, ist zu Testen, wie viel Zeit zwischen paint-Aufrufen effektiv verstreicht. Dazu erstellst du ein neues Attribut in deine Klasse, welches speicher, wann paint das letzte Mal aufgerufen wurde. Das könnte etwa so aussehen:
Java:
public class Worms_02 extends Applet { 

 ...

 private long t0

 public void paint(Graphics g) { 
   long dt = System.nanoTime()-t0;
   System.out.println("Time elapsed: "+dt/1000000+" ms");
   t0 = System.nanoTime();

   ... // deine paint Befehle

 }

...

} // class
 

Meldanor

Bekanntes Mitglied
Ich bin mir nicht sicher, ob dies auch für Java gilt, jedoch gilt es auch für C++ :

Wenn zu zum inkrementieren ++Variable statt Variable++ verwendest, sparst du Speicher und Ressourcen:

Ich zitiere mal einen Freund von mir:

warum ist dies so? weil beim 2. beispiel zuerst die variable erhöht wird und der neue wert zurückgegeben wird -> es muss nicht erst die variable kopiert werden.
einsparungen in diesem beispiel:

* halb so viel speicher verwendet
* 1 assembler anweisung weniger

um es im code anzusehen:
A ist der accumulator, der hauptspeicher auf dem gearbeitet wird
R0 ist das 0. register

Quellcode

1
2
3
4
5
6



; i++
MOV A,R0 ; register 0 ( i ) in den acc laden
INC R0 ; den wert in R0 um eins erhöhen ( i++ )

; ++i
INC R0 ; den wert in R0 um eins erhöhen ( ++i )

Jedoch weiß ich nur, dass dies für C++ ist und dies auch nicht immer gilt, jedoch man sagen kann:
++Variable KANN IMMER besser sein als Variable++ , muss aber nicht. (Würd dennoch eher zu ++ greifen , hat sich bei mir schon eingebürgert^^)

Ansonsten hab ich eher noch eine Frage:

Du hast in Worms_02 zwei Funktionen

Java:
void stop(Thread t) { w = null;  w.interrupt();  }  void destroy(Thread t) { w = null;  w.interrupt();  }

Du übergibst den Paramater Thread t und greifst auf die Variable w zu. Jedoch setzt du w = null (Reference löschen) und willst dann w unterbrechen. Versteh ich da etwas falsch?
 

diemydarling

Mitglied
genau solche sachen wie mit der funktion stop() und destroy() meinte ich. Ich kenn mich halt zu schlecht in java aus. hast du einen vorschlag wie ich das eleganter löse?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben