Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Edgar_C

[Ajuda] Controlar um Robot

Mensagens Recomendadas

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!

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por Edgar_C

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por Edgar_C

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.