Permalänk

Snake i JAVA

Håller på att avsluta mitt projekt i Programmering A och har valt att göra en Snake-applet. Jag har fått det mesta att funka, det enda problemet är att lägga till "kroppsdelar" till ormen. Jag har en enkel version där jag kan lägga till kroppsdelar manuellt i koden men det är ju inte hållbart...

Har försökt att göra kroppsdelarna som en array men jag får det inte att fungera. De dyker upp i mitten av "spelplanen" och rör sig sedan inte...

Skulle uppskatta om någon kunde ta en titt på koden och berätta var det är jag tänkt fel!

Tack på förhand.

import java.applet.*; import java.awt.*; import java.io.*; public class Snake extends Applet implements Runnable { boolean gameOver = true; int stop = 0; int appletsize_x = 500; int appletsize_y = 500; int x_pos = appletsize_x / 2; int y_pos = appletsize_y / 2; int old_x[] = new int[45]; int old_y[] = new int[45]; int parts = 2; int points = 0; int radius = 10; int dir = 0; int speed = 30; int newHighScore = points; int highscore = newHighScore; /*private void saveHighscore() { try { String filnamn = "Highscore.txt"; FileWriter fw = new FileWriter(filnamn,true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter utFil = new PrintWriter(bw); String innehåll = "Highscore: " + highscore; utFil.println(innehåll); utFil.close(); } catch (IOException ex) { } }*/ public void init() { } public void start() { Thread th = new Thread(this); th.start(); } public void stop() { } public void destroy() { } public boolean keyDown(Event e, int key) { if(key == Event.LEFT && gameOver != false) { if(dir != 2) { dir = 1; } } else if(key == Event.RIGHT && gameOver != false) { if(dir != 1) { dir = 2; } } else if(key == Event.UP && gameOver != false) { if(dir != 4) { dir = 3; } } else if(key == Event.DOWN && gameOver != false) { if(dir != 3) { dir = 4; } } else if(key == 33) { dir = 0; speed = 30; points = 0; x_pos = appletsize_x / 2; y_pos = appletsize_y / 2; for(int i = 0; i < parts; i++) { old_x[i] = appletsize_x / 2; old_y[i] = appletsize_y / 2; } gameOver = true; } else if(key == 32) { parts++; } return true; } public void run() { Thread.currentThread().setPriority(Thread.MIN_PRIORITY); while(true) { for(int i = 0; i < parts; i++) { old_x[i] = appletsize_x / 2; old_y[i] = appletsize_y / 2; } try { Thread.sleep(150); } catch (InterruptedException ex) { } for(int i = parts; i > 0; i--) { old_x[i] = old_x[i - 1]; old_y[i] = old_y[i - 1]; } switch(dir) { case 1: x_pos -= speed; points += 5; break; case 2: x_pos += speed; points += 5; break; case 3: y_pos -= speed; points += 5; break; case 4: y_pos += speed; points += 5; break; default: old_x[0] = x_pos; break; } repaint(); try { Thread.sleep(150); } catch (InterruptedException ex) { } Thread.currentThread().setPriority(Thread.MAX_PRIORITY); } } public void paint(Graphics g) { g.setColor(Color.GREEN); g.fillRect(0, 0, appletsize_x, appletsize_y); g.setColor(Color.RED); for(int i = 0; i < parts; i++) { g.fillRect(old_x[i] - radius, old_y[i] - radius, 2 * radius, 2 * radius); } g.setColor(Color.BLACK); g.fillRect(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); g.drawString("Restart: Spacebar", 10, 80); g.drawString("Parts: " + parts, 10, 60); g.drawString("Points: " + points, 10, 40); g.drawString ("Highscore: " + highscore, 10, 20); if(x_pos == appletsize_x || x_pos > appletsize_x) { dir = 0; speed = 0; g.setColor(Color.BLACK); g.drawString ("GAME OVER", 200, 200); gameOver = false; } if(y_pos == appletsize_y || y_pos > appletsize_y) { dir = 0; speed = 0; g.setColor(Color.BLACK); g.drawString ("GAME OVER", 200, 200); gameOver = false; } if(x_pos == 0 || x_pos < 0) { dir = 0; speed = 0; g.setColor(Color.BLACK); g.drawString ("GAME OVER", 200, 200); gameOver = false; } if(y_pos == 0 || y_pos < 0) { dir = 0; speed = 0; g.setColor(Color.BLACK); g.drawString ("GAME OVER", 200, 200); gameOver = false; } } }

Visa signatur

| Sony A580 | Sigma 10-20/4-5.6 | Tamron 17-50/2.8 | Sigma 70/2.8 Macro | Konica Minolta 50/1.7 | Konicha Minolta 75-300/4.5-5.6 |

Permalänk
Medlem

Har inte kollat igenom koden, men när jag gjorde snake så gjorde jag det med en ArrayList om jag inte minns fel, smidigare med en dynamisk lista...

Sen för att öka längden när man äter äpple är väl bara att öka listan med ett...

Permalänk
Medlem

Om du har intresse skulle du kunna sätta dig in i hur MVC(model view controller) funkar. Lämpligt är väl att använda en linkedlist eftersom du bara behöver lägga till o ta bort i ändarna.

Gör en lista med Positions(x,y) för ormen, meals och en för Keypresses kan underlätta.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av getter
Om du har intresse skulle du kunna sätta dig in i hur MVC(model view controller) funkar.

Horribelt overkill för en så här simpel applet.

Permalänk
Medlem

har du nångång använt LinkedList?
http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList....

Tanken men LinkedList är att man kan lägga till/ta bort/kolla enkelt och snabbt på första och sista elementet och dessutom kolla igenom alla element med en loop.
Alltså normala fall:
Lägg till nya positionen i listan. Rita ut hela listan (alla kroppsdelar). Ta bort Sista i listan om man inte ätit äpple.

Sen verkar det inte som att du slumpar ut platsen på äpplet? Det är ganska lätt att göra med java randomize funktion.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av badboll
Horribelt overkill för en så här simpel applet.

Jo men det är roligt