Título: Consulta Pascal Publicado por: Pascaloro en 22 Noviembre 2018, 16:11 pm Buenos días!! disculpen que lo publique acá pero no se donde publicarlo no encontré ninguna sección de pascal... Estoy haciendo un batalla naval para la facultad (estoy en primer año) y tengo que hacer que los barcos se carguen random en la matriz, sin que colapsen entre si y sin que sean contiguos(No importa si son contiguos en diagonal) logre hacer prácticamente todo pero tengo un problema y es que aveces me carga perfectamente la matriz con los barcos sin que se choquen entre si, pero aveces también me tira un runtime 201 como si se saliera de rango en algún momento pero no logro ver/entender cuando pasa eso y como debería corregirlo... Muchas gracias!! y perdón por publicarlo acá necesito ayuda urgente.
Código: program BatallaNaval; Título: Re: Consulta Pascal Publicado por: Serapis en 25 Noviembre 2018, 02:43 am 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... Citar 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"... Código: funcion GenerarBorrarMapa(integer Filas, integer Columnas) - 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) Código: funcion PosicionarFlota(array Mapa) - 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... Código: funcion PosicionarBarco( integer piezas , array Mapa) - 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 Código: integer = funcion BarcoCabeEnFila(integer Piezas, integer Fila, Integer Pos, buleano Reubicable) Listo... ya tienes por donde seguir... |