Problem mit Java

Deine Programmlogik ist mir absolut rätselhaft... Benutz einen Debugger und schau, ob sich dein Programm so verhält wie du erwartest. Wenn du nicht besser kommentierst, kannst ud von niemandem erwarten, dass er deine Gedanken nachvollziehen kann.
 
Ich frage mich, wie du so die Kollision bestimmen willst. Sind folgende Aussagen korrekt?
1. "collisionX[]" ist ein int-Array.
2. "pen.vPosition()" gibt den Integer der momentanen x-Koordinate des Schlangenkopfes an.
3. "kollisionX" erfüllt keinen Zweck und ist Überbleibsel eines vorherigen Versuches.
4. Du hast keine Ahnung von Arreys, da du den Index nicht sinnvoll numerierst, sondern stattdessen den X-Wert der Schlange hernimmst.
5. Du hast einen GameOver, sobald dein Schlangenkopf zum zweiten mal auf eine Koordinate kommt.

Ach ja und versuche bitte das nächste mal, deinen Quellcode zu kürzen und den Fehler selbst einzugrenzen. Keiner hat Lust sich durch Wülste von Quelltext zu lesen.

PS:
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung!
 
Hab zwar auch noch nicht ganz geschnallt was er will ... aber ich hab zumindest soweit verstanden, dass er mit seinen beiden Arrays eine zweidimensionale Fläche aufspannen will, worin er jeden Punkt markiert wo er mit dem Schlagenkopf schon war. Dabei ist es zwar problematisch, dass diese "pen"-Funktionen double-Werte liefern da Arraygrößen ganzzahlig sind, aber da er seinen "pen" auch immer nur um ganze Einheiten bewegt, dürften Nachkommastellen kein Problem sein.

zu Royal_Flushs Fragen:
1) nein, es ist ein double-Array ... wenn meine Vermutung zur Funktionsweise oben richtig ist, würde ich persönlich einfach ein boolean-Array nehmen, weil das leichter zu handhaben ist
2) nein, die Funktion liefert einen double-Wert ... da er aber bei 400/400 startet und sich immer um 1 Einheit bewegt, dürfte es eh keine Nachkommastellen geben
3) in diese Variable speichert er die aktuelle Koordinate, welche er nach Integer castet und dann zur Auswahl des passenden Array-Elements nutzt
4) ob er Ahnung hat kann ich nicht beurteilen ... aber das mit dem X-Wert kann durchaus beabsichtigt sein
5) so soll es glaube funktionieren ... eben wie "Snake"

für eine nähere Betrachtung fehlt mir die Zeit (muss arbeiten), aber hier sind ja doch genug andere Leute
 
1) nein, es ist ein double-Array ... wenn meine Vermutung zur Funktionsweise oben richtig ist, würde ich persönlich einfach ein boolean-Array nehmen, weil das leichter zu handhaben ist
2) nein, die Funktion liefert einen double-Wert ... da er aber bei 400/400 startet und sich immer um 1 Einheit bewegt, dürfte es eh keine Nachkommastellen geben
Ja, komm. double, int, float. Zahl ist Zahl, wenns ums Grundprinzip geht. Aber du hast natürlich trotzdem recht ;)
5) so soll es glaube funktionieren ... eben wie "Snake"
Ja schon, aber die Schlange bewegt sich ja. Also kann der Kopf auch 50 mal über den selben Punkt fahren, solange sich der Körper bis dahin schon von dort entfernt hat.
 
Ich hab jetzt ein weiteres Problem. Nicht zu nem bestimmten Code sondern zun ner Vorgehensweise:

Wie muss man den vorgehen wenn man festellen will ob ein Objekt mit dem anderen kollidiert(2 dimensionale Objekte) oder ob der Mauszeiger einen bestimmten Bereich auf dem Bildschirm erreicht?
 
Um herauszufinden, ob zwei (rechteckige) Objekte kollidieren, musst du prüfen, ob sich dessen Ränder schneiden:
Code:
Rechteck r1;
Rechteck r2;
if (r1.Unten>r2.Oben && r1.Rechts>r2.Links && r1.Links<r2.Rechts && r1.Oben<r2.Unten)
{/*Kollission*/}
(Der Koordinatenursprung ist links oben)

Mit dem Mauszeiger kannst du genauso vorgehen. Vorrausgesetzt du weisst, wie man seine Position abfrägt.
 
  • Like
