# Fehler bei Programmierung lässt Figur nicht bewegen



## ObjecTV (18. Mai 2014)

Hallo liebe Community,

das ist mein erster Post und ich bin so aufregend... - ich meine aufgeregt. 
Ich habe angefangen mit Java zu programmieren. Ein Stück weit bin ich gekommen, aber irgendwo häng ich jetzt. Folgendes Problem ist entstanden:

Ich hatte anfangs Bildschirmflackern gehabt, habe das behoben und auf einmal funktionieren meine Bewegeungsbefehle nicht mehr. Falls ihr natürlich im Quellcode mehr Fehler findet wäre ich für Hilfe sehr dankbar!

Apropos es geht hier um ein Snake Spiel!


Das hier ist die Java-Datei mit dem Hintergrund!

```
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package snake;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
/**
 *
 * @author Smilodon
 */
public class Snake extends JFrame implements KeyListener, Runnable{
    
    private Dot dot = new Dot(3,this);
    //Menge der "Dots"
    private boolean up, down, left, right;
    private apple apple = new apple(this);
    
   public Snake (String title) {
   super(title);
   this.setFocusable(true);
   this.addKeyListener(this);
   apple.createLocation();
  
    }
    public void paint (Graphics gr){
    super.paint(gr);
    // mit dieser Methode können wir malen
    /**
     * 
     */
       //Image mit Pfad eingegeben plus Ausrichtung des Bildes  
    gr.drawImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\ background.png"), -250, -250, this);
   
    //Dot wird gezeichnet
    dot.paint(gr);
    
    //Frucht wird gezeichnet
    apple.paint(gr);

    }
    public static void main(String[] args) {
      //Größe des Bildes, schließung des Fensters und größe des Fensters, Sichtbarkeit des Fensters
     Snake snake = new Snake ("Snake!");
     snake.setSize(500, 500);
     new Thread(snake).start();
     snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     snake.setVisible(true);
     snake.setUndecorated(true);
     snake.setLocation(500, 500);
     //Spielfeld wird eingerichtet, größe, Ort, ob es Sichtbar ist etc pp
    }
    
            @Override
    public void keyTyped(KeyEvent e) {
    }
    
    @Override
    public void keyPressed(KeyEvent e) {
     if (e.getKeyCode()== 37 && !right){
         left=true;
         right=false;
         down=false;
         up=false;
    }else if (e.getKeyCode() == 38 && !down){
         up=true;
         right=false;
         down=false;
         left=false;
    }else if (e.getKeyCode() == 39 && !left){
        right=true;
        up=false;
        down=false;
        left=false;
    }else if (e.getKeyCode() == 40 && !up){
        down=true;             
        right=false;
        left=false;
        up=false;
              //Erklärung welche Befehle "true" oder "false" sind unter anderem die Zuordnung der Tasten (37,38,39,40)
    }
    }
    
    
    @Override
    public void keyReleased(KeyEvent e) {
    }

    
    @Override
    public void run(){
        while(true){
            if (up){
                dot.move("up");
            }else if (down){
                dot.move("down");
            }else if (left){
                dot.move("left");
            }else if (right){
                dot.move("right");
            }
            
            dot.checkapple(apple);
            
                repaint();//damit der Punkt auch beim Bewegen erscheint
                try {
                    Thread.sleep(140);
                }catch (InterruptedException ex){
                    Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
                }//Den Verzögrungseffekt für den Flaire einschalten!
            }
        }
    }
```



Das hier ist die Dot Datei - also der Körper der Schlange.

