Hallo zusammen,
Ich bin grad an einem Snake Spiel, was ich aus Spaß und zum erfahrungen sammeln programmieren will. Ich habe jetzt schon eine Snake die über den Bildschirm wandert, aber sie macht leider immer 2er Schritte und ich kann mir leider überhaupt nicht erklären wieso. Es wäre super wenn jemand von euch der da ein wenig mehr Ahnung hat mal draufgucken könnte und mir sagen woran es liegt. Der Fehler liegt höchstwahrscheinlich in der Klasse "kopp" in der methode "step(int, int)", aber diese wird nur einmal ausgeführt un in jedem Fall sollte pro schritt die der Punkt des Kopfes nur um einen verschoben werden (++/--).
Tut mir leid für die uneleganten Lösungen, aber ich lerne Ja noch und hatte keine andere Idee.
Hier die Snake.java
Und hier die benötigte JFrame
Ich bin relativ neu hier also sagt mir bitte wenn ich was anders formulieren muss.
Schonmal danke im voraus.
Ich bin grad an einem Snake Spiel, was ich aus Spaß und zum erfahrungen sammeln programmieren will. Ich habe jetzt schon eine Snake die über den Bildschirm wandert, aber sie macht leider immer 2er Schritte und ich kann mir leider überhaupt nicht erklären wieso. Es wäre super wenn jemand von euch der da ein wenig mehr Ahnung hat mal draufgucken könnte und mir sagen woran es liegt. Der Fehler liegt höchstwahrscheinlich in der Klasse "kopp" in der methode "step(int, int)", aber diese wird nur einmal ausgeführt un in jedem Fall sollte pro schritt die der Punkt des Kopfes nur um einen verschoben werden (++/--).
Tut mir leid für die uneleganten Lösungen, aber ich lerne Ja noch und hatte keine andere Idee.
Hier die Snake.java
Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
public class Snake {
boolean alive = true;
int[][] drawer = new int[50][50];
Draw2DInt window;
ArrayList<glied> player;
kopp kopf;
glied apfel;
public void run(){
window = new Draw2DInt(drawer, 900);
player = new ArrayList<glied>();
player.add(kopf = new kopp(drawer.length/2, drawer[0].length/2));
window.addKeyListener(kopf);
//wurm erstellen
player.add(kopf);
player.add(new glied(kopf.x-1, kopf.y));
player.add(new glied(kopf.x-2, kopf.y));
player.add(new glied(kopf.x-3, kopf.y));
player.add(new glied(kopf.x-4, kopf.y));
//game loop
while(alive) {
//apfel platzieren falls nicht da
if(apfel == null) {
apfel = new glied((int)(Math.random()*(drawer.length-1)),(int)(Math.random()*(drawer[0].length-1)));
apfel.project(2);
}
//wurm projezieren
for(int i = 0; i < player.size(); i++) {
player.get(i).project(0);
if(player.get(i) instanceof kopp)player.get(i).step(0, 0);
else player.get(i).step(player.get(i-1).altx, player.get(i-1).alty);
player.get(i).project(1);
}
/*/test
kopf.project(0);
kopf.step();
kopf.project(1);
*/
//apfel fressen
if(kopf.x == apfel.x && kopf.y == apfel.y) {
player.add(new glied(player.get(player.size()-1).altx, player.get(player.size()-1).alty));
apfel = null;
}
//window routine
if(apfel != null)apfel.project(2);
window.repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
window.dispose();
}
public static void main(String[] args) {
Snake p = new Snake();
p.run();
}
private class glied{
public glied(int pX, int pY) {
x = pX;
y = pY;
}
int x;
int y;
int altx;
int alty;
public void step(int px, int py) {
altx = x;
alty = y;
x = px;
y = py;
}
public void project(int pC){
drawer[x][y] = pC;
}
}
private class kopp extends glied implements KeyListener{
public kopp(int pX, int pY) {
super(pX, pY);
}
int richtung = 0;//0=rechts, 1=unten, 2=links, 3=oben
public void step(int px, int py) {
altx = x;
alty = y;
if(richtung == 0){
if(x!=drawer.length-1)x++;
else alive = false;
}
else if(richtung == 1){
if(y!=drawer[0].length-1)y++;
else alive = false;
}
else if(richtung == 2){
if(x!=0)x--;
else alive = false;
}
else if(richtung == 3){
if(y!=0)y--;
else alive = false;
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_A) {
richtung = 2;
System.out.println("a");
}
else if(e.getKeyCode() == KeyEvent.VK_W) {
richtung = 3;
System.out.println("w");
}
else if(e.getKeyCode() == KeyEvent.VK_D) {
richtung = 0;
System.out.println("d");
}
else if(e.getKeyCode() == KeyEvent.VK_S) {
richtung=1;
System.out.println("s");
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
Und hier die benötigte JFrame
Java:
import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.*;
@SuppressWarnings("serial")
public class Draw2DInt extends JFrame
{
private int size;
private int[][] arr;
public Draw2DInt(int[][] pArr, int size){
this.size = size;
arr=pArr;
this.setSize(size+16, size+38);
this.setTitle("Draw2DArray");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new Bild(), BorderLayout.CENTER);
this.setVisible(true);
}
public void setArr(int[][] pArr){
arr=pArr;
}
private class Bild extends JComponent{
public void paint(Graphics g){
Graphics2D graph2 = (Graphics2D)g;
//graph2.rotate(0.5 * Math.PI, size/2, size/2);
int rectsize;
if(arr.length >= arr[0].length) {
rectsize = size/arr.length;
}
else {
rectsize = size/arr[0].length;
}
for(int x = 0; x < arr.length; x++){
for(int y = 0; y < arr[0].length; y++) {
if(arr[x][y] == 1)//hier die farben
graph2.setColor(Color.black);
else if(arr[x][y]==2)graph2.setColor(Color.green);
else graph2.setColor(Color.white);
graph2.fillRect(x*rectsize, y*rectsize, rectsize, rectsize);
}
}
}
}
}
Ich bin relativ neu hier also sagt mir bitte wenn ich was anders formulieren muss.
Schonmal danke im voraus.