Snake

Status
Nicht offen für weitere Antworten.

jobu0101

Bekanntes Mitglied
Ich habe hier mal was probiert, ist aber noch längst nicht fertig:

Code:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test09 extends JPanel implements KeyListener {
	static test09 panel;

	int hoch = 20;

	int breit = 20;

	int lang = 19;

	int richtung = 0;

	static boolean an = true;

	Point[] schlange = new Point[lang];

	test09() {
		addKeyListener(this);
		for (int i = 0; i < lang; i++)
			schlange[i] = new Point(i, 0);

	}

	void weiter(Point p) {

		for (int i = 0; i < lang - 1; i++)

			schlange[i] = new Point((int) schlange[i + 1].getX(),
					(int) schlange[i + 1].getY());

		schlange[lang - 1] = new Point((int) p.getX(), (int) p.getY());

	}

	void move() {
		Point p = new Point(0, 0);
		if (richtung == 0)
			p = new Point((int) schlange[lang - 1].getX() + 1,
					(int) schlange[lang - 1].getY());
		if (richtung == 1)
			p = new Point((int) schlange[lang - 1].getX(),
					(int) schlange[lang - 1].getY() + 1);
		if (richtung == 2)
			p = new Point((int) schlange[lang - 1].getX() - 1,
					(int) schlange[lang - 1].getY());
		if (richtung == 3)
			p = new Point((int) schlange[lang - 1].getX(),
					(int) schlange[lang - 1].getY() - 1);
		p = new Point(((int) p.getX() + breit) % breit, ((int) p.getY() + hoch)
				% hoch);
		for (int i = 0; i < lang; i++)
			if (schlange[i].getX() == p.getX()
					&& schlange[i].getY() == p.getY())
				an = false;
		if (an)

			weiter(p);

		repaint();
	}

	protected void paintComponent(Graphics g) {
		BufferedImage bild = new BufferedImage(breit * 10, hoch * 10,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D gr = (Graphics2D) bild.getGraphics();
		gr.setColor(Color.BLUE);
		gr.fill(new Rectangle2D.Double(0, 0, breit * 10, hoch * 10));
		gr.setColor(Color.YELLOW);
		for (int i = 0; i < lang; i++) {
			gr.fill(new Rectangle2D.Double(schlange[i].getX() * 10, schlange[i]
					.getY() * 10, 10, 10));
		}
		g.drawImage(bild, 0, 0, this);
	}

	public static void main(String args[]) {

		JFrame f = new JFrame("Snake");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(600, 600);
		Container con = f.getContentPane();
		panel = new test09();
		panel.setBorder(BorderFactory.createEtchedBorder(Color.black,
				Color.blue));

		con.add("Center", panel);

		con.add(panel);

		f.setVisible(true);
		panel.requestFocus();

		lauf t = panel.new lauf();

		t.start();
	}

	class lauf extends Thread {
		public void run() {
			while (an) {

				try {
					Thread.sleep(30);
				} catch (InterruptedException e) {
					interrupt();
				}
				panel.move();
			}
		}
	}

	public void keyTyped(KeyEvent arg0) {

	}

	public void keyPressed(KeyEvent arg0) {

		if (arg0.getKeyCode() == KeyEvent.VK_LEFT && richtung != 0)
			richtung = 2;
		if (arg0.getKeyCode() == KeyEvent.VK_RIGHT && richtung != 2)
			richtung = 0;
		if (arg0.getKeyCode() == KeyEvent.VK_DOWN && richtung != 3)
			richtung = 1;
		if (arg0.getKeyCode() == KeyEvent.VK_UP && richtung != 1)
			richtung = 3;
		move();
	}

	public void keyReleased(KeyEvent arg0) {
	};
}


Nur wenn man hoch und breit höher stellt fängt es schon an nichtmehr ganz so flüssig zu laufen! Dabei laufen solche ähnlichen Spiele sogar auf einem schlechten Handy gut. Das heißt ich habe es ziemlich blöd programmiert! Könnt ihr mir helfen und sagen wo ich die vielen Systemressourcen klaue und wie ich daqs umgehen kann?
 

Lim_Dul

Top Contributor
Einfach mal eine Idee:

Nicht immer in paintComponent ein neues BufferedImage erstellen. Entweder immer in das gleiche schreiben oder gleich auf der Komponete.
 

Bleiglanz

Gesperrter Benutzer
doch: kein volles Repaint machen

sondern das letzte segment der schlange löschen und "vorne" ein neues hinzufügen, ist aber nicht ganz einfach

und wozu ist das Thread.sleep(30); da?
 

jobu0101

Bekanntes Mitglied
Das ist zum Bremsen der Schlange da!

Sie wird also nur alle 3/100 Sekunden einen Schritt machen!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben