Jump to content
Edgar_C

[Ajuda] Controlar um Robot

Recommended Posts

Edgar_C

Boas pessoal!

Ando com uns problemas a programar a JAVA e fiz um pseudo-código, mas não estou a conseguir passar para código.

Se alguém me pudesse dar umas luzes.

package pt.ulht.fp.curiosity.core;

import java.util.Random;

import pt.ulht.fp.curiosity.RobotController;
import pt.ulht.fp.curiosity.Simulator;
import pt.ulht.fp.curiosity.Simulator.Map;
import pt.ulht.fp.curiosity.Simulator.Speed;

public class Curiosity {
static int linhaactual;
static int colunaactual;
public static void configLandingSite(int line, int column, int numLines,
int numColumns) {
//Inicializa estado do robot
colunaactual = column;
linhaactual = line;
System.out.println("A Posição inicial é"+ colunaactual +"," + linhaactual);


}

public static void controlRobot() {
int energia = RobotController.getEnergy();
System.out.println(energia);
if(RobotController.senseEnergy()){
System.out.println("Bateria");
RobotController.recharge();

}
else if(RobotController.senseWall()){
System.out.println("Parede");



}
else if(RobotController.senseSpace()){
RobotController.move();
}

if (RobotController.senseSpace()) {
RobotController.move();
}
else {
Random rnd = new Random();
int n = rnd.nextInt(3);
if (n == 0) {
RobotController.turnLeft();
} else if (n == 1) {
RobotController.turnRight();
}

}
}

public static void transmitState(String filename) {
//Escrever estado para ficheiro filename passado como argumento
}

public static void main(String[] args) {
//Experimentar Map.WORLD01 Map.WORLD02 Map.WORLD03 Map.WORLD04 Map.WORLD05
//e as velocidades Speed.SLOW Speed.NORMAL Speed.FAST
Simulator.run(Map.WORLD05, Speed.NORMAL);
}
}

tenho as seguintes operações para movimentar o robot:

void RobotController.move()- Avança uma unidade, caso exista um obstáculo, o robot fica destruído e a missão comprometida.

boolean RobotController.senseSpace()- Devolve Verdadeiro ou Falso caso exista ou não um espaço à frente do robot

boolean RobotController.senseWall()- Devolve Verdadeiro ou Falso caso exista ou não uma parede à frente do robot.

boolean RobotController.senseEnergy()- Devolve Verdadeiro ou Falso caso exista ou não uma fonte de energia à frente do robot.

boolean RobotController.recharge()- Devolve verdadeiro ou falso caso o robot consiga recarregar ou não.

int RobotController.getEnergy()- Ddevolve um nº inteiro referente à energia disponivel na bateria do robo

void RobotController.turnLeft()- o robot fica na mesma posição mas vira 90º para a esquerda.

void RobotController.turnRight()- o robot fica na mesma posição mas vira 90º para a direita.

Não estou a conseguir criar o seguinte:

1º detectar o q tem á frente:

  • se tiver um espaço livre á frente- move-se.
  • Se tiver uma parede á frente(vira até encontrar um espaço livre e move-se)
  • Se tiver uma fonte de energia( recarrega e encontra um espaço livre e move-se)

Mas tenho energia limitada!

Edited by apocsantos
geshi

Share this post


Link to post
Share on other sites
HappyHippyHippo

se tiver um espaço livre á frente- move-se.

- boolean RobotController.senseSpace()

- void RobotController.move()

Se tiver uma parede á frente(vira até encontrar um espaço livre e move-se)

- boolean RobotController.senseWall()

- void RobotController.turnLeft()

- void RobotController.move()

Se tiver uma fonte de energia( recarrega e encontra um espaço livre e move-se)

- boolean RobotController.senseEnergy()

- void RobotController.move()

- void RobotController.turnLeft()

- boolean RobotController.senseSpace()

agora puxa um bocadito pela cabeça porque na realidade tens a papinha toda feita ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