```
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package snake;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
 *
 * @author Smilodon
 */
public class Dot {
    
    private int dots;
    private int[] dotsX = new int[2500];
    private int[] dotsY = new int[2500];
    private Component comp;
    //Hier steht das mehrere "Dots" auf dem Bildschirm sein können, insgesamt 2500 da unser Spielfeld nicht mehr erlaubt!
    
    public Dot(int dots, Component comp) {
        this.dots = dots;
        this.comp = comp;
        for (int i = 0; i < dots; i++) {
            dotsX[i] = 100-i*10;
            dotsY[i] = 100;     
            //Zeigen wie sich der Dot bewegt
    }}
   
    
public void move(String position) {
    
    for (int i = dots; i>0; i--) {
        dotsX[i] = dotsX [ (i - 1)];
        dotsY[i] = dotsY [ (i - 1)];
        //Hiermit wird klargemacht, dass alle dem ersten Punkt folgen !Wichtig! Man muss sagen dass Punkt 2 auf den Platz von Punkt 1 geht und Punkt 3 auf Punkt 2 etc.
    }
    
    if (position.equals("left")){
        dotsX[0] -= 10;
    } else if (position.equals("right")){
        dotsX[0] += 10;  
    } else if (position.equals("down")){
        dotsY[0] += 10;
    } else if (position.equals("up")){
        dotsY[0] -=10;
        }
}
    
public void checkfrucht(frucht frucht) {
    if (dotsX[0] == frucht.getX() && dotsY[0] == Frucht.getY()) {
        Frucht.createLocation();
    }
}
    
    public void paint (Graphics gr) {
        for (int i = 0; i < dots; i++) {
            //Zeigen das der Dot mehr werden muss wenn Apfel gegessen
            gr.drawImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\Smilodon\\Desktop\\Snake Schatz\\Snake Paint\\dot.png"), dotsX[i], dotsY[i], comp);
            //Bild des Dots und Bewegungseingabe in X und Y Werten
               }
        }

    void checkapple(apple apple) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    }
```


Das hier ist der Apfel!

```
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package snake;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
 *
 * @author Smilodon
 */
public class apple {
    
    
    private Component comp;
    private int x, y;
    
    public apple(Component comp) {
        this.comp = comp;
        
    }
    
    public void createLocation() {
        x = 10* (int) (Math.random()*50);
        y = 10* (int) (Math.random()*50);
    }
    
    public int getX(){
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    public void paint(Graphics gr) {
    gr.drawImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\Smilodon\\Desktop\\Snake Schatz\\Snake Paint\\apple.png"), x, y, comp);
}}
```

Danke schon einmal für die Hilfe!!!

LG
ObjecTV


----------



## Gucky (18. Mai 2014)

Hast du schon mal debugged? Lass dir die einzelnen Schritte mal ausgeben. Oder benutz den Debugger und führe den Code zeilenweise aus. So kannst du das Problem meistens relativ leicht finden. Denn ich denke, keiner hier hat Lust sich deinen Code vollständig anzusehen und nach Fehlern zu suchen.  Nicht persöhnlich gemeint.


----------



## ObjecTV (18. Mai 2014)

Hi!

von Debuggen hab ich zurzeit keine Ahnung muss ich zugeben! 
Kann man mir das vielleicht einmal erklären, bitte????:L

Bearbeitung: 
Also - Problem mit dem Bewegen gelöst. Jetzt flackert der Bildschirm wieder... jemand ne Idee? Ich krieg die Krise! 
Bearbeitung 2:
Jetzt fängts wieder umgekehrt an, Bewegung geht nicht aber flackern weg. Hat das was mit dem Befehl "repaint" zu tun?


----------



## Gucky (18. Mai 2014)

repaint ruft die paintComponent Methode auf und löscht alles, was schon gemalt war.

In Swing ist Grapics schon doppelt gepuffert. Eigentlich dürfte da nichts flackern.


Debuggen: Alles, was hilft den Fehler zu finden. Sysouts mit Variablen und Bestätigungen von Schritten, Benutzung des Debuggers, etc. Der Debugger lässt dich Code zeilenweise oder Blockweise ausführen. Außerdem kannst du dir die Belegungen der Variablen anzeigen lassen.


----------



## ObjecTV (18. Mai 2014)

Fehler gefunden: In graphics muss man einfach super.paint(gr) entfernen dann gehts. Danke für die Hilfe!!!


----------



## Gucky (18. Mai 2014)

Kein Ding. 

Jetzt bitte noch das Thema als "erledigt" markieren.


----------

