Pascal/Turbo Pascal - Hundir la flota en PAscal

   
Vista:

Hundir la flota en PAscal

Publicado por Juan (7 intervenciones) el 14/12/2012 10:54:58
Hola:
Me han mandado hace un hundir la flota en Pascal y ando un poco perdido.
Las características que tiene que tener el programas son las siguientes:
- Deberá ser jugado por dos jugadores, cada uno de los cuales hará uso de dos
‘tableros’ (cada uno de dimensiones 8x8), uno para colocar sus barcos y otro para
controlar los disparos que ha ido realizando sobre su adversario.
- Cada jugador dispondrá de cuatro barcos, uno de longitud cuatro, otro de tres, otro
de dos y otro de uno. Estos deben ser colocados por cada jugador en su tablero de
barcos al comenzar la partida, y sólo pueden ser colocados de forma horizontal o
vertical.
- Cuando uno de los dos haga blanco en un barco del otro, en cuyo caso se le debe
informar del tipo de barco que ha alcanzado, y ese jugador vuelve a disparar.
- Cuando uno de los dos consiga hundir la flota contraria por completo, el programa
finaliza, indicando el ganador.
- Las matrices en las que los jugadores posicionan sus barcos deberán ser de registros,
que contendrán, al menos, los siguientes campos:
• Si en esa posición hay agua o barco.
• En caso de haber barco si este es de dimensión 1, 2, 3 o 4. De esta forma cuando el
jugador contrario acierte se le podrá informar del tipo de barco que ha alcanzado.

Hasta ahora he hecho lo siguiente (seguro que no está bien):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Program Hundir_la_flota;
	uses
		crt;
	type
		tipo_tablero=array[1..8, 1..8]of string;
		barco=record
			posicion:char;
			tamano:byte;
		end;
	var
		tablero:tipo_tablero;
		barcos:barco;
	procedure inicializaTableroControl (var t:tipo_tablero);{nos inicializa el tablero de control con todos los valores A}
		var
			i,j:integer;
		begin
			for i:=1 to 8 do
				for j:=1 to 8 do
					begin
						t[i,j]:='A';
						writeln(t[i,j]);
					end;
		end;
	procedure inicializaTableroBarcos (var t:tipo_tablero);{inicializa el tablero en blanco, nos pregunta de qué dimension es y los introducimos}
		var
			i,j,cont,dimb:integer;
			direc:string;
 
		begin
			for i:= 1 to 8 do
				for j:= 1 to 8 do
					begin
						t[i,j]:=' ';
					end;
			write('¿de que dimension es el barco?: ');
			readln(dimb);
			write('¿En que dirección quieres poner el barco: arriba/abajo/izquierda/derecha?: ');
			readln(direc);
			write('Introduce la coordenada de la FILA del barco: ');
			readln(i);
			write('Introduce la COLUMNA del barco: ');
			readln(j);
			case direc of
				'derecha': 		for i:= i to dimb do
									begin
										t[i,j]:='B';
										writeln(t[i,j]);
									end;
				'izquierda': 	for i:=i downto dimb do
									begin
										t[i,j]:='B';
										writeln(t[i,j]);
									end;
				'arriba':		for j:= j to dimb do
									begin
										t[i,j]:='B';
										writeln(t[i,j]);
									end;
				'abajo':		for j:= j downto dimb do
									begin
										t[i,j]:='B';
										writeln(t[i,j]);
									end;
 
				end;
		end;
	procedure dispara (var t:tipo_tablero);{disparamos y nos dice si es tocado o agua}
		var
			i,j:integer;
		begin
			writeln('introduce la coordenada FILA del barco a ATACAR: ');
			readln(i);
			writeln('introduce la coordenada COLUMNA del barco a ATACAR: ');
			readln(j);
			if t[i,j]='B' then
				writeln('Tocado')
			else
				writeln('Agua')
		end;
 
 
   	begin (*del programa principal*);
   	inicializaTableroControl(tablero);
	inicializaTableroBarcos(tablero);
	dispara(tablero);
	end.


Agradecería que me echaseis una mano.
Muchas gracias
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

Hundir la flota en PAscal

Publicado por ramon (2072 intervenciones) el 16/12/2012 15:13:11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
{A qui tienes tu programa corregido las sentencias case no admiten comparación de cadenas como tu as puesto a ver  si vale tienes que trabajar un poco mas.}
 
