martes, 9 de diciembre de 2008

Robot TITO


Este Robot es capaz de salir solo de cualquier laberinto






Codigo Fuente

Robot

package bicho;

import java.awt.Image;

/**
*

Title: Bicho


*

Description: Es un Bicho inteligente


*

Copyright: Copyright (c) 2006


*

Company:


* @author Doglas A. Dembogurski
* @version 1.0
*/

public class Robot extends Elemento{

// Sensors
private Elemento norteSensor = new Elemento(true,0,0,null);
private Elemento surSensor = new Elemento(true,0,0,null);
private Elemento esteSensor = new Elemento(true,0,0,null);
private Elemento oesteSensor = new Elemento(true,0,0,null);
private Elemento norEsteSensor = new Elemento(true,0,0,null);
private Elemento surEsteSensor = new Elemento(true,0,0,null);
private Elemento surOesteSensor = new Elemento(true,0,0,null);
private Elemento norOesteSensor = new Elemento(true,0,0,null);


public Robot(Image img){
super(true,0,0,img);
}
public void setNorteSensor(Elemento norte){
this.norteSensor=norte;
}
public Elemento getNorteSensor(){
return this.norteSensor;
}
public void setSurSensor(Elemento sur){
this.surSensor=sur;
}
public Elemento getSurSensor(){
return this.surSensor;
}
public void setEsteSensor(Elemento este){
this.esteSensor=este;
}
public Elemento getEsteSensor(){
return this.esteSensor;
}
public void setOesteSensor(Elemento oeste){
this.oesteSensor=oeste;
}
public Elemento getOesteSensor(){
return this.oesteSensor;
}

public void setNorEsteSensor(Elemento norEste){
this.norEsteSensor=norEste;
}
public Elemento getNorEsteSensor(){
return this.norEsteSensor;
}

public void setNorOesteSensor(Elemento norOeste){
this.norOesteSensor=norOeste;
}
public Elemento getNorOesteSensor(){
return this.norOesteSensor;
}
public void setSurEsteSensor(Elemento surEste){
this.surEsteSensor=surEste;
}
public Elemento getSurEsteSensor(){
return this.surEsteSensor;
}
public void setSurOesteSensor(Elemento surOeste){
this.surOesteSensor=surOeste;
}
public Elemento getSurOesteSensor(){
return this.surOesteSensor;
}
}


Elemento

package bicho;

import java.awt.Image;

/**
*

Title: Bicho


*

Description: Es un Bicho inteligente


*

Copyright: Copyright (c) 2006


*

Company:


* @author Doglas A. Dembogurski
* @version 1.0
*/

public class Elemento {

private boolean transitable = true;
int posFila = 0;
int posCol = 0;


Image image = null;

public Elemento(boolean transitable, int posFila, int posCol, Image img) {
this.transitable= transitable;
this.posFila= posFila;
this.posCol=posCol;
this.image=img;
}

public void setTransitable(boolean transitable){
this.transitable= transitable;
}
public void setPosFila(int fila){
this.posFila=fila;
}
public void setPosCol(int col){
this.posCol=col;
}
public int getPosFila(){
return this.posFila;
}
public int getPosCol(){
return this.posCol;
}

public boolean isTransitable(){
return this.transitable;
}

public void setImage(Image imagen){
this.image=image;
}
public Image getImange(){
return this.image;
}


}

ULU

package bicho;
import javax.swing.*;
/**
*

Title: Bicho


*

Description: Es un Bicho inteligente


*

Copyright: Copyright (c) 2006


*

Company:


* @author Doglas A. Dembogurski
* @version 1.0
*/

