Está en la página 1de 22

CEAD/Occidente/ECBTI

SOFTWARE PARA INGENIERÍA


BATTLESHIP (Batalla Naval)
Paola Andrea Buitrago Cadavid
Medellín abril 20 de 2020
Temáticas a desarrollar

0A Batalla Naval

0B Modelado del problema

0C Análisis del Campo de Batalla

0D Conclusiones

01 Implementación

02 Resultados
0A BATTLESHIP (Batalla Naval)

Videojuego world of warship barcos militares. Recuperado de https://wall.alphacoders.com/big.php?i=689297&lang=Spanish


0A BATTLESHIP (Batalla Naval)

Battleship (también Battleships o Sea Battle) es


un juego de adivinanzas tipo estrategia para dos
jugadores.

Se juega en cuadrículas indexadas (papel o


tablero) en las que se marca la flota de barcos de
cada jugador (incluidos los acorazados). Las
ubicaciones de las flotas están ocultas al otro
jugador. Los jugadores se alternan por turnos
llamando "tiros" a las naves del otro jugador, y el
objetivo del juego es destruir la flota del jugador
contrario.
0B Modelado del problema

Modelado del problema. Fuente: Buitrago, P. (2020).


0C Análisis del Campo de Batalla

Posicionamiento aleatorio de las naves.

Definiciones de las naves utilizadas para el campo de batalla (BF). En este


ejemplo el campo de batalla tiene unas dimensiones de:
row = 10; (10 filas ) por
col = 10; (10 columnas)

Definimos el vector tb (tamaño de barco) como


un vector de 3 posiciones con las longitudes de
las naves tb = [5 4 3];

En donde 0 representa el océano


Nota: El color naranjado representa el punto de pivote (ya sea horizontal o vertical) a partir
del cual se comienza a contar (posicionar) de acuerdo al tamaño de las naves.
0C Análisis del Campo de Batalla
Posicionamiento del Portaviones en el Campo de Batalla

El área de color verde


corresponde al rango BF[y,x]
valido para posicionar un
Portaaviones con orientación:

Horizontal Vertical

En donde se representan tres


posibles posiciones validas para un
Portaaviones

col = 10;
x = randi([1 col-(tb(1)-1)]) Row = 10; x = randi([1 col])
y = randi([1 row]) tb = [5 4 3]; y = randi([1 row-(tb(1)-1)])
0C Análisis del Campo de Batalla
Posicionamiento del Acorazado en el Campo de Batalla

La posición del Portaviones; es una x = randi([1 Col-(tb(2)-1)]) x = randi([1 col])


restricción para el posicionamiento y = randi([1 row]) y = randi([1 row-(tb(2)-1)])
del Acorazado.
0C Análisis del Campo de Batalla
Posicionamiento del Acorazado en el Campo de Batalla

x = randi([1 col]) x = randi([1 Col-(tb(2)-1)])


y = randi([1 row-(tb(2)-1)]) y = randi([1 row])
0C Análisis del Campo de Batalla
Posicionamiento de la Lancha en el Campo de Batalla

x = randi([1 Col-(tb(3)-1)]) x = randi([1 col])


y = randi([1 row]) y = randi([1 row-(tb(3)-1)])
0C Análisis del Campo de Batalla
Posicionamiento de la Lancha en el Campo de Batalla

x = randi([1 Col-(tb(3)-1)]) x = randi([1 col])


y = randi([1 row]) y = randi([1 row-(tb(3)-1)])
0D Análisis del Campo de Batalla – Conclusiones

1 Restricciones en el posicionamiento de la naves

Posicionamiento Horizontal Posicionamiento Vertical

x = randi([1 Col-(tb(i)-1)]) x = randi([1 col])


y = randi([1 row]) y = randi([1 row-(tb(3)-1)])

En donde tb(i) corresponde a la longitud de la nave i.

2 Combinaciones en el posicionamiento de la naves

2n, donde n es el numero de naves a posicionar en el campo de batalla

3 Aproximaciones al posicionamiento de la naves sin solapamiento

• En base a la posición previa de las naves (crece en potencias de 2)


• Según el espacio libre más grande (puede no ser posible ubicar la nave)
• Método de fuerza bruta (preguntar si esa posición esta libre)
0E Implementar una solución
Método de fuerza bruta

Pasos para implementar el método

1. Generar la matriz de tamaño aleatorio entre 8 y 10 filas y entre 8 y 10 columnas

2. Especificar la cantidad de naves a ubicar (posicionar) en el campo de batalla (matriz)

3. Determinar orientación aleatoria de la nave (Horizontal o Vertical)

4. Generar una coordenada aleatoria valida para posicionamiento de la nave de acuerdo a su longitud

5. Determinar si es posible la ubicación de la nave es esa posición; es decir, esta libre de otras embarcaciones

6. Si no esta libre iterar otra secuencia para una nueva ubicación aleatoria

7. Una ves ubicada esta nave, repetir los pasos 3 al 6 para la siguiente nave a posicionar.
0E Implementar una solución

Pasos para implementar el método

1. Generar la matriz de tamaño aleatorio entre 8 y 10 filas y entre 8 y 10 columnas

% Tamaño del Campo de Batalla


Mcol = randi([8 10]);
Mrow = randi([8 10]);
M = zeros(Mrow,Mcol);

2. Especificar la cantidad de naves a ubicar (posicionar) en el campo de batalla (matriz)

% Longitud de los barcos


% tb(1) == 5 Portaaviones
% tb(2) == 4 Acorazado
% tb(3) == 3 Lancha
tb = [5 4 3];
n = length(tb); % <- se implementa en un ciclo for
0E Implementar una solución

Pasos para implementar el método

3. Determinar orientación aleatoria de la nave (Horizontal o Vertical)

% Orientación: 0 = Horizontal, 1 = Vertical


No = randi([0 1]);

4. Generar una coordenada aleatoria valida para posicionamiento de la nave de acuerdo a su longitud

if No == 0 % Horizontal
Nx = randi([1 Mcol-tb(i)+1]);
Ny = randi([1 Mrow]);
else % Vertical
Nx = randi([1 Mcol]);
Ny = randi([1 Mrow-tb(i)+1]);
end
0E Implementar una solución

Pasos para implementar el método

5. Determinar si es posible la ubicación de la nave es esa posición; es decir, esta libre de otras embarcaciones

v = false;
if libre(M,No,Ny,Nx,tb(i)) == true % función propia
if No == 0 % Horizontal
M(Ny, Nx:Nx+tb(i)-1) = tb(i); % Nave
v = true;
else % Vertical
M(Ny:Ny+tb(i)-1, Nx) = tb(i); % Nave
v = true;
end
end

5. Si no esta libre iterar otra secuencia para una nueva ubicación aleatoria

6. Una ves ubicada esta nave, repetir los pasos 3 al 6 para la siguiente nave a posicionar.
0E Implementar una solución

Pasos para implementar el método

8. Función para determinar si esta libre la zona de ubicación

% m:matriz, o:orientación,
% y:fila, x:columna, z:longitud
function v = libre(m,o,y,x,z)
v = true;
if o == 0 % Horizontal else % Vertical
for c=x:x+z-1 for f=y:y+z-1
if m(y,c) ~= 0 % Océano if m(f,x) ~= 0 % Océano
v = false; v = false;
end end
end end
end
end
0F Resustados
0F Resustados
0F Resustados
0F Resustados
¡GRACIAS POR SU ATENCIÓN!

También podría gustarte