A* Algorithmus?!

    • Offizieller Beitrag

    Heyho,

    Ich bins nochmal, wieder mit dem Spiel "Schäfchen ins Trockene bringen" (aka. "Fang den Hut")
    Ich versuche grade folgendes: Wie kommt mein Schaf möglichst schnell von dem Platz wo es grade ist auf ein anderen Platz.
    Das Spiel gibt mir immer 3 Würfel (wovon mindestens zwei verschieden sind). Die Möglichen Züge, die mein Schaf gehen kann, habe ich in einem Array und die Felder + die Nachbarsfelder ebenfalls in einem Array
    (z.B. für Feld 0: [0][1] = 5 [0][2] = 10 [0][3] = 15 [0][4] = 20 - Feld 0 hat also 4 Nachbars Felder: 5,10,15 und 20)

    Hier mal die beiden Arrays:
    $SC_ARR_PLACES (alle Felder)

    Spoiler anzeigen
    [autoit]

    Global $SC_ARR_PLACES[65][5]
    $SC_ARR_PLACES[0][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[0][1] = 5; 1. Nachbar von Feld 0
    $SC_ARR_PLACES[0][2] = 20; 2. Nachbar von Feld 0
    $SC_ARR_PLACES[0][3] = 10; 3. Nachbar von Feld 0
    $SC_ARR_PLACES[0][4] = 15; 4. Nachbar von Feld 0
    $SC_ARR_PLACES[1][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[1][1] = 51; 1. Nachbar von Feld 1
    $SC_ARR_PLACES[1][2] = 64; 2. Nachbar von Feld 1
    $SC_ARR_PLACES[1][3] = 52; 3. Nachbar von Feld 1
    $SC_ARR_PLACES[1][4] = 9; 4. Nachbar von Feld 1
    $SC_ARR_PLACES[2][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[2][1] = 34; 1. Nachbar von Feld 2
    $SC_ARR_PLACES[2][2] = 33; 2. Nachbar von Feld 2
    $SC_ARR_PLACES[2][3] = 62; 3. Nachbar von Feld 2
    $SC_ARR_PLACES[2][4] = 14; 4. Nachbar von Feld 2
    $SC_ARR_PLACES[3][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[3][1] = 19; 1. Nachbar von Feld 3
    $SC_ARR_PLACES[3][2] = 42; 2. Nachbar von Feld 3
    $SC_ARR_PLACES[3][3] = 43; 3. Nachbar von Feld 3
    $SC_ARR_PLACES[3][4] = 63; 4. Nachbar von Feld 3
    $SC_ARR_PLACES[4][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[4][1] = 25; 1. Nachbar von Feld 4
    $SC_ARR_PLACES[4][2] = 24; 2. Nachbar von Feld 4
    $SC_ARR_PLACES[4][3] = 61; 3. Nachbar von Feld 4
    $SC_ARR_PLACES[4][4] = 60; 4. Nachbar von Feld 4
    $SC_ARR_PLACES[5][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[5][1] = 0; 1. Nachbar von Feld 5
    $SC_ARR_PLACES[5][2] = 6; 2. Nachbar von Feld 5
    $SC_ARR_PLACES[6][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[6][1] = 5; 1. Nachbar von Feld 6
    $SC_ARR_PLACES[6][2] = 7; 2. Nachbar von Feld 6
    $SC_ARR_PLACES[7][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[7][1] = 6; 1. Nachbar von Feld 7
    $SC_ARR_PLACES[7][2] = 8; 2. Nachbar von Feld 7
    $SC_ARR_PLACES[8][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[8][1] = 7; 1. Nachbar von Feld 8
    $SC_ARR_PLACES[8][2] = 9; 2. Nachbar von Feld 8
    $SC_ARR_PLACES[9][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[9][1] = 1; 1. Nachbar von Feld 9
    $SC_ARR_PLACES[9][2] = 8; 2. Nachbar von Feld 9
    $SC_ARR_PLACES[10][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[10][1] = 0; 1. Nachbar von Feld 10
    $SC_ARR_PLACES[10][2] = 11; 2. Nachbar von Feld 10
    $SC_ARR_PLACES[11][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[11][1] = 10; 1. Nachbar von Feld 11
    $SC_ARR_PLACES[11][2] = 12; 2. Nachbar von Feld 11
    $SC_ARR_PLACES[12][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[12][1] = 11; 1. Nachbar von Feld 12
    $SC_ARR_PLACES[12][2] = 13; 2. Nachbar von Feld 12
    $SC_ARR_PLACES[13][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[13][1] = 12; 1. Nachbar von Feld 13
    $SC_ARR_PLACES[13][2] = 14; 2. Nachbar von Feld 13
    $SC_ARR_PLACES[14][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[14][1] = 2; 1. Nachbar von Feld 14
    $SC_ARR_PLACES[14][2] = 13; 2. Nachbar von Feld 14
    $SC_ARR_PLACES[15][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[15][1] = 0; 1. Nachbar von Feld 15
    $SC_ARR_PLACES[15][2] = 16; 2. Nachbar von Feld 15
    $SC_ARR_PLACES[16][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[16][1] = 17; 1. Nachbar von Feld 16
    $SC_ARR_PLACES[16][2] = 15; 2. Nachbar von Feld 16
    $SC_ARR_PLACES[17][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[17][1] = 16; 1. Nachbar von Feld 17
    $SC_ARR_PLACES[17][2] = 18; 2. Nachbar von Feld 17
    $SC_ARR_PLACES[18][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[18][1] = 17; 1. Nachbar von Feld 18
    $SC_ARR_PLACES[18][2] = 19; 2. Nachbar von Feld 18
    $SC_ARR_PLACES[19][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[19][1] = 18; 1. Nachbar von Feld 19
    $SC_ARR_PLACES[19][2] = 3; 2. Nachbar von Feld 19
    $SC_ARR_PLACES[20][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[20][1] = 0; 1. Nachbar von Feld 20
    $SC_ARR_PLACES[20][2] = 21; 2. Nachbar von Feld 20
    $SC_ARR_PLACES[21][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[21][1] = 20; 1. Nachbar von Feld 21
    $SC_ARR_PLACES[21][2] = 22; 2. Nachbar von Feld 21
    $SC_ARR_PLACES[22][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[22][1] = 21; 1. Nachbar von Feld 22
    $SC_ARR_PLACES[22][2] = 23; 2. Nachbar von Feld 22
    $SC_ARR_PLACES[23][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[23][1] = 22; 1. Nachbar von Feld 23
    $SC_ARR_PLACES[23][2] = 24; 2. Nachbar von Feld 23
    $SC_ARR_PLACES[24][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[24][1] = 4; 1. Nachbar von Feld 24
    $SC_ARR_PLACES[24][2] = 23; 2. Nachbar von Feld 24
    $SC_ARR_PLACES[25][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[25][1] = 4; 1. Nachbar von Feld 25
    $SC_ARR_PLACES[25][2] = 26; 2. Nachbar von Feld 25
    $SC_ARR_PLACES[26][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[26][1] = 25; 1. Nachbar von Feld 26
    $SC_ARR_PLACES[26][2] = 27; 2. Nachbar von Feld 26
    $SC_ARR_PLACES[27][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[27][1] = 26; 1. Nachbar von Feld 27
    $SC_ARR_PLACES[27][2] = 28; 2. Nachbar von Feld 27
    $SC_ARR_PLACES[28][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[28][1] = 27; 1. Nachbar von Feld 28
    $SC_ARR_PLACES[28][2] = 29; 2. Nachbar von Feld 28
    $SC_ARR_PLACES[29][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[29][1] = 28; 1. Nachbar von Feld 29
    $SC_ARR_PLACES[29][2] = 30; 2. Nachbar von Feld 29
    $SC_ARR_PLACES[30][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[30][1] = 29; 1. Nachbar von Feld 30
    $SC_ARR_PLACES[30][2] = 31; 2. Nachbar von Feld 30
    $SC_ARR_PLACES[31][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[31][1] = 32; 1. Nachbar von Feld 31
    $SC_ARR_PLACES[31][2] = 30; 2. Nachbar von Feld 31
    $SC_ARR_PLACES[32][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[32][1] = 33; 1. Nachbar von Feld 32
    $SC_ARR_PLACES[32][2] = 31; 2. Nachbar von Feld 32
    $SC_ARR_PLACES[33][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[33][1] = 32; 1. Nachbar von Feld 33
    $SC_ARR_PLACES[33][2] = 2; 2. Nachbar von Feld 33
    $SC_ARR_PLACES[34][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[34][1] = 35; 1. Nachbar von Feld 34
    $SC_ARR_PLACES[34][2] = 2; 2. Nachbar von Feld 34
    $SC_ARR_PLACES[35][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[35][1] = 34; 1. Nachbar von Feld 35
    $SC_ARR_PLACES[35][2] = 36; 2. Nachbar von Feld 35
    $SC_ARR_PLACES[36][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[36][1] = 35; 1. Nachbar von Feld 36
    $SC_ARR_PLACES[36][2] = 37; 2. Nachbar von Feld 36
    $SC_ARR_PLACES[37][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[37][1] = 38; 1. Nachbar von Feld 37
    $SC_ARR_PLACES[37][2] = 36; 2. Nachbar von Feld 37
    $SC_ARR_PLACES[38][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[38][1] = 39; 1. Nachbar von Feld 38
    $SC_ARR_PLACES[38][2] = 37; 2. Nachbar von Feld 38
    $SC_ARR_PLACES[39][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[39][1] = 38; 1. Nachbar von Feld 39
    $SC_ARR_PLACES[39][2] = 40; 2. Nachbar von Feld 39
    $SC_ARR_PLACES[40][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[40][1] = 39; 1. Nachbar von Feld 40
    $SC_ARR_PLACES[40][2] = 41; 2. Nachbar von Feld 40
    $SC_ARR_PLACES[41][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[41][1] = 42; 1. Nachbar von Feld 41
    $SC_ARR_PLACES[41][2] = 40; 2. Nachbar von Feld 41
    $SC_ARR_PLACES[42][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[42][1] = 3; 1. Nachbar von Feld 42
    $SC_ARR_PLACES[42][2] = 41; 2. Nachbar von Feld 42
    $SC_ARR_PLACES[43][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[43][1] = 3; 1. Nachbar von Feld 43
    $SC_ARR_PLACES[43][2] = 44; 2. Nachbar von Feld 43
    $SC_ARR_PLACES[44][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[44][1] = 43; 1. Nachbar von Feld 44
    $SC_ARR_PLACES[44][2] = 45; 2. Nachbar von Feld 44
    $SC_ARR_PLACES[45][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[45][1] = 46; 1. Nachbar von Feld 45
    $SC_ARR_PLACES[45][2] = 44; 2. Nachbar von Feld 45
    $SC_ARR_PLACES[46][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[46][1] = 47; 1. Nachbar von Feld 46
    $SC_ARR_PLACES[46][2] = 45; 2. Nachbar von Feld 46
    $SC_ARR_PLACES[47][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[47][1] = 48; 1. Nachbar von Feld 47
    $SC_ARR_PLACES[47][2] = 46; 2. Nachbar von Feld 47
    $SC_ARR_PLACES[48][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[48][1] = 49; 1. Nachbar von Feld 48
    $SC_ARR_PLACES[48][2] = 47; 2. Nachbar von Feld 48
    $SC_ARR_PLACES[49][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[49][1] = 50; 1. Nachbar von Feld 49
    $SC_ARR_PLACES[49][2] = 48; 2. Nachbar von Feld 49
    $SC_ARR_PLACES[50][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[50][1] = 51; 1. Nachbar von Feld 50
    $SC_ARR_PLACES[50][2] = 49; 2. Nachbar von Feld 50
    $SC_ARR_PLACES[51][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[51][1] = 50; 1. Nachbar von Feld 51
    $SC_ARR_PLACES[51][2] = 1; 2. Nachbar von Feld 51
    $SC_ARR_PLACES[52][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[52][1] = 1; 1. Nachbar von Feld 52
    $SC_ARR_PLACES[52][2] = 53; 2. Nachbar von Feld 52
    $SC_ARR_PLACES[53][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[53][1] = 54; 1. Nachbar von Feld 53
    $SC_ARR_PLACES[53][2] = 52; 2. Nachbar von Feld 53
    $SC_ARR_PLACES[54][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[54][1] = 55; 1. Nachbar von Feld 54
    $SC_ARR_PLACES[54][2] = 53; 2. Nachbar von Feld 54
    $SC_ARR_PLACES[55][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[55][1] = 54; 1. Nachbar von Feld 55
    $SC_ARR_PLACES[55][2] = 56; 2. Nachbar von Feld 55
    $SC_ARR_PLACES[56][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[56][1] = 55; 1. Nachbar von Feld 56
    $SC_ARR_PLACES[56][2] = 57; 2. Nachbar von Feld 56
    $SC_ARR_PLACES[57][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[57][1] = 58; 1. Nachbar von Feld 57
    $SC_ARR_PLACES[57][2] = 56; 2. Nachbar von Feld 57
    $SC_ARR_PLACES[58][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[58][1] = 59; 1. Nachbar von Feld 58
    $SC_ARR_PLACES[58][2] = 57; 2. Nachbar von Feld 58
    $SC_ARR_PLACES[59][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[59][1] = 58; 1. Nachbar von Feld 59
    $SC_ARR_PLACES[59][2] = 60; 2. Nachbar von Feld 59
    $SC_ARR_PLACES[60][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[60][1] = 4; 1. Nachbar von Feld 60
    $SC_ARR_PLACES[60][2] = 59; 2. Nachbar von Feld 60
    $SC_ARR_PLACES[61][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[61][1] = 4; 1. Nachbar von Feld 61
    $SC_ARR_PLACES[62][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[62][1] = 2; 1. Nachbar von Feld 62
    $SC_ARR_PLACES[63][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[63][1] = 3; 1. Nachbar von Feld 63
    $SC_ARR_PLACES[64][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[64][1] = 1; 1. Nachbar von Feld 64

    [/autoit]


    Und die Möglichen Züge könnten so Aussehen:
    $SC_ARR_POSSIBLEMOVES

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Gewürfelt wurde eine Vier eine Zwei und eine Eins
    ;Dies gilt nur für den Blauen Spieler (Schaf 1,2,3 und 7,8,9)
    ;Alle Schafe sind noch in ihren Heimatfeldern
    Global $SC_ARR_POSSIBLEMOVES[43][2]
    $SC_ARR_POSSIBLEMOVES[0][0] = 42;Mögliche Züge
    ;Schaf 1 kann auf Feld 4
    $SC_ARR_POSSIBLEMOVES[1][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[1][1] = 4; Platz
    ;Schaf 1 kann auf Feld 25
    $SC_ARR_POSSIBLEMOVES[2][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[2][1] = 25; Platz
    ;Schaf 1 kann auf Feld 24
    $SC_ARR_POSSIBLEMOVES[3][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[3][1] = 24; Platz
    ;Schaf 1 kann auf Feld 60
    $SC_ARR_POSSIBLEMOVES[4][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[4][1] = 60; Platz
    ;Schaf 1 kann auf Feld 27
    $SC_ARR_POSSIBLEMOVES[5][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[5][1] = 27; Platz
    ;Schaf 1 kann auf Feld 22
    $SC_ARR_POSSIBLEMOVES[6][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[6][1] = 22; Platz
    ;Schaf 1 kann auf Feld 58
    $SC_ARR_POSSIBLEMOVES[7][0] = 1; Schaf
    $SC_ARR_POSSIBLEMOVES[7][1] = 58; Platz
    ;Schaf 2 kann auf Feld 4
    $SC_ARR_POSSIBLEMOVES[8][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[8][1] = 4; Platz
    ;Schaf 2 kann auf Feld 25
    $SC_ARR_POSSIBLEMOVES[9][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[9][1] = 25; Platz
    ;Schaf 2 kann auf Feld 24
    $SC_ARR_POSSIBLEMOVES[10][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[10][1] = 24; Platz
    ;Schaf 2 kann auf Feld 60
    $SC_ARR_POSSIBLEMOVES[11][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[11][1] = 60; Platz
    ;Schaf 2 kann auf Feld 27
    $SC_ARR_POSSIBLEMOVES[12][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[12][1] = 27; Platz
    ;Schaf 2 kann auf Feld 22
    $SC_ARR_POSSIBLEMOVES[13][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[13][1] = 22; Platz
    ;Schaf 2 kann auf Feld 58
    $SC_ARR_POSSIBLEMOVES[14][0] = 2; Schaf
    $SC_ARR_POSSIBLEMOVES[14][1] = 58; Platz
    ;Schaf 3 kann auf Feld 4
    $SC_ARR_POSSIBLEMOVES[15][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[15][1] = 4; Platz
    ;Schaf 3 kann auf Feld 25
    $SC_ARR_POSSIBLEMOVES[16][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[16][1] = 25; Platz
    ;Schaf 3 kann auf Feld 24
    $SC_ARR_POSSIBLEMOVES[17][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[17][1] = 24; Platz
    ;Schaf 3 kann auf Feld 60
    $SC_ARR_POSSIBLEMOVES[18][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[18][1] = 60; Platz
    ;Schaf 3 kann auf Feld 27
    $SC_ARR_POSSIBLEMOVES[19][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[19][1] = 27; Platz
    ;Schaf 3 kann auf Feld 22
    $SC_ARR_POSSIBLEMOVES[20][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[20][1] = 22; Platz
    ;Schaf 3 kann auf Feld 58
    $SC_ARR_POSSIBLEMOVES[21][0] = 3; Schaf
    $SC_ARR_POSSIBLEMOVES[21][1] = 58; Platz
    ;Schaf 7 kann auf Feld 3
    $SC_ARR_POSSIBLEMOVES[22][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[22][1] = 3; Platz
    ;Schaf 7 kann auf Feld 19
    $SC_ARR_POSSIBLEMOVES[23][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[23][1] = 19; Platz
    ;Schaf 7 kann auf Feld 42
    $SC_ARR_POSSIBLEMOVES[24][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[24][1] = 42; Platz
    ;Schaf 7 kann auf Feld 43
    $SC_ARR_POSSIBLEMOVES[25][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[25][1] = 43; Platz
    ;Schaf 7 kann auf Feld 17
    $SC_ARR_POSSIBLEMOVES[26][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[26][1] = 17; Platz
    ;Schaf 7 kann auf Feld 40
    $SC_ARR_POSSIBLEMOVES[27][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[27][1] = 40; Platz
    ;Schaf 7 kann auf Feld 45
    $SC_ARR_POSSIBLEMOVES[28][0] = 7; Schaf
    $SC_ARR_POSSIBLEMOVES[28][1] = 45; Platz
    ;Schaf 8 kann auf Feld 3
    $SC_ARR_POSSIBLEMOVES[29][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[29][1] = 3; Platz
    ;Schaf 8 kann auf Feld 19
    $SC_ARR_POSSIBLEMOVES[30][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[30][1] = 19; Platz
    ;Schaf 8 kann auf Feld 42
    $SC_ARR_POSSIBLEMOVES[31][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[31][1] = 42; Platz
    ;Schaf 8 kann auf Feld 43
    $SC_ARR_POSSIBLEMOVES[32][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[32][1] = 43; Platz
    ;Schaf 8 kann auf Feld 17
    $SC_ARR_POSSIBLEMOVES[33][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[33][1] = 17; Platz
    ;Schaf 8 kann auf Feld 40
    $SC_ARR_POSSIBLEMOVES[34][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[34][1] = 40; Platz
    ;Schaf 8 kann auf Feld 45
    $SC_ARR_POSSIBLEMOVES[35][0] = 8; Schaf
    $SC_ARR_POSSIBLEMOVES[35][1] = 45; Platz
    ;Schaf 9 kann auf Feld 3
    $SC_ARR_POSSIBLEMOVES[36][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[36][1] = 3; Platz
    ;Schaf 9 kann auf Feld 19
    $SC_ARR_POSSIBLEMOVES[37][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[37][1] = 19; Platz
    ;Schaf 9 kann auf Feld 42
    $SC_ARR_POSSIBLEMOVES[38][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[38][1] = 42; Platz
    ;Schaf 9 kann auf Feld 43
    $SC_ARR_POSSIBLEMOVES[39][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[39][1] = 43; Platz
    ;Schaf 9 kann auf Feld 17
    $SC_ARR_POSSIBLEMOVES[40][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[40][1] = 17; Platz
    ;Schaf 9 kann auf Feld 40
    $SC_ARR_POSSIBLEMOVES[41][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[41][1] = 40; Platz
    ;Schaf 9 kann auf Feld 45
    $SC_ARR_POSSIBLEMOVES[42][0] = 9; Schaf
    $SC_ARR_POSSIBLEMOVES[42][1] = 45; Platz

    [/autoit]

    Nun will ich zum Beispiel Schaf 2 sagen, er soll möglichst schnell zu Feld 11. (Siehe Bild im Anhang)
    Wie mache ich das am besten? Der A* Algorithmus (A stern bzw A star) hört sich da genau richtig an, leider weiß ich nicht, wie ich den mit Feldern anstelle von Koordinaten füttern kann.
    Hat sonst jemand noch eine andere Idee? Ich habe mir vielleicht überlegt meine Funktion zum herausfinden der möglichen Züge zu modifizieren, leider komme ich da nicht weiter, da die Züge nicht "Spinnenartig" vom Feld aus gehen, sondern ich mit einer Rekursiven funktion gearbeitet habe. (Er checkt z.B. NICHT so: Start: Feld 63 -> 3 -> 42 -> 3 -> 19 -> 3 -> 43 sonder so: 63 -> 3 -> 42 -> 41 -> 40 -> ...)

    Spoiler anzeigen
    [autoit]

    Func _SC_RefreshPossibleMoves()
    Global $SC_ARR_POSSIBLEMOVES[1][2];Setze die Globale Varialbe GetPossible (== Mögliche Züge) zurück
    Local $n, $m
    Local $aMySheeps = _SC_GetMySheeps()
    For $n = 0 To 5
    For $m = 1 To 6
    If _SC_SheepExists($aMySheeps[$n]) Then;wenn das schaf überhaupt noch existiert (falls es gefressen wird, kanns auch nicht mehr gehen)
    If _ArraySearch($SC_ARR_DIE,$m) > -1 Then;damit die möglichen Züge nach Größe sortiert werden
    ConsoleWrite($m & @CRLF)
    Local $iPlace = $SC_ARR_SHEEP[$aMySheeps[$n]][6];Der momentane Platz des Schaafes, z.B. 61
    Local $aAlready[1] = [$iPlace];Die, die schon geprüft wurden
    $aAlready = __SC_Recursive_GetPossible($iPlace, $aAlready, $aMySheeps[$n], 1, $m);SC_ARR_DIE[0] gibt den ersten würfel zurück, z.B. 5
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Next
    $SC_ARR_POSSIBLEMOVES[0][0] = UBound($SC_ARR_POSSIBLEMOVES) - 1

    [/autoit] [autoit][/autoit] [autoit]

    ;Gibt die globale variable zurück
    Return $SC_ARR_POSSIBLEMOVES
    EndFunc ;==>_SC_RefreshPossibleMoves

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __SC_Recursive_GetPossible($iPlace, $aAlready, $iSheep, $zaehler = 0, $iTo = 6)
    Local $i2, $z
    $aNeighbour = _SC_GetNeighbourPlaces($iPlace);gibt die nachbarsplätze eines platzes aus in einem array (array[0] = anz)
    For $i2 = 1 To $aNeighbour[0];schleife
    If $zaehler = $iTo Then;wenn zaehler = wuerfel dann schreibe in das global array (SC_ARR_GETPOSSIBLE)
    If _ArraySearch($aAlready, $aNeighbour[$i2]) = -1 And $aNeighbour[$i2] <> '' Then
    If _SC_IsValidTurn($iSheep, $aNeighbour[$i2]) Then
    Local $iUb = UBound($SC_ARR_POSSIBLEMOVES)
    ReDim $SC_ARR_POSSIBLEMOVES[$iUb + 1][2]
    $SC_ARR_POSSIBLEMOVES[$iUb][0] = $iSheep
    $SC_ARR_POSSIBLEMOVES[$iUb][1] = $aNeighbour[$i2]
    EndIf
    EndIf
    Else;wenn zaehler < wuerfel dann schreibe das momentane feld in ein array und finde davon wieder die nachbars felder (rekursion)
    If _ArraySearch($aAlready, $aNeighbour[$i2]) = -1 Then
    Local $iUb = UBound($aAlready)
    ReDim $aAlready[$iUb + 1]
    $aAlready[$iUb] = $aNeighbour[$i2]
    __SC_Recursive_GetPossible($aNeighbour[$i2], $aAlready, $iSheep, $zaehler + 1, $iTo);zaehler +=1
    EndIf
    EndIf
    Next
    Return $aAlready;gibt aalready zurück für _test2
    EndFunc ;==>__SC_Recursive_GetPossible

    [/autoit]

    Im Anhang ist sonst auch noch mal ein funktionstüchtiges Beispiel (zum Herausfinden der Möglichen Züge)

    Vielen Dank schonmal :)

    Gruß
    Spider

    • Offizieller Beitrag

    Das geht auch einfacher!

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $SC_ARR_POSSIBLEMOVES[1][2];Setze die Globale Varialbe GetPossible (== Mögliche Züge) zurück
    Global $SC_ARR_PLACES[65][5]
    $SC_ARR_PLACES[0][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[0][1] = 5; 1. Nachbar von Feld 0
    $SC_ARR_PLACES[0][2] = 20; 2. Nachbar von Feld 0
    $SC_ARR_PLACES[0][3] = 10; 3. Nachbar von Feld 0
    $SC_ARR_PLACES[0][4] = 15; 4. Nachbar von Feld 0
    $SC_ARR_PLACES[1][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[1][1] = 51; 1. Nachbar von Feld 1
    $SC_ARR_PLACES[1][2] = 64; 2. Nachbar von Feld 1
    $SC_ARR_PLACES[1][3] = 52; 3. Nachbar von Feld 1
    $SC_ARR_PLACES[1][4] = 9; 4. Nachbar von Feld 1
    $SC_ARR_PLACES[2][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[2][1] = 34; 1. Nachbar von Feld 2
    $SC_ARR_PLACES[2][2] = 33; 2. Nachbar von Feld 2
    $SC_ARR_PLACES[2][3] = 62; 3. Nachbar von Feld 2
    $SC_ARR_PLACES[2][4] = 14; 4. Nachbar von Feld 2
    $SC_ARR_PLACES[3][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[3][1] = 19; 1. Nachbar von Feld 3
    $SC_ARR_PLACES[3][2] = 42; 2. Nachbar von Feld 3
    $SC_ARR_PLACES[3][3] = 43; 3. Nachbar von Feld 3
    $SC_ARR_PLACES[3][4] = 63; 4. Nachbar von Feld 3
    $SC_ARR_PLACES[4][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[4][1] = 25; 1. Nachbar von Feld 4
    $SC_ARR_PLACES[4][2] = 24; 2. Nachbar von Feld 4
    $SC_ARR_PLACES[4][3] = 61; 3. Nachbar von Feld 4
    $SC_ARR_PLACES[4][4] = 60; 4. Nachbar von Feld 4
    $SC_ARR_PLACES[5][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[5][1] = 0; 1. Nachbar von Feld 5
    $SC_ARR_PLACES[5][2] = 6; 2. Nachbar von Feld 5
    $SC_ARR_PLACES[6][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[6][1] = 5; 1. Nachbar von Feld 6
    $SC_ARR_PLACES[6][2] = 7; 2. Nachbar von Feld 6
    $SC_ARR_PLACES[7][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[7][1] = 6; 1. Nachbar von Feld 7
    $SC_ARR_PLACES[7][2] = 8; 2. Nachbar von Feld 7
    $SC_ARR_PLACES[8][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[8][1] = 7; 1. Nachbar von Feld 8
    $SC_ARR_PLACES[8][2] = 9; 2. Nachbar von Feld 8
    $SC_ARR_PLACES[9][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[9][1] = 1; 1. Nachbar von Feld 9
    $SC_ARR_PLACES[9][2] = 8; 2. Nachbar von Feld 9
    $SC_ARR_PLACES[10][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[10][1] = 0; 1. Nachbar von Feld 10
    $SC_ARR_PLACES[10][2] = 11; 2. Nachbar von Feld 10
    $SC_ARR_PLACES[11][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[11][1] = 10; 1. Nachbar von Feld 11
    $SC_ARR_PLACES[11][2] = 12; 2. Nachbar von Feld 11
    $SC_ARR_PLACES[12][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[12][1] = 11; 1. Nachbar von Feld 12
    $SC_ARR_PLACES[12][2] = 13; 2. Nachbar von Feld 12
    $SC_ARR_PLACES[13][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[13][1] = 12; 1. Nachbar von Feld 13
    $SC_ARR_PLACES[13][2] = 14; 2. Nachbar von Feld 13
    $SC_ARR_PLACES[14][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[14][1] = 2; 1. Nachbar von Feld 14
    $SC_ARR_PLACES[14][2] = 13; 2. Nachbar von Feld 14
    $SC_ARR_PLACES[15][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[15][1] = 0; 1. Nachbar von Feld 15
    $SC_ARR_PLACES[15][2] = 16; 2. Nachbar von Feld 15
    $SC_ARR_PLACES[16][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[16][1] = 17; 1. Nachbar von Feld 16
    $SC_ARR_PLACES[16][2] = 15; 2. Nachbar von Feld 16
    $SC_ARR_PLACES[17][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[17][1] = 16; 1. Nachbar von Feld 17
    $SC_ARR_PLACES[17][2] = 18; 2. Nachbar von Feld 17
    $SC_ARR_PLACES[18][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[18][1] = 17; 1. Nachbar von Feld 18
    $SC_ARR_PLACES[18][2] = 19; 2. Nachbar von Feld 18
    $SC_ARR_PLACES[19][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[19][1] = 18; 1. Nachbar von Feld 19
    $SC_ARR_PLACES[19][2] = 3; 2. Nachbar von Feld 19
    $SC_ARR_PLACES[20][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[20][1] = 0; 1. Nachbar von Feld 20
    $SC_ARR_PLACES[20][2] = 21; 2. Nachbar von Feld 20
    $SC_ARR_PLACES[21][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[21][1] = 20; 1. Nachbar von Feld 21
    $SC_ARR_PLACES[21][2] = 22; 2. Nachbar von Feld 21
    $SC_ARR_PLACES[22][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[22][1] = 21; 1. Nachbar von Feld 22
    $SC_ARR_PLACES[22][2] = 23; 2. Nachbar von Feld 22
    $SC_ARR_PLACES[23][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[23][1] = 22; 1. Nachbar von Feld 23
    $SC_ARR_PLACES[23][2] = 24; 2. Nachbar von Feld 23
    $SC_ARR_PLACES[24][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[24][1] = 4; 1. Nachbar von Feld 24
    $SC_ARR_PLACES[24][2] = 23; 2. Nachbar von Feld 24
    $SC_ARR_PLACES[25][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[25][1] = 4; 1. Nachbar von Feld 25
    $SC_ARR_PLACES[25][2] = 26; 2. Nachbar von Feld 25
    $SC_ARR_PLACES[26][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[26][1] = 25; 1. Nachbar von Feld 26
    $SC_ARR_PLACES[26][2] = 27; 2. Nachbar von Feld 26
    $SC_ARR_PLACES[27][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[27][1] = 26; 1. Nachbar von Feld 27
    $SC_ARR_PLACES[27][2] = 28; 2. Nachbar von Feld 27
    $SC_ARR_PLACES[28][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[28][1] = 27; 1. Nachbar von Feld 28
    $SC_ARR_PLACES[28][2] = 29; 2. Nachbar von Feld 28
    $SC_ARR_PLACES[29][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[29][1] = 28; 1. Nachbar von Feld 29
    $SC_ARR_PLACES[29][2] = 30; 2. Nachbar von Feld 29
    $SC_ARR_PLACES[30][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[30][1] = 29; 1. Nachbar von Feld 30
    $SC_ARR_PLACES[30][2] = 31; 2. Nachbar von Feld 30
    $SC_ARR_PLACES[31][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[31][1] = 32; 1. Nachbar von Feld 31
    $SC_ARR_PLACES[31][2] = 30; 2. Nachbar von Feld 31
    $SC_ARR_PLACES[32][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[32][1] = 33; 1. Nachbar von Feld 32
    $SC_ARR_PLACES[32][2] = 31; 2. Nachbar von Feld 32
    $SC_ARR_PLACES[33][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[33][1] = 32; 1. Nachbar von Feld 33
    $SC_ARR_PLACES[33][2] = 2; 2. Nachbar von Feld 33
    $SC_ARR_PLACES[34][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[34][1] = 35; 1. Nachbar von Feld 34
    $SC_ARR_PLACES[34][2] = 2; 2. Nachbar von Feld 34
    $SC_ARR_PLACES[35][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[35][1] = 34; 1. Nachbar von Feld 35
    $SC_ARR_PLACES[35][2] = 36; 2. Nachbar von Feld 35
    $SC_ARR_PLACES[36][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[36][1] = 35; 1. Nachbar von Feld 36
    $SC_ARR_PLACES[36][2] = 37; 2. Nachbar von Feld 36
    $SC_ARR_PLACES[37][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[37][1] = 38; 1. Nachbar von Feld 37
    $SC_ARR_PLACES[37][2] = 36; 2. Nachbar von Feld 37
    $SC_ARR_PLACES[38][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[38][1] = 39; 1. Nachbar von Feld 38
    $SC_ARR_PLACES[38][2] = 37; 2. Nachbar von Feld 38
    $SC_ARR_PLACES[39][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[39][1] = 38; 1. Nachbar von Feld 39
    $SC_ARR_PLACES[39][2] = 40; 2. Nachbar von Feld 39
    $SC_ARR_PLACES[40][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[40][1] = 39; 1. Nachbar von Feld 40
    $SC_ARR_PLACES[40][2] = 41; 2. Nachbar von Feld 40
    $SC_ARR_PLACES[41][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[41][1] = 42; 1. Nachbar von Feld 41
    $SC_ARR_PLACES[41][2] = 40; 2. Nachbar von Feld 41
    $SC_ARR_PLACES[42][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[42][1] = 3; 1. Nachbar von Feld 42
    $SC_ARR_PLACES[42][2] = 41; 2. Nachbar von Feld 42
    $SC_ARR_PLACES[43][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[43][1] = 3; 1. Nachbar von Feld 43
    $SC_ARR_PLACES[43][2] = 44; 2. Nachbar von Feld 43
    $SC_ARR_PLACES[44][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[44][1] = 43; 1. Nachbar von Feld 44
    $SC_ARR_PLACES[44][2] = 45; 2. Nachbar von Feld 44
    $SC_ARR_PLACES[45][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[45][1] = 46; 1. Nachbar von Feld 45
    $SC_ARR_PLACES[45][2] = 44; 2. Nachbar von Feld 45
    $SC_ARR_PLACES[46][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[46][1] = 47; 1. Nachbar von Feld 46
    $SC_ARR_PLACES[46][2] = 45; 2. Nachbar von Feld 46
    $SC_ARR_PLACES[47][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[47][1] = 48; 1. Nachbar von Feld 47
    $SC_ARR_PLACES[47][2] = 46; 2. Nachbar von Feld 47
    $SC_ARR_PLACES[48][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[48][1] = 49; 1. Nachbar von Feld 48
    $SC_ARR_PLACES[48][2] = 47; 2. Nachbar von Feld 48
    $SC_ARR_PLACES[49][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[49][1] = 50; 1. Nachbar von Feld 49
    $SC_ARR_PLACES[49][2] = 48; 2. Nachbar von Feld 49
    $SC_ARR_PLACES[50][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[50][1] = 51; 1. Nachbar von Feld 50
    $SC_ARR_PLACES[50][2] = 49; 2. Nachbar von Feld 50
    $SC_ARR_PLACES[51][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[51][1] = 50; 1. Nachbar von Feld 51
    $SC_ARR_PLACES[51][2] = 1; 2. Nachbar von Feld 51
    $SC_ARR_PLACES[52][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[52][1] = 1; 1. Nachbar von Feld 52
    $SC_ARR_PLACES[52][2] = 53; 2. Nachbar von Feld 52
    $SC_ARR_PLACES[53][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[53][1] = 54; 1. Nachbar von Feld 53
    $SC_ARR_PLACES[53][2] = 52; 2. Nachbar von Feld 53
    $SC_ARR_PLACES[54][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[54][1] = 55; 1. Nachbar von Feld 54
    $SC_ARR_PLACES[54][2] = 53; 2. Nachbar von Feld 54
    $SC_ARR_PLACES[55][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[55][1] = 54; 1. Nachbar von Feld 55
    $SC_ARR_PLACES[55][2] = 56; 2. Nachbar von Feld 55
    $SC_ARR_PLACES[56][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[56][1] = 55; 1. Nachbar von Feld 56
    $SC_ARR_PLACES[56][2] = 57; 2. Nachbar von Feld 56
    $SC_ARR_PLACES[57][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[57][1] = 58; 1. Nachbar von Feld 57
    $SC_ARR_PLACES[57][2] = 56; 2. Nachbar von Feld 57
    $SC_ARR_PLACES[58][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[58][1] = 59; 1. Nachbar von Feld 58
    $SC_ARR_PLACES[58][2] = 57; 2. Nachbar von Feld 58
    $SC_ARR_PLACES[59][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[59][1] = 58; 1. Nachbar von Feld 59
    $SC_ARR_PLACES[59][2] = 60; 2. Nachbar von Feld 59
    $SC_ARR_PLACES[60][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[60][1] = 4; 1. Nachbar von Feld 60
    $SC_ARR_PLACES[60][2] = 59; 2. Nachbar von Feld 60
    $SC_ARR_PLACES[61][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[61][1] = 4; 1. Nachbar von Feld 61
    $SC_ARR_PLACES[62][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[62][1] = 2; 1. Nachbar von Feld 62
    $SC_ARR_PLACES[63][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[63][1] = 3; 1. Nachbar von Feld 63
    $SC_ARR_PLACES[64][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[64][1] = 1; 1. Nachbar von Feld 64

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aRetPath[2]

    [/autoit] [autoit][/autoit] [autoit]

    $aRetPath[0] = 0
    PathFinder(63,11)
    _ArrayDisplay($aRetPath, "63 -> 11")

    [/autoit] [autoit][/autoit] [autoit]

    $aRetPath[0] = 0
    PathFinder(21,6)
    _ArrayDisplay($aRetPath, "21 -> 6")

    [/autoit] [autoit][/autoit] [autoit]

    $aRetPath[0] = 0
    PathFinder(27,12)
    _ArrayDisplay($aRetPath, "27 -> 12")

    [/autoit] [autoit][/autoit] [autoit]

    Func PathFinder($iStart, $iZiel, $szPath = ";", $iSteps = 0)

    [/autoit] [autoit][/autoit] [autoit]

    $szPath &= $iStart & ";"
    ; Abbruchbedingung für unendliche Rekursionen
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return -1 ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($SC_ARR_PLACES, 2) - 1
    If IsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    If $SC_ARR_PLACES[$iStart][$i] = $iZiel Then ; Wenn Nachbarfeld das Zielfeld ist
    ;~ ConsoleWrite($szPath & @CRLF)
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps + 1) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps + 1 ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft($szPath,1) & $iZiel ; Weg eintragen
    EndIf
    Else ; Wenn Nachbarfeld nicht das Zielfeld ist
    PathFinder($SC_ARR_PLACES[$iStart][$i], $iZiel, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    EndIf
    Next
    EndFunc ;==>PathFinder

    [/autoit]
    • Offizieller Beitrag

    Hey Bernd,

    Wow, vielen Dank :) Habe es noch etwas umgeschrieben, damit ich keine Globale Variable setzen muss, falls es noch jemanden interessiert:

    Spoiler anzeigen
    [autoit]

    Func _SC_PathBetweenPlaces($iStart,$iZiel)
    Local $aRet[2] = [0]
    __SC_Recursive_PathBetweenPlaces($iStart,$iZiel,$aRet)
    Return $aRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel,ByRef $aRetPath, $szPath = ";", $iSteps = 0)
    Local $aRet
    $szPath &= $iStart & ";"
    ; Abbruchbedingung für unendliche Rekursionen
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return -1 ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg
    For $i = 1 To 4
    If StringIsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    If $SC_ARR_PLACES[$iStart][$i] = $iZiel Then ; Wenn Nachbarfeld das Zielfeld ist
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps + 1) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps + 1 ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft($szPath, 1) & $iZiel ; Weg eintragen
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else ; Wenn Nachbarfeld nicht das Zielfeld ist
    __SC_Recursive_PathBetweenPlaces($SC_ARR_PLACES[$iStart][$i], $iZiel,$aRetPath, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    EndIf
    Next
    EndFunc ;==>PathFinder

    [/autoit]

    Vielen Dank nochmal :)

    Gruß
    Spider

    • Offizieller Beitrag

    Hallo,

    Zitat

    Wow, vielen Dank :) Habe es noch etwas umgeschrieben, damit ich keine Globale Variable setzen muss


    War mir schon klar das es noch nicht perfekt war, ich habs nur schnell geschrieben damit du eine Grundlage hast! ;)

    Ich habe die Funktion noch etwas umgeschrieben, jetzt wird auch der Sonderfall, dass $iStart und $iZiel bei Funktionstart gleich sind, korrekt abgefangen. Vorher wurden dann mindestens 2 Steps zurückgegeben, ansonsten ist das Ergenis das gleiche wie vorher!

    Spoiler anzeigen
    [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, ByRef $aRetPath, $szPath = ";", $iSteps = 0)

    [/autoit] [autoit][/autoit] [autoit]

    $szPath &= $iStart & ";"

    [/autoit] [autoit][/autoit] [autoit]

    ; Abbruchbedingung für erfolgreiche Suchergebnisse
    If $iStart = $iZiel Then
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft(StringTrimRight($szPath, 1), 1) ; Weg eintragen
    Return SetError(0, 0, $iSteps)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Abbruchbedingung für unendliche Rekursionen
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return SetError(1, 0, -1) ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg

    [/autoit] [autoit][/autoit] [autoit]

    ; Wenn bis hier keine Abruchbedingung gegriffen hat kann weiter gehen
    For $i = 1 To 4
    If StringIsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    __SC_Recursive_PathBetweenPlaces($SC_ARR_PLACES[$iStart][$i], $iZiel, $aRetPath, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError(0, 0, -1)
    EndFunc ;==>__SC_Recursive_PathBetweenPlaces

    [/autoit]
    • Offizieller Beitrag

    Hey,

    Ah, sehr gut :) Hatte grade genau dies Problem (hatte es aber bisher nur dafür gebraucht um "nach hause" zu gehen, und deswegen habe ich vorher abegfragt ob das Schaf nachahuse gehen kann).
    So ist es natürlich eleganter, danke :)

    Gruß
    Spider

    • Offizieller Beitrag

    Hallo,

    Hatte jetzt mehrmals ein Rekursion Fehler von AutoIt. (Stack Overflow) Das passiert ca. alle 100 male, aber ich kann es einfach nicht Rekonstruieren. Ich schätze einfach mal, dass es kein echter Rekursionsfehler ist, sondern es daran liegt, dass ich die Funktion in ganz bestimmten fällen mehrmals hintereinander aufrufen muss und das AutoIt nur denkt, es wäre ein Rekursionsfehler. Allerdings kann ich mir das nicht wiklich vorstelln, 5000x wird die Funktion garantiert nicht aufgerufen. Ich habe mir jetzt versucht wie folgt zu helfen, aber es bringt nichts. Es gibt immer noch den gleichen Fehler, hat jemand eine Idee woran das liegen kann? Wie gesagt, habe versucht mit den gleichen Werten die beim Fehler passiert sind zu arbeiten, kann es aber nicht rekonstruieren?!

    Spoiler anzeigen
    [autoit]

    Func _SC_PathBetweenPlaces($iStart, $iZiel)
    Local $aByRefPath[2] = [0]
    __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, $aByRefPath)
    Local $aRet = StringSplit($aByRefPath[1], ";")
    Return $aRet
    EndFunc ;==>_SC_PathBetweenPlaces

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, ByRef $aRetPath, $szPath = ";", $iSteps = 0)
    $szPath &= $iStart & ";"
    ; Abbruchbedingung für erfolgreiche Suchergebnisse
    If $iStart = $iZiel Then
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft(StringTrimRight($szPath, 1), 1) ; Weg eintragen
    Return SetError(0, 0, $iSteps)
    EndIf
    EndIf
    ; Abbruchbedingung für unendliche Rekursionen
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return SetError(1, 0, -1) ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg
    ;Um Stack Overflow in jedem fall zu umgehen
    If $iSteps > 100 Then Return SetError(2,FileWrite("ERROR.log","STACK OVERFLOW!") ,-1)
    ; Wenn bis hier keine Abruchbedingung gegriffen hat kann weiter gehen
    For $i = 1 To 4
    If StringIsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    __SC_Recursive_PathBetweenPlaces($SC_ARR_PLACES[$iStart][$i], $iZiel, $aRetPath, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    Next
    Return SetError(0, 0, -1)
    EndFunc ;==>__SC_Recursive_PathBetweenPlaces

    [/autoit]

    Gruß
    Spider

    Edit: Ach ja: die Datei "Error.log" schreibt er nie...
    Edit2: Es scheint so, als würde er bei langsameren Computern öfter abschmieren.. oO

    • Offizieller Beitrag

    Hallo,

    der Fehler muss woanders liegen, selbst wenn ich alle Zugmöglichkeiten durchspiele bekomm ich keine Fehlermeldung!

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $SC_ARR_POSSIBLEMOVES[1][2];Setze die Globale Varialbe GetPossible (== Mögliche Züge) zurück
    Global $SC_ARR_PLACES[65][5]
    $SC_ARR_PLACES[0][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[0][1] = 5; 1. Nachbar von Feld 0
    $SC_ARR_PLACES[0][2] = 20; 2. Nachbar von Feld 0
    $SC_ARR_PLACES[0][3] = 10; 3. Nachbar von Feld 0
    $SC_ARR_PLACES[0][4] = 15; 4. Nachbar von Feld 0
    $SC_ARR_PLACES[1][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[1][1] = 51; 1. Nachbar von Feld 1
    $SC_ARR_PLACES[1][2] = 64; 2. Nachbar von Feld 1
    $SC_ARR_PLACES[1][3] = 52; 3. Nachbar von Feld 1
    $SC_ARR_PLACES[1][4] = 9; 4. Nachbar von Feld 1
    $SC_ARR_PLACES[2][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[2][1] = 34; 1. Nachbar von Feld 2
    $SC_ARR_PLACES[2][2] = 33; 2. Nachbar von Feld 2
    $SC_ARR_PLACES[2][3] = 62; 3. Nachbar von Feld 2
    $SC_ARR_PLACES[2][4] = 14; 4. Nachbar von Feld 2
    $SC_ARR_PLACES[3][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[3][1] = 19; 1. Nachbar von Feld 3
    $SC_ARR_PLACES[3][2] = 42; 2. Nachbar von Feld 3
    $SC_ARR_PLACES[3][3] = 43; 3. Nachbar von Feld 3
    $SC_ARR_PLACES[3][4] = 63; 4. Nachbar von Feld 3
    $SC_ARR_PLACES[4][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[4][1] = 25; 1. Nachbar von Feld 4
    $SC_ARR_PLACES[4][2] = 24; 2. Nachbar von Feld 4
    $SC_ARR_PLACES[4][3] = 61; 3. Nachbar von Feld 4
    $SC_ARR_PLACES[4][4] = 60; 4. Nachbar von Feld 4
    $SC_ARR_PLACES[5][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[5][1] = 0; 1. Nachbar von Feld 5
    $SC_ARR_PLACES[5][2] = 6; 2. Nachbar von Feld 5
    $SC_ARR_PLACES[6][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[6][1] = 5; 1. Nachbar von Feld 6
    $SC_ARR_PLACES[6][2] = 7; 2. Nachbar von Feld 6
    $SC_ARR_PLACES[7][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[7][1] = 6; 1. Nachbar von Feld 7
    $SC_ARR_PLACES[7][2] = 8; 2. Nachbar von Feld 7
    $SC_ARR_PLACES[8][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[8][1] = 7; 1. Nachbar von Feld 8
    $SC_ARR_PLACES[8][2] = 9; 2. Nachbar von Feld 8
    $SC_ARR_PLACES[9][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[9][1] = 1; 1. Nachbar von Feld 9
    $SC_ARR_PLACES[9][2] = 8; 2. Nachbar von Feld 9
    $SC_ARR_PLACES[10][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[10][1] = 0; 1. Nachbar von Feld 10
    $SC_ARR_PLACES[10][2] = 11; 2. Nachbar von Feld 10
    $SC_ARR_PLACES[11][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[11][1] = 10; 1. Nachbar von Feld 11
    $SC_ARR_PLACES[11][2] = 12; 2. Nachbar von Feld 11
    $SC_ARR_PLACES[12][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[12][1] = 11; 1. Nachbar von Feld 12
    $SC_ARR_PLACES[12][2] = 13; 2. Nachbar von Feld 12
    $SC_ARR_PLACES[13][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[13][1] = 12; 1. Nachbar von Feld 13
    $SC_ARR_PLACES[13][2] = 14; 2. Nachbar von Feld 13
    $SC_ARR_PLACES[14][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[14][1] = 2; 1. Nachbar von Feld 14
    $SC_ARR_PLACES[14][2] = 13; 2. Nachbar von Feld 14
    $SC_ARR_PLACES[15][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[15][1] = 0; 1. Nachbar von Feld 15
    $SC_ARR_PLACES[15][2] = 16; 2. Nachbar von Feld 15
    $SC_ARR_PLACES[16][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[16][1] = 17; 1. Nachbar von Feld 16
    $SC_ARR_PLACES[16][2] = 15; 2. Nachbar von Feld 16
    $SC_ARR_PLACES[17][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[17][1] = 16; 1. Nachbar von Feld 17
    $SC_ARR_PLACES[17][2] = 18; 2. Nachbar von Feld 17
    $SC_ARR_PLACES[18][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[18][1] = 17; 1. Nachbar von Feld 18
    $SC_ARR_PLACES[18][2] = 19; 2. Nachbar von Feld 18
    $SC_ARR_PLACES[19][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[19][1] = 18; 1. Nachbar von Feld 19
    $SC_ARR_PLACES[19][2] = 3; 2. Nachbar von Feld 19
    $SC_ARR_PLACES[20][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[20][1] = 0; 1. Nachbar von Feld 20
    $SC_ARR_PLACES[20][2] = 21; 2. Nachbar von Feld 20
    $SC_ARR_PLACES[21][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[21][1] = 20; 1. Nachbar von Feld 21
    $SC_ARR_PLACES[21][2] = 22; 2. Nachbar von Feld 21
    $SC_ARR_PLACES[22][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[22][1] = 21; 1. Nachbar von Feld 22
    $SC_ARR_PLACES[22][2] = 23; 2. Nachbar von Feld 22
    $SC_ARR_PLACES[23][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[23][1] = 22; 1. Nachbar von Feld 23
    $SC_ARR_PLACES[23][2] = 24; 2. Nachbar von Feld 23
    $SC_ARR_PLACES[24][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[24][1] = 4; 1. Nachbar von Feld 24
    $SC_ARR_PLACES[24][2] = 23; 2. Nachbar von Feld 24
    $SC_ARR_PLACES[25][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[25][1] = 4; 1. Nachbar von Feld 25
    $SC_ARR_PLACES[25][2] = 26; 2. Nachbar von Feld 25
    $SC_ARR_PLACES[26][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[26][1] = 25; 1. Nachbar von Feld 26
    $SC_ARR_PLACES[26][2] = 27; 2. Nachbar von Feld 26
    $SC_ARR_PLACES[27][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[27][1] = 26; 1. Nachbar von Feld 27
    $SC_ARR_PLACES[27][2] = 28; 2. Nachbar von Feld 27
    $SC_ARR_PLACES[28][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[28][1] = 27; 1. Nachbar von Feld 28
    $SC_ARR_PLACES[28][2] = 29; 2. Nachbar von Feld 28
    $SC_ARR_PLACES[29][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[29][1] = 28; 1. Nachbar von Feld 29
    $SC_ARR_PLACES[29][2] = 30; 2. Nachbar von Feld 29
    $SC_ARR_PLACES[30][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[30][1] = 29; 1. Nachbar von Feld 30
    $SC_ARR_PLACES[30][2] = 31; 2. Nachbar von Feld 30
    $SC_ARR_PLACES[31][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[31][1] = 32; 1. Nachbar von Feld 31
    $SC_ARR_PLACES[31][2] = 30; 2. Nachbar von Feld 31
    $SC_ARR_PLACES[32][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[32][1] = 33; 1. Nachbar von Feld 32
    $SC_ARR_PLACES[32][2] = 31; 2. Nachbar von Feld 32
    $SC_ARR_PLACES[33][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[33][1] = 32; 1. Nachbar von Feld 33
    $SC_ARR_PLACES[33][2] = 2; 2. Nachbar von Feld 33
    $SC_ARR_PLACES[34][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[34][1] = 35; 1. Nachbar von Feld 34
    $SC_ARR_PLACES[34][2] = 2; 2. Nachbar von Feld 34
    $SC_ARR_PLACES[35][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[35][1] = 34; 1. Nachbar von Feld 35
    $SC_ARR_PLACES[35][2] = 36; 2. Nachbar von Feld 35
    $SC_ARR_PLACES[36][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[36][1] = 35; 1. Nachbar von Feld 36
    $SC_ARR_PLACES[36][2] = 37; 2. Nachbar von Feld 36
    $SC_ARR_PLACES[37][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[37][1] = 38; 1. Nachbar von Feld 37
    $SC_ARR_PLACES[37][2] = 36; 2. Nachbar von Feld 37
    $SC_ARR_PLACES[38][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[38][1] = 39; 1. Nachbar von Feld 38
    $SC_ARR_PLACES[38][2] = 37; 2. Nachbar von Feld 38
    $SC_ARR_PLACES[39][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[39][1] = 38; 1. Nachbar von Feld 39
    $SC_ARR_PLACES[39][2] = 40; 2. Nachbar von Feld 39
    $SC_ARR_PLACES[40][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[40][1] = 39; 1. Nachbar von Feld 40
    $SC_ARR_PLACES[40][2] = 41; 2. Nachbar von Feld 40
    $SC_ARR_PLACES[41][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[41][1] = 42; 1. Nachbar von Feld 41
    $SC_ARR_PLACES[41][2] = 40; 2. Nachbar von Feld 41
    $SC_ARR_PLACES[42][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[42][1] = 3; 1. Nachbar von Feld 42
    $SC_ARR_PLACES[42][2] = 41; 2. Nachbar von Feld 42
    $SC_ARR_PLACES[43][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[43][1] = 3; 1. Nachbar von Feld 43
    $SC_ARR_PLACES[43][2] = 44; 2. Nachbar von Feld 43
    $SC_ARR_PLACES[44][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[44][1] = 43; 1. Nachbar von Feld 44
    $SC_ARR_PLACES[44][2] = 45; 2. Nachbar von Feld 44
    $SC_ARR_PLACES[45][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[45][1] = 46; 1. Nachbar von Feld 45
    $SC_ARR_PLACES[45][2] = 44; 2. Nachbar von Feld 45
    $SC_ARR_PLACES[46][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[46][1] = 47; 1. Nachbar von Feld 46
    $SC_ARR_PLACES[46][2] = 45; 2. Nachbar von Feld 46
    $SC_ARR_PLACES[47][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[47][1] = 48; 1. Nachbar von Feld 47
    $SC_ARR_PLACES[47][2] = 46; 2. Nachbar von Feld 47
    $SC_ARR_PLACES[48][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[48][1] = 49; 1. Nachbar von Feld 48
    $SC_ARR_PLACES[48][2] = 47; 2. Nachbar von Feld 48
    $SC_ARR_PLACES[49][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[49][1] = 50; 1. Nachbar von Feld 49
    $SC_ARR_PLACES[49][2] = 48; 2. Nachbar von Feld 49
    $SC_ARR_PLACES[50][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[50][1] = 51; 1. Nachbar von Feld 50
    $SC_ARR_PLACES[50][2] = 49; 2. Nachbar von Feld 50
    $SC_ARR_PLACES[51][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[51][1] = 50; 1. Nachbar von Feld 51
    $SC_ARR_PLACES[51][2] = 1; 2. Nachbar von Feld 51
    $SC_ARR_PLACES[52][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[52][1] = 1; 1. Nachbar von Feld 52
    $SC_ARR_PLACES[52][2] = 53; 2. Nachbar von Feld 52
    $SC_ARR_PLACES[53][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[53][1] = 54; 1. Nachbar von Feld 53
    $SC_ARR_PLACES[53][2] = 52; 2. Nachbar von Feld 53
    $SC_ARR_PLACES[54][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[54][1] = 55; 1. Nachbar von Feld 54
    $SC_ARR_PLACES[54][2] = 53; 2. Nachbar von Feld 54
    $SC_ARR_PLACES[55][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[55][1] = 54; 1. Nachbar von Feld 55
    $SC_ARR_PLACES[55][2] = 56; 2. Nachbar von Feld 55
    $SC_ARR_PLACES[56][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[56][1] = 55; 1. Nachbar von Feld 56
    $SC_ARR_PLACES[56][2] = 57; 2. Nachbar von Feld 56
    $SC_ARR_PLACES[57][0] = "SAVE"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[57][1] = 58; 1. Nachbar von Feld 57
    $SC_ARR_PLACES[57][2] = 56; 2. Nachbar von Feld 57
    $SC_ARR_PLACES[58][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[58][1] = 59; 1. Nachbar von Feld 58
    $SC_ARR_PLACES[58][2] = 57; 2. Nachbar von Feld 58
    $SC_ARR_PLACES[59][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[59][1] = 58; 1. Nachbar von Feld 59
    $SC_ARR_PLACES[59][2] = 60; 2. Nachbar von Feld 59
    $SC_ARR_PLACES[60][0] = "GRASS"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[60][1] = 4; 1. Nachbar von Feld 60
    $SC_ARR_PLACES[60][2] = 59; 2. Nachbar von Feld 60
    $SC_ARR_PLACES[61][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[61][1] = 4; 1. Nachbar von Feld 61
    $SC_ARR_PLACES[62][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[62][1] = 2; 1. Nachbar von Feld 62
    $SC_ARR_PLACES[63][0] = "HOME2"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[63][1] = 3; 1. Nachbar von Feld 63
    $SC_ARR_PLACES[64][0] = "HOME1"; Dieser Wert ist irrelevant
    $SC_ARR_PLACES[64][1] = 1; 1. Nachbar von Feld 64

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hFile = FileOpen("Output.txt", 2)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 64
    For $j = 0 To 64
    $aRetPath = _SC_PathBetweenPlaces($i, $j)
    FileWrite($hFile, "(" & $i & " -> " & $j & ")" & @TAB & "Steps: " & $aRetPath[0] & @TAB & "Path: " & _ArrayToString($aRetPath, " -> ", 1) & @CRLF)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    Func _SC_PathBetweenPlaces($iStart, $iZiel)
    Local $aByRefPath[2] = [0]
    __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, $aByRefPath)
    Local $aRet = StringSplit($aByRefPath[1], ";")
    Return $aRet
    EndFunc ;==>_SC_PathBetweenPlaces

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, ByRef $aRetPath, $szPath = ";", $iSteps = 0)
    $szPath &= $iStart & ";"
    ; Abbruchbedingung für erfolgreiche Suchergebnisse
    If $iStart = $iZiel Then
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft(StringTrimRight($szPath, 1), 1) ; Weg eintragen
    Return SetError(0, 0, $iSteps)
    EndIf
    EndIf
    ; Abbruchbedingungen für unendliche Rekursionen
    If $iSteps > 21 Then Return SetError(1, 0, -1) ; Maximal gültige Weglänge hat 21 Abschnitte
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return SetError(1, 0, -1) ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg

    [/autoit] [autoit][/autoit] [autoit]

    ; Wenn bis hier keine Abruchbedingung gegriffen hat kann es weiter gehen
    For $i = 1 To 4
    If StringIsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    __SC_Recursive_PathBetweenPlaces($SC_ARR_PLACES[$iStart][$i], $iZiel, $aRetPath, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    Next
    Return SetError(0, 0, -1)
    EndFunc ;==>__SC_Recursive_PathBetweenPlaces

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    Ja, das glaube ich eben auch. Habe mal TrayIconDebug auf 1 gesetzt, aber er hängt tatsächlich in dieser Funktion. CPU Last geht auf 100% (resp. 25%). Sobald mal ein Fehler kommt, kommt der nächste auch schnell, und danach gibt es sehr sehr viele Fehler (liegt daran, das mein 4 Kern nach spätestens 4 Fehlversuchen voll ausgelastet ist ;) )
    Aber woran kann es dann liegen?!

    Gruß
    Spider

    Edit: Hab jetzt mal folgendes gemacht:

    [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, ByRef $aRetPath, $szPath = ";", $iSteps = 0)
    $szPath &= $iStart & ";"
    ConsoleWrite("RECURSIVE: "&$szPath & @CRLF)
    ConsoleWrite($iStart&":"&$iZiel & @CRLF)
    ;etc...

    [/autoit]


    Und die Konsole dann in ne Datei geschrieben. Die Dateein sind im normallfall so um die 2-3 MB groß.
    Wenn es abschmiert werden sie immer größer und größer, hab jetzt mal be 29mb aufgehört
    Ich habe sie man in anhang gepackt (eine normale und eine nicht normale)
    Versteht das jemand?! Es gibt eigentlich keine richtige Wiederholungen soweit ich gesehen habe...

    • Offizieller Beitrag

    Hast du den noch andere Rekursive Funktionen?

    Mir ist gerade aufgefallen das man die Abruchbedingung noch etwas verfeinern kann, da ein gültiger Weg nicht mehr als 21 Steps haben kann!

    [autoit]

    Func __SC_Recursive_PathBetweenPlaces($iStart, $iZiel, ByRef $aRetPath, $szPath = ";", $iSteps = 0)
    $szPath &= $iStart & ";"
    ; Abbruchbedingung für erfolgreiche Suchergebnisse
    If $iStart = $iZiel Then
    If ($aRetPath[0] = 0) Or ($aRetPath[0] > $iSteps) Then ; wenn es der kürzeste Weg ist
    $aRetPath[0] = $iSteps ; Schritte bis zum Ziel eintragen
    $aRetPath[1] = StringTrimLeft(StringTrimRight($szPath, 1), 1) ; Weg eintragen
    Return SetError(0, 0, $iSteps)
    EndIf
    EndIf
    ; Abbruchbedingungen für unendliche Rekursionen
    If $iSteps > 21 Then Return SetError(1, 0, -1) ; Maximal gültige Weglänge hat 21 Abschnitte
    StringReplace($szPath, ";" & $iStart & ";", ";" & $iStart & ";")
    If @extended > 1 Then Return SetError(1, 0, -1) ; Wenn das Startfeld mehr als einmal im Weg steht war es wohl ein Umweg

    [/autoit][autoit][/autoit][autoit]

    ; Wenn bis hier keine Abruchbedingung gegriffen hat kann es weiter gehen
    For $i = 1 To 4
    If StringIsInt($SC_ARR_PLACES[$iStart][$i]) Then ; Wenn ein Nachbarfeld eingetragen ist
    __SC_Recursive_PathBetweenPlaces($SC_ARR_PLACES[$iStart][$i], $iZiel, $aRetPath, $szPath, $iSteps + 1) ; weitersuchen
    EndIf
    Next
    Return SetError(0, 0, -1)
    EndFunc ;==>__SC_Recursive_PathBetweenPlaces

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    Ja, habe noch andere Rekursive Funktionen, aber der Fehler ist (wie man ja auch oben bei meinem Edit sieht, bzw. an den Logs) irgendwie in dieser Funktion...

    Ich probiere es mal mit dem 21 aus..

    Gruß
    Spider

    Edit: Nope.. bei 21 passiert verrückterweise exakt das gleiche:
    [Blockierte Grafik: http://k44.img-up.net/Unbenannt-z10n.jpg]

    • Offizieller Beitrag

    Kommt der Fehler auch wenn das Script in Post #7 laufen läßt?

    Wenn du willst kann du mir ja mal deinen Code schicken!

    • Offizieller Beitrag

    Hallo,

    Jup - das läuft! Ich versuche noch einmal ganz kurz etwas, und dann schick ich dir den Code.
    Danke schonmal :)

    Gruß
    Spider
    Edit: Ok... ich bin dumm :D Vielen Dank Bernd, lag natürlich nicht an der Funktion. Wenn der seltene Fall eintritt, dass alle meine Schafe mehr als 10 Punkte haben ruft sich eine funktion die die Pfadfunktion benutzt rekursiv immer und immer wieder auf. Interessant nur, dass AutoIt ein Rekursionsfehler bei der Pfadfunktion gemeint gefunden zu haben, obwohl sie ganz wo anders steckt. Vielen Dank nochmal, wenn du mal in Kiel bist meld dich mal, dann geb ich dir ein Bierchen aus ;)

    • Offizieller Beitrag

    Ja das sind halt die Tücken der rekursiven Funktionen, sie haben zwar in der Regel weniger Codezeien als die gleiche iterative Funktion, dafür sind sie langsamer und können den PC ganz schön durcheinander bringen. ;)

    Auf das Bierchen komm ich bestimmt mal zurück.