No lo he revisado a fondo...
Aseguraría que tu fallo consiste en tus bucles While... ya que los condicionas para acabar cuando alcancen el valor de 't', pero anterior al bucle no verificas si el 'barco' cabe a partir de ahí. Tu sumas filas o columnas hasta que posiblemente desborde el array...
While b<>t do begin
if (((Tablero[f+1,c]<>'B') and (Tablero[f,c-1]<>'B')) and (Tablero[f,c+1]<>'B')) then begin
f:=f+1;
Tendrías que revisar varios bucles.
La lógica es que crees algunas funciones de revisión...
Te aclaro un poco por encima, bueno las 3 funciones principales del tema que te trae...
- Primero creamos el mapa, además cuando se inicie una nueva partida, también se invoca.
- Básicamente borramos el mapa, marcando cada casilla con 'agua', vacía, un valor 0 si usas bytes,o un char "0"...
funcion GenerarBorrarMapa(integer Filas, integer Columnas)
integer j, k
MAXCOLUMNA = (columnas-1) //Maxcolumna y maxfila se DEBEN declarar a nivel de modulo... lo mismo que los arrays de Mapa (tableros).
MAXFILA = (filas-1)
// Hay 2 mapas el propioy el del enemigo...
Dimensionar array MapaA(0 a MAXFILA , 0 a MAXCOLUMNA ) //es el array de las casillas, el tablero...
Dimensionar array MapaB(0 a MAXFILA , 0 a MAXCOLUMNA )
Bucle para j desde 0 a MAXFILA
bucle para k desde 0 hasta MAXCOLUMNA
MapaA(j,k) = 0 // marcamos la casilla como vacía
MapaB(j,k) = 0 // marcamos la casilla como vacía
siguiente
siguiente
fin funcion
- Ahora se posicionan todos los barcos en un mapa (MapaA o MapaB)
- Es decir se debe invocar dos veces cada vez con un mapa distinto.
- Hemos supuesto que la flota se compone de (por ejemplo); Un barco de 5 casillas, 2 de 4, 3 de 3 y 1 de 2 casillas... total la flota tiene 7 barcos... (24 casillas)
funcion PosicionarFlota(array Mapa)
PosicionarBarco(5, Mapa) // es preferible posicionar primero los barcos más grandes,
//los pequeños luego caben mejor en medias que si se hace al revés...
// por eso los vamos colocando en este orden de mayor a menor...
PosicionarBarco(4, Mapa)
PosicionarBarco(4, Mapa)
PosicionarBarco(3, Mapa)
PosicionarBarco(3, Mapa)
PosicionarBarco(3, Mapa)
PosicionarBarco(2, Mapa)
fin funcion
- Aquí la función que reposiciona un solo barco... nota que se elige si colocarlo vertical u horizontal
- Luego se elige al azar la fila donde ponerlo, después se verifica si cabe en dicha fila, si no cabe se busca otra... Se supone que el mapa es lo suficientemente grande para que quepan todos los barcos holgadamente... si no es así... fallará.
- Al comprobar que un barco cabe en una fila, devuelve la posición donde cabe... pero intentamos colocarlo al azar, solo si tras 5 intentos al azar no fue osible ubicarlo, usamos la posición devuelta.
- Notar que la misma función para verificar si cabe el barco se usa dos veces, perimero recorriendo toda la fila, luego solo desde la posición elegida al azar.
- Solo se pone el pseudocódigo para el caso horizontal, el vertical es solo cambiar donde proceda...
funcion PosicionarBarco( integer piezas , array Mapa)
buleano b = random(entre 0 y 1)
integer cabe, pos, n, k
Si b=1 // elegimos ponerlo en horizontal
Hacer
fila = random(entre 0 y MAXFILA)
cabe = BarcoCabeEnFila(piezas, fila, 0, TRUE)
Repetir mientras (cabe= -1)
hacer // haremos 5 reintentos de ubicalro al azar, si fallan, se posicionará en 'cabe'.
pos = Random(entre 0 y MAXCOLUMNA)
pos = BarcoCabeEnFila(Piezas, Fila, pos, FALSO)
n = (n+1)
Repetir mientras ((pos=-1) y (n < 5))
// si se intentó 5 veces al azar y no encajó, lo posicionamos donde se encontró en la fila
Si (pos= -1) luego pos = cabe
// Finalmente marcamos las casillas donde se colca el barco, con el valor del barco.
bucle para k desde pos hasta (pos + piezas-1)
Mapa(fila, k) = piezas // una casilla ocupada la marcamos con el número de piezas que tiene ese barco... un barco de 2, con el valor-char 2, uno de 4 con valor o char 4, etc... la vacía tiene valor 0.
fin si
Sino // b=0 , se coloca en vertical
// similar a lo de horizontal, cambiando donde proceda.
fin si
fin funcion
- Esta función trata de ver si un barco de x piezas de tamaño, cabe en la fila dada... a partir de la posición que se pide. Para ello basta saber si tiene el números de casillas consecutivas libres que tiene 'piezas' de barco.
- La fila ya puede tener casillas ocupadas... cuando se vaya a colocar el barco, primero lo intentará al azar, tras x intentos fallidos, se tomaría el hueco encontrado y devuelto por esta funcion.
- La función se usa con dos usos bien diferenciados al inicio, se recorre la fila entera si es necesario... buscando que quepa. En la otra funcionalidad solo se recorre hasta encontrarlo o se sale... es decir no comprueba más alla de la posición de inicio recibida si se haya alguna ocupada. El parámetro 'Reubicable' se encarga de esto... fíjate en la llamada quien lo llama con TRUE y quien con FALSE
- La función Gemela- BarcoCabeEnColumna, es casi idéntica, cambia solo la comprobación del mapa: If Mapa(k, Columna) ... MAXCOLUMNA
integer = funcion BarcoCabeEnFila(integer Piezas, integer Fila, Integer Pos, buleano Reubicable)
integer k, n
Bucle para k desde Pos hasta MAXFILA
If Mapa(fila, k) = 0 // " " "Agua" , casilla no ocupada actualmente.
n = (n+1)
Si n=Piezas devolver (k-piezas) // devuelve el punto donde comienza a estar libre
sino
si Reubicable=FALSO salir del bucle // o devolver -1 saliendo de la funcion.
n = 0
fin si
fin bucle
devolver -1 // no cabe un barco de ese tamaño.
fin funcion
Listo... ya tienes por donde seguir...