Java - No se generar posiciones aleatorias sin que haya duplicadas en los barcos, alguien me puede ayudar?

 
Vista:

No se generar posiciones aleatorias sin que haya duplicadas en los barcos, alguien me puede ayudar?

Publicado por Julian (1 intervención) el 08/06/2023 17:45:11
package proyectofinal;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class Interfaz extends javax.swing.JFrame {

public static String[][] tablero = new String[10][10];
public static ArrayList<Barco> barcos = new ArrayList<Barco>();
public static int contador = 0;
private int tiempo = 0;

public static void generarTablero() {
int letras = 65;
int num = 49;
char numeros = (char) 49;
char letra = (char) 65;
for (int i = 0; i < 10; i++) {
for (int o = 0; o < 10; o++) {
tablero[i][o] = "-";
}
}
for (int i = 1; i < 10; i++) {
tablero[0][i] = Character.toString(numeros);
num = num + 1;
numeros = (char) num;
}
for (int i = 1; i < 10; i++) {
tablero[i][0] = Character.toString(letra);
letras = letras + 1;
letra = (char) letras;
}

tablero[0][0] = " ";
tablero[0][9] = "9";

}

//orientar aleatorio
public static String orientarBarco() {
int ale = (int) (Math.random() * 2);
String orientacion;
if (ale > 1) {
orientacion = "horizontal";
return orientacion;
} else {
orientacion = "vertical";
return orientacion;
}
}

//generar posicion de barcos
public static String[] generarPosicion(int longitud, String orientacion) {
String[] posiciones = new String[longitud];
boolean posicionValida = false;

while (!posicionValida) {
int filaInicial, columnaInicial;

if (orientacion.equals("horizontal")) {
filaInicial = (int) (Math.random() * 9);
columnaInicial = (int) (Math.random() * (10 - longitud));
} else {
filaInicial = (int) (Math.random() * (10 - longitud));
columnaInicial = (int) (Math.random() * 9);
}

if (posicionDentroDelTablero(filaInicial, columnaInicial, longitud, orientacion)) {
boolean posicionesIguales = false;

for (Barco barco : barcos) {
if (barco.getPosicion() != null) {
String[] posicionesBarco = barco.getPosicion();
for (String pos : posicionesBarco) {
String posicionActual = Character.toString((char) (filaInicial + 'A')) + (columnaInicial + 1);
if (pos.equals(posicionActual)) {
posicionesIguales = true;
break;
}
}
}
if (posicionesIguales) {
break;
}
}

if (!posicionesIguales) {
posicionValida = true;
for (int i = 0; i < longitud; i++) {
if (orientacion.equals("horizontal")) {
posiciones[i] = Character.toString((char) (filaInicial + 'A')) + (columnaInicial + i + 1);
} else {
posiciones[i] = Character.toString((char) (filaInicial + i + 'A')) + (columnaInicial + 1);
}
}
}
}
}

return posiciones;
}

//Comprobar si esta dentro del tablero la posicion del barco
public static boolean posicionDentroDelTablero(int filaInicial, int columnaInicial, int longitud, String orientacion) {
if (orientacion.compareTo("horizontal") == 0) {
int columnaFinal = columnaInicial + longitud - 1;
if (columnaFinal > 9) {
return false;
}
for (int columna = columnaInicial; columna <= columnaFinal; columna++) {
if (tablero[filaInicial][columna].compareTo("-") != 0) {
return false;
}
}
} else {
int filaFinal = filaInicial + longitud - 1;
if (filaFinal > 9) {
return false;
}
for (int fila = filaInicial; fila <= filaFinal; fila++) {
if (tablero[fila][columnaInicial].compareTo("-") != 0) {
return false;
}
}
}
return true;
}

public static String imprimirTablero() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
for (int o = 0; o < 10; o++) {
sb.append(tablero[i][o]).append(" ");
}
sb.append("\n");
}
return sb.toString();
}