else if(RobotController.senseSpace()==false){
while(RobotController.senseSpace()==false){
RobotController.turnLeft();
RobotController.senseSpace();
}
}

Enquanto não houver espaço vai virar para a esquerda até que haja um espaço livre. Há forma de melhorar isto? Assim vai virar sempre para a esquerda enquanto que virar para a direita pode ser mais rápido.

E outra coisa, ele vai ter que guardar os passos todos num ficheiro, como consigo que ele memorize por onde já passou e não volte a passar pelo mesmo sítio?

Share this post


Link to post
Share on other sites
HappyHippyHippo

Enquanto não houver espaço vai virar para a esquerda até que haja um espaço livre. Há forma de melhorar isto? Assim vai virar sempre para a esquerda enquanto que virar para a direita pode ser mais rápido.

como só tens maneira de saber esse tipo de informação somente à frente, a resposta é : não, não existe outra forma.

E outra coisa, ele vai ter que guardar os passos todos num ficheiro, como consigo que ele memorize por onde já passou e não volte a passar pelo mesmo sítio?

existe vários métodos em que muitos deles passam por terem em memória algum tipo de estrutura com os estado de cada posição. no entanto o melhor é fazeres o exercício inicial e deixares isso para depois porque não é um processo simples


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

Já consegui controlar o robot mais ou menos, só me falta mesmo é que ele não volte a passar pelos mesmo sítios.

