AI Wettbewerb - Meinungen zum Thema ?

  • Moin,

    Neulich habe ich im Netz (wo sonst) etwas interessantes gefunden was für "groß und klein" machbar ist.
    Es geht um die Ameisen AI. (http://de.wikipedia.org/wiki/AI_Challenge#Ants)

    Ich möchte nun hier Meinungen dazu Sammeln, sowie mögliche Regeln und sonstiges, damit kein Chaos ensteht.
    Zum Schluss soll es klar definierte (möglichst lückenfreie) Regeln geben, damit jeder wirklich die gleiche Chance hat.


    Das Spiel:
    Es treten immer 2 bis n Spieler gegeneinander an.
    Jeder Spieler hat zu Beginn einen "Hügel" aus dem "Ameisen" herauskommen und umherlaufen.
    Diese Ameisen sammeln Essen um weitere Ameisen zu produzieren.
    Dabei müssen sie sich selbstständig in einem kleinen Labyrinth zurechtfinden.
    Treffen sich 2 Ameisen sterben beide.
    Besiegt wird ein Spieler indem eine Ameise eines Feindes den eigenen Hügel erreicht.
    Sieger ist wer als letzter übrig ist, oder (falls es zu keinem eindeutigen Sieg kommt) wer am Ende die meisten Ameisen vorweisen kann.

    Aufgabe:
    Programmieren einer künstlichen Intelligenz für die Ameisen, damit sie Essen suchen und Feinde Abwehren/Angreifen.

    Meine Vorstellung:
    --------
    Das Skript beinhaltet ein Array[x][y] welches das komplette Spielfeld beinhaltet. Mehr Daten stehen der AI nicht zur Verfügung.
    Die AI Funktion hat nur einen Parameter (Das Array) welches vorher speziell generiert wird, sodass die AI selbst immer Spieler 1 ist und die anderen dann Spieler 2, 3, usw. Dadurch wird es möglich dass eine AI ein beliebiger Spieler (1 - n) sein kann ohne umgeschrieben zu werden.
    MOVE verändert das Globale Array, NICHT das spezielle Array. Mit dem speziellen Array darf man machen was man will.
    --------
    Nur natives AutoIt ist erlaubt.
    Keine DllCalls/DllCallAdress und sonstiges.
    Das include Array.au3 darf benutzt werden. (keine weiteren Includes)
    Keine Externen Daten (z.B. per IniRead/Write, FileRead/Write, InetGet, usw) auch nicht wenn sie zur Laufzeit erstellt werden.
    Die AI darf nur genau eine Funktion sein. Weitere Funktionen sind nicht erlaubt.
    Zur Manipulation der Daten darf ausschließlich MOVE(x, y, sRichtung) (sRichtung = l, r, o, u) genutzt werden.
    Der Code jeder AI wird öffentlich gemacht.

    Es sieht also so aus, dass man nur eine einzige Funktion schreiben darf die unter Zuhilfenahme der Arraydaten das Spielfeld kennt und mittels MOVE einzelne Ameisen bewegen kann.

    Regelverstöße verursachen einen Error und werden nicht ausgeführt. (Bewegen einer fremden Ameise, bewegen in "p" (die Richtung "p" existiert nicht), Bewegen einer Stelle an der sich keine Ameise befindet, Laufen durch Wände, usw.)

    Es werden Spielfelder zufallsgeneriert (per Seed). Es treten dann einige (oder auch nur 2) AIs gegeneinander in 5 Levels jeweils mit vertauschten Positionen gegeneinander an. (also bei 2 Spielern 10 Durchläufe). Anschließend kann man den Sieger ermitteln.

    Andere Möglichkeit: (welche mir sogar besser gefällt^^)
    Mit den gleichen Regeln wie oben, aber:
    Es treten immer 2 Spieler auf 5 Festgelegten Karten (mit vertauschten Positionen) gegeneinander an.
    Der Sieger ist "Champ".
    Nun darf jeder aus dem Forum eine AI schreiben die den "Champ" besiegen kann. (auf den gleichen 5 Karten)
    Dieser Wettbewerb würde also praktisch nie zu Ende gehen, da immer jemand eine noch bessere AI schreiben kann.
    Beim Beginn des wettbewerbs werde ich eine extrem schlechte AI bereitstellen die es zu schlagen gilt. (Habe nicht so viel Zeit und kann daher keine "gute" AI schreiben. Würde aber gene mitmachen)

    (das Skript in das man zwei AIs einsetzen kann habe ich schon angefangen)


    Nun ist eure Meinung gefragt.
    Habt ihr Lust es mal zu versuchen ?
    Wie wollt ihr es versuchen ?
    Wie viele Leute machen überhaupt mit ?

    ___

  • Hi,
    habe mit AntMe! viel Spass in der Schule meiner Tochter gehabt. Eine Lehrerin hatte mich gefragt, wie man Grundschulkindern "programmieren" näherbringen könnte, und da hab ich mich einige Stunden geopfert^^
    Die Kinder fanden es total klasse, "ihren" Ameisen Leben einzuhauchen und mit ihren Völkern (Programmen) gegeneinander anzutreten...

    Da es in AntMe! schon eine TOP-Entwicklungsumgebung gibt, und "nur" noch die Regeln zu definieren sind, würde ich mir ehrlich gesagt die Mühe in AutoIt nicht machen ;)

  • Ich lade mir AntMe mal herunter.
    Wenn das so gut ist wie du sagst (was ich annehme, wenn du das sagst) könnte das ja schonmal unsere Grundlage sein.

    Edit: Deine Grundschulkinder können Visual Basic oder C# ?!
    Das Einzige was ich herunterladen kann ist Quellcode.

    Edit2: Aaah. in \lib ist eine .exe...

    Edit3: Das ist aber wesentlich umfangreicher un komplexer als das was ich eigentlich vorhatte.
    Und man muss VS2008/10 installiert haben.

  • Der Gewinner ist der Sohn meines Physiklehrers und er hat zusammen mit anderen Teilnehmern den Code veröffentlicht.

    Ich finde, du solltest einen eigenen Wettbewerb ausdenken und nicht einfach nur übernehmen.


    Es gefällt mir garnicht, dass man nur eine Funktion definieren darf. Dadurch entsteht nur schlechter Spaghetticode und die Übersichtlichkeit beim Schreiben geht auch verloren.


    Ich bin bei AI-Contests gerne dabei, aber nicht zu den Bedingungen.

  • Ich würde daran teilnehmen... Aber ob ich es hinbekomme eine 'Künstliche Intelligenz' zu programmieren, das ist eine andere Frage :D

    Bin ja noch Grün hinter den Ohren ^^ |> Ansonsten würde ich schonmal teilnehmen. Zmd. Versuchen...

  • Ich sehe das Problem nicht einen offiziellen Wettbewerb in klein nachzustricken.
    Mehr sinn als Viereckigen Code macht es allemal und es ist für jedermann machbar.

    Hab mir folgendes überlegt:
    Man erstellt nicht nur eine Funktion, sondern eine AU3.

    Darin sind einige Variablen vorhanden um die AI mit Daten zu füttern.
    (zurzeit)
    SIZE[2] = Größe des Spielfeldes in x und y Richtung
    FELD[x][y] = Das Spielfeld
    POS[2][2] = Position der Ameisenlöcher von Spieler 1 und 2

    In der AU3 darf man beliebig viele Funktionen und lokale Variablen benutzen.
    Globale Variablen gehen auch, sofern dafür gesorgt wird, dass es keine Namenskonflikte gibt. (z.B. $_Mars_PosX wird vermutlich außer mir keiner Nutzen)
    Funktionen sollten auch so gehalten werden, dass es keine Namenskonflikte gibt.

    Funktionen zum Zeichnen, sowie bewegen sind provisorisch fertig (noch weitestgehend ungetestet).
    zum Test laufen Beide zufällig in eine Richtung. Essen gibts noch nicht, aber bald^^

    Die Idee mit einer einzigen Funktion hatte ich, um das einfügen zu erleichtern. Da hatte ich wohl nicht im Kopf, dass man auch Include nehmen kann :rolleyes:

    Ich kann keinen Dateianhang machen. :thumbdown:

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <Array.au3>
    #include "AI_01.au3"
    #include "AI_02.au3"

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

    Opt('GUIOnEventMode', 1)
    Opt("MustDeclareVars", 1)

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

    Global $hGUI, $hGFX, $hBMP, $hBUF, $iW, $iH, $iZ = 10, $hBRU[7], $FELD
    Global $HIVE[2] ; Ameisen im "Speicher"
    Global $POS[2][2] ; Position der Ameisenlöcher

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

    Global $SIZE[2] = [40, 25] ; Breite und Höhe
    Global $aSpielfeld[$SIZE[0]][$SIZE[1]] ; Spielfeld

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

    Global $sError ; Errorlog für BEIDE Spieler
    Global $iPlayer ; Spieler am Zug: 1 oder 2
    Global $iRunden = 100 ; Runden die die Simulation läuft

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

    _GDIPlus_Startup()

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

    $iW = $SIZE[0] * $iZ
    $iH = $SIZE[1] * $iZ
    $hGUI = GUICreate('Ant AI', $iW, $iH)

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

    $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX)
    $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)

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

    ;~ - [Sache] - [Farbe] - [Nummer]
    ;~ - Feld : Hellorange 0
    ;~ - Spieler 1 : Rot 1 - Gegner = 2 Spieler = 1
    ;~ - Spieler 2 : Blau 2 - Gegner = 2 Spieler = 1
    ;~ - Wand : Schwarz 3
    ;~ - Essen : Grün 4
    ;~ - Loch 1 : Pink 5 - Gegner = 7 Spieler = 6
    ;~ - Loch 2 : Türkis 6 - Gegner = 7 Spieler = 6

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

    $hBRU[0] = _GDIPlus_BrushCreateSolid(0xFFFFC000)
    $hBRU[1] = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    $hBRU[2] = _GDIPlus_BrushCreateSolid(0xFF0000FF)
    $hBRU[3] = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBRU[4] = _GDIPlus_BrushCreateSolid(0xFF00FF00)
    $hBRU[5] = _GDIPlus_BrushCreateSolid(0xFF00FFFF)
    $hBRU[6] = _GDIPlus_BrushCreateSolid(0xFFFF00FF)

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

    KARTE(1)
    DRAW()

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

    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Freigeben')
    GUISetOnEvent(-3, '_Event')
    GUISetState(@SW_SHOW, $hGUI)

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

    _Main()

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

    ConsoleWrite(@CRLF & '+ Errorlog: ' & $sError & @CRLF & @CRLF)

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

    Func _Main()

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

    For $i = 1 To $iRunden Step 1

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

    Sleep(10)

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

    If IsInt($i / 10) Then ; Alle 10 Frames eine Ameise mehr
    $HIVE[0] += 1
    $HIVE[1] += 1
    EndIf

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

    SETARRAY() ; Neue Ameisen hinzufügen

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

    $iPlayer = 1 ; Spieler 1 ist am Zug
    $FELD = GETARRAY()
    AI_01()

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

    $iPlayer = 2 ; Spieler 2 ist am Zug
    $FELD = GETARRAY()
    AI_02()

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

    KOLLISIONEN()
    DRAW()
    WM_PAINT()

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

    Next

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

    EndFunc ;==>_Main

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

    Func KARTE($i)
    Switch $i
    Case 1
    $POS[0][0] = Int($SIZE[0] / 4)
    $POS[0][1] = Int($SIZE[1] / 2)
    $POS[1][0] = Int($SIZE[0] * 0.75)
    $POS[1][1] = Int($SIZE[1] / 2)
    Case 2
    Case 3
    EndSwitch
    EndFunc ;==>KARTE

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

    Func MOVE($x, $y, $s)
    If $FELD[$x][$y] = 1 Then ; Es ist eine Ameise vorhanden
    Switch $s
    Case 'l'
    If $x > 0 Then ; es geht nach lniks.
    If ($FELD[$x-1][$y] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x-1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x-1][$y] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x-1][$y] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x-1][$y] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x-1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    Else ; Man wandert durch den Rand.
    If ($FELD[$SIZE[0]-1][$y] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$SIZE[0]-1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$SIZE[0]-1][$y] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$SIZE[0]-1][$y] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$SIZE[0]-1][$y] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$SIZE[0]-1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    EndIf
    Case 'r'
    If ($x < $SIZE[0] - 1) Then ; es geht nach rechts.
    If ($FELD[$x+1][$y] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x+1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x+1][$y] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x+1][$y] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x+1][$y] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x+1][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    Else ; Es geht durch die rechte Wand
    If ($FELD[0][$y] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[0][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[0][$y] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[0][$y] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[0][$y] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[0][$y] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    EndIf
    Case 'o'
    If $y > 0 Then ; es geht nach lniks.
    If ($FELD[$x][$y-1] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x][$y-1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$y-1] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x][$y-1] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$y-1] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x][$y-1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    Else ; Man wandert durch den Rand.
    If ($FELD[$x][$SIZE[1]-1] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x][$SIZE[1]-1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$SIZE[1]-1] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x][$SIZE[1]-1] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$SIZE[1]-1] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x][$SIZE[1]-1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    EndIf
    Case 'u'
    If ($y < $SIZE[1] - 1) Then ; es geht nach rechts.
    If ($FELD[$x][$y+1] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x][$y+1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$y+1] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x][$y+1] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][$y+1] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x][$y+1] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    Else
    If ($FELD[$x][0] = 0) Then ; Ist das Feld frei ?
    $aSpielfeld[$x][0] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][0] = 2) Then ; Ist da ein Gegner ?
    $aSpielfeld[$x][0] = 0 ; Beide Tot
    $aSpielfeld[$x][$y] = 0
    ElseIf ($FELD[$x][0] = 4) Then ; Ist da Essen =
    $HIVE[$iPlayer-1] += 1
    $aSpielfeld[$x][0] = $iPlayer
    $aSpielfeld[$x][$y] = 0
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 03: Laufen durch eigene Ameisen oder Wände geht nicht.' & @CRLF
    EndIf
    EndIf
    Case Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 01: Unbekannte Richtungsangabe' & @CRLF
    EndSwitch
    Else
    $sError &= 'Spieler ' & $iPlayer & ', ERROR: 02: Keine Ameise zum Bewegen vorhanden' & @CRLF
    EndIf
    EndFunc ;==>MOVE

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

    Func KOLLISIONEN()
    EndFunc ;==>KOLLISIONEN

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    EndFunc ;==>WM_PAINT

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

    Func GETARRAY()
    Local $aRet = $aSpielfeld
    For $x = 0 To $SIZE[0] - 1 Step 1
    For $y = 0 To $SIZE[1] - 1 Step 1
    Switch $aRet[$x][$y]
    Case 1 ; Spieler 1 Ameise
    ;~ If $iPlayer = 1 Then $aRet[$x][$y] = 1
    If $iPlayer = 2 Then $aRet[$x][$y] = 2
    Case 2 ; Spieler 2 Ameise
    ;~ If $iPlayer = 1 Then $aRet[$x][$y] = 2
    If $iPlayer = 2 Then $aRet[$x][$y] = 1
    Case 6
    ;~ If $iPlayer = 1 Then $aRet[$x][$y] = 6
    If $iPlayer = 2 Then $aRet[$x][$y] = 7
    Case 7
    ;~ If $iPlayer = 1 Then $aRet[$x][$y] = 7
    If $iPlayer = 2 Then $aRet[$x][$y] = 6
    EndSwitch
    Next
    Next
    Return $aRet
    EndFunc ;==>GETARRAY

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

    Func SETARRAY()
    For $i = 0 To 1 Step 1
    If $HIVE[$i] > 0 Then ; Eine Ameise ist am Start
    If Not ($aSpielfeld[$POS[$i][0]][$POS[$i][1]] = 1 + $i) Then ; Wenn der Ausgang nicht blockiert ist
    $aSpielfeld[$POS[$i][0]][$POS[$i][1]] = 1 + $i ; Ameise hinzu
    $HIVE[$i] -= 1 ; Eine vom Stapel abziehen
    EndIf
    Else
    If Not ($aSpielfeld[$POS[$i][0]][$POS[$i][1]] = 1 + $i) Then $aSpielfeld[$POS[$i][0]][$POS[$i][1]] = 5 + $i ; Spieler Loch setzen
    EndIf
    Next
    EndFunc ;==>SETARRAY

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

    Func DRAW()
    For $x = 0 To $SIZE[0] - 1 Step 1
    For $y = 0 To $SIZE[1] - 1 Step 1
    _GDIPlus_GraphicsFillRect($hBUF, $x * $iZ, $y * $iZ, $iZ, $iZ, $hBRU[$aSpielfeld[$x][$y]])
    Next
    Next
    EndFunc ;==>DRAW

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

    Func _Freigeben()

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

    For $i = 0 To UBound($hBRU) - 1 Step 1
    _GDIPlus_BrushDispose($hBRU)
    Next

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

    _GDIPlus_GraphicsDispose($hBUF)
    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_Shutdown()

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

    EndFunc ;==>_Freigeben

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

    Func _Event()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>_Event

    [/autoit]
    Spoiler anzeigen
    [autoit]


    Global $POS, $FELD, $SIZE

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

    Func AI_01()

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

    For $x = 0 To $SIZE[0] - 1 Step 1
    For $y = 0 To $SIZE[1] - 1 Step 1
    MOVE($x, $y, _LROU())
    Next
    Next

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

    EndFunc

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

    Func _LROU()
    Local Static $LROU[4] = ['l', 'r', 'o', 'u']
    Return $LROU[Random(0, 3, 1)]
    EndFunc

    [/autoit]
    Spoiler anzeigen
    [autoit]


    Global $POS, $FELD, $SIZE

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

    Func AI_02()

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

    For $x = 0 To $SIZE[0] - 1 Step 1
    For $y = 0 To $SIZE[1] - 1 Step 1
    MOVE($x, $y, LROU())
    Next
    Next

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

    EndFunc

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

    Func LROU()
    Local Static $LROU[4] = ['l', 'r', 'o', 'u']
    Return $LROU[Random(0, 3, 1)]
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Treffen sich 2 Ameisen sterben beide.


    Das solltest du klarer ausführen.
    Wenn ich das Programm schreiben würde, wäre Punkt 1 vor einer Bewegung zu prüfen ob ich nicht eine Kollision erleide (und wie hier angegeben sterbe).
    Bezieht sich diese Anmerkung also nur darauf, dass bei einer fehlerhaften Überprüfung meinerseits die Kollision zu diesem Ergebnis führt oder ist das ein Lotteriespiel: Beweg dich - vielleicht stirbst du. :wacko:

    Aber ich halte aufgrund der existierenden Lösungen in diesem Bereich eine Umsetzung in AutoIt auch nicht für sehr sinnvoll.
    Sicher ist es schwer auf vollkommen neue Ideen zu kommen. Aber Altbackenes neu zu Lackieren ist nicht so der Hit.. :whistling:

  • Man könnte das als Grundlage nehmen: GDI+ Spiel: AutoIt Arena Fight.
    Ala RoboWar, finde ich auch spannend ;)... Man muss ja nicht unbedingt AntMe! nachbauen, kann da auch eigene Konzepte nehmen :P...
    An meiner Uni haben wir z.B. Eishockey-Teams programmiert (weil das Turnier in der Klausurphase lag, waren die Teams aber nicht sehr gut und nur wenige...^^ Leider...).

    Ich finde die Idee super und so kann man Leuten spielerisch den Einstieg in AutoIt erleichtern :)! Nur, weils das in anderen Sprachen gibt, ist das doch kein Grund, das nicht zu erstellen?! O.o

    LG,
    Aca

  • Ich finde die Idee super und so kann man Leuten spielerisch den Einstieg in AutoIt erleichtern :)! Nur, weils das in anderen Sprachen gibt, ist das doch kein Grund, das nicht zu erstellen?! O.o


    Dieser Meinung bin ich auch, nur sollte man dann am Ende eine Aufgabe wählen, die auch für Anfänger schaffbar ist.
    Ich denke aber, dass Ameisen oder die Spieler in Arena Fight noch einfach genug zu steuern wären...

    MfG, James

  • Aber Altbackenes neu zu Lackieren ist nicht so der Hit.. :whistling:


    Das ist hier ja schon fast einn Krieg mit Bauernweisheiten^^
    Wozu das Rad neu erfinden ?

    Zur Kollision:

    Fällt der Abstand der Ameisen unter 2 px gibt es 2 Tote.
    Man kann ohne wissen über den Gegnerischen Zug also nicht sagen ob man stirbt, wenn man auf ihn zu geht.
    Das ist aber soweit ich weiß im Original auch so. (Deshalb bilden sich diese "Mauern" aus Ameisen, weil keine den Abstand veringern will)

    Kein Treffer:
    A## . . A#B . . A##
    ##B . . ### . . ###
    ### . . ### . . B##

    Treffer:
    A# . AB . A#
    #B . ## . B#

    Da man das Array mit allen Daten sämtlicher Ameisen (eigene und Gegnerische) besitzt muss man selbst berechnen wie man vorgeht.
    Das ist ja grade der Trick an der Sache. Wenn ich das wie ein Baukastensystem mache muss man ja nix mehr machen außer eine hand voll Funktionen in der Reihenfolge Variieren.

    Teams, Angriffspläne, Verteidigung, Sammeln usw muss man schon selbst programmieren.


    Allerdings hat das je nach Anforderung an den Bot nichts mit "einstig in AutoIt" zu tun^^
    einen simplen Bot der gezielt Essen sucht und angreift sowie verteidigt sollte man aber in weniger als 100 Zeilen schaffen. Auch mit simplem Code.

  • Wie du schon sagst "Je nach Anforderungen"... Wenn man ein Beispiel beilegt, kann man auch ein schönes Tutorial dazu schreiben, vllt. ab und an mal Turniere machen und für verschiedene "Schwierigkeitsgrade" oder so :p...

    Ist halt ein "spielerischer Einstieg" und der "Bot" kann sich immer weiter entwickeln^^...