Snake-BlueJ Bewegung

Thommi

Mitglied
Hi
Ich versuch schon seit einiger zeit ein Snake-Spiel zu programmieren, bin allerdings ein ziemlicher Anfänger und hab da so meine Probleme mit der Bewegung der Schlange;#

Vorneweg noch: das ganze ist mit BlueJ programmiert, einer vereinfachten Programmierumgebung für Schüler falls das wichtig ist.

Ich hab mir gedacht dass es am einfachsten wäre, wenn ich jedes Segment der Schlange einfach auf den Platz des Vorgängers aufrutschen lasse, und so eigentlich immer nur dem vordersten teil der Schlange koordinaten gegeben werden müssen, der Rest "rutscht" ja nach :)
Am besten poste ich einfach mal meine 3 Hauptklassen:

Java:
import java.util.Random;

public class SPIEL implements ITuWas, ITastatur
{   
    private Rechteck Spielfeld;
    private KÖRPER Körper;
    private Taste Pause;
    private Taste Wiederaufnahme;
    private Taste Neustart;
    private Taktgeber takt,takt1,takt2,takt3;
    private int Level;
    private int z;
    private int a,b;
    Bild r;
    SEGMENT ort = new SEGMENT();
    Tastatur t;
    
    public SPIEL()
    {
        Zeichnung.setzeFenstergroesse(1200,1200);
        r = new Bild(300,1, 400, 400 , "snake2.jpg"); 
        r = new Bild(20, 250, 400, 400 , "snake.jpg"); 
        Spielfeld = new Rechteck (300,250,600,600);
        Körper = new KÖRPER();
        a=190;
        b=210;
        
        Level= 400;
        
        takt = new Taktgeber();
        definiereTakt(takt,10);
        takt1 = new Taktgeber();
        definiereTakt(takt1,20);
        takt2 = new Taktgeber();
        definiereTakt(takt2,30);
        takt3 = new Taktgeber();
        definiereTakt(takt3,40);
        
        t= new Tastatur();
        t.setzeLink(this);
        t.meldeAnTaste('w', "up");
        t.meldeAnTaste('a', "left");
        t.meldeAnTaste('s', "down");
        t.meldeAnTaste('d', "right");
        t.meldeAnTaste('+', "lvlup");
        t.meldeAnTaste('-', "lvldown");
        
        StartSchlange();
        z=0;
        
        Pause = new Taste ("Pause", 1000, 400, 150,50);
        Pause.setzeLink(this);
        Pause.setzeID(1000);

        
        Neustart = new Taste ("Neustart", 1000, 500, 150,50);
        Neustart.setzeLink(this);
        Neustart.setzeID(50);
        
        Wiederaufnahme = new Taste ("Fortfahren", 1000, 600, 150,50);
        Wiederaufnahme.setzeLink(this);
        Wiederaufnahme.setzeID(90);
        
         
    }
    
     private void definiereTakt(Taktgeber t, int id)
    {
        t.setzteZeitZwischenAktionen(Level);
        t.setzeLink(this);
        t.setzeID(id);
    }
    
    public void tastenAktion(String r)
       {
        if(r.equals("up"))
        {
           Up();
           z=1;
        }
        if(r.equals("down"))
        {
            Down();
            z=2;
        }
        if(r.equals("left"))
        {
            Left();
            z=3;
        }
        if(r.equals("right"))
        {
            Right();
            z=4;
        }
        if(r.equals("lvlup"))
        {
            if(Level>100)
            {
                Level=Level-100;
            }
        }
        if(r.equals("lvldown"))
        {
            if(Level<1000)
            {
                Level=Level+100;
            }
        }
       }
    
    public void tuWas(int ID)
    {
        if(ID == 10) 
        {
            ticke();
        }
        else if(ID == 20) 
        {
           ticke1();
        }
        else if(ID == 30)
        {
            ticke2();
        }
        else if(ID == 40)
        {
            ticke3();
        }
        else if(ID == 1000)
        {
            Stoppe();
        }
        else if(ID == 50)
        {
            //Neustart();
        }
        else if(ID == 60)
        {
            //SchnickSchnackMethode();
        }
        else if(ID == 70)
        {
           //SchnickSchnackMethode();
        }
        else if(ID == 80)
        {
            //SchnickSchnackMethode();
        }
        else if(ID == 90)
        {
            //Fortfahren();
        }
    }
    
