Member 13554847 Ответов: 2

Как заставить змеиный хвост следовать за головой


Я разработал базовую игру змеи, и у меня есть ошибка. Змеиный хвост не следует за головой.Пожалуйста помогите ниже мой код

Что я уже пробовал:

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

Что такое "окно" в вашем коде?

2 Ответов

Рейтинг:
1

Patrice T

Я думаю, что вы хотите что-то вроде этого: Змеиный байт для 8-битного семейства Atari - YouTube[^]
В этом случае вы кодируете все неправильно.
вам нужно справиться с тем, что змея не может идти назад, она не может изменить свое направление, просто повернуться влево или вправо.

Цитата:
у меня есть ошибка. Змеиный хвост не следует за головой.

Вам нужно где-то хранить все тело змеи (положение каждой части тела)
Я бы использовал круговой буфер или битовую карту, содержащую карту уровней и переменные, чтобы запомнить, где находятся голова и хвост.


Рейтинг:
0

Member 13593068

окно представляет собой класс, который содержит код, форму.. Да, я хотел того же самого..
Спасибо Вам за помощь. Теперь это работает.. :))