Estou desenvolvendo um programa POO em java que consiste em uma matriz com uns veiculos se movendo para lados aleatoriamente.
Minha duvida é , como mover o objeto na matriz de uma forma aleatória e como fazer para eles nao se moverem pra mesma posição ao invés de irem para o mesmo lado juntos.
Sim mas assim , to com dificuldade na funçao mover mesmo , sei que posso utilizar o eixo x por exemplo pra ir pra direita ou esquerda subtraindo ou somando uma posição,mesma coisa com o y pra ir pra cima ou pra baixo.
/**
* @author itamar
*/
public class CarsGame {
public static final int CYCLES = 100;
public static final int COLS = 40;
public static final int ROWS = 20;
private Set<Car> cars;
private Random randomiser;
private void doIt() throws InterruptedException {
printBoard("INITIAL STATE");
for (int i = 0; i < CYCLES; i ++) {
cars.forEach(e -> e.move(Direction.values()[randomiser.nextInt(4)], this::isEmptyPosition));
printBoard(String.format("Cycle %d", i));
Thread.sleep(500);
}
}
private boolean isEmptyPosition(Position position) {
if (position.getX() < 0 || position.getY() < 0) {
return false;
}
if (position.getY() >= ROWS || position.getX() >= COLS) {
return false;
}
return !cars.stream()
.anyMatch(e -> e.getPosition().equals(position));
}
private void printBoard(String header) {
System.out.println();
System.out.println(header);
String bar = String.format("%1$" + (COLS + 2) + "s", "").replace(' ', '-');
System.out.println(bar);
for (int row = 0; row < ROWS; row++) {
int finalRow = row;
Map<Integer, String> carsInRow = cars.stream() // Column is key and id is value
.filter(e -> e.getPosition().getX() == finalRow)
.collect(Collectors.toMap(e -> e.getPosition().getY(), e -> Integer.toString(e.getId())));
if (carsInRow.isEmpty()) { // If there are no cars, just print blank spaces and continue
System.out.println(String.format("|%1$" + COLS + "s|", ""));
continue;
}
// Else we have to print the car ids
System.out.print("|");
for (int col = 0; col < COLS; col++) {
System.out.print(carsInRow.getOrDefault(col, " "));
}
System.out.println("|");
}
System.out.println(bar);
System.out.println();
}
private CarsGame() {
cars = IntStream.range(0, 5)
.mapToObj(e -> new Car(e, new Position(0, e)))
.collect(Collectors.toSet());
randomiser = new Random();
}
class Car {
private final int id;
private Position position;
public Car(int id, Position position) {
this.position = position;
this.id = id;
}
public boolean move(Direction direction, Function<Position, Boolean> constraints) {
Position newPosition = position.movingTo(direction, 1); // 1 by 1 for now to keep it simple
if (constraints.apply(newPosition)) {
position = newPosition;
return true;
}
return false;
}
public int getId() {
return id;
}
public Position getPosition() {
return position;
}
}
class Position {
private int x;
private int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Position movingTo(Direction direction, int by) {
if (EnumSet.of(Direction.UP, Direction.LEFT).contains(direction)) {
by *= -1; // For left or up, we're decreasing the value
}
if (EnumSet.of(Direction.UP, Direction.DOWN).contains(direction)) {
return new Position(x, y + by);
}
return new Position (x + by, y);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Position)) return false;
Position position = (Position) o;
if (x != position.x) return false;
return y == position.y;
}
}
enum Direction {
UP, RIGHT, DOWN, LEFT
}
public static void main(String... args) throws InterruptedException {
new CarsGame().doIt();
}
}
Aqui está meu codigo,preciso mover os carros em uma posição aleatória que é o numero 3 que são armazenados no arraylist…
import java.util.ArrayList;
import java.util.Random;
public class Main {
//Declaração Global dos ArrayLists para poder armazenar a quantidade
// de cada veiculo
public static ArrayList<Carro> c = new ArrayList<>();
public static void main(String[] args)
{
int [][] matrix = new int[30][60];
for(int x = 0; x < matrix.length; x++)
{
for (int i = 0; i < matrix[x].length; i++)
{
if((x==0)||(x==(matrix.length)-1))
matrix[x][i]=1;
else
if((i==0)||(i==(matrix[x].length)-1))
matrix[x][i]=1;
else
matrix[x][i]=0;
}
}
for(int x = 0; x < matrix.length; x++)
{
for (int i = 0; i < matrix[x].length; i++)
{
if(matrix[x][i] == 0){
for(int n = 5; n < 12 ;n++){
for(int m = 3; m <= 5 ;m++){
matrix[m][n] = 2;
}
}
for(int n = 5; n < 12 ;n++){
for(int m = 24; m <= 26 ;m++){
matrix[m][n] = 2;
}
}
for(int n = 48; n < 55 ;n++){
for(int m = 3; m <= 5 ;m++){
matrix[m][n] = 2;
}
}
for(int n = 48; n < 55 ;n++){
for(int m = 24; m <= 26 ;m++){
matrix[m][n] = 2;
}
}
for(int n =23 ; n <33 ;n++){
for(int m =13 ; m <= 15 ;m++){
matrix[m][n] = 2;
}
}
}
System.out.print(matrix[x][i]);
}
System.out.println();
}
//Instanciando objetos para usar as funçoes
//Utilizando as funções com objetos
Carro carros = new Carro();
for(int i=0;i<10;i++){
carros.gerarCarro(matrix);
c.add(new Carro());
}
//Código para printar a matriz após cada veiculo adicionado
for(int x = 0; x < matrix.length; x++)
{
for (int i = 0; i < matrix[x].length; i++)
{
System.out.print(matrix[x][i]);
}
System.out.println();
}
}
}
Aqui está a classe Carro:
import java.util.Random;
import java.util.ArrayList;
public class Carro{
//Método para gerar um Carro em um lugar aleatório da matriz
public void gerarCarro(int matrix[][]){
Random r= new Random();
int a =r.nextInt(29);
int b =r.nextInt(59);
if(matrix[a][b] == 0 && matrix[a][b] != 2 && matrix[a][b]!=1 && matrix[a][b]!=4 && matrix[a][b]!=5){
matrix[a][b]=3;
}
}