Pascal/Turbo Pascal - BARCOS BUBLES URGENTE

 
Vista:
sin imagen de perfil

BARCOS BUBLES URGENTE

Publicado por Maria (2 intervenciones) el 03/11/2022 22:21:03
Tenemos en la entrada datos de una serie de barcos para el juego de los barcos. Los barcos se colocan horizontalmente o verticalmente en un tablero. El tablero numera las columnas con letras, A, B, C, ... y las filas con números, 1, 2, 3, ...

Un barco puede ser

Submarino, de longitud 1.
Dragaminas, de longitud 2.
Fragata de longitud 3.
PortaAviones, de longitud 4.
Además, cada barco tiene información relativa al juego, que incluye

La posición de la proa (arriba para barcos verticales, a la izquierda para barcos horizontales).
El color, que puede ser Rojo, Verde o Azul.
Si está Tocado, Hundido o Intacto. (durante el juego se hacen disparos, pero no en este ejercicio).
Disponemos en la entrada estándar de un número que indica el número de filas, un número que indica el número de columnas, y datos de barcos, terminados con la palabra FIN. Para cada barco tenemos su tipo, orientación, columna y fila de la proa, color, y estado del barco (tocado, etc.). Todo ello, escrito con un sólo valor por línea.

Se quiere un programa en pascal que, leyendo estos datos de la entrada, haga lo siguiente:

Escriba cuántos barcos hay en total
Escriba cuántos barcos hundidos hay en total
Dibuje al finalizar el tablero, mostrando en el tablero la posición de la proa del barco de mayor tamaño.
Pistas:

El procedimiento leerbarco debería tener dos parámetros, uno el barco y otro un boolean que indique si tras la llamada a leerbarco hemos encontrado FIN en lugar de un barco.
Para leer la clase de barco o el FIN se sugiere un enumerado que tenga las clases de barco y FIN, y luego la clase de barco será un subrango de dicho tipo.
Es útil mantener un TipoJuego con la información que necesitamos sobre el mismo, incluyendo el número de barcos, el número de hundidos, el mayor barco, etc.
Para esta entrada:

5
10
FIN
La salida ha de ser esta:

0 barcos
0 hundidos
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .


Para esta entrada:

5
10
Submarino
Horizontal
B
2
Rojo
Tocado
Fragata
Vertical
C
3
Verde
Hundido
FIN
La salida ha de ser esta:

2 barcos
1 hundidos
. . . . . . . . . .
. . . . . . . . . .
. . P . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
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
sin imagen de perfil

BARCOS BUCLES URGENTE

Publicado por Sofia (2 intervenciones) el 17/11/2022 21:23:13
program ejercicio;

type
TipoColor = (Rojo, Verde, Azul);
TipoEstado = (Tocado, Hundido, Intacto);
TipoPosicion = (Vertical, Horizontal);
TipoClase = (Submarino, Dragaminas, Fragata, PortaAviones, FIN);
TipoBarco = Submarino..PortaAviones;
TipoDatos = record
fila: integer;
columna: char;
color: TipoColor;
estado: TipoEstado;
posicion: TipoPosicion;
barco: TipoClase;
end;

var
numerobarcos: integer;
numerohundidos: integer;
barcomayor: TipoDatos;


procedure numfilcol(var a,b: integer);
begin
readln(a);
readln(b);
end;

function esfin(d: TipoClase):boolean;
begin
result := (d = FIN);
end;

procedure leerbarco(var c: TipoDatos; var FINAL: boolean);
begin
readln(c.barco);
FINAL:=esfin(c.barco);
if not FINAL then begin
readln(c.posicion);
readln(c.columna);
readln(c.fila);
readln(c.color);
readln(c.estado);
end;
end;

function longitudbarco(clase: TipoDatos): integer;
begin
case clase.barco of
Submarino:
result:=1;
Dragaminas:
result:=2;
Fragata:
result:=3;
PortaAviones:
result:=4;
end;
end;

function numcolumna(c: char): integer;
begin
result:= ord(c) - ord('A') + 1;
end;

procedure dibtablero(numfilas,numcolumnas: integer);
var
y,x: integer;
begin
for y := 1 to numfilas do begin
for x := 1 to numcolumnas do begin
if ((y = barcomayor.fila) and (x = numcolumna(barcomayor.columna))) then begin
write('P');
end
else begin
write('.');
end;
end;
writeln;
end;
end;
var

datos: TipoDatos;
finjuego: boolean;
filas,columnas: integer;
begin
numerobarcos := 0;
numerohundidos:= 0;
barcomayor.barco:= Submarino;
numfilcol(filas,columnas);
repeat
leerbarco(datos, finjuego);
if not finjuego then begin
numerobarcos:= numerobarcos+1;
if datos.estado= Hundido then begin
numerohundidos:= numerohundidos+1;
end;
if (numerobarcos=1) or (longitudbarco(datos)>longitudbarco(barcomayor)) then begin
barcomayor:= datos;
end;
end;
until finjuego;
writeln;
writeln(numerobarcos, ' barcos');
writeln(numerohundidos, ' hundidos');
dibtablero(filas,columnas);
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar