Verbesserungsvorschläge

Xym

Erfahrenes Mitglied
Ich hab mich mal dran gesetzt und den Spiele-Klassiker " Snake " programmiert.
Bis jetzt bin ich soweit damit zu frieden und wollte euch mal fragen, ob ihr vielleich gute Ideen habt um das Spiel zu verbessern.
Hier ist der Quellcode und ihr könnt es euch mal anschaun:
Java:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;


public class Snake extends Applet implements Runnable
{
  Thread th = new Thread(this);
  
  int xk=100,yk=200,rx,ry;
  int x[]=new int[501];
  int y[]=new int[501];
  int anzahl=-1;
  int i;
  int s=10;
  int score=-100;
  double drx,dry;
  
  boolean treffer=true;
  boolean spiel=true;
  
  char c;
  char t;
  String Score;
  
  Font f = new Font("Serif",Font.BOLD,20);
  
  private Image dbImage;
  private Graphics dbg;
  
  public void start()
  {
    th.start();
  }
  
  public void stop()
  {
    th.stop();
  }
  
  public void init()
  {
   setFont(f);
   addKeyListener(
    new KeyListener()
    {
      public void keyPressed(KeyEvent e)
      {
       if(spiel==true)
       {
         t = e.getKeyChar();
         if(t=='w' && c!='s' || t=='s' && c!='w' || t=='a' && c!='d' || t=='d' && c!='a')
         {
           c = t;
         }
       }
      }
      public void keyReleased(KeyEvent e)
      {

      }
      public void keyTyped(KeyEvent e)
      {

      }
    });
  }
  
  public void run()
  {
    while(true)
    {
      for(int j=500;j!=1;j--)
      {
        x[j]=x[j-1];
        y[j]=y[j-1];
      }
      x[1]=x[0];
      y[1]=y[0];
      x[0]=xk;
      y[0]=yk;

      if(c=='w')
      {
        yk=yk-20;
      }
      if(c=='s')
      {
        yk=yk+20;
      }
      if(c=='a')
      {
        xk=xk-20;
      }
      if(c=='d')
      {
        xk=xk+20;
      }
      
      for(int i=0;i<anzahl;i++)
      {
        if(xk==x[i] && yk==y[i])
        {
          c=',';
          spiel=false;
          th.stop();
        }
      }
      
      if(xk==-20 || xk==320 || yk==-20 || yk==320)
      {
        c=',';
        spiel=false;
        th.stop();
      }

      repaint();
      if(xk==rx && yk==ry)
      {
        treffer=true;
      }
      if(treffer==true)
      {
        drx = Math.random()*15;
        dry = Math.random()*15;
        rx = (int)drx;
        ry = (int)dry;
        rx*=20;
        ry*=20;
        repaint();
        treffer=false;
        anzahl++;
        score+=100;
        Score="Score: "+score;
        System.out.println(anzahl);
      }

      try
      {
        Thread.sleep (160);
      }
      catch (InterruptedException ex){}
    }
  }
  
  public void paint(Graphics g)
  {
    //Kopf
    g.setColor(Color.green);
    g.fillOval(xk,yk,20,20);
    if(c=='s')
    {
      g.setColor(Color.black);
      g.drawArc(xk+5,yk+10,10,5,180,180);
      g.fillOval(xk+6,yk+5,3,3);
      g.fillOval(xk+11,yk+5,3,3);
    }
    if(c=='w')
    {
      g.setColor(Color.black);
      g.drawArc(xk+5,yk+5,10,5,-180,-180);
      g.fillOval(xk+6,yk+10,3,3);
      g.fillOval(xk+11,yk+10,3,3);
    }
    if(c=='a')
    {
      g.setColor(Color.black);
      g.drawArc(xk+5,yk+5,5,10,-270,180);
      g.fillOval(xk+10,yk+6,3,3);
      g.fillOval(xk+10,yk+11,3,3);
    }
    if(c=='d')
    {
      g.setColor(Color.black);
      g.drawArc(xk+10,yk+5,5,10,270,180);
      g.fillOval(xk+5,yk+6,3,3);
      g.fillOval(xk+5,yk+11,3,3);
    }
    //Roterpunkt
    g.setColor(Color.red);
    g.fillRect(rx,ry,20,20);
    for(int p=0;p<anzahl;p++)
    {
      add(g,p);
    }
    g.setColor(Color.red);
    g.drawString(Score,10,15);
  }
  
    public void update (Graphics g)
  {
    if (dbImage == null)
    {
      dbImage = createImage (this.getSize().width, this.getSize().height);
      dbg = dbImage.getGraphics ();
    }

    dbg.setColor (getBackground ());
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

    dbg.setColor (getForeground());
    paint (dbg);

    g.drawImage (dbImage, 0, 0, this);
  }
  
   public void add (Graphics g,int i)
  {
    g.setColor(Color.black);
    g.fillOval(x[i],y[i],20,20);
  }

}
 
Hey,

Was meinst du mit verbessern?
Eine Optimierung deines Quellcodes oder Vorschläge zur Erweiterung deines Snakes?

Vllt. solltest du die Schlange und das Spielffeld auslagern und jeweils eigene Klassen entwerfen,
dann könntest du auch problemlos neue Spielkarten hinzufügen ( mit Wänden etc.)

bo
 
Thread.stop() ist keine gute Idee!

Ich würde javax.swing.JApplet in Verbindung mit SwingUtilities.invokeLater(Runnable) verwenden.
 
Zuletzt bearbeitet:
Zurück