import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class competition01 extends JPanel
{
	ArrayList vermi;
	int vermeCorrente = 0;
	public competition01()
	{
		vermi = new ArrayList();
		addMouseListener( new MouseAdapter(){
			public void mousePressed(MouseEvent e) {
				// ad ogni click aggiungo un nuovo elemento in vermi
				vermi.add(new Verme()); }
			public void mouseReleased(MouseEvent e) {
				// ad ogni rilascio del mouse ho finito di creare il mio verme e lo faccio muovere..
				//((Verme)vermi.get(vermeCorrente)).muovi = true;
				//e incremento il vermeCorrente
				vermeCorrente++;
				}} );
		addMouseMotionListener( new MouseMotionAdapter(){
			public void mouseDragged(MouseEvent e) {
				Verme vCorrente = (Verme)vermi.get(vermeCorrente);
				vCorrente.addNodo(e.getX(), e.getY());
				}});
	}
	
	public void paint(Graphics g)
	{
		super.paintComponent(g);
		for (int k = 0; k < vermi.size(); k++)
		{
			Verme v = (Verme)vermi.get(k);
			v.mostraVerme(g, getWidth(), getHeight());
		}
		repaint();
	}
	
	public static void main(String[] args) 
	{ 
		JFrame f = new JFrame(); 
		f.setSize(300,300); 
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		f.add(new competition01()); 
		f.setVisible(true);
	}
}


class Verme
{
	// ogni punto si muove verso dove vuole ma devono rimanere sempre alla stessa distanza
	ArrayList nodi;
	boolean muovi = false;
	int x, y; // coordinate del sistema di riferimanto per TUTTO il verme
	int step = 1, VX = 1, VY = 1;
	Punto primoPunto = null;
	
	public Verme()
	{
		// inizializzo l'array che conterrā tutti i punti del verme
		nodi = new ArrayList();
	}
	
	public void addNodo(int x, int y) 
	{ 
		// aggiungo un punto al verme (lo utilizzo in mouseDragged)
		nodi.add(new Punto(x,y)); 
		if (primoPunto == null)
		{
			primoPunto = new Punto(x,y);
			this.x = x;
			this.y = y;
		}
	}

	public void mostraVerme(Graphics g, int w, int h)
	{
		// se la variabile muovi č vera, devo incrementare la posizione del verme
		if (muovi)
		{
			// muove il verme
			x += step*VX;
			y += step*VY;
			if (x < 0 || x > w) VX = VX*(-1);
			if (y < 0 || y > h) VY = VY*(-1);
		}
		// se ci sono almeno 2 punti nell'array di nodi...
		if (nodi.size() > 1)
			for (int k = 1; k < nodi.size(); k++)
			{
				//...allora li disegno facendo una linea dal punto precedente al punto corrente
				Punto pCorrente = (Punto)nodi.get(k);
				Punto pPrecedente = (Punto)nodi.get(k-1);
				g.drawLine(x + (int)pPrecedente.x - (int)primoPunto.x, y + (int)pPrecedente.y - (int)primoPunto.y, x + (int)pCorrente.x - (int)primoPunto.x, y + (int)pCorrente.y - (int)primoPunto.y);
				//g.fillOval(x + (int)pPrecedente.x - (int)primoPunto.x, y + (int)pPrecedente.y - (int)primoPunto.y,5,5);
			}
	}
}


class Punto
{
	float x,y;
	public Punto(int x, int y)
	{
		this.x = (float)x;
		this.y = (float)y;
	}
}