         private void ticke()
       {
         Körper.bewegeO();
         z=1;
       }
       private void ticke1()
       {
         Körper.bewegeU();
         z=2;
       }
       private void ticke2()
       {
         Körper.bewegeL();
         z=3;
       }
       private void ticke3()
       {
         Körper.bewegeR();
         z=4;
       }
    
    public void Up ()
    {
        if(z==1 || z==2 )
       {
       }
        else
       {
            takt1.stop();
            takt2.stop();
            takt3.stop();
            takt.endlos();
       }
    }
    public void Down ()
    {
        if(z==2 || z==1)
       {
       }
        else
      {
            takt.stop();
            takt2.stop();
            takt3.stop();
            takt1.endlos();
       }
    }
    public void Left ()
    {
        
        if(z==3 || z==4)
        {
        }
        else
       {
        takt1.stop();
        takt3.stop();
        takt.stop();
        takt2.endlos();
       }
    }
    
    public void Right ()
    {
       if(z==4 || z==3)
        {
        }
       else
       {takt1.stop();
        takt2.stop();
        takt.stop();
        takt3.endlos();
       }
    }
    
    public void StartSchlange()
    {
        
          for(int i=0; i<5; i++)
         {
             SEGMENT n = new SEGMENT(500-i*10,500,Körper);
             Körper.fuegeSegmentHinzu(n);
        }
    }
    
    public void Wachse ()
    {
            SEGMENT n = new SEGMENT(a,b,Körper);
            Körper.fuegeSegmentHinzu(n);
     }
    
    public void Stoppe()
    {
            takt.stop();
            takt1.stop();
            takt2.stop();
            takt3.stop();
    }
     

}

Das ist so ziemlich die Hauptklasse, in dem ich dem ersten Element die Bewegung zu Weise, hier gibt es eigentlich noch keine Probleme;

Java:
public class KÖRPER
{
    public SEGMENT[] s;
    private int anzahl;
    
    
    public KÖRPER ()
    {
        anzahl = 0;
        s = new SEGMENT[1000];
    
    }
    
    public void fuegeSegmentHinzu (SEGMENT elementNeu)
    {
        if (anzahl < 1000)
        {
         s[anzahl] = elementNeu;
         anzahl = anzahl + 1;
        }
    }
    
    public void bewegeO()
    {
        s[0].bewegeOben();
        //for(int i=0;i<anzahl;i++)
        //{
        //    s[i+1].Krieche(i*2,1+i*2,i+1);
        //}
       s[1].Krieche(0,1,1);
    }
    
    public void bewegeU( )
    {
        s[0].bewegeUnten();
        for(int i=0;i<anzahl;i++)
        {
            s[i+1].Krieche(i*2,1+i*2,i+1);
        }
    }
    
    public void bewegeL( )
    {
        s[0].bewegeLinks();
        for(int i=0;i<anzahl;i++)
        {
            s[i+1].Krieche(i*2,1+i*2,i+1);
        }
    }
    
    public void bewegeR( )
    {
        s[0].bewegeRechts();
        for(int i=0;i<anzahl;i++)
        {
            s[i+1].Krieche(i*2,1+i*2,i+1);
        }
    }
    }

Java:
import java.util.Random;
public class SEGMENT 
{
    private Quadrat q;
    private int x;
    private int y;
    private int[] ort;
    //anzahl der koordinaten
    int b;

      
    public SEGMENT()
    {
        ort=new int[100000];
    
    }
   
    public SEGMENT(int xStart, int yStart, KÖRPER r)
    {
        x= xStart;
        y= yStart;
        q=new Quadrat(x, y, 10);
        
        b=0;
      
    }
    
    public void bewegeOben( )
    {
         
        if(x<600 && y<600 && x>-1 && y>-1) 
        {
         y = y - 10 ;
         q.setzePosition((int)x, (int)y);
            ort[0]=x;
          ort[1]=y+10;
         
        }
    }   
    public void bewegeUnten( )
    {
         if(x<600 && y<600 && x>-1 && y>-1) 
        {
         y = y +10  ;
         q.setzePosition((int)x, (int)y);
          ort[0]=x;
          ort[1]=y-10;
       }
      
    }   
    public void bewegeLinks( )
    {
         if(x<600 && y<600 && x>-1 && y>-1) 
       {
        x = x - 10 ;
        q.setzePosition((int)x, (int)y);
         ort[0]=x+10;
          ort[1]=y;
       }
    }   
    public void bewegeRechts( )
    {
        if(x<600 && y<600 && x>-1 && y>-1) 
       {
        x = x + 10 ;
        q.setzePosition((int)x, (int)y);
        ort[0]=x-10;
          ort[1]=y;
       }
    }  
    
