Как заставить змеиный хвост следовать за головой
Я разработал базовую игру змеи, и у меня есть ошибка. Змеиный хвост не следует за головой.Пожалуйста помогите ниже мой код
Что я уже пробовал:
package mygame; import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferStrategy; import java.util.Random; public class game extends Canvas implements Runnable , KeyListener{ public Thread thread; public int px=190; public int py=230; public int fx=245; public int fy=300; public int width=600; public Random r; public int height=500; public boolean up,right,left; public boolean down; public boolean running=false; public int l=0; public int[] map= new int[400]; public int[] m = new int[500]; public BufferStrategy bs; public game() { addKeyListener(this); this.setFocusable(true); this.setFocusTraversalKeysEnabled(true); new window(height,width,"game",this); r = new Random(); } public static void main(String[] args) { new game(); } public synchronized void start() { thread = new Thread(this); thread.start(); running=true; } public synchronized void stop() { try { thread.join(); running=false; } catch (InterruptedException e) { // TODO Auto-generated catch blocks } } @Override public void run() { int fps=60; long lasttime=System.nanoTime(); double ns =1000000000/fps; int ticks=0; double delta=0; long timer=0; while(running) { long now =System.nanoTime(); delta+=(now-lasttime)/ns; timer+=now-lasttime; lasttime=now; while(delta>=1) { ticks++; ticks(); delta--; } if(running)render(); if(timer>1000000000) { timer=0; //System.out.println("ticks "+ticks); ticks=0; } } stop(); } private void render() { // TODO Auto-generated method stub BufferStrategy bs = this.getBufferStrategy(); if(bs==null) { this.createBufferStrategy(3); return; } Graphics g = bs.getDrawGraphics(); g.setColor(Color.BLACK); g.fillRect(0, 0, width, height); //length for(int i=0;i<=l;i++) { m[i]=py+i*10; map[i]=px; } //move move(); //snake g.setColor(Color.WHITE); for(int i=0;i<=l;i++) { System.out.println("----- normal "); System.out.println(map[0]+" "+m[0]+" "+map[1]+" "+m[1]+" "+map[2]+" "+m[2]+" "+map[3]+" "+m[3]); if(i==0)g.fillRect(map[i],m[i], 10, 10); else { g.drawString("score", map[i], m[i]); g.drawRect(map[i], m[i], 10, 10);} //check if(l==3) { System.out.println("----- in"); System.out.println(map[0]+" "+m[0]+" "+map[1]+" "+m[1]+" "+map[2]+" "+m[2]+" "+map[3]+" "+m[3]); //System.exit(1); } } //food g.setColor(Color.GREEN); g.drawRect(fx, fy, 8, 8); //score g.setColor(Color.GREEN); g.drawString("score: "+l, 400,50); //collision this.collision(); //game over if(px<=0||px>=440) { g.drawString("gameover", 250, 250); stop(); } if(py<=0||py>=450) { g.drawString("gameover", 250, 250); stop(); } g.dispose(); bs.show(); } public void collision() { Rectangle snake = new Rectangle(px,py,10,10); Rectangle food = new Rectangle(fx,fy,5,5); if(snake.intersects(food)) { l++; fx=r.nextInt(400)+1; fy=r.nextInt(420)+1; } } public void move() { if(l>=1) { for(int i=l;i>=1;i--) { map[i]=map[i-1]; m[i]=m[i-1]; } if (left) { map[0] -= 10; } if (right) { map[0] += 10; } if (up) { m[0] -= 10; } if (down) { m[0] += 10; } }} public void ticks() { if(up==true) { py-=2; } if(down==true) { py+=2; } if(left==true) { px-=2; } if(right==true) { px+=2; } // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); //System.out.println(key); if(e.getKeyCode()==KeyEvent.VK_S) { down=true; right=false; left=false; up=false; } if(e.getKeyCode()==KeyEvent.VK_W) { up=true; right=false; left=false; down=false; } if(e.getKeyCode()==KeyEvent.VK_A) { left=true; right=false; up=false; down=false; } if(e.getKeyCode()==KeyEvent.VK_D) { right=true; left=false; down=false; up=false; } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } }
CPallini
Что такое "окно" в вашем коде?