Reaktionen: EraZeR
Hi danke erstaml. Ich werd mal gucken was ich damit machen kann:)

Jetzt hab ich allerdings ein anderes Problem. Wir benutzen im Unterricht das Programm BlueJ um unsere Programme zu erstellen. Nur bei mir am Rechner kommt es vor das sich Fenster gerne mal schwarz färben oder schwarze Streifen bekommen. Weiß jemmand woran das liegen könnte?
 

Anhänge

  • problem.png
    problem.png
    81,8 KB · Aufrufe: 124
  • problem2.png
    problem2.png
    19,8 KB · Aufrufe: 126
Nee ich hat gestern noch einwandfrei funktioniert. Da das Programm in Java geschrieben ist glaube ich dass irgendwie am JDK liegt. Ich hab aber beides schon mehrfach neuinstalliert hat aber nicht geholfen. Ich hab auch mal die Priorität das Java.exe und des Javaw.exe Prozesses geändert hat aber nichts gebracht:?

EDIT: Das wird ja immer lustige jetzt beginnt das Programm auch noch meinen Code zu verändern -.-
 
Zuletzt bearbeitet:
Sorry für den Doppelpost aber ich hab ein Problem mit abstrakten Klassen.
Ich habe vor zwei Klassen zu schreiben. Die erste sieht so aus:

Code:
import sum.kern.*;
/**
 * @author ErazeR
 * @version 24.02.11
 */
public abstract class Figur
{
    // Bezugsobjekte
    Stift pen;
    // Attribute
    int zX, zY;
    // Konstruktor
    public Figur(int pX, int pY)
    {
        pen = new Stift();
        zX = pX;
        zY = pY;
    }

    // Dienste
    public abstract void move();
    
    public abstract void draw();
    
    public abstract void delete();
}

Von dieser Klasse möchte ich nun eine zweite Klasse ableiten mit der man einen Kreis zeichnen und bewegen kann. Diese sieht so aus:

Code:
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class Ball extends Figur
{
    // Bezugsobjekte
    
    // Attribute
    
    // Konstruktor
    public Ball()
    {
          super();
    }

    // Dienste
    public void delete()
    {
        pen.radiere(); //Setzt das Objekt pen in radier-Modus
        pen.zeichneKreis(4); //Zeichnet(bzw. radiert) an der aktuellen Position einen Kreis
    }
    
    public void draw()
    {
        pen.bewegeBis(zX, zY); //Das Objekt pen(Stift) zeichnet einen Kreis an der Position zX, zY
        pen.normal(); //Setzt das Objekt pen(Stift) in den normalen Modus
        pen.zeichneKreis(4); //Das Objekt pen zeichnet an der aktuellen Position einen Kreis
    }
    
    public void move()
    {
        this.delete(); //Ruft die Methode delete auf
        pen.bewegeUm(1); // bewegten das Objekt pen um 1 in der aktuellen Richtung
        this.draw();
    }
}

Was ich mich jetzt Frage ob man in der Oberklasse irgendwie den Konstruktor benutzen kann und ihn auch in der Unterklasse aufrufen so wie ich es bei mir gemacht habe den bis jetzt bekomm ich eine Fehlermeldung wenn ich meine Klasse Ball compiliere.

Code:
cannot find symbol - constructor Figur()
 
Das dürfte eigentlich so schon funktionieren wie du das umgesetzt hast ... die Antwort darauf warum dein "Ball" die "Figur" nicht finden kann hängt von der Struktur deines Projektes ab. Ich würd dir empfehlen für diese Klassen ein package zu definieren und sowohl "Figur" als auch "Ball" da rein zu packen - dann dürfte es eigentlich keine Probleme mit dem gegenseitigen Finden geben.
 
  • Like
Reaktionen: EraZeR
Ich glaube nicht das es von der Struktur meines Projektes abhängt da ich keine Probleme habe wenn ich den Konstruktor der Klasse Figur leer lasse. Wenn ich jedoch Parameter übergebe und in der Unterklasse super(); aufrufe kommt dieser Fehler. Falls die Klasse Ball also nicht weiß wo sie nach der Klasse Figur suchen soll müßte dieser Fehler doch auch ohne Parameter im Konstruktor auftauchen.

EDIT: Ich glaube inzwischen, dass es an der Entwicklungsumgebung BlueJ liegt die wir benutzen, den dieses Problem tritt bei uns im kurs immer auf wenn jemmand Vererbung benutzt:?
 