     public void Krieche(int n1, int n2, int p)
     {
        q.setzePosition(ort[n1],ort[n2]);
        ort[n1]=ort[p*2];
        ort[n2]=ort[p*2+1];
     }
    
     }

Das ist nun die wichtigste Klasse für mein Problem, hier werden den nachfolgenden Segmenten die Positionen zugewiesen


Starte ich nun das Spiel bekomm ich eine Menge Java.lang.NullpointerExceptions, allerdings hab ich keine Ahnung wieso diese auftreten.

Nur mal als Beispiel:
Exception in thread "Thread-11" java.lang.NullPointerException
at SEGMENT.bewegeOben(SEGMENT.java:36)
at K�RPER.bewegeO(K�RPER.java:25)
at SPIEL.ticke(SPIEL.java:159)
at SPIEL.tuWas(SPIEL.java:117)
at Taktgeber$2.run(Taktgeber.java:69)
at java.lang.Thread.run(Thread.java:722)


Ich hoffe ihr könnt mir helfen, ich häng auch nochmal das gesamte Projekt als Anhang dran, falls jemand die Zeit findet sich das mal anzuschauen.

Danke schonmal :)
 

Anhänge

  • Projekt.7z
    189,7 KB · Aufrufe: 26
T

transdenzentral

Gast
Java:
 private int[] ort;

wird nicht initialisiert. Das Array ist "null".

Der entsprechende Konstruktor von Segment wird nie aufgerufen.


Java:
public void bewegeU( )
public void bewegeO( )
public void bewegeR( )
public void bewegeL( )

Hier gehen deine Schleifen eins zu lang, wenn Du bei 0 anfängst mit zählen...
 
Zuletzt bearbeitet von einem Moderator:

Thommi

Mitglied
Ok den Konstruktor von Segment hab ich jetzt einfach in den Konstruktor von Spiel reingepackt.

Zu den Schleifen:
Java:
for(int i=0;i<(anzahl-1);i++)
        {
            s[i+1].Krieche(i*2,1+i*2,i+1);
        }