Program Hundir_la_flota;
   uses
     crt;
 type
     tipo_tablero = array[1..8, 1..8] of string;
     barco = record
     posicion : char;
       tamano : byte;
     end;
   var
    tablero : tipo_tablero;
     barcos : barco;
 
   procedure inicializaTableroControl(var t : tipo_tablero);
    {nos inicializa el tablero de control con todos los valores A}
   var
    i, j : integer;
    begin
       for i := 1 to 8 do
         for j :=1 to 8 do
         begin
            t[i,j] := 'A';
            gotoxy(i * 2,j * 2);write(t[i,j]);
         end;
    end;
 
  procedure inicializaTableroBarcos(var t : tipo_tablero);
  {inicializa el tablero
          en blanco, nos pregunta de qué dimension es y los introducimos}
   var
     i, j, cont, dimb : integer;
     direc : char;
     begin
       for i := 1 to 8 do
        for j := 1 to 8 do
        begin
         t[i,j] := ' ';
        end;
        clrscr;
        write('¿de que dimension es el barco?: ');
        readln(dimb);
        write(' En que direccion quieres poner el barco : [D/I/A/B] : ');
        readln(direc);
        write('Introduce la coordenada de la FILA del barco : ');
        readln(i);
        write('Introduce la COLUMNA del barco : ');
        readln(j);
        if direc = 'D' then
        for i := i to dimb do
        begin
          t[i,j] := 'B';
          gotoxy(i,j);write(t[i,j]);
        end;
       if direc = 'I' then
        for i := i downto dimb do
        begin
           t[i,j] := 'B';
           gotoxy(i,j);write(t[i,j]);
        end;
       if direc = 'A' then
        for j := j to dimb do
        begin
          t[i,j] := 'B';
           gotoxy(i,j);write(t[i,j]);
        end;
        if direc = 'B' then
        for j := j downto dimb do
        begin
           t[i,j] := 'B';
           gotoxy(i,j);write(t[i,j]);
        end;
    end;
 
   procedure dispara (var t:tipo_tablero);
    {disparamos y nos dice si es tocado o agua}
   var
     i,j : integer;
    begin
     writeln('introduce la coordenada FILA del barco a ATACAR : ');
     readln(i);
     writeln('introduce la coordenada COLUMNA del barco a ATACAR : ');
     readln(j);
     if t[i,j] = 'B' then
      writeln('Tocado')
  else
      writeln('Agua')
  end;
 
  begin (*del programa principal*);
     inicializaTableroControl(tablero);
     inicializaTableroBarcos(tablero);
     dispara(tablero);
     readln;
  end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Hundir la flota en PAscal

Publicado por JM (7 intervenciones) el 17/12/2012 09:18:56
Hola:
Muchas gracias por ayudarme.
Voy a intentar seguir el programa y si tengo alguna duda os la preguntaré.
Un saludo
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

Hundir la flota en PAscal

Publicado por Juan (7 intervenciones) el 08/01/2013 00:10:56
Hola:
Ya he avanzado un poco más.
Ahora me surgen algunas preguntas:
¿Cómo puedo ir cambiando de jugador cuando uno falle? LO quiero hacer en el programa principal?
¿Como puedo controlar que los barcos no se pongan en las mismas celdas?
Lo último que me pide la práctica es: El programa debe ofrecer la posibilidad de almacenar una partida en fichero para
que pueda ser reanudada con posterioridad leyendo la información de dicho fichero ¿Cómo puedo hacerlo?
¿Cómo puedo interrumpir la partida y guardarla?
Gracias
Un saludo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
Program Hundir_la_flota;
uses
	crt;
type
	tEstado = (AGUA, BARCO);
	tDisparo = (X, A, B);
	tCasilla = record
		tam:byte;
		estado:tEstado;
	end;
	tTableroBarco = array[1..8, 1..8] of tCasilla;
	tTableroDisparo = array[1..8, 1..8] of tDisparo;
var
	tableroB1,tableroB2:tTableroBarco;
	tableroD1,tableroD2:tTableroDisparo;
	cont1,cont2,ii,jj:integer;
 
procedure InicializaTableroDisparos (var t:tTableroDisparo); {nos inicializa el tablero de DISPAROS a LIBRE}
	var
		i,j:integer;
	begin
		for i:=1 to 8 do
			for j:=1 to 8 do
				t[i,j] := X;
end;
 
procedure InicializaTableroBarcos (var t:tTableroBarco); {nos inicializa el tablero de barcos a AGUA}
	var
		i,j:integer;
			begin
				for i:=1 to 8 do
					for j:=1 to 8 do
						t[i,j].estado := AGUA;
end;
 
