busqueda pathfind bloquea programa
Publicado por Manuel (2 intervenciones) el 27/08/2016 20:11:32
Buenas.
Estoy haciendo un generador de mazmorras aleatorias, y una parte consiste en unir dos puntos en una matriz.
asigno una coordenada al punto de comienzo, y otra coordenada al punto del final, y voy generando rutas aleatorias que salen desde el comienzo, y si alguna llega al punto del final, pues resulta válida.
Por lo general, el código funciona bien, y crea una ruta válida en muy poco tiempo.
Mi problema consiste en que, a veces, mi código bloquea el programa sin razón aparente (para mi).
A ver si alguien es capaz de iluminarme.
El número de cálculos de ruta que cuelga el programa varía bastante, así que no tengo muy claro por qué puede ser. Sospecho que las rutas deben petar por algún lado el código. A ver si alguien se anima y me echa una mano.
Un saludo a todos.
Estoy haciendo un generador de mazmorras aleatorias, y una parte consiste en unir dos puntos en una matriz.
asigno una coordenada al punto de comienzo, y otra coordenada al punto del final, y voy generando rutas aleatorias que salen desde el comienzo, y si alguna llega al punto del final, pues resulta válida.
Por lo general, el código funciona bien, y crea una ruta válida en muy poco tiempo.
Mi problema consiste en que, a veces, mi código bloquea el programa sin razón aparente (para mi).
A ver si alguien es capaz de iluminarme.
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
Structure camino 'ahora mismo no hace mucha falta el structure, pero en un futuro mis planes son usarlo.
Dim selected As Boolean
Dim value As Integer
End Structure
Dim celdaActual(50, 50) As camino 'esta es la matriz de ceros donde voy a ir excavando caminos con valor 1
Private Sub PintamapaAB()
Dim cadena As String 'Esto dibuja la matriz en un Textbox multiline
TextBox1.Clear()
For x = 0 To 50
cadena = ""
For y = 0 To 50
cadena = cadena & celdaActual(x, y).value.ToString
Next
TextBox1.AppendText(cadena & vbCrLf)
Next
End Sub
Private Sub BuscarABToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuscarABToolStripMenuItem.Click
Dim adondevamos As Integer
Dim xs, ys, txs, tys As Integer
Dim sumalrededor As Integer
Randomize()
Me.Text = 1
volvemosen: 'arrancamos a buscar una ruta cualquiera
'Iniciamos el punto A, y vamos a hacer un camino aleatorio. Luego comprobaremos si el camino ha llegado al objetivo.
xs = 25 'donde tenemos al muñeco
ys = 25
celdaActual(xs, ys).value = 1 'al ser 1, es que esa celda forma parte del camino
For a = 1 To 20 'vamos a buscar un camino de 20 pasos
Do While sumalrededor <> 1 ' si es 1, el paso es válido, si no, repite el proceso y busca otro paso posible
adondevamos = Rnd() * 4
If adondevamos = 1 Then txs = xs + 1 : tys = ys 'probamos si a la derecha podemos poner un 1
If adondevamos = 2 Then txs = xs - 1 : tys = ys 'izquierda
If adondevamos = 3 Then txs = xs : tys = ys + 1 'arriba
If adondevamos = 4 Then txs = xs : tys = ys - 1 'abajo
'sumamos todo lo que haya alrededor de nuestra celda a prueba, para que no haya bucles dentro del camino
Try
sumalrededor = celdaActual(txs - 1, tys).value + celdaActual(txs + 1, tys).value + celdaActual(txs, tys - 1).value + celdaActual(txs, tys + 1).value
Catch ex As Exception
End Try
Loop
'ya hemos creado un paso del camino, y devolvemos los valores temporales a 0 para buscar otro paso
sumalrededor = 0
celdaActual(txs, tys).value = 1
xs = txs : ys = tys
Next
'Buscamos una ruta desde A hasta B(17,29) por ejemplo.
PintamapaAB()
If xs = 17 And ys = 29 Then
PintamapaAB() 'Hemos triunfado!!!, hemos encontrado una ruta válida!!!
Else
For x = 1 To 50
For y = 1 To 50
celdaActual(x, y).value = 0
Next
Next
Me.Text = Me.Text + 1
Application.DoEvents()
GoTo volvemosen 'como no hemos triunfado, volvemos a buscar otra ruta (ya sé que el GOTO es una
'mierda, pero hasta que no sepa por qué falla, todos nos entendemos)
End If
End Sub
El número de cálculos de ruta que cuelga el programa varía bastante, así que no tengo muy claro por qué puede ser. Sospecho que las rutas deben petar por algún lado el código. A ver si alguien se anima y me echa una mano.
Un saludo a todos.
Valora esta pregunta


0