public static void atacarBarco(char fila, char columna) {
boolean barcoHundido = false;
boolean barcoTocado = false;

int filaIndex = fila - 'A';
int columnaIndex = columna - '1';
if (filaIndex >= 0 && filaIndex < 10 && columna >= '1' && columna <= '0' + 10) {
for (Barco barco : barcos) {
String[] posicionesBarco = barco.getPosicion();

for (String pos : posicionesBarco) {
if (tablero[filaIndex][columnaIndex].compareTo("-") == 0) {
barcoTocado = true;
tablero[filaIndex][columnaIndex] = "+";
} else if (tablero[filaIndex][columnaIndex].compareTo("+") == 0) {
// Si ya se había tocado previamente, no se hace nada
} else {
// Si ya está marcado como hundido, no se hace nada
}
break;
}

if (barcoTocado) {
int contadorTocados = 0;
for (String pos : posicionesBarco) {
char filaBarco = pos.charAt(0);
char columnaBarco = pos.charAt(1);

int filaBarcoIndex = filaBarco - 'A';
int columnaBarcoIndex = columnaBarco - '1';

if (tablero[filaBarcoIndex][columnaBarcoIndex].compareTo("+") == 0) {
contadorTocados++;
}
}

if (contadorTocados == posicionesBarco.length) {
barcoHundido = true;
for (String pos : posicionesBarco) {
char filaBarco = pos.charAt(0);
char columnaBarco = pos.charAt(1);

int filaBarcoIndex = filaBarco - 'A';
int columnaBarcoIndex = columnaBarco - '1';

tablero[filaBarcoIndex][columnaBarcoIndex] = "X";
}
}
break;
}
}
}

if (!barcoTocado && !barcoHundido) {
tablero[filaIndex][columnaIndex] = Character.toString('~');
}

imprimirTablero();

if (barcoHundido) {
JOptionPane.showMessageDialog(null, "¡Barco hundido!");
contador = contador + 1;

} else if (barcoTocado) {
JOptionPane.showMessageDialog(null, "¡Barco tocado!");
} else {
JOptionPane.showMessageDialog(null, "¡Fallaste el ataque!");
}
}

public Interfaz() {
initComponents();
generarTablero();
Barco b1 = new Barco(" 4", 4, orientarBarco(), generarPosicion(4, orientarBarco()));

Barco b2 = new Barco(" 3.1 ", 3, orientarBarco(), generarPosicion(3, orientarBarco()));

Barco b3 = new Barco(" 3.2 ", 3, orientarBarco(), generarPosicion(3, orientarBarco()));

Barco b4 = new Barco(" 2.1 ", 2, orientarBarco(), generarPosicion(2, orientarBarco()));

Barco b5 = new Barco(" 2.2 ", 2, orientarBarco(), generarPosicion(2, orientarBarco()));

Barco b6 = new Barco(" 2.3 ", 2, orientarBarco(), generarPosicion(2, orientarBarco()));

Barco b7 = new Barco(" 1.1 ", 1, orientarBarco(), generarPosicion(1, orientarBarco()));

Barco b8 = new Barco(" 1.2 ", 1, orientarBarco(), generarPosicion(1, orientarBarco()));

Barco b9 = new Barco(" 1.3 ", 1, orientarBarco(), generarPosicion(1, orientarBarco()));

Barco b10 = new Barco(" 1.4 ", 1, orientarBarco(), generarPosicion(1, orientarBarco()));
barcos.add(b1);
barcos.add(b2);
barcos.add(b3);
barcos.add(b4);
barcos.add(b5);
barcos.add(b6);
barcos.add(b7);
barcos.add(b8);
barcos.add(b9);
barcos.add(b10);
imprimirTablero();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

GenerarBarcos = new javax.swing.JButton();
CuadroF = new javax.swing.JTextField();
CuadroC = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
Atacar = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
FinalizarJuego = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
TableroDeJuego = new javax.swing.JTextArea();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

GenerarBarcos.setText("Generar Barcos");
GenerarBarcos.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
GenerarBarcosActionPerformed(evt);
}
});

jLabel1.setText("Fila");

jLabel2.setText("Columna");

Atacar.setText("Atacar");
Atacar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
AtacarActionPerformed(evt);
}
});