procedure InsertarTableroBarcos (var tb:tTableroBarco); { inserta los barcos en el tablero }
	var
		i,j:integer;
		direc:string;
 
	begin
		write('¿En que direccion quieres poner el barco de LONGITUD 4: arriba/abajo/izquierda/derecha?: ');
		readln(direc);
		repeat
			write('Introduce la coordenada de la FILA del barco: ');
			readln(i);
			write('Introduce la coordenada de la COLUMNA del barco: ');
			readln(j);
			if (i>8) and (j>8) then
				writeln('Esta fuera de rango ');
		until i<=8;
		if direc = 'izquierda' then
			for j := j  downto 4 do
				begin
					tb[i,j].estado := BARCO;
					tb[i,j].tam:=4;
				end
		else
			if direc = 'derecha' then
				for j := j to 4 do
					begin
						tb[i,j].estado := BARCO;
						tb[i,j].tam:=4;
					end
			else
				if direc = 'arriba' then
					for i := i downto 4 do
						begin
							tb[i,j].estado := BARCO;
							tb[i,j].tam:=4;
						end
				else
					if direc = 'abajo' then
						for i := i  to 4 do
							begin
								tb[i,j].estado := BARCO;
								tb[i,j].tam:=4;
							end;
		write('¿En que direccion quieres poner el barco de LONGITUD 3: arriba/abajo/izquierda/derecha?: ');
		readln(direc);
		repeat
			write('Introduce la coordenada de la FILA del barco: ');
			readln(i);
			write('Introduce la coordenada de la COLUMNA del barco: ');
			readln(j);
			if (i>8) and (j>8) then
				writeln('Esta fuera de rango ');
		until i<=8;
		if direc = 'izquierda' then
			for j := j  downto 3 do
				begin
					tb[i,j].estado := BARCO;
					tb[i,j].tam:=3;
				end
		else
			if direc = 'derecha' then
				for j := j to 3 do
					begin
						tb[i,j].estado := BARCO;
						tb[i,j].tam:=3;
					end
			else
				if direc = 'arriba' then
					for i := i downto 3 do
						begin
							tb[i,j].estado := BARCO;
							tb[i,j].tam:=3;
					end
				else
					if direc = 'abajo' then
						for i := i  to 3 do
							begin
								tb[i,j].estado := BARCO;
								tb[i,j].tam:=3;
							end;
 
		write('¿En que direccion quieres poner el barco de LONGITUD 2: arriba/abajo/izquierda/derecha?: ');
		readln(direc);
		repeat
			write('Introduce la coordenada de la FILA del barco: ');
			readln(i);
			write('Introduce la coordenada de la COLUMNA del barco: ');
			readln(j);
			if (i>8) and (j>8) then
				writeln('Esta fuera de rango ');
		until i<=8;
		if direc = 'izquierda' then
			for j := j  downto 2 do
				begin
					tb[i,j].estado := BARCO;
					tb[i,j].tam:=2;
				end
		else
			if direc = 'derecha' then
				for j := j to 2 do
					begin
					tb[i,j].estado := BARCO;
					tb[i,j].tam:=2;
				end
			else
				if direc = 'arriba' then
					for i := i downto 2 do
						begin
							tb[i,j].estado := BARCO;
							tb[i,j].tam:=2;
						end
				else
					if direc = 'abajo' then
						for i := i  to 2 do
							begin
								tb[i,j].estado := BARCO;
								tb[i,j].tam:=2;
							end;
		repeat
			write('Introduce la coordenada de la FILA del barco: ');
			readln(i);
			write('Introduce la coordenada de la COLUMNA del barco: ');
			readln(j);
			if (i>8) and (j>8) then
				writeln('Esta fuera de rango ');
		until i<=8;
		begin
			tb[i,j].estado := BARCO;
			tb[i,j].tam:=1;
		end
end;
procedure dispara (tb:tTableroBarco; var td:tTableroDisparo);
    {disparamos y nos dice si es tocado o agua}
   var
     i,j : integer;
    begin
		repeat
			writeln('introduce la coordenada FILA del barco a ATACAR : ');
			readln(i);
			writeln('introduce la coordenada COLUMNA del barco a ATACAR : ');
			readln(j);
			if (i>8) and (j>8) then
				writeln('Esta fuera de rango ');
		until i<=8;
     if tb[i,j].estado = BARCO then
		begin
			writeln('Tocado: has alcanzado un barco de ',tb[i,j].tam);
			td[i,j]:=B;
		end
	else
		begin
			writeln('Agua');
			td[i,j]:=A;
		end;
  end;