public class ULU{

private int Umbral = 0;
private int pesoA = 0;
private int pesoB = 0;
private int pesoC = 0;
private ULU uluHija = null;
private boolean bitEntradaA = false;
private boolean bitEntradaB = false;
private boolean bitEntradaC = false;
private String nombre;

private String brazoHija = "none";


// Constructors
// 0 Patas
public ULU(){

}

// 1 pata
public ULU(int umbral,int pesoA){
this.Umbral = umbral;
this.pesoA = pesoA;
}

public boolean salida(boolean bitA){
this.bitEntradaA = bitA;
int senial = 0;
if(bitA){
senial = 1;
}
if((senial * pesoA) >= Umbral){
return true;
} else{
return false;
}
}

// 2 patas
public ULU(int umbral,int pesoA,int pesoB){
this.Umbral = umbral;
this.pesoA = pesoA;
this.pesoB = pesoB;
}

public boolean salida(boolean bitA,boolean bitB){
this.bitEntradaA = bitA;
this.bitEntradaB = bitB;
int senialA = 0;
int senialB = 0;
if(bitA){
senialA = 1;
}
if(bitB){
senialB = 1;
}
if(((senialA * pesoA) + (senialB * pesoB)) >= Umbral){
return true;
} else{
return false;
}
}

// 3 patas
public ULU(int umbral,int pesoA,int pesoB,int pesoC){
this.Umbral = umbral;
this.pesoA = pesoA;
this.pesoB = pesoB;
this.pesoC = pesoC;
}

public boolean salida(boolean bitA,boolean bitB,boolean bitC){
this.bitEntradaA = bitA;
this.bitEntradaB = bitB;
this.bitEntradaC = bitC;

int senialA = 0;
int senialB = 0;
int senialC = 0;
if(bitA){
senialA = 1;
}
if(bitB){
senialB = 1;
}
if(bitC){
senialC = 1;
}
if(((senialA * pesoA) + (senialB * pesoB) + (senialC * pesoC)) >= Umbral){
return true;
} else{
return false;
}
}
public void setSenialA(boolean senial){
this.bitEntradaA = senial;
}
public void setSenialB(boolean senial){
this.bitEntradaB = senial;
}
public void setSenialC(boolean senial){
this.bitEntradaC = senial;
}

// Sets
public void setUmbral(int umbral){
this.Umbral=umbral;
}
public void setPesoA(int pesoA){
this.pesoA=pesoA;
}
public void setPesoB(int pesoB){
this.pesoB=pesoB;
}
public void setPesoC(int pesoC){
this.pesoC=pesoC;
}
// Get pesos
public int getPesoA(){
return this.pesoA;
}
public int getPesoB(){
return this.pesoB;
}
public int getPesoC(){
return this.pesoC;
}

public void setNombre(String nombre){
this.nombre= nombre;
}
public String getNombre(){
return this.nombre;
}

public int getUmbral(){
return this.Umbral;
}


// Gets para las señales

public boolean getSenialA(){
return this.bitEntradaA;
}
public boolean getSenialB(){
return this.bitEntradaB;
}
public boolean getSenialC(){
return this.bitEntradaC;
}

public void setULUHija(ULU hija){
this.uluHija = hija;
}
public ULU getHija(){
return this.uluHija;
}


public void setBrazoHija(String abc){
this.brazoHija = abc;
}
public String getBrazoHija(){
return this.brazoHija;
}
}

Pantalla Principal
package bicho;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.HashMap;
import java.io.*;
import javax.imageio.ImageIO;

/**
*

Title: Bicho


*

Description: Es un Bicho inteligente


*

Copyright: Copyright (c) 2006


*

Company:


* @author Viviana Garcia- Sandra Flores - Doglas A. Dembogurski
* @version 1.0
*/