public static void controlRobot() {
int energia = RobotController.getEnergy();
System.out.println(energia);

if(RobotController.senseEnergy()){
System.out.println("Bateria");
RobotController.recharge();
RobotController.turnLeft();
RobotController.senseSpace();
if(RobotController.senseSpace()==true){
RobotController.move();

}

}

else if(RobotController.senseWall()){
System.out.println("Parede");
if(RobotController.senseWall()==true){
RobotController.turnRight();
RobotController.senseWall();
}
else if(RobotController.senseWall()==false){
RobotController.move();
}

}

if(RobotController.senseSpace()){
RobotController.move();
}

Mesmo assim parece-me bastante rudimentar.

no

public static void transmitState(String filename) {

//Escrever estado para ficheiro filename passado como argumento

tenho que criar um ficheiro log das decisões/operações do robot até ao momento que fica sem energia.

X- representa parede

?- desconhecido

!- energia

(espaço) - espaço

Podia criar uma memória em que ele gravasse as coordenadas(linha, coluna) e não voltasse a passar por esse sítio. Mas como? Tendo um mapa desconhecido que vou ter que descobrir. Peço desculpa por estar a incomodar mas estou mesmo com dúvidas!

Edited by apocsantos

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mesmo assim parece-me bastante rudimentar.

porque, na realidade, o exercício também o é

no

public static void transmitState(String filename) {

//Escrever estado para ficheiro filename passado como argumento

tenho que criar um ficheiro log das decisões/operações do robot até ao momento que fica sem energia.

X- representa parede

?- desconhecido

!- energia

(espaço) - espaço

Podia criar uma memória em que ele gravasse as coordenadas(linha, coluna) e não voltasse a passar por esse sítio. Mas como? Tendo um mapa desconhecido que vou ter que descobrir. Peço desculpa por estar a incomodar mas estou mesmo com dúvidas!

como esperas gravar no ficheiro essa informação ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

Sempre que ele detectar uma parede "escreve" o símbolo correspondente no ficheiro. Mas não sei como fazer o ficheiro nem como passar para o ficheiro a informação.

Share this post


Link to post
Share on other sites
Edgar_C

Para criar o ficheiro se calhar algo do género:

1 import java.io.PrintWriter;
2 import java.io.FileOutputStream;
3 import java.io.FileNotFoundException;
4 public class TextFileOutputDemo
5 {
6 public static void main(String[] args)
7 {
8 PrintWriter outputStream = null;
9 try
10 {
11 outputStream =
12 new PrintWriter(new FileOutputStream("stuff.txt"));
13 }
14 catch(FileNotFoundException e)
15 {
16 System.out.println("Error opening the file stuff.txt.");
17 System.exit(0);
18 }
19 System.out.println("Writing to file.");-
20 outputStream.println("The quick brown fox");
21 outputStream.println("jumped over the lazy dog.");
22 outputStream.close();
23 System.out.println("End of program.");
24 }
25 }

ou não?

e no print's tenho é que colocar a informação que ele recebe acerca de cada passo que dá(se é parede, espaço ou energia)

Share this post


Link to post
Share on other sites
Edgar_C

Criei um array multidimensional mas as coordenadas estão-me a dar mal.

Aqui deixo o código todo

package pt.ulht.fp.curiosity.core;

import java.util.Random;

import pt.ulht.fp.curiosity.RobotController;
import pt.ulht.fp.curiosity.Simulator;
import pt.ulht.fp.curiosity.Simulator.Map;
import pt.ulht.fp.curiosity.Simulator.Speed;

public class Curiosity {
static int linhaactual;
static int colunaactual;
static int comprimento;
static int largura;
static int [][] coordenadas= new int [comprimento][largura];
public static void configLandingSite(int line, int column, int numLines,
int numColumns) {
//Inicializa estado do robot
colunaactual = column;
linhaactual = line;
comprimento= numLines;
largura = numColumns;
System.out.println("A Posição inicial é"+ colunaactual +"," + linhaactual);

}

public static void controlRobot() {
int energia = RobotController.getEnergy();
System.out.println(energia);

if(RobotController.senseEnergy()){
System.out.println("Bateria");
RobotController.recharge();
RobotController.turnRight();
RobotController.senseSpace();
if(RobotController.senseSpace()==true){
RobotController.move();
System.out.println("coordenada actual"+ linhaactual+","+colunaactual);
}
else if(RobotController.senseSpace()==false){
RobotController.turnRight();
RobotController.senseSpace();
}

}

if(RobotController.senseWall()){
System.out.println("Parede");
if(RobotController.senseWall()==true){
RobotController.turnRight();
RobotController.senseWall();
}
else if(RobotController.senseWall()==false){
RobotController.move();
System.out.println("coordenada actual"+ linhaactual+","+colunaactual);
}
}

if(RobotController.senseSpace()){
RobotController.move();
System.out.println("coordenada actual"+ linhaactual+","+colunaactual);
}
}

public static void transmitState(String filename) {
//Escrever estado para ficheiro filename passado como argumentos
}

public static void main(String[] args) {
//Experimentar Map.WORLD01 Map.WORLD02 Map.WORLD03 Map.WORLD04 Map.WORLD05
//e as velocidades Speed.SLOW Speed.NORMAL Speed.FAST
Simulator.run(Map.WORLD05, Speed.NORMAL);
}
}

Acho que o que está a falhar é , como é que o robot lê as coordenadas à medida que se move!

Edited by Edgar_C

Share this post


Link to post
Share on other sites
HappyHippyHippo
static int comprimento;  // <-------------------------------------- que valor tem esta variável ?
static int largura;      // <-------------------------------------- que valor tem esta variável ?
static int [][] coordenadas= new int [comprimento][largura]; // <-- que tamanho do array terás ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

o tamanho do comprimento é o tamanho de colunas que o mapa terá.

largura é o tamanho das linhas que o mapa terá.

Eu só tenho que fazer o código independentemente do nº de linhas ou colunas. Até porque o mapa só me será dado depois.

O Tamanho do array dependerá disso ou não? é para armazenar cada coordenada!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Eu só tenho que fazer o código independentemente do nº de linhas ou colunas. Até porque o mapa só me será dado depois.

então um array multidimensional só é solução se implementares métodos de redimensionamento do array multidimensional com persistência dos dados. qualquer outra estrutura e bem mais complicada, e como não sei o teu nível de conhecimentos em estruturas de dados, apresentar soluções mais complexas é fazer pior que melhor

como disse, este ponto é vários níveis mais complicado do que os outros pontos.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

É reduzido, só comecei a programar à cerca de 1 mês. Nem sei bem o que fazer com isto. Obrigado pela Ajuda.

Share this post


Link to post
Share on other sites
HappyHippyHippo

bem como é Java, cria uma classe que manuseie essa informação

public class Map
{
 public static final int CHUNK_SIZE 32;

 protected int map[][];
 protected int length;
 protected int height;

 protected int robot_pos_x;
 protected int robot_pos_y;

 public Map()
 {
   this.map = int[CHUNK_SIZE][CHUNK_SIZE];
   this.length = CHUNK_SIZE;
   this.height = CHUNK_SIZE;

   this.robot_pos_x = CHUNK_SIZE / 2;
   this.robot_pos_y = CHUNK_SIZE / 2;
 }

 public void setWall(int x, int y)
 {
   if (x < 0 || x >= this.width)
     resize_width();

   if (y < 0 || y >= this.height)
     resize_height();

   // do whatever ...
 }

 // ... all the functions needed ...

 protected void resize_width()
 {
   // create a new multidimensional array with a bigger width
   // copy the old data to the new multidimensional array

   // reposition/update the robot world position
 }

 protected void resize_height()
 {
   // create a new multidimensional array with a bigger height
   // copy the old data to the new multidimensional array

   // reposition/update the robot world position
 }
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Edgar_C

public enum Objectos { Espaço, parede,estacaoenergia,desconhecido}
static Objectos [][]= Map.WORLD05; 
ou 
static Oobjectos[][]= MapadoRobot;

Queria colocar os objectos a um qualquer mapa, como consigo fazer?

Share this post


Link to post
Share on other sites
Edgar_C

package pt.ulht.fp.curiosity.core;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;

import pt.ulht.fp.curiosity.RobotController;
import pt.ulht.fp.curiosity.Simulator;
import pt.ulht.fp.curiosity.Simulator.Map;
import pt.ulht.fp.curiosity.Simulator.Speed;

public class Curiosity {

static int linhaActual, colunaActual, totalLinhas, totalColunas, orientacaoActual;
static char [][] mapa;
private static Writer fstream;

public static void configLandingSite(int line, int column, int numLines,
int numColumns) {

line = linhaActual;
column = colunaActual;
numLines = totalLinhas;
numColumns = totalColunas;

mapa = new char [numLines][numColumns];
int x=0, y=0;
for (;x<numLines;x++){
for (;y<numColumns;y++){
if (mapa [x--][y]==mapa [x] [y])
{
mapa [x] [y]='X';
}
else if (mapa[x] [y--]==mapa [x][y]) {
mapa [x][y]='X';
}
else {
mapa [x][y]='?';
}
}
}
System.out.println("Comecou na linha " + linhaActual);
System.out.println("Comecou na coluna " + colunaActual);
System.out.println("Numero de linhas iniciais " + totalLinhas);
System.out.println("Numero de colunas iniciais " + totalColunas);
}

public static void controlRobot() {
if (RobotController.senseEnergy()){
if(RobotController.senseEnergy()==true){
RobotController.recharge();
System.out.println("Bateria Carregada");
}
}
if (RobotController.senseSpace()) {
RobotController.move();
} else {
Random rnd = new Random();
int orientacaoActual = rnd.nextInt(3);
if (orientacaoActual == 0) {
RobotController.turnLeft();
orientacaoActual=3;
} else if (orientacaoActual == 1) {
RobotController.turnRight();
orientacaoActual=2;
}else if(orientacaoActual == 2){
RobotController.turnRight();
orientacaoActual=1;
}
}
}

public static void transmitState(String ficheiro)
{
//Escrever estado para ficheiro filename passado como argumento
try{
FileWriter writer = new FileWriter("ficheiro.txt");
BufferedWriter out = new BufferedWriter(fstream);
String Mapa = "";
for (int x = 0; x < totalLinhas; ++x){
for (int y = 0; y < totalColunas; ++y){
// escrever todos o tabuleiro de jogo na string mapa
Mapa += mapa[x][y];
}
// para mudar de linha
Mapa += "\n";
}
// escrever no ficheiro
out.write(Mapa);
// fechar a stream
out.close();
}
catch (Exception e)
{// apanhar excepcao caso aconteça algum erro com
// o ficheiro
System.err.println("Error: " + e.getMessage());
}




}
public static void main(String[] args) {
//Experimentar Map.WORLD01 Map.WORLD02 Map.WORLD03 Map.WORLD04 Map.WORLD05
//e as velocidades Speed.SLOW Speed.NORMAL Speed.FAST
Simulator.run(Map.WORLD05, Speed.NORMAL);
}
}package pt.ulht.fp.curiosity.core;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

import pt.ulht.fp.curiosity.RobotController;
import pt.ulht.fp.curiosity.Simulator;
import pt.ulht.fp.curiosity.Simulator.Map;
import pt.ulht.fp.curiosity.Simulator.Speed;

public class Curiosity {
static int linhaactual;
static int colunaactual;
public enum Objectos { Espaço, parede,estacaoenergia,desconhecido}

public enum pontos { Norte,Sul,Este,Oeste}
static pontos direccaodoRobot;
static int linhafrente;
static int colunafrente;

static Objectos [][] mapa;
public static void Esquerda(){
RobotController.turnLeft();
switch(direccaodoRobot){
case Norte: direccaodoRobot= pontos.Oeste;break;
case Sul: direccaodoRobot= pontos.Este;break;
case Este: direccaodoRobot=pontos.Norte;break;
case Oeste: direccaodoRobot= pontos.Sul;break;
}
}
public static void Direita(){
RobotController.turnRight();
switch(direccaodoRobot){
case Norte: direccaodoRobot= pontos.Este;break;
case Sul: direccaodoRobot= pontos.Oeste;break;
case Este: direccaodoRobot= pontos.Sul;break;
case Oeste: direccaodoRobot= pontos.Norte;break;
}
}
public static boolean senseEspaço(){
boolean spaceInFront = RobotController.senseSpace();
storeObject(Objectos.Espaço, computeFrontLine);
return(spaceInFront);
}


public static void configLandingSite(int line, int column, int numLines,
int numColumns) {
//Inicializa estado do robot
direccaodoRobot= pontos.Norte;
colunaactual = column;
linhaactual = line;
linhafrente= line;
colunafrente=column;
System.out.println("A Posição actual "+ linhaactual+","+ colunaactual);

}

public static void controlRobot() {
int energia = RobotController.getEnergy();
System.out.println(energia);

if(RobotController.senseEnergy()==true){
System.out.println("Bateria");
RobotController.recharge();
Esquerda();
RobotController.senseSpace();
if(RobotController.senseSpace()==true){
RobotController.move();

}
else if(RobotController.senseSpace()==false){
Esquerda();
RobotController.senseSpace();
}

}

if(RobotController.senseWall()){
System.out.println("Parede");
if(RobotController.senseWall()==true){
Esquerda();
RobotController.senseWall();

}
else if(RobotController.senseWall()==false){
RobotController.move();


}
}

if (RobotController.senseSpace()) {
RobotController.move();

} else {
Random rnd = new Random();
int n = rnd.nextInt(3);
if (n == 0) {
RobotController.turnLeft();
} else if (n == 1) {
RobotController.turnRight();

}


}}

public static void transmitState(String filename) {
//Escrever estado para ficheiro filename passado como argumentos


}


public static void main(String[] args) {
//Experimentar Map.WORLD01 Map.WORLD02 Map.WORLD03 Map.WORLD04 Map.WORLD05
//e as velocidades Speed.SLOW Speed.NORMAL Speed.FAST
Simulator.run(Map.WORLD05, Speed.NORMAL);
}
}

Está cada vez mais atrapalhado :D

Edited by Edgar_C

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.