procedure MuestraBombardeados (t:tTableroDisparo);
	var
		i,j:integer;
	begin
		for i:= 1 to 8 do
		begin
			for j:= 1 to 8 do
				begin
					write(t[i,j],' ');
				end;
				writeln;
		end;
end;
begin (*del programa principal*);
	InicializaTableroDisparos(tableroD1);
	InicializaTableroDisparos(tableroD2);
	InicializaTableroBarcos(tableroB1);
	InicializaTableroBarcos(tableroB2);
	write('Introduce los barcos del jugador 1: ');
	InsertarTableroBarcos(tableroB1);
	write('Introduce los barcos del jugador 2: ');
	InsertarTableroBarcos(tableroB2);
{Aqui es donde quiero que un jugador dispare y que si falla pase al siguiente jugador.}
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

Hundir la flota en PAscal

Publicado por ramon (2072 intervenciones) el 08/01/2013 18:17:36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
{Mira a ver esto}
 
program quientira;
 uses
    crt;
  type
     regparti = record
        pantalla : integer;{tTableroBarco = array[1..8, 1..8] of tCasilla;}
        disparos : integer;{tTableroDisparo = array[1..8, 1..8] of tDisparo;}
        turno : array[1..2] of boolean; {al que toque en este momento}
      end;
 
  var
    posx, posy : integer;
    qui1, qui2 : boolean;
    tecla : char;
    toca : word;
    f : file of regparti;
    par : regparti;
 
  procedure sorteo;
  begin
     randomize;
     toca := random(5) + 1;
     if toca in[1,3,5] then
     begin
       qui1 := true;
       qui2 := false;
     end;
     if toca in[2,4,6] then
     begin
        qui1 := false;
        qui2 := true;
     end;
  end;
 
  procedure disparo;
  begin
     gotoxy(2,1);write('Tecla [ESC] Termina');
     if (qui1 = true) and (qui2 = false) then
     begin
       gotoxy(2,20);write('Juega Jugador N§1 ');
       gotoxy(2,19);write('Entre Posicion X : ');
       gotoxy(21,19);readln(posx);
       gotoxy(2,19);clreol;
       gotoxy(2,19);write('Entre Posicion Y : ');
       gotoxy(21,19);readln(posy);
       gotoxy(2,19);clreol;
       gotoxy(2,20);clreol;
       gotoxy(posx, posy);write('*');
     end;
     if (qui1 = false) and (qui2 = true) then
     begin
       gotoxy(2,20);write('Juega Jugador N§2 ');
       gotoxy(2,19);write('Entre Posicion X : ');
       gotoxy(21,19);readln(posx);
       gotoxy(2,19);clreol;
       gotoxy(2,19);write('Entre Posicion Y : ');
       gotoxy(21,19);readln(posy);
       gotoxy(2,19);clreol;
       gotoxy(2,20);clreol;
       gotoxy(posx, posy);write('*');
     end;
     if (qui1 = true) and (qui2 = false) then
     begin
        qui1 := false;
        qui2 := true;
     end
   else
      begin
         qui2 := false;
         qui1 := true;
      end;
   end;
 
 procedure guardapartida;
 begin
    assign(f,'Partid1.dat');
    rewrite(f);
    seek(f,0);
    write(f,par);
    close(f);
 end;
 
  procedure cargapartida;
  begin
     assign(f,'Partid1.dat');
  {$I-} reset(f); {$I+}
  if ioresult <> 0 then
  begin
     writeln('Error Archivo No Encontrado Pulse [Enter]');
     readln;
     exit;
  end
 else
     begin
        seek(f,0);
        read(f,par);
        close(f);
     end;
  end;
 
 begin
     clrscr;
   repeat
     writeln(' 1 = Nueva Partida');
     writeln(' 2 = Caegar Partida');
     writeln(' 3 = Salir');
     repeat
     tecla := readkey;
     until tecla in['1','2','3'];
   case ord(tecla) - 48 of
 1 : sorteo;
 2 : cargapartida;
   end;
   until tecla in['1','2','3'];
  if tecla in['1','2'] then
  begin
   repeat
   disparo;
   gotoxy(2,20);write('Pulse Espacio = Seguir \ Esc = Salir \ G = guardar y Sale');
   tecla := readkey;
   gotoxy(2,20);clreol;
   if upcase(tecla) = 'G' then
   begin
   guardapartida;
   tecla := #27;
   end;
   until tecla = #27;
  end;
 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

Hundir la flota en PAscal

Publicado por Juan (7 intervenciones) el 08/01/2013 19:02:53
Muchísimas gracias.
Le voy a echar un vistazo
Un saludo
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