1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Yjuq

Beiträge von Yjuq

  • Regeln für den „AI Fight“ Wettbewerb

    • Yjuq
    • 26. Januar 2015 um 22:30

    Du stehst auf meiner Liste! :D
    Passt schon, jeder wie er/sie Zeit hat. Finde es aber klasse dass es schon vorab so viele Melden.
    Für den ersten Wettbewerb wird es auch was einfaches (aus dem klassischen Bereich) geben.
    Ein Singleplayer Spiel wird zum Multiplayer Spiel umfunktioniert.
    Verschiedene Umsetzungen kamen im Forum auch schon öfter's vor. ^^

    Zuviel mag ich aber noch nicht verraten.

  • Regeln für den „AI Fight“ Wettbewerb

    • Yjuq
    • 26. Januar 2015 um 21:42

    Folgender Abschnitt wurde den Spielregeln hinzugefügt:


    Datenbanken
    Grundsätzlich sind Datenbanken welche vorausberechnete Spielzüge enthalten erlaubt. Nach gründlichen Überlegungen bin ich zu dem Schluss gekommen dass eine Größe der Datenbanken von 1'048'576 Byte (1 MB) mehr als ausreichend ist. Wer ein wenig platzsparend ist und sich was einfallen lässt wird damit keine Probleme haben. Dies gilt als Maximalgrenze und darf nicht mal um einen einzigen Byte überschritten werden. Außerdem darf die Datenbank auch nur aus einer einzigen Datei bestehen (damit ich die einzelnen Dateigrößen später nicht zusammenrechnen muss). Die Datenbank direkt im Skript zu hinterlegen ist unerwünscht. Als Dateiname ist der Präfix DB_ zu wählen und danach euren AutoIt Username. Beispiel: DB_ShitDown (Ohne Dateiendung)

    Hinweis: Wer temporär Daten abspeichern möchte (während der Laufzeit) kann dies gerne tun. Hinterher müssen diese Daten aber wieder von eurer KI selbständig gelöscht werden. Dafür erinnere ich einfach mal an die Funktion OnAutoItExitRegister(). Hier liegt kein Limit für die Dateigröße vor, da es ja eure 3 Sekunden sind die Ihr euch einteilen müsst. Alle temporären Daten müssen als Präfix euren Variablenpräfix nutzen. Welche Dateiendung Ihr hierfür nimmt ist mir in diesem Fall wurscht. Beispiel: $MG_TempFile.txt

    Wer die vorgegebene Datenbankgröße überschreitet (auch während der Laufzeit) wird disqualifiziert und hat 3 Tage Zeit zur Nachbesserung.


    Achtung, der Funktion _AIFight_Register() wurde ein dritter Parameter hinzugefügt mit dem angegeben werden muss, ob eine Datenbank genutzt wird. Wird zwar später in der Wertung unberücksichtigt bleiben, jedoch weiß mein Skript dann dass es die Dateigröße eurer Datenbank ständig überwachen muss. Ihr könnt nämlich den Inhalt der Datenbank auch während der Laufzeit ändern wenn ihr wollt.

  • _ArrayDisplayConsole v0.92 build 2015-01-25 beta

    • Yjuq
    • 26. Januar 2015 um 21:14

    Naja, einen wirklichen Nutzen gegenüber der _ArrayDisplay() Funktion sehe ich jetzt nicht wirklich. Viel mehr würde mir eine Array-Konsolen Ausgabe mir beim Debuggen tierisch auf dem Leim gehen. Wenn dann überprüft man Array's in Schleifen um zu sehen ob da irgendwelche Fehlerhaften Eingaben etc. geschehen. 20x eine komplette Array Darstellung in der Konsole ist da nicht so vorteilhaft. Welchen nutzen soll das also noch haben wenn ich mal bescheiden nachfragen darf!? :)

    Ach ja, ich vermisse immer noch eine Funktion die mir 64D Arrays anzeigen kann. Ich hab da leider noch keine praktische Darstellungsform gefunden, arbeite aber schon mal öfters mit denen. Hast du nicht was in deinem Zauberkasten? :D

  • Debugger einstellung

    • Yjuq
    • 24. Januar 2015 um 10:41

    Ich wette da hast du seit Jahren selber nicht mehr drauf geklickt.
    Der Link führt zu einer nicht existierenden Seite, zumindest bei mir. ^^

  • Einfache ImageSearch Lösung für x64 System

    • Yjuq
    • 23. Januar 2015 um 22:08

    Naja, du hast JETZT erst die x64 Version von AutoIt installiert. Daher konntest du mit #AutoIt3Wrapper_UseX64 = Y keine Ergebnisse erzielen. Auswirkung dürfte die Umstellung keine haben außer dass du halt jetzt erst für 64 Bit kompilieren kannst. Sofern ich da bei der Installation nichts falsch verstanden habe. xD

  • Einfache ImageSearch Lösung für x64 System

    • Yjuq
    • 23. Januar 2015 um 17:03

    Ich weiß nicht was los ist, aber bei mir funktioniert die DLL ohne Probleme:

    [autoit]

    #include <ImageSearch.au3>

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

    #AutoIt3Wrapper_UseX64 = Y

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

    Test()

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

    Func Test()
    Local $x, $y
    Local $search = _ImageSearch("Unbenannt.bmp", 0, $x, $y, 0)
    If $search = 1 Then
    MouseMove($x, $y, 10)
    Else
    MsgBox(0, "", "Nothing Found")
    EndIf
    EndFunc ;==>Test

    [/autoit]
  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 15:49

    Naja, dass ist ein Hauptproblem welches in jedem Grafikprogramm steckt. Da gibt's ehrlich gesagt keine "gute" oder "richtige" Lösung. Aber die GDI+ Engine regelt dass schon ganz gut selber. Da brauchst du dich nicht großartig drum scheren. Schau dir mal das Beispiel hier an:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $g_hGUI, $g_hGraphics, $g_hBmp_Buffer, $g_hGfx_Buffer, $g_hImage
    Global $g_iMouseX, $g_iMouseY

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

    Example()

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

    Func Example()
    AutoItSetOption("GUIOnEventMode", 1)

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

    ; X64 running support
    Local $sWow64 = ""
    If @AutoItX64 Then $sWow64 = "\Wow6432Node"

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

    ;get AutoIt install dir
    Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt"

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

    Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif"
    If Not FileExists($sFile) Then
    MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30)
    Exit
    EndIf

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

    $g_hGUI = GUICreate("GDI+", 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_ResetGraphicsTransform")
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()
    $g_hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI)
    $g_hBmp_Buffer = _GDIPlus_BitmapCreateFromGraphics(800, 600, $g_hGraphics)
    $g_hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($g_hBmp_Buffer)

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

    $g_hImage = _GDIPlus_ImageLoadFromFile($sFile)

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

    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
    GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")
    GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
    GUISetState(@SW_SHOW)

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

    _Draw()

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

    While Sleep(10)
    WEnd
    EndFunc ;==>Example

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

    Func _ResetGraphicsTransform()
    _GDIPlus_GraphicsResetTransform($g_hGfx_Buffer)
    _Draw()
    EndFunc ;==>_ResetGraphicsTransform

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

    Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam

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

    $g_iMouseX = BitAND($lParam, 0x0000FFFF)
    $g_iMouseY = BitShift($lParam, 16)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_LBUTTONDOWN

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

    Func WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg

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

    Switch BitAND($wParam, 0x0000FFFF)
    Case 1
    Local $iX = BitAND($lParam, 0x0000FFFF)
    Local $iY = BitShift($lParam, 16)

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

    _GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, $iX - $g_iMouseX, $iY - $g_iMouseY, True)

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

    $g_iMouseX = $iX
    $g_iMouseY = $iY

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

    _Draw()
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_MOUSEMOVE

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

    Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam

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

    Switch BitAND($wParam, 0x0000FFFF)
    Case 1
    Local $iAngle = -3
    If BitShift($wParam, 16) < 0 Then $iAngle = 3

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

    Local $aMousePos[2][2] = [[1]]
    $aMousePos[1][0] = $g_iMouseX
    $aMousePos[1][1] = $g_iMouseY
    _GDIPlus_GraphicsTransformPoints($g_hGfx_Buffer, $aMousePos)

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

    _GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, $aMousePos[1][0], $aMousePos[1][1])
    _GDIPlus_GraphicsRotateTransform($g_hGfx_Buffer, $iAngle)
    _GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, -$aMousePos[1][0], -$aMousePos[1][1])

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

    Case Else
    Local $aInfo = GUIGetCursorInfo($g_hGUI)
    Local $iScale = 1.1
    If BitShift($wParam, 16) < 0 Then $iScale = 0.9

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

    _GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, -$aInfo[0], -$aInfo[1], True)
    _GDIPlus_GraphicsScaleTransform($g_hGfx_Buffer, $iScale, $iScale, True)
    _GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, $aInfo[0], $aInfo[1], True)
    EndSwitch

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

    _Draw()
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_MOUSEWHEEL

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

    Func _Draw()
    _GDIPlus_GraphicsClear($g_hGfx_Buffer, 0xFFFFFFFF)

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

    _GDIPlus_GraphicsDrawImage($g_hGfx_Buffer, $g_hImage, 316, 266)

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

    Local $hPen = _GDIPlus_PenCreate(0xFF0000FF)
    _GDIPlus_GraphicsDrawRect($g_hGfx_Buffer, 300, 250, 200, 100, $hPen)
    _GDIPlus_PenDispose($hPen)

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

    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    _GDIPlus_StringFormatSetAlign($hFormat, 1)
    Local $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    Local $hFont = _GDIPlus_FontCreate($hFamily, 24, 2)
    Local $tLayout = _GDIPlus_RectFCreate(0, 360, 800)
    _GDIPlus_GraphicsDrawStringEx($g_hGfx_Buffer, "AutoIt rulez!", $hFont, $tLayout, $hFormat, $hBrush)

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

    _GDIPlus_GraphicsDrawImage($g_hGraphics, $g_hBmp_Buffer, 0, 0)

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

    _GDIPlus_FontDispose($hFont)
    $hFont = _GDIPlus_FontCreate($hFamily, 10)
    _GDIPlus_StringFormatSetAlign($hFormat, 0)

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

    DllStructSetData($tLayout, "X", 10)
    DllStructSetData($tLayout, "Y", 10)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, "left mousebutton = move graphic", $hFont, $tLayout, $hFormat, $hBrush)

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

    DllStructSetData($tLayout, "Y", 30)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, "mousewheel = zoom graphic", $hFont, $tLayout, $hFormat, $hBrush)

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

    DllStructSetData($tLayout, "Y", 50)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, "mousewheel + left mousebutton = rotate graphic", $hFont, $tLayout, $hFormat, $hBrush)

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

    DllStructSetData($tLayout, "Y", 70)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, "right mousebutton = reset", $hFont, $tLayout, $hFormat, $hBrush)

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

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_GraphicsGetTransform($g_hGfx_Buffer, $hMatrix)
    Local $aMatrix_Values = _GDIPlus_MatrixGetElements($hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

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

    DllStructSetData($tLayout, "Y", 110)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, "Matrix:", $hFont, $tLayout, $hFormat, $hBrush)
    DllStructSetData($tLayout, "X", 20)
    DllStructSetData($tLayout, "Y", 130)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, StringFormat("%.2f %.2f", $aMatrix_Values[0], $aMatrix_Values[1]), $hFont, $tLayout, $hFormat, $hBrush)
    DllStructSetData($tLayout, "Y", 150)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, StringFormat("%.2f %.2f", $aMatrix_Values[2], $aMatrix_Values[3]), $hFont, $tLayout, $hFormat, $hBrush)
    DllStructSetData($tLayout, "Y", 170)
    _GDIPlus_GraphicsDrawStringEx($g_hGraphics, StringFormat("%.2f %.2f", $aMatrix_Values[4], $aMatrix_Values[5]), $hFont, $tLayout, $hFormat, $hBrush)

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

    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    EndFunc ;==>_Draw

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

    Func _Exit()
    _GDIPlus_ImageDispose($g_hImage)
    _GDIPlus_GraphicsDispose($g_hGfx_Buffer)
    _GDIPlus_BitmapDispose($g_hBmp_Buffer)
    _GDIPlus_GraphicsDispose($g_hGraphics)
    _GDIPlus_Shutdown()
    GUIDelete($g_hGUI)
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Findest du in Beispielecodes der Helpfile in der Datei _GDIPlus_GraphicsTransformPoints.au3
    Am besten sind immernoch die Vergrößerungen bzw. Verkleinerungen mit einem Faktor von 2^x. Also: 0.125, 0.25, 0.5, 1, 2, 4, 8, 16 usw...

  • Einfache ImageSearch Lösung für x64 System

    • Yjuq
    • 23. Januar 2015 um 15:40

    Von XenApp's oder Citrix Umgebungen habe ich ehrlich gesagt keine Ahnung. Aber ich bin sicher dass es da andere sichere Möglichkeiten gibt als die ImageSearch.au3. generell supporte ich persönlich nicht gerne für die ImageSearch UDF, da diese eben eher Gebrauch in Game-Bot's findet (die unsere Forenregeln verbieten). Du scheinst mir aber kein Skriptkiddie zu sein die meist mit der UDF hantiert. Von daher mache ich mal eine Ausnahme. ^^

    Ich weiß nicht von wo du die ImageSearch UDF bezogen hast, jedoch liegt hier eine Version für x86 und einmal für x64 Anwendungen bereit: http://www.autoitscript.com/forum/topic/14…ge-explanation/
    Die passende kannst du dir ja dann aussuchen. Alternativ musst du ja das Skript nicht unbedingt als x64 Anwendung ausführen. Falls es geht würde auch ein einfaches #AutoIt3Wrapper_UseX64 = N am Anfang deines Skriptes für Abhilfe schaffen.

    Falls du an "sichereren" Lösungsvorschlägen interessiert bist, lass es mich wissen. ^^

  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 15:19

    Jupp, schau dir mal die _WinAPI_AlphaBlend() Funktion an. :)

  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 14:57

    Ach stimmt, ich arbeite eigentlich noch selten mit den Funktionen. Da verliert man schon mal die eine oder andere Funktion aus dem Gedächnis. ^^

  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 14:51

    ô.ö

    Da gibt's keine "Variable" für. Du erstellst das Fenster direkt in der Desktopgröße oder veränderst diese später dementsprechend. Vielleicht meinst du auch einfach nur den $WS_POPUP Style, mehr kann ich dir nicht helfen. :/

  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 14:34

    Wenn du die gesamte Desktopgröße nutzt reichen hier auch die Makros @DesktopHeight und @DesktopWidth aus.
    Die Bildposition musst du wohl oder übel berechnen, aber das wird ja kaum das Problem sein...

    [autoit]

    $xPos = @DesktopWidth / 2 - _GDIPlus_ImageGetWidth($handle) / 2
    $yPos = @DesktopHeight / 2 - _GDIPlus_ImageGetHeight($handle) / 2

    [/autoit]
  • Einfache ImageSearch Lösung für x64 System

    • Yjuq
    • 23. Januar 2015 um 14:26

    Hey! Schmeiß die ImageSearch.au3 am besten direkt in deinen virtuellen Papierkorb! ;)
    AutoIt liefert da ganz andere Mittel mit wodurch du Buttons betätigen kannst. Auch ist die Identifizierung des Buttons um Längen sicherer als mit einem Bild. Du liest einfach mit dem AutoIt Window Info Tool den Button aus. Meistens reicht die ID aus, aber für eine sichere Idenfizierung würde ich dir doch schon empfehlen die Klasse sowie die Instanz zu wählen. Hier mal ein kurzes Beispiel für mögliche Werte (ausgelesen am Windows eigenen Editor):

    Spoiler anzeigen
    Code
    >>>> Window <<<<
    Title:	Unbenannt - Editor
    Class:	Notepad
    Position:	0, 0
    Size:	800, 860
    Style:	0x14CF0000
    ExStyle:	0x00000110
    Handle:	0x000000000EDE078A
    
    
    >>>> Control <<<<
    Class:	Edit
    Instance:	1
    ClassnameNN:	Edit1
    Name:	
    Advanced (Class):	[CLASS:Edit; INSTANCE:1]
    ID:	15
    Text:	
    Position:	0, 0
    Size:	784, 802
    ControlClick Coords:	504, 278
    Style:	0x50200104
    ExStyle:	0x00000200
    Handle:	0x00000000009F0170
    
    
    >>>> Mouse <<<<
    Position:	512, 328
    Cursor ID:	0
    Color:	0xFFFFFF
    
    
    >>>> StatusBar <<<<
    1:	
    2:	   Zeile 1, Spalte 1  
    
    
    >>>> ToolsBar <<<<
    
    
    >>>> Visible Text <<<<
    
    
    
    
    >>>> Hidden Text <<<<
    Alles anzeigen


    Einzelne Controls kannst du dann mit den Control Funktionen ansprechen. Um also dein Button anzuklicken benutze einfach die ControlClick() Funktion. Damit dürfte es in den meisten Fällen nie irgendwelche Probleme geben. LG. Make ^^

  • Diashow Bilder richtig anzeigen

    • Yjuq
    • 23. Januar 2015 um 14:15

    Servus, um mal deine eigentliche Frage zu beantworten. Mithilfe den GDI+ Funktionen kannst du problemlos die Größe eines Bildes ermitteln. Die nötigen Funktionen dazu sind _GDIPlus_ImageGetHeight() und _GDIPlus_ImageGetWidth(). Ansonsten kannst du die Fenstergröße direkt (sobald diese geändert wird) mit der Windows Message $WM_SIZE auslesen. Oder mit der WinAPI Funktionen _WinAPI_GetWindowHeight() und _WinAPI_GetWindowWidth().

  • Hüpfer – Fraktale

    • Yjuq
    • 23. Januar 2015 um 11:27

    Ganz einfach, dass du andere Formeln ausprobieren kannst. Dann kannst du auch diese Variable nutzen. :)

  • Regeln für den „AI Fight“ Wettbewerb

    • Yjuq
    • 22. Januar 2015 um 18:10

    Gute Frage, daran habe ich noch nicht gedacht (obwohl das viele AI's benutzen um einfach Rechenzeit zu sparen). Prinzipiell würde ich sagen dass das in Ordnung geht. Jedoch muss ich dass auch hier limitieren. Ich habe wirklich keine Lust mit meiner Baumbusleitung später 50GB große Datenbanken hinunter zu laden. ^^

    Ich überlege mir da mal noch eine allgemeine Grenze. Je nach Spiel kann auch diese dann wieder variieren.

  • Hüpfer – Fraktale

    • Yjuq
    • 22. Januar 2015 um 16:08

    Servus :)
    Ich bin auf folgende Seite gestoßen: http://www.mathematische-basteleien.de/huepfer.htm
    Das fand ich so interessant, dass ich gleich eine eigene Implantation in AutoIt schreiben musste.
    Ist nichts dolles, aber es macht Spaß damit herumzuspielen. Versucht es selber mal! ^^

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>

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

    Opt('GUIOnEventMode', 1)

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

    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; > Hier kannst du herumspielen! :)

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

    Global Const $iWidth = 800
    Global Const $iHeight = 600

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

    Global Const $fA = -70
    Global Const $fB = 100
    Global Const $fC = 0
    Global Const $iNum = 150000

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

    Func Term($fA, $fB, $fC, $fX, $fY)
    Return $fY - SIGN($fX) * Abs($fB * $fX - $fC) ^ 0.5
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global Const $fU = $iWidth / 2
    Global Const $fV = $iHeight / 2

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

    Global $hGUI, $hGraphics, $i, $fX, $fY, $fX2, $fY2

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('Hüpfer [Make-Grafik]', $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, GUI_EVENT_CLOSE)
    GUISetState()

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    For $i = 1 To $iNum
    _GDIPlus_GraphicsFillRect($hGraphics, $fU + $fX, $fV + $fY, 1, 1)
    $fX2 = Term($fA, $fB, $fC, $fX, $fY)
    $fY2 = $fA - $fX
    $fX = $fX2
    $fY = $fY2
    Next

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

    ConsoleWrite('! Finish' & @CRLF)

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

    While Sleep(1000)
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func SIGN($fValue)
    If $fValue < 0 Then
    Return -1
    ElseIf $fValue > 0 Then
    Return 1
    EndIf
    EndFunc

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

    Func GUI_EVENT_CLOSE()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • Regeln für den „AI Fight“ Wettbewerb

    • Yjuq
    • 22. Januar 2015 um 13:37
    Zitat von General Kaboom

    Beim ersten Durchlauf kann ich aber vielleicht noch gar nicht dabei sein (Abschlussarbeit und so n Zeugs).

    Nicht schlimm, wenn es zeitlich nicht passt dann geht es eben nicht. Da aber generell sowieso 3 Wettbewerbe geplant sind um nach der Beteiligung zu schauen, kannst du später natürlich auch noch mitmachen. Jedes Spiel wird für sich selber gewertet, eine Gesamtpunktzahl aus allen Spielen wird es nicht geben. ^^


    €dit:
    @draien >> Wie meinst du das mit „aufzeichnen“? Zu jeder Spielrunde wird eine Log-Datei mit allen Spielaktionen der AI's erstellt. Diese können dann in der mitgelieferten GUI abgespielt werden um die absolvierten Runden der Auswertung nachzuprüfen bzw. anzusehen. :)

  • Regeln für den „AI Fight“ Wettbewerb

    • Yjuq
    • 21. Januar 2015 um 22:13

    Schönen guten Tag Community! :)
    Ich freue mich dass sich (aus meine Ansicht heraus) genug Interessenten gefunden haben, sodass der Wettbewerb „AI Fight“ starten kann. Was wäre aber ein fairer Wettbewerb wenn nicht vorab einige Spielregeln festgelegt werden?

    Wichtig: Bitte benutzt immer die aktuellste AutoIt Stable.


    Ziel des AI Fight
    Es geht darum für verschiedene Spiele (wofür entsprechende Umgebungen bereit gestellt werden) sog. künstliche Intelligenzen (eng.: Artificial Intelligence) zu schreiben. Die einzelnen AI's treten gegeneinander an um die beste AI zu ermitteln und zu krönen. Im Vordergrund steht natürlich der Spaß am Programmieren. Dadurch versteht es sich natürlich von selber dass Fairness groß geschrieben wird. Zu Gewinnen gibt es nichts, außer die neuen Erkenntnisse die aus dem Wettbewerb gewonnen werden können.


    Die Spiele
    Die einzelnen Spiele gehen in die verschiedensten Richtungen. Ich bin sicher dass für jeden was dabei sein wird. Grundsätzlich variiert die Schwierigkeit und Aufwendigkeit zum schreiben einer AI pro Spiel. Das hängt stark mit zusammen ob es sich eher um ein Strategie oder ein Würfel-/Kartenspiel handelt. Manche Spiele werden euch vielleicht bekannt vorkommen, ich kann leider unmöglich alles neu erfinden, jedoch bemühe ich mich auch Spiele zu entwerfen die es in dieser Form noch nicht gibt. Vielleicht klau ich hier und da mal eine Idee die ich mal im Netz gefunden habe. :D


    Die Spielumgebung
    Eine Spielumgebung wird (und muss logischerweise) von mir bereit gestellt werden. Zu der Spielumgebung gehört das eigentliche Spiel und ggf. die grafische Ausgabe der einzelnen Spielrunden. Beides werden als getrennte Skripte geliefert. Zu jedem bestrittenen Spiel wird eine Log-Datei geschrieben, die jede Entscheidung, Bewegung und jede Spielrunde dokumentiert. So dauert später das Testen sowie auswerten der einzelnen AI's nicht ganz so lange, da die grafische Ausgabe vom eigentlichen Spiel getrennt wurde. Die Log-Dateien können nämlich im 2ten mitgelieferten Skript abgerufen und abgespielt werden. So können die einzelnen Spielrunden Schritt für Schritt beobachtet werden. Später werden auch sämtliche Spielrunden die bei der Auswertung gespielt wurden mitgeliefert. Das hat den Sinn, dass jeder von euch nachprüfen kann dass ich keine Spieler bevorzuge und alles mit rechten Dingen zuläuft.


    Aufbau der AI
    Die komplette AI muss aus Funktionen bestehen. Ob ihr mir 10 *.au3 Files oder nur eine einzige liefert ist mir egal. Wichtig ist nur, dass kein Code selbständig ausgeführt wird. Einzige Ausnahme bildet hier das Registrieren eurer AI. Alle relevanten Spieldaten erhaltet ihr über die Parameter. Diese Werte könnt ihr beliebig auswerten. Alle möglichen Rückgabewerte (also die Aktionen eurer AI) werden als globale Konstanten definiert. Ich bitte darum die Konstanten zu nutzen für den Fall, dass ich Änderungen an der Spielumgebung vornehmen muss. Es könnte vorkommen dass sich Rückgabewerte verändern, damit ihr eure AI's nicht umschreiben müsst ist es einfacher die Konstanten zu nutzen. Die genauen Rückgabewerte sowie Parameter werden in den einzelnen Spielen beschrieben.

    Die zu registrierende Funktion könnt ihr euch selber aussuchen, wichtig ist dabei nur, dass die Anzahl der Parameter später stimmen. Die Funktion _AIFight_Register($hFunc, $sName, $bDB) welche die einzelnen AI's registriert wird in jedem Spiel gleich sein. In dem ersten Parameter übergibt ihr das Handle eurer Funktion (nicht als String, sondern wirklich als Funktionshandle), mit dem zweiten euer Benutzername hier im Forum. Mit dem dritten Parameter gibt ihr an ob eine Datenbank verwendet wird. Setzt den Aufruf einfach so ziemlich am Anfang eurer *.au3 Datei, sodass ich später nur noch die AI's inkludieren muss. Ein Beispiel:

    [autoit]

    _AIFight_Register(_MG_AI, 'Make-Grafik', True)

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

    Func _MG_AI($vParam1, $vParam2, $vParam3)
    ; Irgendwelcher Code in der AI
    EndFunc

    [/autoit]


    Funktionsnamen, globale Variablen und deren Präfix
    Damit es später nicht zu Doppelverlegungen einzelner Funktionsnamen oder globalen Variablen gibt, ist das Präfix $AIFight_[...] für Variablen sowie _AIFight_[...]() für Funktionen reserviert. Alle die an dem Wettbewerb teilnehmen wollen (egal ob jetzt oder in naher Zukunft) haben ihren eigenen Präfix zu reservieren. Eine Liste mit allen reservierten Präfixen wird am Ende der Spielregeln ausgehängt. Wer einen Präfix reservieren möchte (oder ändern) schreibt mir bitte eine private Nachricht. Was Ihr danach für Bezeichnungen (also nach euren Präfix) wählt, ist mir so ziemlich egal. Es dient nur dazu um zu verhindern, dass meine SciTE einen Error nach dem anderen anzeigt.


    Allgemeine Spielregeln
    Sofern in den Beschreibungen der einzelnen Spiele nichts anderes festgelegt wird, sind folgende Regeln gültig:

    > Programmiert wird ausschließlich in AutoIt. Jede eingereichte AI muss selber verfasst sein, darf jedoch externe UDF's mitliefern und auch nutzen. Was nicht gewünscht ist sind DLL's in der die eigentliche AI ausgelagert wurde. Genauso verhält es sich mit Assembler. Bleibt fair und schreibt die eigentliche Logik eurer AI in AutoIt.

    > Jede AI hat nur eine begrenzte Ausführungszeit zur Verfügung. Dabei werden alle Runden gemessen und der Durchschnittswert berechnet. Sollte dieser über 3 Sekunden liegen (was schon ein großer Spielraum ist) so wird der User disqualifiziert. Er hat jedoch die Möglichkeit seine AI innerhalb von 3 Tagen nachzubessern. Testet eure AI also regelmäßig vorab.

    > Manipulation der Spielereignisse außerhalb der vorgesehen Schnittstelle (also der registrierten Funktion und dessen Rückgabewert) ist ausdrücklich unerwünscht. Dies zeigt mir nur dass ihr keinen Sinn für Fairness und Sportsgeist habt.

    > Nach der Veröffentlichung der Spielregeln + Spielumgebung habt ihr 28 Tage Zeit (also 4 Wochen) um eure AI zu schreiben. Ich denke der Zeitraum ist hier groß genug gewählt. Je nach Spiel kann sich dieser auch noch vergrößern oder verlängern (sofern dies mehrere Teilnehmer wünschen).

    > Jede AI die in irgendeiner Weise einen Fehler enthält (wenn mir die SciTE ein Error entgegen spuckt oder ein falscher Wert zurück gegeben wird) wird disqualifiziert. Auch hier habt ihr die Möglichkeit innerhalb von 3 Tagen eure AI nachzubessern.

    > Ihr könnt gerne mehrere AI's einsenden, jedoch nimmt nur die zuletzt eingesendete AI am Wettbewerb teil. Eure AI könnt ihr mir als private Nachricht zukommen lassen. Bitte nutzt als Betreff „AI Fight – Einsendung“ damit ich auch weiß dass es sich um eine Einsendung handelt.

    Wie man sieht gibt es nicht viele Spielregeln, das wichtigste ist einfach nur dass ihr Spaß habt und Fair bleibt. Wer sich dies beherzigt wird keine Probleme haben. Bitte testet eure AI's vor der eigentlichen Abgabe selber ausgiebig. Alle Einsendungen werden natürlich von mir auch nochmal getestet. Falls irgendwas nicht stimmen sollte schicke ich euch für's Debuggen die Log-Datei sowie die Fehlermeldung zu. Ihr könnt eure AI dann bis zum Abgabetermin natürlich dann verbessern.


    Datenbanken
    Grundsätzlich sind Datenbanken welche vorausberechnete Spielzüge enthalten erlaubt. Nach gründlichen Überlegungen bin ich zu dem Schluss gekommen dass eine Größe der Datenbanken von 1'048'576 Byte (1 MB) mehr als ausreichend ist. Wer ein wenig platzsparend ist und sich was einfallen lässt wird damit keine Probleme haben. Dies gilt als Maximalgrenze und darf nicht mal um einen einzigen Byte überschritten werden. Außerdem darf die Datenbank auch nur aus einer einzigen Datei bestehen (damit ich die einzelnen Dateigrößen später nicht zusammenrechnen muss). Die Datenbank direkt im Skript zu hinterlegen ist unerwünscht. Als Dateiname ist der Präfix DB_ zu wählen und danach euren AutoIt Username. Beispiel: DB_ShitDown (Ohne Dateiendung)

    Hinweis: Wer temporär Daten abspeichern möchte (während der Laufzeit) kann dies gerne tun. Hinterher müssen diese Daten aber wieder von eurer KI selbständig gelöscht werden. Dafür erinnere ich einfach mal an die Funktion OnAutoItExitRegister(). Hier liegt kein Limit für die Dateigröße vor, da es ja eure 3 Sekunden sind die Ihr euch einteilen müsst. Alle temporären Daten müssen als Präfix euren Variablenpräfix nutzen. Welche Dateiendung Ihr hierfür nimmt ist mir in diesem Fall wurscht. Beispiel: $MG_TempFile.txt

    Wer die vorgegebene Datenbankgröße überschreitet (auch während der Laufzeit) wird disqualifiziert und hat 3 Tage Zeit zur Nachbesserung.


    Teilnehmerzahl
    Die Anzahl der AI's die gegeneinander antreten ist in jedem Spiel unterschiedlich. Es ist auch möglich dass AI's für eine einzelne Runde im Team spielen. Bitte beachtet dies bei der Programmierung. Folgende Kombinationen sind möglich:

    Code
    2 Spieler:
    	  1 vs 1   → Hier treten die AI's einfach nur gegeneinander an.
    4 Spieler:
    	All vs All → Alle gegen Alle, der Beste gewinnt.
    	  2 vs 2   → 2 Spieler jeweils in einem Team.
    	  3 vs 1   → 1 Spieler muss sich gleich gegen 3 AI's behaupten.

    Ich persönlich werde am Wettbewerb nur teilnehmen falls dass von der Teilnehmerzahl nicht ganz passt. Wie nachher der eigentliche Wettbewerb abläuft (also wer gegen wen spielt) kann ich vorher schlecht vorhersagen. Es hängt ja immer von der Teilnehmerzahl ab, aus diesem Grund kann ich mich da nur nach allen Einsendungen festlegen. Jedoch sollte es aus den Spielregeln erkennbar sein welche der oberen genannten Kombinationen Verwendung finden könnten. Aus diesem Grund müsst ihr eure AI schon etwas flexibel gestalten.


    Newcomer Angebot
    Da ich weiß dass nicht jeder in der Lage ist eben mal so eine AI zu schreiben, gibt es von mir ein spezielles Angebot. Jeder der es einfach nicht schafft (egal ob jetzt Ansatzpunkte fehlen oder eben die nötigen Sprachkenntnisse) kann sich bei mir per PN melden. Ich helfe dann jeden in einen angemessenen Rahmen. Meine Hilfestellung könnte z.B. so aussehen, dass ich auf bestimmte Internetadressen verweise die das Thema behandeln oder euch Ansatzpunkte liefere. Die eigentliche AI müsst ihr natürlich selber schreiben. Ich möchte euch lediglich dabei beim Lernen unterstützen. Da ich natürlich nicht in euren Kopf rein gucken kann, setze ich einfach auf die Ehrlichkeit der User. Nutzt dieses Angebot bitte nicht aus, versucht es erst einmal selber! :)


    Ich denke die Spielregeln sind sehr human gehalten. Natürlich freue ich mich wenn gleich beim ersten Spiel viele Teilnehmer mitmachen. Unabhängig davon wie viele Teilnehmer mitmachen wird es definitiv 3 Wettbewerbsspiele geben. Danach schaue ich ob es Sinn macht es fortzuführen oder eben nicht. Natürlich hoffe ich auf Ersteres. Falls noch Fragen da sind oder Punkte ungeklärt, so hinterlasst mir einfach eine Antwort hier im Thread. Ansonsten findet ihr hier die Liste mit allen reservierten Präfixen:


    User Präfix
    ShitDown $MG_[...] & _MG_[...]()
    Lottich $Lo_[...] & _Lo_[...]()
    General Kaboom $Shelbot_[...] & _Shelbot_[...]()
    Kanashius $KanAI_[...] & _KanAI_[...]()
    draien $Drabot_[...] & _Drabot_[...]()
    chip $chip_[...] & _chip_[...]()
    Mars $M_[...] & _M_[...]()
    GtaSpider $spider[...] & _spider[...]()
    teamnoobPDB $pdb_[...] & _pdb_[...]()

    Der erste Wettbewerb wird voraussichtlich Mitte Februar starten. Vielleicht auch schon früher, mal schauen. In der Zwischenzeit könnt ihr euch mit mir über die Spielregeln diskutieren. :)
    LG. Make

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 21. Januar 2015 um 22:02

    Ich freue mich dass sich 10 Ja-Stimmen gefunden haben! :)
    Damit wird der Wettbewerb definitiv stattfinden, die Umfrage schließt sich automatisch in 2 Stunden. Die Regeln dazu werden auch direkt veröffentlicht. Ich schätze der erste Wettbewerb wird erst Mitte Februar beginnen da ich noch nicht angefangen habe zu programmieren. Je nachdem wie schnell ich bin startet er auch schon bisschen früher. In der Zwischenzeit habt ihr die Möglichkeit mit mir über die Spielregeln zu diskutieren. Ich danke für eure Anteilnahme! ^^

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™