FinalizarJuego.setText("FinalizarJuego");
FinalizarJuego.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
FinalizarJuegoActionPerformed(evt);
}
});

TableroDeJuego.setColumns(20);
TableroDeJuego.setRows(5);
jScrollPane1.setViewportView(TableroDeJuego);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(GenerarBarcos, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(FinalizarJuego, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(CuadroF, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(CuadroC, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(16, 16, 16))
.addGroup(layout.createSequentialGroup()
.addGap(25, 25, 25)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(Atacar, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(15, 15, 15)
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(GenerarBarcos, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(FinalizarJuego, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(Atacar, javax.swing.GroupLayout.DEFAULT_SIZE, 63, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(CuadroF, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(CuadroC, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(63, 63, 63))
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1)
.addContainerGap())))
);

pack();
}// </editor-fold>

//Boton generar barcos
private void GenerarBarcosActionPerformed(java.awt.event.ActionEvent evt) {
generarTablero();
TableroDeJuego.append(imprimirTablero());
System.out.println("Posiciones de los barcos:");
for (Barco barco : barcos) {
System.out.println(Arrays.toString(barco.getPosicion()));
}

//Definimos un "Runnable" que viene a ser un programa
Runnable miniPrograma = new Runnable() {
//Sobreescribimos el método run, que es como si fuera el main de dicho programa
@Override
public void run() {

while (true) { //Para que se esté ejecutando todo el rato
try {
Thread.sleep(1000); //Espera de 1 segundo
jLabel3.setText("Tiempo: " + tiempo++); //Aquí lo que queramos ejecutar cada segundo
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};

// Creamos un hilo y le pasamos el runnable que acabamos de crear
Thread hilo = new Thread(miniPrograma);
hilo.start(); //Lo iniciamos*/
}

//Boton atacar barcos
private void AtacarActionPerformed(java.awt.event.ActionEvent evt) {
String filaS = CuadroF.getText();
filaS = filaS.toUpperCase();
char fila = filaS.charAt(0);
char filaCambiada = (char) (fila + 1);
String columnaS = CuadroC.getText();
columnaS = columnaS.toUpperCase();
char columna = columnaS.charAt(0);
char columnaCambiada = (char) (columna + 1);
if (filaCambiada >= 'A' && filaCambiada <= 'J' && columnaCambiada >= '1' && columnaCambiada <= ('9' + 1) && columnaS.compareTo("0") != 0) {
atacarBarco(filaCambiada, columnaCambiada);
CuadroF.setText("");
CuadroC.setText("");
TableroDeJuego.setText(imprimirTablero());
} else {
JOptionPane.showMessageDialog(null, "Posición inválida");
CuadroF.setText("");
CuadroC.setText("");
}
}

private void FinalizarJuegoActionPerformed(java.awt.event.ActionEvent evt) {
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/TiempoJuego";
String user = "root";
String password = "root";
try {
Class.forName("com.mysql.cj.jdbc.Driver"); //Aunque esta línea ya no es necesaria, yo la pongo de siempre, jeje
} catch (ClassNotFoundException ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}
Statement stmt;
try {
stmt = conn.createStatement();

String consulta1 = "INSERT INTO tiempo VALUES ('" + tiempo + "')";
stmt.executeUpdate(consulta1);

System.out.println("");
stmt.close();
conn.close();
} catch (SQLException ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE, null, ex);
}
System.exit(0);
}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
if (JOptionPane.showConfirmDialog(null, "Bienvenid@ a Hundir la flota, por Fernando López y Hugo Gómez. \n ¿Quieres jugar una nueva partida?") == 0) {
new Interfaz().setVisible(true);

} else {
new Interfaz().setVisible(false);
}
}
});
}

// Variables declaration - do not modify
private javax.swing.JButton Atacar;
private javax.swing.JTextField CuadroC;
private javax.swing.JTextField CuadroF;
private javax.swing.JButton FinalizarJuego;
private javax.swing.JButton GenerarBarcos;
private javax.swing.JTextArea TableroDeJuego;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder