Visual Basic.NET - busqueda pathfind bloquea programa

 
Vista:

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.
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder