"Snake"-Game Logikfehler

Battleju

Aktives Mitglied
Hi,
ich bin ein Anfänger und versuche das Spiel Snake auf eine ungewöhnliche Weise zu Programmieren. Es besteht aus der Eingabeaufforderung als "Bild-Ausgabe" und einem Frame als Steuerung.
Das Spiel ist fast fertig und funktioniert auch bis zu einem Punkt. Nun ist es so, dass wenn die Schlange einen "Snack" frisst größer wird. Das ist mein Problem... Die Schlange wird als "*" dargestellt. Doch der Schwanz der Schlange wird nicht ordnungsgemäß dargestellt. Ich grüble schon Tage darüber und komme nicht darauf, was ich falsch gemacht habe.
Der Code:
Code:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
public class Snake extends Thread{
  static int stnr=0;
  static int a=1;
  static int snack=0;
  static int xsnack,ysnack;
  public static void main(String[]args)throws InterruptedException{
    int x=0,y=0,score=0,z=1;
    int[] xalt;
    int[] yalt;
    int[] xzws;
    int[] yzws;
    Snake t1 = new Snake();
    t1.start();
    while(a==1){
      TimeUnit.SECONDS.sleep(1);
      xalt = new int[z+1];
      yalt = new int[z+1];
      xzws = new int[z+1];
      yzws = new int[z+1];
     
      for (int czws=0; czws<=z; czws++) {
        if (czws==0) {
          xzws[czws]=xalt[czws];
          yzws[czws]=yalt[czws];
        }else{
          xzws[czws]=xalt[czws];
          yzws[czws]=yalt[czws]; 
        }
      }
      for (int c=0; c<=z; c++) {
        if (c==0) {
          xalt[c]=x;
          yalt[c]=y;
        }else{
          xalt[c]=xzws[c-1];
          yalt[c]=yzws[c-1];
        }
      }
      if (snack==0) {
        snack=1;
        snackGenerieren();
      }
      if (stnr==1) {
        x=x-1;
      }
      if (stnr==2) {
        x=x+1;
      }
      if (stnr==3) {
        y=y-1;
      }
      if (stnr==4) {
        y=y+1;
      }
      if (y>20) {
        y=0;
      }
      if (x>40) {
        x=0;
      }
      if (y<0) {
        y=20;
      }
      if (x<0) {
        x=40;
      }
     
      if (x==xsnack && y==ysnack) {
        snack=0;
        score++;
        z++;
      }
     
      System.out.println(score);
      for (int yachse=0; yachse<=20; yachse++) {
        for (int xachse=0; xachse<=40; xachse++) {
          for (int v =0; v<z; v++) {
            if (xalt[v]==xachse && yalt[v]==yachse ) {
              System.out.print("*");
            }
          }
          if ((x==xachse && y==yachse) ) {
            System.out.print("*");
          } else{
            System.out.print(" ");
          }
          if (xsnack==xachse && ysnack==yachse) {
            System.out.print("~");
          }
         
        }
        System.out.println();
       
      }
     
    }
  }
  public static void snackGenerieren(){
    xsnack=(int)((Math.random() * 40)+1);
    ysnack=(int)((Math.random() * 20)+1);
  }
  public void run(){
    int x=0;
    JFrame meinJFrame = new JFrame();
    meinJFrame.setTitle("Steuerung");
    JPanel panel = new JPanel();
   
    JButton links = new JButton("links");
    JButton rechts = new JButton("rechts");
    JButton oben = new JButton("oben");
    JButton unten = new JButton("unten");
   
   
    ActionListener l = new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
        stnr=1;
      }
    };
    ActionListener r = new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
        stnr=2;
      }
    }; 
    ActionListener o = new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
        stnr=3;
      }
    }; 
    ActionListener u = new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
        stnr=4;
      }
    };
   
    links.addActionListener(l);
    rechts.addActionListener(r);
    oben.addActionListener(o);
    unten.addActionListener(u);
   
    panel.add(links);
    panel.add(rechts);
    panel.add(oben);
    panel.add(unten);
   
    meinJFrame.add(panel);
   
    meinJFrame.pack();
   
    meinJFrame.setVisible(true);
    try{
      TimeUnit.SECONDS.sleep(1);
    }catch(InterruptedException e){
      e.printStackTrace();
    }
  }
}
Wenn ich jetzt nicht den übelsten Tunnelblick habe, sollte es an den 2 Stellen liegen:
Java:
for (int czws=0; czws<=z; czws++) {
        if (czws==0) {
          xzws[czws]=xalt[czws];
          yzws[czws]=yalt[czws];
        }else{
          xzws[czws]=xalt[czws];
          yzws[czws]=yalt[czws]; 
        }
      }
      for (int c=0; c<=z; c++) {
        if (c==0) {
          xalt[c]=x;
          yalt[c]=y;
        }else{
          xalt[c]=xzws[c-1];
          yalt[c]=yzws[c-1];
        }
      }
Java:
for (int yachse=0; yachse<=20; yachse++) {
        for (int xachse=0; xachse<=40; xachse++) {
          for (int v =0; v<z; v++) {
            if (xalt[v]==xachse && yalt[v]==yachse ) {
              System.out.print("*");
            }
          }
          if ((x==xachse && y==yachse) ) {
            System.out.print("*");
          } else{
            System.out.print(" ");
          }
          if (xsnack==xachse && ysnack==yachse) {
            System.out.print("~");
          }
         
        }
        System.out.println();
       
      }
Ich hoffe jemand kann mir helfen🙁
Danke schon mal im voraus!

Lg bttl
 
Ich habe mal die Zeile
Java:
System.out.println();
durch diese
Java:
System.out.println("#");
ersetzt. Dadurch sieht man sozusagen die rechte Mauer. Auf dem Screenshot sieht man, dass sie an manchen Stellen um eins zu weit rechts ist.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    8,6 KB · Aufrufe: 34

Zurück
Oben