-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgeneradorMapa.psc
More file actions
194 lines (155 loc) · 5.54 KB
/
generadorMapa.psc
File metadata and controls
194 lines (155 loc) · 5.54 KB
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
Proceso Principal
Definir tam, n Como Entero;
Definir laberinto, estadoOriginal Como Caracter;
Dimension laberinto(20,20);
Dimension estadoOriginal(20,20);
tam <- 20; // Tamaño del laberinto
poblarLaberinto(tam, laberinto);
Escribir "Creando Mundo...";
Escribir "";
Mientras no esConectado(tam, laberinto) Hacer
poblarLaberinto(tam, laberinto);
Para n <- 0 Hasta 4 Hacer
aplicarReglas(tam, laberinto);
FinPara
FinMientras
// Limpiar alrededores de la entrada y la salida
laberinto(0,1) <- " ";
laberinto(1,0) <- " ";
laberinto(1,1) <- " ";
laberinto((tam-1),(tam-1)-1) <- " ";
laberinto((tam-1)-1,(tam-1)) <- " ";
laberinto((tam-1)-1,(tam-1)-1) <- " ";
poblarLaberintoEnemigos(tam, laberinto);
mostrarLaberinto(tam, laberinto);
//Confirmación
Si esConectado(tam, laberinto) Entonces
Escribir "La entrada y la salida están conectadas.";
Sino
Escribir "La entrada y la salida no están conectadas.";
FinSi
FinProceso
SubProceso poblarLaberinto(tam,laberinto)
Definir fila, columna Como Entero;
Definir bloques Como Caracter;
Dimension bloques(3);
bloques(0) <- " "; //Espacio en blanco
bloques(1) <- " "; //Segundo espacio (es necesario porque da 66 porciento de probabilidad de que genere un espacio y hace más rapido el proceso)
bloques(2) <- "X";
Para fila <- 0 Hasta tam-1 Hacer
Para columna <- 0 Hasta tam-1 Hacer
laberinto(fila, columna) <- bloques(azar(3));
FinPara
FinPara
FinSubProceso
SubProceso vecinos <- contarVecinos(fila, columna, tam, laberinto)
Definir vecinos Como Entero;
Definir k, ni, nj Como Entero;
Definir dx Como Entero;
Definir dy Como Entero;
Dimension dx(8);
Dimension dy(8);
vecinos <- 0;
dx(0) <- -1; dy(0) <- -1;
dx(1) <- -1; dy(1) <- 0;
dx(2) <- -1; dy(2) <- 1;
dx(3) <- 0; dy(3) <- -1;
dx(4) <- 0; dy(4) <- 1;
dx(5) <- 1; dy(5) <- -1;
dx(6) <- 1; dy(6) <- 0;
dx(7) <- 1; dy(7) <- 1;
Para k <- 0 Hasta 7 Hacer
ni <- fila + dx(k);
nj <- columna + dy(k);
// Verificar si el vecino está dentro de los límites
Si ni >= 1 Y ni <= tam-1 Y nj >= 1 Y nj <= tam-1 Entonces
Si laberinto(ni, nj) = "X" Entonces
vecinos <- vecinos + 1;
FinSi
FinSi
FinPara
FinSubProceso
SubProceso poblarLaberintoEnemigos(tam, laberinto)
Definir fila, columna Como Entero;
Definir contadorE Como Entero;
Definir posicionFila, posicionColumna Como Entero;
contadorE <- 0;
Mientras contadorE < 20 Hacer
posicionFila <- Azar(tam-1); // Genera una fila aleatoria
posicionColumna <- Azar(tam-1); // Genera una columna aleatoria
Si laberinto(posicionFila, posicionColumna) = " " Entonces
laberinto(posicionFila, posicionColumna) <- "E";
contadorE <- contadorE + 1;
FinSi
FinMientras
FinSubProceso
SubProceso aplicarReglas(tam, laberinto)
Definir fila, columna Como Entero;
// Reglas 4-5
Para fila <- 1 Hasta tam-1 Hacer
Para columna <- 1 Hasta tam-1 Hacer
Si laberinto(fila, columna) = "X" y contarVecinos(fila, columna, tam, laberinto) >= 4 o laberinto(fila, columna) = " " y contarVecinos(fila, columna, tam, laberinto) >= 5 Entonces
laberinto(fila, columna) <- "X";
FinSi
FinPara
FinPara
// Punto de entrada y de salida
laberinto(0,0) <- "C";
laberinto(tam-1,tam-1) <- "[";
FinSubProceso
SubProceso mostrarLaberinto(tam, laberinto)
Definir fila, columna Como Entero;
Para fila <- 0 Hasta tam-1 Hacer
Para columna <- 0 Hasta tam-1 Hacer
Escribir "[", laberinto(fila, columna), "] " Sin Saltar;
FinPara
Escribir " ";
FinPara
FinSubProceso
SubProceso conectado <- esConectado(tam, laberinto)
Definir visitado Como Logico;
Dimension visitado(20, 20);
Definir fila, columna Como Entero;
Definir conectado Como Logico;
// Inicializar el arreglo de visitados
Para fila <- 0 Hasta tam-1 Hacer
Para columna <- 0 Hasta tam-1 Hacer
visitado(fila, columna) <- Falso;
FinPara
FinPara
// Inicializar DFS desde la entrada
conectado <- DFS(0, 0, tam, laberinto, visitado);
FinSubProceso
SubProceso encontrado <- DFS(fila, columna, tam, laberinto, visitado)
Definir dx, dy Como Entero;
Definir nx, ny Como Entero;
Definir k Como Entero;
Dimension dx(4);
Dimension dy(4);
Definir encontrado Como Logico;
// Movimientos posibles (derecha, abajo, izquierda, arriba)
dx(0) <- 1; dy(0) <- 0;
dx(1) <- 0; dy(1) <- 1;
dx(2) <- -1; dy(2) <- 0;
dx(3) <- 0; dy(3) <- -1;
// Si se llega a la salida
Si fila = tam-1 Y columna = tam-1 Entonces
encontrado <- Verdadero;
Sino
// Marcar como visitado
visitado(fila, columna) <- Verdadero;
encontrado <- Falso;
// Probar cada movimiento posible
Para k <- 0 Hasta 3 Hacer
nx <- fila + dx(k);
ny <- columna + dy(k);
// Verificar si el siguiente paso es válido
Si nx >= 0 Y nx < tam Y ny >= 0 Y ny < tam Y no visitado(nx, ny) Y laberinto(nx, ny) <> "X" Entonces
encontrado <- DFS(nx, ny, tam, laberinto, visitado);
Si encontrado Entonces
k <- 4; // Salir del bucle para evitar seguir buscando
FinSi
FinSi
FinPara
FinSi
FinSubProceso