public class Pantalla extends JFrame{

int VELOCIDADDELBICHO = 150;
int ANCHO = 20;
int LARGO = 30;

int TITOCOLINI = 0;
int TITOFILAINI = 18;

int FILASALIDA = 18;
int COLSALIDA = 29;
String anterior = "";
String preferenciaDeGiro = "NORTE";
Elemento[][] elementos = new Elemento[ANCHO][LARGO];
Timer timer = null;
Robot tito = null;
HashMap memoriaDeTito = new HashMap();
int falseCounter = 0;

Image camino = null;
Image pared = null;
Image robot = null;
Image robot2 = null;
Image robotLuz = null;
Image robot2Luz = null;
int tamImagen = 22;

BorderLayout borderLayout1 = new BorderLayout();

public Pantalla(){
try{
jbInit();
} catch(Exception ex){
ex.printStackTrace();
}
}

void jbInit() throws Exception{
this.getContentPane().setLayout(borderLayout1);
try{
FileInputStream fis = new FileInputStream("Imagenes/Camino.gif");
camino = ImageIO.read(fis);
FileInputStream fisp = new FileInputStream("Imagenes/Pared.gif");
pared = ImageIO.read(fisp);
FileInputStream fisr = new FileInputStream("Imagenes/Robot.gif");
robot = ImageIO.read(fisr);
FileInputStream fisr2 = new FileInputStream("Imagenes/Robot2.gif");
robot2 = ImageIO.read(fisr2);

FileInputStream fisrl = new FileInputStream("Imagenes/RobotLuz.gif");
robotLuz = ImageIO.read(fisrl);
FileInputStream fisr2Luz = new FileInputStream("Imagenes/Robot2Luz.gif");
robot2Luz = ImageIO.read(fisr2Luz);

tito = new Robot(robot);
} catch(Exception e){
e.printStackTrace();
}
cargarArreglo();
configurarSensores();

super.paint(this.getGraphics());

}

public synchronized void paint(Graphics g){
Graphics grafico = (Graphics) g;
try{
int img = 120;
int jmg = 60;
for(int fila = 0; fila < ANCHO; fila++){
jmg += tamImagen;
for(int columna = 0; columna < LARGO; columna++){
Elemento elem = null;
try{
elem = (Elemento) elementos[fila][columna];
img += tamImagen;
grafico.drawImage(elem.getImange(),img,jmg,this);
} catch(Exception e){}
}
img = 120;
}
} catch(Exception ex){
System.out.println("Error en el metodo paint...");
ex.printStackTrace();
}
}

public synchronized void update(Graphics g){
paint(g);
}

public synchronized void mostrarMensaje(String s){
Graphics g = this.getGraphics();
g.setColor(Color.DARK_GRAY);
g.fill3DRect(140,540,655,30,true);
g.fill3DRect(140,20,655,55,true);
g.setColor(Color.ORANGE);
g.setFont(new java.awt.Font("Tahoma",1,14));
g.drawString(s,155,560);
g.drawString ("Ineligencia Artificial U.N.I. 2006)",340,48);
g.drawString("Robot Tito",410,67);
g.setFont(new Font("Tahoma",1,14));
g.setColor(Color.black);
g.drawString("<--- Salida",810,495);
g.drawString("Créditos",830,100);
g.drawString("Viviana García",830,130);
g.drawString("Sandra Flores",830,160);
g.drawString("Douglas Dembogurski",830,190);
}

public synchronized void configurarSensores(){
try{
int fila = tito.getPosFila();
int col = tito.getPosCol();
tito.setNorteSensor(elementos[fila - 1][col]);
tito.setEsteSensor(elementos[fila][col + 1]);
tito.setSurSensor(elementos[fila + 1][col]);
tito.setOesteSensor(elementos[fila][col - 1]);
tito.setNorEsteSensor(elementos[fila - 1][col + 1]);
tito.setSurEsteSensor(elementos[fila + 1][col + 1]);
tito.setSurOesteSensor(elementos[fila + 1][col - 1]);
tito.setNorOesteSensor(elementos[fila - 1][col - 1]);
} catch(Exception ex){
System.out.println("Hay pared...");
}
}

private void cargarArreglo(){
for(int i = 0; i < ANCHO; i++){
for(int j = 0; j < LARGO; j++){
if(((i == 0) || (i == ANCHO - 1)) || (j == 0) || (j == LARGO - 1)){
elementos[i][j] = new Elemento(false,i,j,pared);
elementos[i][j].setTransitable(false);
} else{
elementos[i][j] = new Elemento(true,i,j,camino);
}
}
}
ponerObstaculos();
tito.setPosFila(TITOFILAINI);
tito.setPosCol(TITOCOLINI);
tito.setImage(robot);
elementos[TITOFILAINI][TITOCOLINI] = tito;
memoriaDeTito.put("FILA" + TITOFILAINI + "COL" + TITOCOLINI,"FILA" + TITOFILAINI + "COL" + TITOCOLINI);
}

public void ponerObstaculos(){
// filas Cols

dibujarParedHorizontal(1,30,10);
dibujarParedVertical(1,20,9);
dibujarParedVertical(1,20,20);
dibujarCamino(14,9);
dibujarParedHorizontal(5,10,13);
dibujarParedHorizontal(5,10,15);
dibujarCamino(10,15);
dibujarParedVertical(4,10,14);
dibujarParedVertical(4,10,16);
dibujarCamino(1,9);
dibujarCamino(1,20);
dibujarParedHorizontal(10,20,2);
dibujarCamino(7,9);
dibujarCamino(10,21);
dibujarCamino(10,22);
dibujarParedVertical(10,20,13);
dibujarUnLadrillo(17,12);
dibujarCamino(18,13);
dibujarParedVertical(13,17,13);
dibujarUnLadrillo(12,5);
dibujarUnLadrillo(4,13);
dibujarUnLadrillo(4,12);
dibujarParedVertical(5,9,12);
dibujarUnLadrillo(8,11);
dibujarCamino(2,18);
dibujarUnLadrillo(1,20);
dibujarCamino(4,20);
dibujarParedHorizontal(20,29,5);
dibujarParedHorizontal(2,8,8);
dibujarParedVertical(4,8,2);
dibujarUnLadrillo(4,1);
dibujarParedVertical(12,18,11);
dibujarParedVertical(1,7,4);
dibujarParedVertical(1,3,2);
dibujarParedHorizontal(5,9,6);
dibujarUnLadrillo(2,5);
dibujarUnLadrillo(2,6);
dibujarUnLadrillo(2,8);
dibujarCamino(18,20);
dibujarParedVertical(4,9,18);
dibujarUnLadrillo(4,17);
dibujarParedVertical(12,19,22);
dibujarParedVertical(3,7,10);
dibujarCamino(3,9);
dibujarCamino(4,9);
dibujarCamino(5,9);
dibujarParedHorizontal(6,9,4);
dibujarCamino(18,29);
dibujarUnLadrillo(15,4);
dibujarParedVertical(12,16,3);
dibujarUnLadrillo(12,4);
dibujarParedHorizontal(3,8,17);
dibujarUnLadrillo(16,7);
dibujarCamino(15,8);
dibujarParedHorizontal(15,19,12);
dibujarParedHorizontal(15,20,14);
dibujarParedHorizontal(15,16,16);
dibujarParedHorizontal(18,19,16);
dibujarParedHorizontal(15,20,17);
dibujarParedHorizontal(21,23,10);
dibujarCamino(5,28);
dibujarParedHorizontal(22,28,7);
dibujarUnLadrillo(9,22);
dibujarUnLadrillo(9,27);
dibujarUnLadrillo(8,25);
dibujarUnLadrillo(9,24);
dibujarParedVertical(11,16,24);
dibujarParedHorizontal(24,29,17);
dibujarParedHorizontal(22,27,3);
dibujarParedVertical(2,5,27);
dibujarParedVertical(13,17,1);
}

private void dibujarParedHorizontal(int colIni,int colFin,int fila){
for(int i = colIni; i < colFin; i++){
dibujarUnLadrillo(fila,i);
}
}

private void dibujarParedVertical(int filaIni,int filaFin,int col){
for(int i = filaIni; i < filaFin; i++){
dibujarUnLadrillo(i,col);
}
}

private void dibujarUnLadrillo(int posFila,int posCol){
elementos[posFila][posCol] = new Elemento(false,posFila,posCol,pared);
}

private void dibujarCamino(int posFila,int posCol){
elementos[posFila][posCol] = new Elemento(true,posFila,posCol,camino);
}

public void movimientoDelRobot(){
timer = new javax.swing.Timer(VELOCIDADDELBICHO,new ActionListener(){
public void actionPerformed(ActionEvent evt){
moverRobot(); //mover el robotito
}
});
}

public void moverRobot(){
if(preferenciaDeGiro.equals("NORTE")){
if(moverAlNorte()){
if(verificarSiTodosSonTransitables()){
preferenciaDeGiro = "NORTE";
} else{
preferenciaDeGiro = "OESTE";
}
} else{
preferenciaDeGiro = "ESTE";
}
} else if(preferenciaDeGiro.equals("ESTE")){
if(moverAlEste()){
preferenciaDeGiro = "NORTE";
} else{
preferenciaDeGiro = "SUR";
}
} else if(preferenciaDeGiro.equals("SUR")){
if(moverAlSur()){
preferenciaDeGiro = "ESTE";
} else{
preferenciaDeGiro = "OESTE";
}
} else if(preferenciaDeGiro.equals("OESTE")){
if(moverAlOeste()){
preferenciaDeGiro = "SUR";
} else{
preferenciaDeGiro = "NORTE";
}
}
if(falseCounter >= 4){
falseCounter = 0;
memoriaDeTito = new HashMap();
preferenciaDeGiro = "NORTE";
System.err.println("Limpiando memoria demasiadas indeciciones....");
this.mostrarMensaje("Ahora si que me voy de aqui...");
}
if(falseCounter == 2){
this.mostrarMensaje("Estoy a pensando hacia donde moverme...");
}
configurarSensores();
//imprimirArreglo();
paint(this.getGraphics());
}

private boolean moverAlNorte(){
if(((tito.getNorteSensor().isTransitable() && tito.getNorEsteSensor().isTransitable()) &&
tito.getSurSensor().isTransitable() && !anterior.equals("NORTE")) ||
(tito.getNorteSensor().isTransitable() && tito.getNorEsteSensor().isTransitable()) &&
!tito.getOesteSensor().isTransitable() || tito.getNorteSensor().isTransitable()){
// Mover al Norte
// Si no esta en la memoria me muevo si esta no me muevo
boolean mover = moverParaAlgunLado(false,true,robot,"SUR");this.mostrarMensaje("Me voy para arriba...");
if(verificarSiTodosSonTransitables()){
preferenciaDeGiro = "NORTE";
}
falseCounter--;
return mover;

}
falseCounter++;
return false;
}

private boolean moverAlEste(){
if((((tito.getEsteSensor().isTransitable() && tito.getSurEsteSensor().isTransitable() &&
tito.getOesteSensor().isTransitable()) && !anterior.equals("ESTE")) ||
(tito.getEsteSensor().isTransitable() && tito.getSurEsteSensor().isTransitable() &&
!tito.getNorteSensor().isTransitable())) ||
(tito.getEsteSensor().isTransitable() && !tito.getNorEsteSensor().isTransitable()) ||
tito.getEsteSensor().isTransitable()){
// Mover al este
this.mostrarMensaje("El Este es mi Norte!!!");
return moverParaAlgunLado(true,false,robot2,"OESTE");
}
falseCounter++;
return false;
}

private boolean moverAlSur(){
if((tito.getSurSensor().isTransitable() && tito.getSurOesteSensor().isTransitable() &&
tito.getNorteSensor().isTransitable() && !anterior.equals("SUR")) ||
(tito.getSurSensor().isTransitable() && tito.getSurOesteSensor().isTransitable() &&
!tito.getEsteSensor().isTransitable()) || tito.getSurSensor().isTransitable()){
// Mover al Sur
return moverParaAlgunLado(true,true,robotLuz,"NORTE");
}
falseCounter++;
return false;
}

private boolean moverAlOeste(){
if((tito.getOesteSensor().isTransitable() && tito.getNorOesteSensor().isTransitable() &&
tito.getEsteSensor().isTransitable() && !anterior.equals("OESTE")) ||
(tito.getOesteSensor().isTransitable() && tito.getNorOesteSensor().isTransitable() &&
!tito.getSurSensor().isTransitable()) || tito.getOesteSensor().isTransitable()){
// Mover al Oeste
this.mostrarMensaje("Reversa reversa reversa...");
return moverParaAlgunLado(false,false,robot2Luz,"ESTE");
}
falseCounter++;
return false;
}

private boolean moverParaAlgunLado(boolean sumar,boolean filas,Image robotImage,String anter){
try{
int fila = tito.getPosFila();
int col = tito.getPosCol();
if(sumar){
if(filas){
fila = tito.getPosFila() + 1;
} else{
col = tito.getPosCol() + 1; // Hacia donde me voy a mover
}
} else{
if(filas){
fila = tito.getPosFila() - 1;
} else{
col = tito.getPosCol() - 1;
}
}
if(checkearMemoria(fila,col)){ // Si esta en la memoria devuelve true
falseCounter++;
return false;
} else{ // Me muevo
elementos[fila][col] = new Robot(robotImage);
elementos[tito.getPosFila()][tito.getPosCol()] = new Elemento(true,tito.getPosFila(),tito.getPosCol(),
camino);
if(filas){
tito.setPosFila(fila);
} else{
tito.setPosCol(col);
}
anterior = anter;
memoriaDeTito.put("FILA" + fila + "COL" + col,"FILA" + fila + "COL" + col);
falseCounter--;
verificarSiEsSalida(fila,col); // Veo si no es la salida...
return true;
}
} catch(Exception ex){
return false;
}
}

private boolean checkearMemoria(int fila,int col){ // Aqui quiero saltar
try{
String s = memoriaDeTito.get("FILA" + fila + "COL" + col).toString();
if(s != null){
this.mostrarMensaje("Upsss!!! por aqui ya he pasado...");
return true;
}
return false;
} catch(Exception ex){
return false;
}
}

private void verificarSiEsSalida(int fila,int col){
if((fila == FILASALIDA) && (col == COLSALIDA)){
this.mostrarMensaje("No hay lugar de donde yo no pueda salir...");
try{
Thread.sleep(5000);
this.mostrarMensaje("Bueno ya ven que puedo salir ahora me voy de vuelta...");
Thread.sleep(5000);
} catch(InterruptedException ex){
}

//timer.stop();
}

}

private boolean verificarSiTodosSonTransitables(){
if(tito.getNorteSensor().isTransitable() && tito.getNorEsteSensor().isTransitable() &&
tito.getEsteSensor().isTransitable() && tito.getSurEsteSensor().isTransitable()
&& tito.getSurSensor().isTransitable() && tito.getSurOesteSensor().isTransitable() &&
tito.getOesteSensor().isTransitable() && tito.getNorOesteSensor().isTransitable()){
return true;
} else{
return false;
}
}

public void iniciarMovimiento(){
movimientoDelRobot();
timer.start();
}

public static void main(String[] args){
Pantalla p = new Pantalla();
p.setVisible(true);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
p.setSize(dim.getSize());
p.iniciarMovimiento();
}
}

1 comentario:

sPohlmann dijo...

Andá a conseguir una aplicación que te indente el código en tu HTML. Quedará mejor para mirar.

Saludos!!!