Jo ich hab mir jetzt Eclipse für Java besorgt. Allerdings wüßte ich jetzt gerne wie man Programme ausführt. Die Bibliotheken die wir für den Unterricht benutzen hab ich schon importiert.
 
Such dir im Package Explorer deine Klasse, die die main-Methode enthält. Dann entweder einfach anklicken und aufs Run-Symbol in der Toolbar klicken oder alternativ einen Rechtsklick drauf machen, "Run As" aufklappen und "Java Application" auswählen. Das Navigieren zur Klasse musst du übrigens nur einmal machen - da dabei gleich eine "Run Configuration" angelegt wird, welche du ab diesem Zeitpunkt immer oben über das Run-Symbol in der Toolbar aufrufen kannst.
 
  • Like
Reaktionen: EraZeR
Also für "normal" Programme funktioniert das, allerdings haben die Programme die wir im Unterricht schreiben haben "keine" main-methode zumindest hab ich nie eine gesehen wahrscheinlich nimmt BlueJ einem die Arbeit ab oder kann man auch eine Klasse so compilieren?
 
hmm, Programm starten ohne "main"? dieses BlueJ muss ne komische IDE sein

wenn du nur mal deine Klassen kompilieren willst, dann geh im Menü auf "Project" und dann "Build Project" gehen (musst möglicherweise vorher den Hacken bei "Build Automatically" entfernen)
 
BlueJ ist eine speziell für den Unterricht entwickelte Entwicklerumgebung mit extremer Objektorientierung. In ihr siehst du in einem Fenster alle erstellten Klassen als Rechtecke und tippst deine Befehle zu Laufzeit ein. Optional musst du eine Klasse erstellen, die sozusagen deine main-Funktion ersetzt.

E: Sieht dann etwa so aus.
 
Jop das ist es:-D. Wir benutzen im Unterricht aber noch spezielle Klassen(Stifte und Mäuse) die uns einen "Stift" usw. zu Verfügung stellen und die Methoden und Objekte sind alle in Deutsch.(Klick)
 
Zuletzt bearbeitet:
Entschuldigt bitte den Doppelpost aber ich habe wieder ein Problem. Ich habe von meinem Informatiklehrer die Aufgabe bekommen ein Programm zu schreiben, dass von einer beliebigen Zahl die Fakultät oder die Fibonaccizahl berechnen kann. Mein Code sieht bis jetzt so aus:

Code:
public long fib(long n) {
    if(n == 1) {
      return (0);
    }else {
      return (n - 1 + fib(n-1));
    }
  }
  
  public long fakultaet(long n) {
    if (n <= 1) {
      return (1);
    }else {
      return (n * fakultaet(n - 1));
    }
  }

Allerdings ist bei 39! Schluss, da Long "nur" 64 Bits groß ist. Nun hat uns unsere Lehrer gesagt wir sollen mit Hilfe unseres Buches den Datentyp BigInteger benutzen. Nur leider erklärt unser tolles Buch kein Stück diesen Typ sondern wirft diesen einfach in den Raum. Bis jetzt konnte ich die Methoden soweit umschreiben:
Code:
public BigInteger fib(long n) {
    if(n == 1) {
      return new BigInteger(0);
    }else {
      return new BigInteger(n - 1 + fib(n-1));
    }
  }
  
  public BigInteger fakultaet(long n) {
    if (n <= 1) {
      return new BigInteger(1);
    }else {
      return new BigInteger(n * fakultaet(n - 1));
    }
  }

Dabei bekomme ich folgende Fehlermeldungen:
Code:
Rekursion.java:92:14: BigInteger(long) has private access in java.math.BigInteger
      return new BigInteger(0);
             ^
Rekursion.java:94:35: operator + cannot be applied to long,java.math.BigInteger
      return new BigInteger(n - 1 + fib(n-1));
                                  ^
Rekursion.java:100:14: BigInteger(long) has private access in java.math.BigInteger
      return new BigInteger(1);
             ^
Rekursion.java:102:31: operator * cannot be applied to long,java.math.BigInteger
      return new BigInteger(n * fakultaet(n - 1));
                              ^

Unser Buch hat nicht erklärt, dass man BigInteger nicht wie zb. Integer benutzen kann. Ich bin jetzt total verwirrt:?.