Hallo!
ich habe gerade ein altes Programm von mir gefunden welches Labyrinthe in beliebiger Größe erstellt viel Spaß damit.
ich würde mich über Verbesserungsvorschläge und Feedback freuen
€: auf Autoit V3.3.12.0 angepasst
Spoiler anzeigen
AutoIt
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Gdiplus.au3>
#include <Misc.au3>
#include <EditConstants.au3>
Global $cpx, $cpy, $kasten = 0, $dir, $timer, $splitter, $hGraphics, $red, $weg, $bitmap
$Stack = ObjCreate("System.Collections.Stack")
HotKeySet("{ESC}", "_exit")
_GDIPlus_Startup()
$Form1 = GUICreate("Maze", 289, 342, 192, 124)
$Input_X_Blocks = GUICtrlCreateInput(250, 40, 20, 121, 21, $ES_NUMBER)
$Input_Y_Blocks = GUICtrlCreateInput(250, 40, 60, 121, 21, $ES_NUMBER)
$Input_startx = GUICtrlCreateInput(1, 40, 140, 121, 21, $ES_NUMBER)
$Input_starty = GUICtrlCreateInput(1, 40, 180, 121, 21, $ES_NUMBER)
$Input_endex = GUICtrlCreateInput(250, 40, 220, 121, 21, $ES_NUMBER)
$Input_endey = GUICtrlCreateInput(250, 40, 260, 121, 21, $ES_NUMBER)
GUICtrlCreateLabel("X Blocks", 176, 20, 236, 17)
GUICtrlCreateLabel("Y Blocks", 176, 60, 236, 17)
$id_LABEL_AnzahlBlocks = GUICtrlCreateLabel("Anzahl an Feldern " & GUICtrlRead($Input_X_Blocks) * GUICtrlRead($Input_Y_Blocks), 40, 100, 236, 17)
GUICtrlCreateLabel("START X", 176, 140, 236, 17)
GUICtrlCreateLabel("START Y", 176, 180, 236, 17)
GUICtrlCreateLabel("ENDE X", 176, 220, 236, 17)
GUICtrlCreateLabel("ENDE Y", 176, 260, 236, 17)
$Button_Create = GUICtrlCreateButton("Create", 40, 296, 75, 25)
$Progress1 = GUICtrlCreateProgress(4, 320, 280, 20)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_exit()
Case $Input_X_Blocks
GUICtrlSetData($Input_endex, GUICtrlRead($Input_X_Blocks))
GUICtrlSetData($id_LABEL_AnzahlBlocks, "Anzahl an Feldern " & GUICtrlRead($Input_X_Blocks) * GUICtrlRead($Input_Y_Blocks))
Case $Input_Y_Blocks
GUICtrlSetData($Input_endey, GUICtrlRead($Input_Y_Blocks))
GUICtrlSetData($id_LABEL_AnzahlBlocks, "Anzahl an Feldern " & GUICtrlRead($Input_X_Blocks) * GUICtrlRead($Input_Y_Blocks))
Case $Button_Create
$xBlocks = GUICtrlRead($Input_X_Blocks) + 2
$yBlocks = GUICtrlRead($Input_Y_Blocks) + 2
$startx = GUICtrlRead($Input_startx)
$starty = GUICtrlRead($Input_starty)
$endex = GUICtrlRead($Input_endex)
$endey = GUICtrlRead($Input_endey)
If $xBlocks < 4 Then
MsgBox(0, "", "Wert in X Blocks zu klein, mindestens 2")
Else
If $yBlocks < 4 Then
MsgBox(0, "", "Wert in Y Blocks zu klein, mindestens 2")
Else
If $startx < 1 Or $startx > $endex Then
MsgBox(0, "", "Startwert x liegt Auserhalb")
Else
If $starty < 1 Or $starty > $endey Then
MsgBox(0, "", "Startwert y liegt Auserhalb ")
Else
$cpx = $startx;$cpx=current position x
$cpy = $starty;$cpx=current position y
$anzahlblocks = (($xBlocks - 2) * ($yBlocks - 2) - 1)
Dim $maze[$xBlocks][$yBlocks];2D Feld Array
$wi = (@DesktopHeight - 20) / (($xBlocks < $yBlocks) ? $yBlocks : $xBlocks) * 0.95;Breite der kästchen, abhängig von anzahl
$timer = TimerInit()
_setwalls()
ConsoleWrite(TimerDiff($timer))
$timer = TimerInit()
_createMaze()
$timer1Diff = Round(TimerDiff($timer) / 1000, 4)
_drawmaze()
EndIf
EndIf
EndIf
EndIf
EndSwitch
WEnd
Func _setwalls();Randbegrenzungen als solche festlegen
For $i1 = 0 To $xBlocks - 1
$maze[$i1][0] = 16
$maze[$i1][$yBlocks - 1] = 16
Next
For $i1 = 0 To $yBlocks - 1
$maze[0][$i1] = 16
$maze[$xBlocks - 1][$i1] = 16
Next
EndFunc ;==>_setwalls
Func _createMaze()
Do
$dir = Random(1, 4, 1);bewegungsrichtung
If ($dir = 4 And Mod($dir, $cpx) < $cpx / 2) Then GUICtrlSetData($Progress1, 100 / ($xBlocks * $yBlocks - $xBlocks - $yBlocks) * $kasten, "")
If $cpx = $endex And $cpy = $endey Then $splitter = $Stack.ToArray;ziel erreicht
If $cpx <= 0 Or $cpy <= 0 Or $cpx >= $xBlocks Or $cpy >= $yBlocks Then
_backstep()
Else
If $maze[$cpx][$cpy - 0x1] * $maze[$cpx][$cpy + 0x1] * $maze[$cpx + 0x1][$cpy] * $maze[$cpx - 0x1][$cpy] Then
_backstep()
Else
_math()
EndIf
EndIf
Until $anzahlblocks = $kasten ;bis alle blöcke betreten wurden
EndFunc ;==>_createMaze
Func _math();1=0ben /2=rechts /4=unten /8=links
Switch $dir
Case 1
If $cpy > 0 And $maze[$cpx][$cpy - 0x1] = 0 Then;N
$maze[$cpx][$cpy] += 0x1
$cpy -= 0x1
$maze[$cpx][$cpy] = 0x4
$Stack.push(1)
$kasten += 0x1
EndIf
Case 2
If $cpx < $xBlocks And $maze[$cpx + 0x1][$cpy] = 0 Then;O
$maze[$cpx][$cpy] += 0x2
$cpx += 0x1
$maze[$cpx][$cpy] = 0x8
$Stack.push(2)
$kasten += 0x1
EndIf
Case 3
If $cpy < $yBlocks And $maze[$cpx][$cpy + 0x1] = 0 Then;S
$maze[$cpx][$cpy] += 0x4
$cpy += 0x1
$maze[$cpx][$cpy] = 0x1
$Stack.push(3)
$kasten += 0x1
EndIf
Case 4
If $cpx > 0 And $maze[$cpx - 0x1][$cpy] = 0 Then;W
$maze[$cpx][$cpy] += 0x8
$cpx -= 0x1
$maze[$cpx][$cpy] = 0x2
$Stack.push(4)
$kasten += 0x1
EndIf
EndSwitch
EndFunc ;==>_math
Func _backstep()
Switch $Stack.pop
Case 1
$cpy += 0x1
Case 2
$cpx -= 0x1
Case 3
$cpy -= 0x1
Case 4
$cpx += 0x1
EndSwitch
EndFunc ;==>_backstep
Func _drawmaze()
$Form2 = GUICreate("", @DesktopHeight - 40, @DesktopHeight - 40)
GUISwitch($Form2)
GUISetState(@SW_SHOW, $Form2)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($Form2)
_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopHeight - 40, @DesktopHeight - 40, $hGraphics)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
Global $black = _GDIPlus_PenCreate(0xFF000000)
$red = _GDIPlus_PenCreate(0xFFFF0000, $wi * 0.8);Stift für läufer
$weg = _GDIPlus_PenCreate(0xFF00FF00, $wi);Stift für lösungsweg
$Temp_01 = 10 + ($wi / 2)
For $i1 = 0 To $xBlocks - 1
$wi2 = $i1 * $wi + 10
For $i2 = 0 To $yBlocks - 1
If (BitAND($maze[$i1][$i2], 0x1) = 0) Then GDIPlus_GraphicsDrawLine($buffer, $wi2, $i2 * $wi + 10, $wi2 + $wi, $i2 * $wi + 10)
If (BitAND($maze[$i1][$i2], 0x2) = 0) Then GDIPlus_GraphicsDrawLine($buffer, $wi2 + $wi, $i2 * $wi + 10 + $wi, $wi2 + $wi, $i2 * $wi + 10)
If (BitAND($maze[$i1][$i2], 0x4) = 0) Then GDIPlus_GraphicsDrawLine($buffer, $wi2 + $wi, $i2 * $wi + 10 + $wi, $wi2, $i2 * $wi + 10 + $wi)
If (BitAND($maze[$i1][$i2], 0x8) = 0) Then GDIPlus_GraphicsDrawLine($buffer, $wi2, $i2 * $wi + 10, $wi2, $i2 * $wi + 10 + $wi)
Next
Next
GDIPlus_GraphicsDrawLine($buffer, ($startx * $wi - ($wi / 2)) + $wi + 10, ($starty * $wi) + 10, ($startx * $wi - ($wi / 2)) + $wi + 10, ($starty * $wi + $wi) + 10, $weg);start
GDIPlus_GraphicsDrawLine($buffer, ($endex * $wi - ($wi / 2)) + $wi + 10, ($endey * $wi) + 10, ($endex * $wi - ($wi / 2)) + $wi + 10, ($endey * $wi + $wi) + 10, $red);ende
_GDIPlus_GraphicsDrawImage($buffer, $bitmap, 0, 0)
If MsgBox(4, "LÖSEN?", "es hat " & $timer1Diff & " Sekunden gedauert " & $anzahlblocks & " felder zu erstellen" & @CRLF & "Soll das Labyrint gelöst werden?") = 6 Then
$solvex = $startx
$solvey = $starty
For $1a = UBound($splitter) - 1 To 0 Step -1;array wurde runter gepopt also ist es vom ende ausgehend
Switch $splitter[$1a]
Case 1;N
GDIPlus_GraphicsDrawLine($buffer, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01 - $wi, $red)
$solvey -= 1
Case 2;O
GDIPlus_GraphicsDrawLine($buffer, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01, $solvex * $wi + $Temp_01 + $wi, $solvey * $wi + $Temp_01, $red)
$solvex += 1
Case 3;S
GDIPlus_GraphicsDrawLine($buffer, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01 + $wi, $red)
$solvey += 1
Case 4;W
GDIPlus_GraphicsDrawLine($buffer, $solvex * $wi + $Temp_01, $solvey * $wi + $Temp_01, $solvex * $wi + $Temp_01 - $wi, $solvey * $wi + $Temp_01, $red)
$solvex -= 1
EndSwitch
Next
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
EndIf
_GDIPlus_GraphicsDrawImage($buffer, $bitmap, 0, 0)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($Form2)
$solvex = $startx
$solvey = $starty
_GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
GDIPlus_GraphicsDrawLine($hGraphics, ($solvex * $wi - ($wi / 2)) + $wi + 10, 2 + (($solvey * $wi) + 10), ($solvex * $wi - ($wi / 2)) + $wi + 10, (($solvey * $wi + $wi) + 10) - 2, $red)
Do
Sleep(100)
If _IsPressed(57) And BitAND($maze[$solvex][$solvey], 1) = 1 Then;bewegung und wandtestN
$solvey -= 1;w
_GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
GDIPlus_GraphicsDrawLine($hGraphics, ($solvex * $wi - ($wi / 2)) + $wi + 10, 2 + (($solvey * $wi) + 10), ($solvex * $wi - ($wi / 2)) + $wi + 10, (($solvey * $wi + $wi) + 10) - 2, $red)
EndIf
If _IsPressed(41) And BitAND($maze[$solvex][$solvey], 8) = 8 Then;bewegung und wandtestW
$solvex -= 1;a
_GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
GDIPlus_GraphicsDrawLine($hGraphics, ($solvex * $wi - ($wi / 2)) + $wi + 10, 2 + (($solvey * $wi) + 10), ($solvex * $wi - ($wi / 2)) + $wi + 10, (($solvey * $wi + $wi) + 10) - 2, $red)
EndIf
If _IsPressed(53) And BitAND($maze[$solvex][$solvey], 4) = 4 Then;bewegung und wandtestS
$solvey += 1;s
_GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
GDIPlus_GraphicsDrawLine($hGraphics, ($solvex * $wi - ($wi / 2)) + $wi + 10, 2 + (($solvey * $wi) + 10), ($solvex * $wi - ($wi / 2)) + $wi + 10, (($solvey * $wi + $wi) + 10) - 2, $red)
EndIf
If _IsPressed(44) And BitAND($maze[$solvex][$solvey], 2) = 2 Then;bewegung und wandtestO
$solvex += 1;d
_GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
_GDIPlus_GraphicsDrawImage($hGraphics, $bitmap, 0, 0)
GDIPlus_GraphicsDrawLine($hGraphics, ($solvex * $wi - ($wi / 2)) + $wi + 10, 2 + (($solvey * $wi) + 10), ($solvex * $wi - ($wi / 2)) + $wi + 10, (($solvey * $wi + $wi) + 10) - 2, $red)
EndIf
If $solvex = $endex And $solvey = $endey Then;am ende angekommen
MsgBox(0, "", "Sie haben gewonnen!!")
_exit();beenden
EndIf
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc ;==>_drawmaze
Func GDIPlus_GraphicsDrawLine($hGraphics, $iX1, $iY1, $iX2, $iY2, $hPen = $black);kein errorhandling kein zeitverlust
DllCall($__g_hGDIPDll, "int", "GdipDrawLineI", "handle", $hGraphics, "handle", $hPen, "int", $iX1, "int", $iY1, "int", $iX2, "int", $iY2)
EndFunc ;==>GDIPlus_GraphicsDrawLine
Func _exit()
_GDIPlus_BitmapDispose($bitmap);Aufräumen
_GDIPlus_PenDispose($red)
_GDIPlus_PenDispose($weg)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_exit
Alles anzeigen
bernd670: Code neu formatiert