so ist`s besser oder?

Dann sinds wohl schonmal 2 fehler weniger :)

aber leider kommen immer noch die selben fehlermeldungen
 
T

transdenzentral

Gast
Poste doch einfach mal die ganze Fehlermeldung ;)


Ok den Konstruktor von Segment hab ich jetzt einfach in den Konstruktor von Spiel reingepackt.

Das ist wohl nicht unbedingt zielführend. Initialisiere dein Array doch einfach in dem Konstruktor, den Du sowieso aufrufst:

Java:
  public SEGMENT(int xStart, int yStart, KÖRPER r)
    {
        x= xStart;
        y= yStart;
        q=new Quadrat(x, y, 10);
//Hier...
        ort=new int[100000];
        b=0;
      
    }

Dann sollten eigentlich auch keine NPE mehr fliegen... - ich hab das Grade testweise ausprobiert...
 

Thommi

Mitglied
Aber dieser Konstruktor wird ja jedesmal aufgerufen wenn ich ein neues Segment hinzufüge, wir dann nicht auch jedes mal wieder ein Array erstellt?

Naja ich habs jetzt mal ausprobiert und ...

... es gibt wirklich keine NPE mehr :) danke

das einzige Problem ist jetzt noch dass alle segment anscheinend auf(0|0) springen, woran dass auch liegen mag

aber das war schon mal eine große hilfe :)

----> Bin jetzt zu dem Schluss gekommen dass die Segmente genau wegen dem Problem mit dem array auf (0|0) springen, weil jedes Segment jetzt sein eigenes Array hat und die Koordinatenwerte ja nur in das erste Array eingetragen werden. :/ was tun?
 
Zuletzt bearbeitet:

Thommi

Mitglied
Kann mir irgendjemand vielleicht noch eine Tipp geben wie ich das hinbekomme, das es nicht jedesmla wenn ich ein neues Segment erstell ein neues Array erstellt wird und ich so die Koordinaten nicht richtig aufrufen kann?
 

Kevin94

Top Contributor
Ich würde sagen, das das Array static sein müsste.

Um mal eine Anmerkung zum Algorithmus zu machen: Ich würde es so schreiben, das immer das letzte Elemenent nach vorne an die Spitze versetzt wird, bzw. an die Zweite Stelle wenn du einen Kopf hättest. Da spart man sich viele Verschiebungen.
 

Thommi

Mitglied
Danke für den Tip :) Hab es jetzt wirklich so gelöst dass immer das letzte nach vorne "springt".
Jetzt funktioniert soweit alles :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Snake mit Bluej Java Basics - Anfänger-Themen 8
Z SNAKE Schlange beim Aufheben von Essen verlängern Java Basics - Anfänger-Themen 4
AmsananKING Methoden Moving Snake Forward Java Basics - Anfänger-Themen 0
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
B "Snake"-Game verbuggt Java Basics - Anfänger-Themen 0
K Diverse Bugs in einem Snake Spiel Java Basics - Anfänger-Themen 4
J Snake Movement Java Basics - Anfänger-Themen 7
W Snake pausieren Java Basics - Anfänger-Themen 4
C Java Nullpointer Exception in 2D-Spiel Snake Java Basics - Anfänger-Themen 8
N Snake Java Basics - Anfänger-Themen 2
S Snake Punktezähler funktioniert nicht Java Basics - Anfänger-Themen 9
C Minispiel Snake Java Basics - Anfänger-Themen 3
A Snake programmieren? Java Basics - Anfänger-Themen 31
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
W Pfeilenformen im BlueJ Java Basics - Anfänger-Themen 9
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
aero043 Hilfe bei BlueJ Hausübung Java Basics - Anfänger-Themen 27
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
Vernon.098 Java (BlueJ) Mensch ärgere dich nicht Programmien Java Basics - Anfänger-Themen 6
momo96 bluej Java Basics - Anfänger-Themen 2
K BlueJ Ball an Rand Reflektieren Java Basics - Anfänger-Themen 2
YAZZ BlueJ Bewegung einer Figur im Kreis Java Basics - Anfänger-Themen 4
Delonyg Bluej Supermarkt Java Basics - Anfänger-Themen 2
Ray19941 Über BlueJ Textdatei selbstständig erstellen lassen Java Basics - Anfänger-Themen 2
N BlueJ Implementation Analoguhr Java Basics - Anfänger-Themen 33
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
C Projekt öffnen BlueJ Java Basics - Anfänger-Themen 1
M BlueJ - Array als Paramter einer Methode eingeben Java Basics - Anfänger-Themen 12
K Testen in BlueJ Java Basics - Anfänger-Themen 2
C BlueJ Zahlenschloss programmieren Java Basics - Anfänger-Themen 5
1 BlueJ Fehler ? Java Basics - Anfänger-Themen 7
L Bluej Error: Cannot find Symbol Java Basics - Anfänger-Themen 13
H Methoden Bluej Anfänger Java Basics - Anfänger-Themen 13
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
G Variablen Variable nimmt keinen Wert an (BlueJ) Java Basics - Anfänger-Themen 4
I BlueJ importdatei fehlt Java Basics - Anfänger-Themen 4
D Java BlueJ Programm wiederholen? Java Basics - Anfänger-Themen 6
J Uniprojekt (BlueJ) Java Basics - Anfänger-Themen 17
H Klassen Hilfe bei BlueJ, Supermario Java Basics - Anfänger-Themen 5
W Testmethoden in BlueJ Java Basics - Anfänger-Themen 12
F Java BlueJ Dinge verschwinden lassen Java Basics - Anfänger-Themen 2
X wie kann ich in bluej/java einene 2d array mit zahlen fuellen, so dass sich diese in der der zeilen Java Basics - Anfänger-Themen 2
E Hilfe bei Lambda-Ausdrücken in BlueJ Java Basics - Anfänger-Themen 1
J BlueJ und import-Anweisungen, wie geht das? Java Basics - Anfänger-Themen 4
K BlueJ Terminverwaltung erstellen Java Basics - Anfänger-Themen 1
J BlueJ - kompilieren - und wie weit kommt man mit BlueJ? Java Basics - Anfänger-Themen 4
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
I Erste Schritte BlueJ Fehler Java Basics - Anfänger-Themen 8
C Manuelle Parametereingabe in BlueJ Java Basics - Anfänger-Themen 5
D Wer wird Millionär ? BlueJ Java Java Basics - Anfänger-Themen 2
P BlueJ Sieb des Eratothenes Java Basics - Anfänger-Themen 4
M Ausgeben eines 2D Arrays mit int UND String werten - BLUEJ! Java Basics - Anfänger-Themen 4
G BlueJ Stacks Bahnhof Java Basics - Anfänger-Themen 2
J BlueJ öffnet package falsch Java Basics - Anfänger-Themen 2
J BlueJ Liste Würfel Projekt Java Basics - Anfänger-Themen 2
P Java mit BlueJ - Hilfe - Gegenstände Java Basics - Anfänger-Themen 10
H BlueJ Java Basics - Anfänger-Themen 3
L Queue programmieren via BlueJ Java Basics - Anfänger-Themen 5
R Nach Ubuntu-Update: Konsole spuckt bei neu Kompilierten Programmen Fehler aus (BlueJ)(Ubuntu12.04) Java Basics - Anfänger-Themen 11
X Erste Schritte Java BlueJ Programmieren Java Basics - Anfänger-Themen 36
Tally Methoden BlueJ - Datum als Kalendertag int - tagImJahr Java Basics - Anfänger-Themen 6
J BlueJ canvas Buttons adden? Java Basics - Anfänger-Themen 2
J BlueJ Tic Tac Toe öffnen? Java Basics - Anfänger-Themen 6
T Erste Schritte BlueJ kapitel 4 frage Schleifen ? Java Basics - Anfänger-Themen 4
V BlueJ: Funktionierende .jar Datei erstellen Java Basics - Anfänger-Themen 2
G Methoden BlueJ SuM Methode wird nicht gefunden Java Basics - Anfänger-Themen 9
S Pakete in BlueJ Java Basics - Anfänger-Themen 5
S Erste Schritte Bluej Automatisches Einfügen von Objekten Java Basics - Anfänger-Themen 4
R BlueJ - Hilfe bei for-Struktur Java Basics - Anfänger-Themen 11
S Erste Schritte BlueJ-Aufgabe: Programmcode / Brauche dringend Hilfe !!! Java Basics - Anfänger-Themen 37
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
P Java BlueJ Schatzsuche Java Basics - Anfänger-Themen 2
H Erste Schritte von BlueJ zu Eclipse Java Basics - Anfänger-Themen 10
I Rc4 Verschlüsselung in BlueJ Java Basics - Anfänger-Themen 18
H Buch: Java lernen mit BlueJ Modulo-Operator Java Basics - Anfänger-Themen 16
X Methoden Java Dublikatsuche Hilfe(BlueJ) Java Basics - Anfänger-Themen 9
X Interpreter-Fehler "java.lang.NullPionterException: null" bei BlueJ Java Basics - Anfänger-Themen 10
C Problem bei BlueJ - Pfeil bleibt nicht in der Dartscheibe stecken Java Basics - Anfänger-Themen 4
M mit BlueJ einen Ticketautomaten programmieren Java Basics - Anfänger-Themen 9
Binary.Coder Bluej ähnlicher Inspektor gesucht Java Basics - Anfänger-Themen 3
T problem mit der maus in BlueJ Java Basics - Anfänger-Themen 14
J BlueJ! 2 kleine Fragen zum Spiel. Java Basics - Anfänger-Themen 3
R BlueJ Pacman Java Basics - Anfänger-Themen 17
B BlueJ Turtle nicht gefunden Java Basics - Anfänger-Themen 6
J start(); bei bluej Java Basics - Anfänger-Themen 3
E BlueJ Projekt öffnen Java Basics - Anfänger-Themen 15
Jats Probleme mit BlueJ und Bankkonto-Methoden Java Basics - Anfänger-Themen 7
A BlueJ BMI berechnen Java Basics - Anfänger-Themen 9
D BlueJ Anzeigeproblem Java Basics - Anfänger-Themen 5
L String Variable zurückgeben mit BlueJ Java Basics - Anfänger-Themen 12
J BlueJ Zeichen, Dart-Pfeil Java Basics - Anfänger-Themen 59
B Paket in BlueJ einfügen Java Basics - Anfänger-Themen 5
C BlueJ zum Laufen bekommen Java Basics - Anfänger-Themen 14
M BlueJ Problem Java Basics - Anfänger-Themen 6
P BlueJ hängt sich beim compilen auf Java Basics - Anfänger-Themen 9
P BlueJ Fehlermeldung - Illegal Start of Type Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben