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

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 19. Januar 2015 um 21:21
    Zitat

    Ich für meinen Teil weiss, dass ich eindeutig nicht gut genug bin um hier mitmachen zu können. [...] Ich würde sehr gerne mitmachen, aber wie gesagt, bin ich einfach zu schlecht und hab auch keine Vorstellung, was genau mich erwarten würde. Und von der nötigen Zeit ganz zu schweigen.

    Wenn du mitmachen möchtest, aber befürchtest eben „zu schwach/schlecht“ für den Wettbewerb zu sein, dann kann ich dich getrost einmal ermutigen. Grundsätzlich ist „AI“ ja nur ein Oberbegriff. Was einem nun konkret erwartet können alle potentiellen Teilnehmer nicht wissen. Aber ich kann jetzt schon mal sagen, dass die Aufgabenstellungen in die verschiedensten Richtungen laufen werden. Einige Aufgaben erfordern mehr die Analyse der gegeben Umstände, bei anderen Spielen fällt der Zufallsfaktor eventuell größer aus. Um mal ein paar Beispiele zu nennen: Würfelspiele, Kartenspiele, Strategiespiele, Geschicklichkeitsspiele sowie Brettspiele sind möglich. Ich bin sicher in irgendeinen Themenbereich wirst auch du zurecht kommen. Für den Anfang sind tatsächlich auch noch einfache Spiele geplant. Dies dient eher zur Eingewöhnung in den Wettbewerb, später werden dann (teilweise auch von mir entwickelte) komplexere Spiele angeboten. Die Schwierigkeit wechselt also von Spiel zu Spiel. Es kann aber auch sein, dass Spiele (wozu du eine AI quasi mit links schreibst) andere nicht so leicht lösen können. Prinzipiell: Wenn du Interesse hast, versuch es doch einfach.

    Um mal noch ein paar zusätzliche Informationen zu geben. Zu jedem Spiel gibt es ein angemessenen Zeitraum zum schreiben, testen und debuggen einer AI. Auch für die Recherche zu bestimmten Themenbereichen wird genug Zeit zur Verfügung gestellt. Ich möchte den Wettbewerb so halten, dass jeder eine reale Chance hat ein Spiel für sich zu entscheiden. Als attraktiver Bonus ist auch ein spezielles „Newcomer“ Angebot geplant. Dies ist für User gedacht welche selber sich mit AI's noch nicht wirklich im Ansatz auseinander gesetzt haben. All jene User können mir per PN fragen stellen. Natürlich werde ich nur bis zu einem gewissen Grad Hilfestellungen geben, Ziel ist es sich selber fortzubilden. Natürlich werden von mir keine komplette Lösungsstrategien besprochen, sondern lediglich kleinere Tipps wie man ein bestimmtes Problem angehen könnte. Dies dient dazu auch Anfängern eine Chance zu geben!

    Die kompletten Wettbewerbsregeln werden natürlich (falls sich überhaupt genug Teilnehmer finden) noch veröffentlicht. Da kann man dann noch über einzelne Punkte diskutieren bevor dann der Wettbewerb tatsächlich mit seiner ersten Aufgabe startet.

    Wer natürlich jetzt schon Fragen hat die eventuell seine/ihre Entscheidung zur Teilnahme beeinflussen könnten, kann diese auch vorab hier schon stellen. Wie man sieht habe ich mir schon da was ausgedacht, um möglichst viele User mit dem Wettbewerb ansprechen zu können.

  • AutoIt-Object -- wie könnte AutoIt in OOP-Syntax aussehen

    • Yjuq
    • 19. Januar 2015 um 19:18
    Zitat von BugFix

    [...] tolle Arbeit, die da geleistet wurde. :thumbup:
    Nun woll'n wir mal schauen, wo uns das das Leben erleichtern kann. ;)

    Quelle


    Ich denke, dass ist sehr treffend zitiert. :D

  • GDI Editor 2 [in Entwicklung]

    • Yjuq
    • 19. Januar 2015 um 18:43

    Ich nutze Windows 7 64 Bit und die AutoIt Version 3.3.12.0

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 19. Januar 2015 um 18:39
    Zitat

    So eine AI-Engine in der eine AI getestet werden kann, ist gar nicht so einfach. [...] Zum einen darf sie keine Fehler enthalten, da es nicht passieren darf, dass ein blütenreiner Code deshalb einfach nicht laufen will. [...] wo kommen wir hin, wenn nicht einmal mehr der Wettbewerbshoster noch Spass daran hat.

    Das ist mir mehr als bewusst. Natürlich kann man nie ausschließen dass eine Testumgebung da tatsächlich direkt zu 100% Bug frei sein wird, jedoch gebe ich mir größte Mühe (wie auch in all meinen anderen Skripten) alles so dynamisch und strukturiert wie möglich zu programmieren, dass spätere auftretende Bugs einfach gefixt werden können. Sollte tatsächlich Bugs auftreten (beim testen oder gar während der Auswertung der AI's) so werden diese schnellstmöglich behoben. Darüber hinaus werde ich mir auch einen angemessenen Zeitraum reservieren um die Spielregeln + Spielumgebung zu programmieren und auf Lauffähigkeit zu prüfen. Ich selber habe enorm viel Spaß an der Programmierung selber, und das Thema AI interessiert mich auch sehr. Daher mache ich mir keine Gedanken dass das Vorhaben an mir scheitern wird. Eher wird es passieren, dass sich nicht genug Teilnehmer finden werden. Es reichen tatsächlich für den Start nur 8 Teilnehmer aus damit es sich (zumindest aus meiner Ansicht heraus) auch lohnt. Ich bin ziemlich zuversichtlich dass sich dann weitere im Laufe der Zeit finden werden, selbst wenn am Ende nur 6 AI's abgegeben werden ist das schon mehr Beteiligung als an anderen Wettbewerben die hier schon im Forum abgehandelt wurden.


    Zitat

    Hier im Forum engagieren sich die Benutzer einfach eher unregelmässig für solche Dinge. Es gibt vieleicht 4-8 Benutzer die hier tatsächlich täglich aktiv sind. [...] Ich denke für solche Wettbewerbe ist die deutsche AutoIt-Community zur Zeit einfach zu klein.

    Da gebe ich dir Recht! Grundsätzlich muss ich sagen, dass ich nie irgendetwas mache ohne selber damit was zu bezwecken. Genauso verhält es sich auch mit diesem Wettbewerb oder meiner drz. Tutorialreihe. Mein Hauptziel ist es AutoIt wieder attraktiver für potentielle Nutzer zu machen und die Community anzukurbeln. Hier schleichen sich immer mehr Benutzer aus dem Forum, wenn ich da einfach mal vergleiche was zu meiner Anfangszeit hier los war. Ich finde es schade wenn die Skriptsprache sowie auch dieses Forum unter geht. Ich erhoffe mir dadurch einfach wieder Schwung in unsere Community zu bringen und ggf. Usern einen Grund zu bieten, das Forum wieder öfters zu besuchen. Natürlich auch um zum Programmieren zu animieren.


    Ob sich letztendlich der Wettbewerb durchsetzt oder nicht wird sich zeigen. Wie gesagt, bei 8 Ja Stimmen (also 8 interessierten Teilnehmer) werde ich diesen starten. Wer sich letztendlich daran beteiligt kann ich vorher nicht beurteilen. Ich hoffe natürlich darauf dass alles so klappt wie ich es mir vorstelle.

    LG. Make :)

  • Programm aus Autoit Starten und Parameter übergeben

    • Yjuq
    • 18. Januar 2015 um 20:18

    Nö, eigentlich nicht. Über die Kommandozeile müsste eigentlich nun der Pfad "d:\Users\Public\dokuments\Reallusion\Custom\iClone 5 Custom\Props\vns-Allgemein\Gift.VNS" übergeben werden. Dann nimmt das angegebene Programm schlichtweg keine Eingaben über die Kommandozeile an oder hat eine spezielle Syntax. Kann aber auch sein dass du schlichtweg die falschen Pfade angegeben hast.

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 18. Januar 2015 um 16:45

    Servus, ich würde gerne den Thread einmal heimlich pushen, da die Umfrage am 22. Januar 2015 (also in 4 Tagen) endet! Da bisher nur 7 Stimmen (darunter meine eigene xD) abgegeben wurden, möchte ich den anderen die nicht gewählt haben (oder den Thread einfach nicht gesehen haben) darum bitten, 5 Sekunden ihres Lebens zu verschwenden und eben mal auf einer der möglichen Antworten zu klicken!

    Dankeschön :)

  • Tutorial – OOP in AutoIt

    • Yjuq
    • 18. Januar 2015 um 16:03

    Teil #3
    (Alle Beispiele sind für die AutoIt Version 3.3.12.0 geschrieben und laufen eventuell auf älteren Versionen nicht!)
    + ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    Teil #1
    Teil #2
    + ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +


    Background AutoItObject UDF:
    Vorab gibt es ein wenig Geschichtsunterricht. Alle Daten basieren natürlich auf eigener Recherche und deshalb kann ich nicht versprechen dass alles zu 100% stimmt. Ich gebe mir aber größte Mühe hier keinen Mist zu erzählen. :)

    Die Veröffentlichung der ersten Version (v1.1.0) fand am 19. Februar 2010 statt. Die wurde für die AutoIt Version 3.3.4.0 geschrieben. Der Hauptgedanke war es, mehr COM Objekte in AutoIt ansprechbar zu machen. Aus diesem Grund ist auch nur ein geringer Teil der UDF für OOP in AutoIt ausgelegt. Das Augenmerk richtete sich darauf mit Interfaces zu arbeiten um Bibliotheken wie Direct2D / Direct3D zugänglich zu machen. Wer sich einmal die mitgelieferten Beispiele angesehen hat, merkt schnell dass das eigentliche Potential in der UDF auf COM lag. Jedoch wurde am 11. September 2011 die AutoIt Version 3.3.7.15 (Beta) veröffentlicht, welche die Funktion ObjCreateInterface() mitlieferte. Dadurch war die AutoItObject UDF überflüssig geworden, da AutoIt seit dem an auf COM-Objekte nativ zugreifen kann. Das lustige dabei ist, dass trancexx (eine Entwicklerin der AutoItObject UDF) selber dafür verantwortlich war. In der Changelog von AutoIt steht nämlich folgende Zeile: - Added: ObjCreateInterface() (By trancexx). Ich vermute dass dies auch der Grund ist, warum die AutoItObject UDF in den 5 vergangenen Jahren keine große Fangemeinde gefunden hat. Zumindest finde ich selber nur wenige Skripte welche mit der AutoItObject UDF arbeiten. Außerdem gibt es kein einzigstes Tutorial dazu. Dies ist auch der Grund weshalb ich überhaupt mit dieser Tutorialreihe angefangen habe. Die AutoItObject UDF hat nämlich noch großes Potential in der OOP. Viele Aufgaben lassen sich einfacher mithilfe dieser UDF gestalten. Aus diesem Grund habe ich mich dazu entschieden nur bei der OOP in AutoIt zu bleiben und das Arbeiten mit COM-Objekten hier nicht zu behandeln. Dies werde ich in einem anderen separaten Tutorial noch tun. Hier möchte ich eher erklären wie Aufgabenstellungen analysiert und mithilfe von OOP umgesetzt werden können.


    Ziel des Teilabschnittes:
    In diesem Teil der Tutorialreihe geht es hauptsächlich um die Spielereien mit der AutoIt Syntax. Ich möchte hier einfach zeigen welche Möglichkeiten in AutoIt bereit stehen, um mit der UDF zu arbeiten. Es geht kurz gesagt einfach um allgemeine Programmiertechniken.

    Um es hier nicht im Tutorial nochmal wiederholen zu müssen verlinke ich einfach mal auf BugFix's Beitrag: With...EndWith


    Properties:
    Eigentlich könnte man meinen, dass Properties und Attribute das selbe sein müssten. Allein schon dass man mithilfe der _AutoItObject_AddProperty() Funktion ein Attribut erstellen kann. In der Funktionsweise ist ein Property und ein Attribut völlig identisch, ein Wert wird abgespeichert und kann wieder abgerufen werden. Jedoch unterscheiden sich beide vom Aufbau her. Daher ist die Funktionsbezeichnung in der UDF leider auch ein wenig missglückt. Kurz gesagt, ein Property ist eine Methode die aber den gleichen Effekt eines Attributes hat. Natürlich kommt jetzt die Frage auf, was für ein Sinn dann ein Property hat. In erster Linie geht es darum, dass man dynamischer arbeiten kann. Z.B. kann man in einem Property ein Array speichern, welches automatisch sich sortiert. Bei einem normalen Attribut müsste man dies erst noch „von Hand“ selber erledigen. Um nun ein Property zu definieren müssen, wir lediglich den Objekt einfach eine Methode anhängen welche einen optionalen Parameter hat. Mithilfe dieses Parameters können wir unterscheiden ob nun ein Wert zugewiesen oder abgerufen werden soll. Bleiben wir einfach mal bei der einfachsten Form eines Property:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddMethod($oObj, 'var', '_Property') ; Fügt ein Property hinzu
    _AutoItObject_AddProperty($oObj, '__var__', $ELSCOPE_PRIVATE)

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

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

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

    $oObj.var(5)
    ConsoleWrite($oObj.var() & @CRLF)

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

    $oObj.var = 7
    ConsoleWrite($oObj.var & @CRLF)

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

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

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

    ; Methode mit einem optionalen Parameter als Property
    Func _Property($oSelf, $vVar = Default)
    If $vVar <> Default Then $oSelf.__var__ = $vVar

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

    Return $oSelf.__var__
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]

    Im Objekt wird sowohl ein Attribut wie auch eine Methode gespeichert. Beides zusammen ergibt unser Property. Das Attribut wird als Speicherort für unser Property genutzt, die Methode um darauf zuzugreifen. Außerdem ist unschwer zu erkennen, dass wir das Property einmal als Methode (mit Klammern) oder als Attribut (ohne Klammern) aufrufen können. Diese Unterscheidung wird erst später interessant, für Properties sollte allerdings die Syntax wie bei einem Attribut gewählt werden. So ist es leichter zu erkennen dass es sich dabei um eine „Variable“ und keine Funktion handelt.


    Statisches Property
    In dieser oberen gezeigten Standardform ist das Property im Grunde nichts anderes als ein Attribut. Nun wird es Zeit, dass wir unseren Property ein wenig Leben einhauchen, dafür können wir statische Property definieren. Eine Änderung bezieht sich nicht mehr auf das aktuelle Objekt, sondern auf alle Objekte die dieses Property nutzen. Damit dürfte auch schnell klar sein, dass ab hier ein Attribut schon an seine Grenzen stößt. Ein statisches Property ist im Grunde einfach definiert, wer schon mal statische Variablen genutzt hat weiß worauf ich hinaus will:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $oOne = _AutoItObject_Create()
    _AutoItObject_AddMethod($oOne, 'var', '_Property')

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

    Global $oTwo = _AutoItObject_Create($oOne)

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

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

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

    $oOne.var = 7
    ConsoleWrite($oTwo.var & @CRLF)

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

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

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

    Func _Property($oSelf, $vVar = Default)
    Local Static $vVal

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

    If $vVar <> Default Then $vVal = $vVar

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

    Return $vVal
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Beispiel für die Nutzung eines Property
    Bleiben wir mal bei unseren Array Beispiel. Speichern wir also ein Array in unser Property ab, so kann es dieses automatisch sortieren. Der Sinn und Zweck von Properties liegt damit nicht in der Speicherung von Werten, sondern in der direkten Verarbeitung der zu speichernden Werte. Ansonsten könnten wir uns ja einfach mit einem Attribut zufrieden geben. Als Beispiel sollte dieser Code ausreichen:

    Spoiler anzeigen
    [autoit]

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

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

    #include <Array.au3>
    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $aiTemp[] = [9, 2, 5], $i
    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddMethod($oObj, 'var', '_Property')
    _AutoItObject_AddProperty($oObj, '__var__', $ELSCOPE_PRIVATE)

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

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

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

    $oObj.var = 7
    ConsoleWrite($oObj.var & @CRLF & @CRLF)

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

    $oObj.var = $aiTemp
    For $i In $oObj.var
    ConsoleWrite($i & @CRLF)
    Next

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

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

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

    Func _Property($oSelf, $vVar = Default)
    If $vVar <> Default Then
    If IsArray($vVar) Then _ArraySort($vVar)
    $oSelf.__var__ = $vVar
    EndIf

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

    Return $oSelf.__var__
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Unterscheidung zwischen Methode und Property
    Jetzt kann man das alles noch regelrecht auf die Spitze treiben. Es ist möglich zu unterscheiden, ob ein Property als Methode (also mit Klammern) aufgerufen wird oder nicht. Damit lassen sich also vorab bestimmte Optionen für evtl. Spezialregelungen übergeben. Bleiben wir bei der Sortierung eines Arrays. Nehmen wir mal an, wir wollten einstellen können, ob das Array nach der ASCII Tabelle oder Alphanumerisch sortiert werden soll. Dafür könnten wir das Property einfach als Methode aufrufen um anzugeben, dass wir gerade eine Option ändern wollen und nicht den eigentlichen Wert des Property. Mit diesem Hintergrundgedanke macht auch das spezielle Attribut .__propcall__ Sinn. Dieses Attribut ist undokumentiert, daher erkläre ich einmal kurz seine Funktionsweise.

    Das .__propcall__ Attribut hat einen privaten Gültigkeitsbereich ($ELSCOPE_PRIVATE) wodurch es nur in Methoden nutzbar ist. Enthält das Attribut eine „1“, so werden Daten mithilfe des Gleichheitszeichen übergeben. Enthält es allerdings eine „0“, so werden entweder keine Parameter ($oObj.var oder $oObj.var()) übergeben oder eben mithilfe der Klammern ($oObj.var(5)).

    Mithilfe dieses Wissens können wir somit unterscheiden, wie nun die Methode genau aufgerufen wird. Als Beispiel sei einfach mal die Möglichkeit gegeben eine Zufallszahl mithilfe eines Property auszugeben. Als einstellbare Optionen können wir angeben in welchen Bereich die Zufallszahlen generiert werden sollen. Weisen wir den Property jedoch einen Wert zu, so wird der Seed für den Zufallsgenerator gesetzt:

    Spoiler anzeigen
    [autoit]

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

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

    #include <Array.au3>
    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $aiMinMax[2] = [1, 9]
    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddMethod($oObj, 'var', '_Property')
    _AutoItObject_AddProperty($oObj, '__var__', $ELSCOPE_PRIVATE, $aiMinMax)

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

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

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

    $oObj.var = 7 ; Setzt Seed auf 7
    $oObj.var(3, 6) ; Gibt nur noch Zahlen zwischen 3 und 6 aus

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

    ConsoleWrite(@CRLF & _
    ' ' & $oObj.var & @CRLF & _
    ' ' & $oObj.var & @CRLF & _
    ' ' & $oObj.var & @CRLF & @CRLF)

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

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

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

    Func _Property($oSelf, $vVar = Default, $iMax = Default)
    Local $aiMinMax = $oSelf.__var__

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

    If $vVar <> Default Then
    If $oSelf.__propcall__ Then
    SRandom($vVar)
    Else
    $aiMinMax[0] = $vVar
    $aiMinMax[1] = $iMax
    $oSelf.__var__ = $aiMinMax
    EndIf
    EndIf

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

    Return Random($aiMinMax[0], $aiMinMax[1], 1)
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Hinweis
    Damit hast du nun alles nötige um die kompliziertesten Properties zu schreiben die dir einfallen. Du kannst ja beispielsweise einfach mal eine Option einbauen, um das Property zwischendurch einfach mal zum statischen Property zu switchen. Oder du verwendest gleich statische Optionen, so dass du einfach und bequem alle Einstellungen in jedem Objekt mit nur einer Zeile erledigen kannst. Wie du siehst bietet dir diese Art der Programmierung neue Freiheiten im Bezug auf OOP.


    Default Spezifikation:
    Ähnlich wie das .__propcall__ Attribut gibt es noch ein Spezialrezept in der AutoItObject UDF. Der Praktische nutzen liegt allerdings in der Syntax. Mir fällt dafür kein passender Name ein, deswegen nenne ich es einfach mal die Default Spezifikation. Mithilfe dieser Spezifikation kannst du „einem Objekt“ Werte zuweisen. Allerdings scheint dies nur in der Syntax so zu sein. Um unterscheiden zu können ob das das Objekt als Variable oder eben mit dieser Spezifikation ansprichst, müssen Klammern gesetzt werden. Beispiel:

    [autoit]

    $oObj = ; value
    $oObj() = ; value

    [/autoit]

    In der ersten Zeile wird die AutoIt Variable angesprochen. Hat man also in dieser ein Objekt gespeichert, so wird die Referenz des Objektes zu dieser Variable gelöst. Setzt man allerdings wie in Zeile 2 gezeigt noch Klammern, so wird das eigentliche Objekt (und nicht die AutoIt Variable) damit angesprochen. Dadurch existiert eine eindeutige Unterscheidung aber auch eine potentielle Fehlerquelle. Aus diesem Grund weise ich vorher darauf hin. ^^


    Als Attribut
    Um diese Default Spezifikation als Attribut zu definieren, muss lediglich bei der Namensvergebung __defalut__ gewählt werden. Somit wird ab sofort auf dieses Attribut zugegriffen, sobald auf das Objekt zugegriffen wird. Kurzes Beispiel:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddProperty($oObj, '__default__')

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

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

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

    $oObj() = 7
    ConsoleWrite($oObj() & @CRLF)

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

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

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Als Methode
    Parallel dazu kann auch eine Methode für die Default Spezifikation verwendet werden. Dann können sogar Parameter übergeben werden. Auch hier nur ein kurzes Beispiel dazu:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddMethod($oObj, '__default__', '_Func_Default')

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

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

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

    ConsoleWrite($oObj() & @CRLF)
    ConsoleWrite($oObj(1) & @CRLF)

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

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

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

    Func _Func_Default($oSelf, $vVar = Default)
    If $vVar <> Default Then Return $vVar * 10

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

    Return Random(1, 9, 1)
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Als Property
    Wer vorhin aufgepasst hat, der weiß dass es jetzt gar nicht so schwer ist auch die Default Spezifikation als Property festzulegen. Hier nochmal das Beispiel mit den Zufallszahlen, jedoch jetzt als Spezifikation:

    Spoiler anzeigen
    [autoit]

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

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

    #include <Array.au3>
    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $aiMinMax[2] = [1, 9]
    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddMethod($oObj, '__default__', '_Property')
    _AutoItObject_AddProperty($oObj, '__var__', $ELSCOPE_PRIVATE, $aiMinMax)

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

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

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

    $oObj() = 7
    $oObj(3, 6)

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

    ConsoleWrite(@CRLF & _
    ' ' & $oObj() & @CRLF & _
    ' ' & $oObj() & @CRLF & _
    ' ' & $oObj() & @CRLF & @CRLF)

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

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

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

    Func _Property($oSelf, $vVar = Default, $iMax = Default)
    Local $aiMinMax = $oSelf.__var__

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

    If $vVar <> Default Then
    If $oSelf.__propcall__ Then
    SRandom($vVar)
    Else
    $aiMinMax[0] = $vVar
    $aiMinMax[1] = $iMax
    $oSelf.__var__ = $aiMinMax
    EndIf
    EndIf

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

    Return Random($aiMinMax[0], $aiMinMax[1], 1)
    EndFunc

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    For...In...Next Schleife:
    Mithilfe der For...In...Next Schleife können nicht nur Arrays durchlaufen werden, sondern auch COM Objekte. Wer schon mal mit Dictionary's oder ArrayList's gearbeitet hat, der weiß wovon ich reden. Auch AutoItObject Objekte können damit durchlaufen werden, jedoch müssen wir selber festlegen auf welche Attribute/Properties zugegriffen werden sollen. Dafür stelle ich euch einfach mal die Funktion _AutoItObject_AddEnum() vor, womit wir genau dies festlegen können. Diese Funktion definiert 2 Methoden (welche jeweils nur ein Parameter besitzen dürfen) und ruft diese bei jedem Schleifendurchgang in der For...In...Next Schleife auf.

    Die $sResetFunc Funktion
    Der $sResetFunc Parameter ist der 3te Parameter in der _AutoItObject_AddEnum Funktion. Ich fange mit diesem Parameter an, da die hier definierte Funktion als erstes Aufgerufen wird. Diese Funktion wird nämlich noch vor dem eigentlichen durchlaufen der Schleife aufgerufen. Dadurch kann man den Zähler auf eine gewisse Startposition zu setzen oder (sofern man einen Mechanismus benutzt) spezielle Optionen getroffen werden. Dennoch können wir einzelne Elemente durchlaufen. Als Beispiel nehmen wir eine verkettete Liste. Wir durchlaufen die Liste bis zum letzten Glied. Als Vorlage dient uns folgendes Skript:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $oA = _Obj_List('A')
    Global $oB = _Obj_List('B')
    Global $oC = _Obj_List('C')
    Global $oD = _Obj_List('D')
    Global $oE = _Obj_List('E')
    Global $oF = _Obj_List('F')

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

    $oA.next = $oB
    $oB.next = $oC
    $oC.next = $oD
    $oD.next = $oE
    $oE.next = $oF

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

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

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

    Func _Obj_List($vVal = Null)
    Local $oList = __Class_List().Object
    $oList.value = $vVal

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

    Return $oList
    EndFunc

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

    Func __Class_List()
    Local $oList = _AutoItObject_Class()
    $oList.AddProperty('value')
    $oList.AddProperty('next')

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

    Return $oList
    EndFunc

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

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

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]

    Wir haben hier also Objekte welche in Attributen andere Objekte speichert. Zuerst definieren wir unsere Reset Funktion um den Startpunkt festzulegen. Diese Funktion sollte allerdings den ersten Parameter als ByRef übergeben, da wir ja den originalen Zähler verändern wollen:

    [autoit]

    Func __List_ResetFunc($oSelf, ByRef $oList)
    $oList = $oSelf
    Return True
    EndFunc

    [/autoit]

    Es ist hier unbedingt zu beachten, dass True zurückgegeben wird, denn sonst wird der Zähler nicht gesetzt. Um dir also diese Information zu geben waren gut 8 Stunden Debugging nötig. :P


    Die $sNextFunc Funktion
    Diese Funktion wird aufgerufen, sobald die einzelnen Elemente durchlaufen werden. Sobald ein Error Code zurück gegeben wird, wird die Schleife abgebrochen. Hier die Funktion welche die einzelnen Elemente durchläuft:

    [autoit]

    Func __List_NextFunc($oSelf, ByRef $oList)
    If Not IsObj($oList) Then Return SetError(1)
    Local $vRet

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

    $vRet = $oList.value
    $oList = $oList.next

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

    Return $vRet
    EndFunc

    [/autoit]

    Und dazu das gesamte Skript:

    Spoiler anzeigen
    [autoit]

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

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

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

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

    Global $vVal

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

    Global $oA = _Obj_List('A')
    Global $oB = _Obj_List('B')
    Global $oC = _Obj_List('C')
    Global $oD = _Obj_List('D')
    Global $oE = _Obj_List('E')
    Global $oF = _Obj_List('F')

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

    $oA.next = $oB
    $oB.next = $oC
    $oC.next = $oD
    $oD.next = $oE
    $oE.next = $oF

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

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

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

    For $vVal In $oA
    ConsoleWrite($vVal & @CRLF)
    Next

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

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

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

    Func _Obj_List($vVal = Null)
    Local $oList = __Class_List().Object
    $oList.value = $vVal

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

    Return $oList
    EndFunc

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

    Func __Class_List()
    Local $oList = _AutoItObject_Class()
    $oList.AddEnum('__List_NextFunc', '__List_ResetFunc')
    $oList.AddProperty('value')
    $oList.AddProperty('next')

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

    Return $oList
    EndFunc

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

    Func __List_NextFunc($oSelf, ByRef $oList)
    If Not IsObj($oList) Then Return SetError(1)
    Local $vRet

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

    $vRet = $oList.value
    $oList = $oList.next

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

    Return $vRet
    EndFunc

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

    Func __List_ResetFunc($oSelf, ByRef $oList)
    $oList = $oSelf
    Return True
    EndFunc

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

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

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

    _AutoItObject_Shutdown()

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

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

    [/autoit]


    Hinweis: Wer Objekte dynamisch durchlaufen möchte sollte sich diesen Thread mal anschauen!


    Abschluss Teil 3:
    Im Großen und Ganzen ist auch dieser Teil nun fertig. Ich hoffe euch damit neue Einblicke in die OOP mit AutoIt gegeben zu haben. Im nächsten Teil geht es dann um ein praktisches Anwendungsbeispiel mit dem A* Algorithmus. Dort werde ich erklären warum OOP zur Wegfindung Sinn macht und weshalb man mit prozeduraler Programmierung an seine Grenzen stößt. Wie immer ist Kritik und Anregungen erwünscht. Falls du konkrete Themenwünsche hast die ich behandeln soll, dann immer her damit! :)

  • PixelGetColor - 60 Pixel in 1.8 Sekunden?

    • Yjuq
    • 17. Januar 2015 um 23:19

    Ich vermute mal dass dein Skript in etwa so aussieht:

    [autoit]

    Dim $aArr[8][8]

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

    $hTimer = TimerInit()
    For $iX = 0 To UBound($aArr, 1) -1
    For $iY = 0 To UBound($aArr, 2) -1
    $aArr[$iX][$iY] = PixelGetColor($iX, $iY)
    Next
    Next

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

    ConsoleWrite(TimerDiff($hTimer) & @CRLF)

    [/autoit]

    Das ist nicht gerade die optimale Lösung. Das dauert so lange da zuerst ein Gerätekontext geöffnet werden muss, die Oberfläche kopiert, der Pixel gelesen und der Gerätekontext wieder geschlossen werden muss. 3 dieser Schritte kannst du dir bei jedem Schleifendurchgang sparen indem man einfach ein wenig nachdenkt und sich mit GDI beschäftigt. So schwer ist das nicht, dann kannst du jeden einzelnen Pixel des Bildschirms unter 50ms auslesen. Da wette ich drauf!

  • GDI Editor 2 [in Entwicklung]

    • Yjuq
    • 17. Januar 2015 um 20:58

    Hallo :)
    Da hast du dir ja ein tolles Projekt ausgesucht. Das kann ja was werden!

    Folgendes habe ich beim herumspielen festgestellt:
    > Die Werkzeugleiste funktioniert nicht. Ich schätze das hast du noch nicht implantiert oder? Steht ja auch im Titel dass du noch in der Entwicklung bist.
    > Man kann den z-Index der Objekte leider nicht verändern. Dadurch kann ich nachträglich nicht entscheiden welches Element jetzt vor welches soll. Macht man einen Fehler und bemerkt es zu spät dann kann man unter Umständen viele Objekte wieder löschen.
    > Auch das Umbenennen der Objekte funktioniert nicht. Dieses Feature könntest du eventuell auf deine ToDo-Liste setzen falls noch nicht getan. Wäre praktisch weil man sonst den Überblick verlieren könnte.
    > Wähle ich ein Objekt mit dem Auswahlwerkzeug aus, so werden auch alle darunter befindlichen Objekte ausgewählt. Da würde ich mehr Entscheidungsfreiheit lassen ob nur das angeklickte oder tatsächlich alle Objekte die die Position (x|y) schneiden ausgewählt werden sollten.
    > Bei der Auswahl einer Ellipse kannst du auch außerhalb des eigentliches Objektes klicken um es auszuwählen. Ich vermute du behandelst (unabhängig der Form) alle Objekte als Rechteck. Ist bei der Auswahl vielleicht von Nachteil, beim Verändern der Größe aber von Vorteil.
    > Der Objektinspektor aktualisiert sich leider nicht von selber, ich muss erst das Objekt erneut anklicken bevor die Werte für das ausgewählte Objekt wieder aktuell sind.
    > Derzeitig kann ich die einzelnen Fenster nicht mithilfe des Kreuzes oben Rechts schließen. Aber ich denke dass kommt auch noch, oder!? ^^
    > Das Exportieren als *.png Funktioniert nicht richtig. Ich hatte gerade eine Situation wo die Objekte nicht im Bild dargestellt wurden. Leider kann ich es aber nicht mehr rekonstruieren. Wenn mir das nochmal passiert sag ich Bescheid wie ich's angestellt habe damit du den Bug fixen kannst.
    > Was ein wenig umständlich ist, dass ich erst das Objekt mit dem Auswahlwerkzeug auswählen muss, um es mit dem Bewegungswerkzeug bewegen zu müssen. Da solltest du was ändern.
    > Als ich mit der Rechten Maustaste gerade in der Objektliste spielte, stürzte mir das Skript ab. Leider kann ich auch das nicht mehr rekonstruieren. Aber in der Fehlerbeschreibung stand, dass der Dimensionsbereich eines Arrays überschritten wurde. Fehlermeldung habe ich gerade nicht mehr. Auch hierzu sag ich Bescheid wenn ich weiß wie man den Fehler rekostruieren kann, damit du den Bug fixen kannst.
    > Wenn ich in der Objektliste ein Objekt mit der rechten Maustaste anklicke, wird es leider nicht direkt ausgewählt. Lässt sich da was machen?

    Okey, dass erst mal zu den Fehlern bzw. Verbesserungsvorschlägen. ^^
    Ansonsten finde ich das Skript in seinem derzeitigen Umfang gut gelungen. Besonders das exportieren als AutoIt Code ist sehr praktisch, ich freue mich schon wenn der Editor mal irgendwann fertig ist, das kann dann viel Arbeit mit GDI+ gedönse ersparen. Bin mal gespannt was hieraus wird! Ich verfolge das ganze mal.

  • [spiel] Wünsch dir was !

    • Yjuq
    • 16. Januar 2015 um 20:48

    Alina:
    Dein Wunsch geht in Erfüllung, aber
    erst wenn einer der Spaßbremsen hier ein Vorhängeschloss vor dem
    Thread hängt. ^^

    Ich wünsche mir fliegende Schweine und
    strickende Kühe auf Bäumen...

  • kleine Snake Version

    • Yjuq
    • 16. Januar 2015 um 17:04

    Ich sag mal so, interessante Umsetzung. :D

    Generell eignen sich Labels (oder andere Controls) nicht unbedingt für grafische Ausgaben. Nimm dafür doch lieber eine Bibliothek wie GDI/GDI+, Direct2D oder meinetwegen einfach das Graphic Control in AutoIt. Ansonsten hier mal meine Verbesserungsvorschläge.

    > Generell finde ich diese Steuerung (mit dem Turbo) nicht wirklich sehr gut. Wenn man kurz die Richtung ändern will, so wird schon der Turbo aktiviert. Sehr unvorteilhaft... Aktiviere den Turbo lieber nach einer bestimmten Zeit (wenn die Pfeiltaste noch gedrückt ist).

    > Wenn ich mich in deinem Code nicht verlesen habe, dann bewegst du doch alle Teile der Schlange. Wie wäre es, wenn du einfach das letzte Schlangenteil nach Vorne als neuen Kopf setzt? Dann brauchst du die restlichen Teile nicht bewegen und das Spiel wäre flüssiger. Nur mal so als kleine Anmerkung.

    > Die Lücken in den Schlangenteilen stören irgendwie. Klar ist das interessant, aber diese Lücken sind unregelmäßig. Wenn, dann implantiere dieses Feature doch einfach als eigener Modi. Mich persönlich stört das, ist aber nur meine Meinung.

    LG. Make :)

  • Achterrandom = 50

    • Yjuq
    • 14. Januar 2015 um 20:36

    Hallo, das Problem ließe sich in viele Richtungen lösen, jedoch sind nicht alle geeignet da sich die Wahrscheinlichkeit dass bestimmte Zahlen getroffen werden bei jedem Algorithmus unterscheidet. Die Schwierigkeit ist es, einen Algorithmus zu finden, der (wie beim echten Zufall) die Wahrscheinlichkeiten nicht verändert. Wer viel Zeit hat, kann sich ja mal im nachfolgenden die Theorie dazu durchlesen, ich versuche mal zu erklären wo genau das Problem liegt und wie man es lösen kann. ^^

    Gehen wir mal davon aus dass du die Summe 6 mit 2 Würfeln treffen möchtest. Jeder Würfel hat einen Wertbereich von 1 bis 4. So lässt sich das im Folgenden besser erklären.

    Bei einem normalen Würfelwurf ist der Würfel eigentlich unabhängig von den anderen Würfeln. Das bedeutet, dass die Wahrscheinlichkeit für jede Seite des Würfels gleich ist getroffen zu werden. Sobald man aber auf eine bestimmte Summe hinaus spielt, verändern sich die Wahrscheinlichkeiten. Nun kommen nämlich die Variationen (nicht zu verwechseln mit den Kombinationen) ins Spiel, die alles so fürchterlich kompliziert machen. Weshalb Variationen? Ganz einfach, bei 2 Würfel mit jeweils 4 Augen können insgesamt 4² (also 16) mögliche Augenpaare getroffen werden. Aber nicht jedes Augenpaar entspricht der Summe 6. Siehe hier eine Liste:

    Code
    1 + 1 = 2
    1 + 2 = 3
    1 + 3 = 4
    1 + 4 = 5
    2 + 1 = 3
    2 + 2 = 4
    2 + 3 = 5
    2 + 4 = 6
    3 + 1 = 4
    3 + 2 = 5
    3 + 3 = 6
    3 + 4 = 7
    4 + 1 = 5
    4 + 2 = 6
    4 + 3 = 7
    4 + 4 = 8
    Alles anzeigen

    Man sieht eindeutig, dass es Unterschiede gibt dass eine bestimmte Summe getroffen wird. Das liegt daran, dass auch die Anordnung der Würfel berücksichtigt werden muss. Wir haben also einen Summen-Bereich von 2 bis 8 vorliegen. Die Wahrscheinlichkeit eine bestimmte Summe zu treffen variiert also. Hier wieder eine Liste mit den Wahrscheinlichkeiten:

    Code
    2 ->  1 von 16
    3 ->  2 von 16
    4 ->  3 von 16
    5 ->  4 von 16
    6 ->  3 von 16
    7 ->  2 von 16
    8 ->  1 von 16

    Jetzt könnten wir natürlich solange neu würfeln lassen, bis wir die passende Summe erwischt haben, aber das kann je nach Summe und Anzahl der Würfel extrem lange dauern. Daher müssen wir nicht die Augenzahlen der Würfel zufällig bestimmen, sondern die Variationen. In diesem Beispiel sind also nur die Variationen (2|4) (3|3) (4|2) zulässig. Wenn wir diese in einem Array abspeichern, können wir also die Zufallszahlen anhand der Variation bestimmen und kämen auf jeden Fall auf unsere Summe.

    [autoit]

    Dim $aArr[3][2] = [[2, 4], [3, 3], [4, 2]]
    Dim $iRnd = Random(0, 2, 1)

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

    ConsoleWrite(' ' & $aArr[$iRnd][0] & ' + ' & $aArr[$iRnd][1] & ' = 6' & @CRLF)

    [/autoit]


    Nun zu dem eigentlichen Problem, wir haben ja die Summe 50 und 8 Würfel. Der Wertbereich der Würfel soll zwischen 1 und 50 liegen. Das bedeutet dass wir nun alle Variationen erst einmal ermitteln müssen. Dazu hatte ich mal ein Thread aufgemacht wo eine durchaus brauchbare Funktion raussprang. Siehe mal hier: Kombinationen ermitteln

    Und hier das Skript von Mars:

    [autoit]

    #include <Array.au3>

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

    Global $a = _Calc(7, 4)
    _ArrayDisplay($a)

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

    Func _Calc($nErg, $iCnt)
    Local $aRet[0][$iCnt], $u, $aCnt[$iCnt], $iPos = $iCnt - 1
    Local $iSum
    For $i = 0 To $iCnt - 1 Step 1
    $aCnt[$i] = 1
    Next
    Do
    $iSum = 0
    For $i = 0 To $iCnt - 1 Step 1
    $iSum += $aCnt[$i]
    Next
    If $iSum = $nErg Then
    $u = UBound($aRet)
    ReDim $aRet[$u+1][$iCnt]
    For $i = 0 To $iCnt - 1 Step 1
    $aRet[$u][$i] = $aCnt[$i]
    Next
    EndIf
    Until Not _Array($iCnt, $aCnt, $iPos, $nErg)
    Return $aRet
    EndFunc ;==>_Calc

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

    Func _Array(ByRef $iCnt, ByRef $aCnt, ByRef $iPos, $nErg)
    $aCnt[$iPos] += 1
    If $aCnt[$iPos] = $nErg And $iPos > 0 Then
    $aCnt[$iPos] = 1
    $iPos -= 1
    _Array($iCnt, $aCnt, $iPos, $nErg)
    $iPos += 1
    EndIf
    If $aCnt[0] = $nErg Then Return False
    Return True
    EndFunc ;==>_Array

    [/autoit]


    Das müsste allerdings noch optimiert werden da dein Ergebnisraum zu groß ist. Das mache ich noch, aber nicht heute. Nur mal dass man ein Ansatz hat und die Wahrscheinlichkeit für jedes Ergebnis (wie bei einem Würfelwurf) auch gleich ist.

    Achja, falls das irgendwer schon in seinem Skript umgesetzt hat, ich habe mir nicht alles durchgelesen. ^^
    Steinigt mich ansonsten. LG. Make :)

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 13. Januar 2015 um 06:38

    Ja, auf der Website bin ich auch schon gelandet. Hatte es in Betracht gezogen dort teilzunehmen. Aber dann laß ich irgendwas von Java und dann war meine Maus wieder ganz schnell auf dem roten Kreuz oben rechts in der Ecke. Ich kann mir gut vorstellen wie aufwendig das ist, deshalb bin ich drz. am überlegen ob ein Monat doch nicht zu knapp ist. Zudem ja nicht jeder immer Zeit hat und ein angemessener Zeitraum für die Programmierung zur Verfügung stehen sollte. Da muss ich mal in Ruhe alles durchrechnen. Was aufjedenfall Fakt ist, der Wettbewerb soll regelmäßig stattfinden. ^^

  • Umfrage - Wettbewerb >> AI vs AI

    • Yjuq
    • 12. Januar 2015 um 22:22

    Schönen guten Abend Community! :)
    Als ich neulich mal in dem Forum „Wettbewerbe“ herum gewühlt habe, fand ich ganz oben angepinnt die Regeln für den µit Wettbewerb. Vielleicht sagt dass dem einen oder anderen noch etwas. Hier der Thread: Regeln für den µit Wettbewerb

    Ich fand diesen Ansatz sowie auch die Umsetzung sehr interessant. Ein Wettbewerb wo Monatlich eine neue Aufgabe gestellt wurde. Jedoch finde ich es persönlich sehr schade, dass dieser nicht mehr fortgeführt wird. Jedoch dachte ich mir dass man wieder einen monatlichen Wettkampf starten könnte. Dieses mal aber komplett um das Thema AI. Daher habe ich folgende Konzeptidee:

    Jeden Monat soll es ein Wettbewerb geben, wo in verschiedenen Games AI's gegeneinander antreten. Ziel ist es natürlich eine so gutes AI zu entwickeln, dass es nach Möglichkeit alle anderen aus dem Rennen wirft. Dazu hätte ich schon verschiedene Game Ideen. Natürlich werden sämtliche Umgebungen sowie benötigte Schnittstellen von mir bereit gestellt.

    Bevor ich allerdings großartig in die Planung gehe und Einzelheiten wie das Regelwerk aufstelle, wollte ich einmal fragen ob überhaupt Interesse an so etwas besteht. Um es Vorweg zu nehmen: Gewinne wird es keine geben, es geht nur um den Spaß und die Freude am Programmieren.

    Wer dazu was beitragen will oder konkrete Fragen hat, kann sich ja hier melden. Ansonsten gibt’s oben die Umfrage die bitte auszufüllen ist!

    LG. Make :)

  • Aufgabe: Zahlen sortieren

    • Yjuq
    • 11. Januar 2015 um 14:31

    Genau da liegt der Witz bei. Der Sortieralgorithmus ist bereits vorgegeben. Die Schwierigkeit bei dieser Aufgabe liegt darin, dass sämtliche Möglichkeiten durchgegangen werden müssen, um herauszufinden wie viele Schritte für einen bestimmten Eingabestring unbedingt notwendig sind, um auf das Endergebnis zu kommen. Die Aufgabe wurde bewusst so gewählt, da es sich dabei um eine Herausforderung handeln soll. Also auch für die Cracks hier unter euch haben da sicherlich einiges dran zu tun. Versuch dich doch einfach mal daran @BugFix. ^^

  • Aufgabe: Zahlen sortieren

    • Yjuq
    • 10. Januar 2015 um 22:12

    Schönen guten Abend! :)
    Jeder der nicht weiß was er/sie mit seiner/ihrer Zeit anfangen soll, kann sich ja mal an folgender Aufgabe versuchen: Es sollen die mindestens benötigten Sortierung-Schritte ermittelt werden, um einen String zu sortieren.

    Der zu sortierende String besteht aus positiven sowie negativen Ganzzahlen von 0 bis x. Dabei ist jeweils die positive oder die negative Zahl vertreten. Das bedeutet, dass im String z.B. nur eine „2“ vorkommen kann. Entweder als positive Version „+2“ oder negative Version „-2“. Aber niemals beide zusammen. Als Beispielstring sei mal hier „8 0 3 1 6 5 -2 4 7“ genannt. Für die Sortierung gibt es ein bestimmtes Verfahren welches eingehalten werden muss. Im Grunde lässt sich dies in 4 Schritten erklären. Im Folgenden wird auf den oberen genannten Beispielstring zurückgegriffen.

    1. Schritt:
    Zuerst wird sich ein Teilstring ausgesucht, nehmen wir einfach mal die Zahlen „3 1 6 5“ (ab der 2ten Position im Beispielstring).

    2. Schritt:
    Jetzt werden die Vorzeichen aller Zahlen getauscht. Positive Zahlen werden zu negativen Zahlen und anders herum: „-3 -1 -6 -5“

    3. Schritt:
    Nun müssen die Zahlen in ihrer Reihenfolge einmal umgedreht werden: „-5 -6 -1 -3“

    4. Schritt:
    Der Teilstring wird wieder in den String eingefügt: „8 0 -5 -6 -1 -3 -2 4 7“

    Alle 4 Schritte zusammen ergeben einen Sortierung-Schritt. Am Ende sollten alle Ziffern positiv und nach der Größe sortiert sein. Unser Beispielstring sollte also so aussehen: „0 1 2 3 4 5 6 7 8“. Die Frage ist nun, wie viele Schritte sind nun mindestens notwendig, um dies zu erreichen?

    Ich wünsche viel Spaß bei der Lösung dieser Aufgabe! Haltet am besten euren Algorithmus so, dass verschiedene Eingaben entgegengenommen werden können. Für den Abschluss hier einmal noch ein komplettes Beispiel, wie ein String sortiert werden könnte um auf's Endergebnis zu kommen:

    0 +3 +1 +6 +5 -2 +4 7
    0 -5 -6 -1 -3 -2 +4 7
    0 -5 -6 -1+2 +3 +4 7
    0 -5 -6 +1 +2 +3 +4 7
    0 -5 -4 -3 -2 -1 +6 7
    0 +1 +2 +3 +4 +5 +6 7

    Die unterstrichenen Zahlen ist der gewählte Teilstring welcher nach den oberen genannten Regeln sortiert wird. Die fetten Zahlen sind jene, die im letzten Sortierung-Schritt verändert wurden. Das + Zeichen vor den positiven Zahlen ist nur für die Formatierung hier im Forum angegeben. ^^

  • TCP Verbindung in BEIDE RICHTUNGEN?

    • Yjuq
    • 9. Januar 2015 um 20:44

    @jbc:
    Natürlich funktioniert mein Beispiel! Ich veröffentliche nie ungetestete Skripte außer in bestimmten Ausnahmesituationen. Du hast hier von misterspeed gute Erklärungen erhalten was du falsch machst. Von mir hast du ein Beispielskript bekommen welches sowohl den Server wie auch den Client enthält. Es wird einmal vom Client zum Server und einmal vom Server zum Client eine Nachricht geschickt. Ich habe dir also genau ein Beispiel (passend zu den Erklärungen) zu deinem Problem geschrieben.

    Ließ dir am besten nochmal alles genau durch! Das Beispiel sollte dir dabei helfen.

  • TCP Verbindung in BEIDE RICHTUNGEN?

    • Yjuq
    • 9. Januar 2015 um 19:54

    Hey, schau dir mal mein Beispiel an:

    Spoiler anzeigen
    [autoit]

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

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

    Global Const $sIPAddr = '127.0.0.1'
    Global Const $iPort = 65432

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

    Global $iSocketListen, $iSocketAccept, $iSocketConnect, $sRecv

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

    TCPStartup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    If Not $CmdLine[0] Then
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    ; #########
    ; # Server

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

    $iSocketListen = TCPListen($sIPAddr, $iPort) ; Listen Socket für den Server

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

    Run(StringFormat('"%s" "%s" "%s"', @AutoItExe, @ScriptFullPath, 'start')) ; Client starten

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

    Do
    $iSocketAccept = TCPAccept($iSocketListen) ; Auf Client warten
    Until @error <> -1

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

    Do
    $sRecv &= TCPRecv($iSocketAccept, 1024) ; Daten vom Client empfangen
    Until @error And $sRecv

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

    TCPSend($iSocketAccept, 'Send to Client') ; Daten zum Client senden

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

    MsgBox(0x40000, 'From Client:', $sRecv) ; Daten ausgeben

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

    TCPCloseSocket($iSocketListen)
    TCPCloseSocket($iSocketAccept)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    Else
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    ; #########
    ; # Client

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

    $iSocketConnect = TCPConnect($sIPAddr, $iPort) ; Zum Server verbinden

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

    TCPSend($iSocketConnect, 'Send to Server') ; Daten zum Server senden

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

    Do
    $sRecv &= TCPRecv($iSocketConnect, 1024) ; Daten vom Server empfangen
    Until @error And $sRecv

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

    MsgBox(0x40000, 'From Server:', $sRecv) ; Daten ausgeben

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

    TCPCloseSocket($iSocketConnect)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    EndIf

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

    TCPShutdown()

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

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

    [/autoit]
  • Scanner ansprechen

    • Yjuq
    • 7. Januar 2015 um 06:48

    Uff, das ganze ist jetzt knapp zwei Jahre her. Ich kann dir aber sicherlich spater ein Beispiel schreiben. Hab aber jetzt erst mal Schule. :)

  • Berechnung von Verkaufsgebühren

    • Yjuq
    • 6. Januar 2015 um 06:15

    Servus, arbeitet schon jemand aktiv an der Anfrage?

    @Bit-Service
    Es wäre schön wenn du uns einige Beispiel-Datensätze zur Verfügung stellst.

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™