R04_R.java_



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


public class Razona extends Canvas implements KeyListener
{
	boolean Inicio = true;
	int x_a, x_n, y, Movimiento = 0;
	Transporta B, Z, P, M;
	String LETRA;

	public Razona()
	{
        	addKeyListener(this);
		this.requestFocusInWindow();
	}
	
	void SecuenciaDeMovimiento()
	{
		// (Objeto_1, Objeto_2, Direccion)
		// true = derecha, false = izquierda
		B.CORRIENDO = true; Z.CORRIENDO = true;
		P.CORRIENDO = true; M.CORRIENDO = true;
		switch(Movimiento)
		{
			case 1:
				B.Positivo = true; new Thread(B).start();
				P.Positivo = true; new Thread(P).start();
				break;
			case 2:
				B.Positivo = false; new Thread(B).start();
				break;
			case 3:
				B.Positivo = true; new Thread(B).start();
				Z.Positivo = true; new Thread(Z).start();
				break;
			case 4:
				B.Positivo = false; new Thread(B).start();
				P.Positivo = false; new Thread(P).start();
				break;
			case 5:
				B.Positivo = true; new Thread(B).start();
				M.Positivo = true; new Thread(M).start();
				break;
			case 6:
				B.Positivo = false; new Thread(B).start();
				break;
			case 7:
				B.Positivo = true; new Thread(B).start();
				P.Positivo = true; new Thread(P).start();
				break;
			default:
				ALTO();
		}
	}

	public void paint(Graphics G)
	{
		if (Inicio)
		{
			G.setColor(Color.black);
			G.fillRect(0, 0, 570, 310);
			G.setColor(Color.yellow);
			G.drawLine(150, 10, 150, 280);
			G.drawLine(400, 10, 400, 280);
			G.drawString("B", 155, 30);
			G.drawString("Z", 155, 70);
			G.drawString("P", 155, 110);
			G.drawString("M", 155, 150);
			Inicio = false;
		}
		else
		{
			G.setColor(Color.black);  G.drawString(LETRA, x_a, y);
			G.setColor(Color.yellow); G.drawString(LETRA, x_n, y);
		}
	}

	public void update(Graphics G) { paint(G); }

	public void Imprime(int x_a, int x_n, int y, String LETRA)
	{
		this.x_a = x_a;
		this.x_n = x_n;
		this.y   = y;
		this.LETRA = LETRA;
		repaint();
	}

	public void keyTyped(KeyEvent e)   {}
	public void keyPressed(KeyEvent e) {}
	public void keyReleased(KeyEvent e)
	{
		String Tecla = e.getKeyText(e.getKeyCode());
		if (Tecla.equals("Introduzca"))	// Es el enter
		{
			if (B == null && Z == null && P == null && M == null)
			{
				// Transporta (pos_y, Objeto, referencia)
				B = new Transporta( 30, "B", this);
				Z = new Transporta( 70, "Z", this);
				P = new Transporta(110, "P", this);
				M = new Transporta(150, "M", this);
				Movimiento = 0;
			}
			Movimiento++;
			SecuenciaDeMovimiento();
		}
	}

	void ALTO()
	{
		if (B!= null) { B.CORRIENDO = false; B = null; }
		if (Z!= null) { Z.CORRIENDO = false; Z = null; }
		if (P!= null) { P.CORRIENDO = false; P = null; }
		if (M!= null) { M.CORRIENDO = false; M = null; }
		this.setVisible(false);
		Inicio = true;
	}
}

class Transporta extends Thread
{
	int xi = 155, xf = 390, xa, xn, y;	//
	Razona RAZONA;
	boolean CORRIENDO = false, Positivo = true;
	String Letra;

	public Transporta(int y, String Letra, Razona RAZONA)
	{
		this.y = y;
		this.Letra = Letra;
		this.RAZONA = RAZONA;
		this.xn = xi;
	}

	public void run( )
	{
		while(CORRIENDO)
		{
			try { Thread.sleep(50); }
			catch(InterruptedException r){}
			xa = xn;
			xn = (Positivo) ? xn+2 : xn-2;
			if (Positivo && xn>xf || !Positivo && xn<xi)
				CORRIENDO = false;
			RAZONA.Imprime(xa, xn, y, Letra);
		}
	}
}