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. eukalyptus

Beiträge von eukalyptus

  • Prog übergibt Parameter an seine 1 Instanz (mehrere Dateien via Kontext-Menü)

    • eukalyptus
    • 15. August 2008 um 21:50

    Ich erstelle einen Eintrag im Explorer Kontext-Menü; die ausgewählte Datei wird dann via Commandline-Parameter an das Programm übergeben.
    Wen man nun mehrere Dateien ausgewählt hat, dann werden dementsprechend viele Instanzen des Programms gestartet, jede mit einem anderen Dateinamen als Commandline-Parameter.
    Ich will aber, dass mein Programm nur einmal läuft und alle ausgewählten Dateinamen bekommt bzw. auch später ausgewählte Dateien sollen im bereits gestarteten Prog landen.

    (Mit dem fertigen Programm will ich im Explorer Mp3-Dateien markieren und via Rechtsklick auf einen Server laden...)

    Meine Lösung:
    Instanz 1 erzeugt eine GUI und alle weiteren Instanzen senden "ihre" Commandline-Parameter an das GUI der 1 Instanz.

    Wenn man zu viele Dateien auf einmal "startet", dann würden die einzelnen Instanzen fast zeitgleich senden.
    Darum warten diese, bis sie an der Reihe sind.


    Spoiler anzeigen
    [autoit]

    If $CmdLine[0]=0 And @Compiled Then RegWrite("HKEY_CLASSES_ROOT\*\shell\TestContext\command","","REG_SZ",'"' & @AutoItExe & '" "%1"')
    ;RegDelete("HKEY_CLASSES_ROOT\*\shell\TestContext")

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

    #include <Misc.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    If $CmdLine[0]<>1 Then Exit

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

    Global $WinTitle="Window Title"

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

    If _Singleton($WinTitle,1)=0 Then ;wenn nicht 1 Instanz
    #NoTrayIcon
    WinWait($WinTitle)
    $Send_handle = WinGetHandle($WinTitle)
    Do
    $ProcList=ProcessList(@ScriptName)
    Sleep(100)
    Until $ProcList[2][1]=@AutoItPID ;wartet bis aktuelle Instanz an der Reihe ist - also [2][0], [1][0] ist ja die 1 Instanz mit GUI
    _SendCopyDataString(0,$Send_handle,$CmdLine[1]);sendet den Commandline-Parameter an das GUI der 1 Instanz
    Exit
    EndIf

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

    GUICreate($WinTitle,320,640)
    GUIRegisterMsg($WM_COPYDATA, 'MY_WM_COPYDATA');empfängt die Daten
    GUISetOnEvent($GUI_EVENT_CLOSE,"_EXIT")
    $Liste=GUICtrlCreateLabel($CmdLine[1],0,0,320,640)
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _SendCopyDataString($My_Hwnd, $Scite_hwnd, $sCmd)
    Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
    'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
    'Ptr', DllStructGetPtr($COPYDATA))
    EndFunc

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

    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    Local $Temp=""
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    Local $COPYDATA_StringLen = DllStructGetData($COPYDATA, 2)
    Local $CmdStruct = DllStructCreate('Char['&$COPYDATA_StringLen&']', DllStructGetData($COPYDATA, 3))
    $COPYDATA_String = StringLeft(DllStructGetData($CmdStruct, 1), $COPYDATA_StringLen)
    $Temp=GUICtrlRead($Liste)
    GUICtrlSetData($Liste,$Temp & @CRLF & $COPYDATA_String)
    EndFunc

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

    Func _EXIT()
    Exit
    EndFunc

    [/autoit]

    wers ausprobieren will:
    als EXE Compilieren
    dann einmal direkt aufrufen, damit der Eintrag ins Kontext-Menü gemacht wird
    danach im Explorer irgendwelche Dateien markieren -> Rechtsklick -> TestKontext

    das GUI listet nun die Dateien der Reihe nach auf.

    Ich hoff, das kann jemand brauchen ;)

    lgE

  • Class und Title

    • eukalyptus
    • 14. August 2008 um 18:52

    Irgendwie verstehe ich das nicht so ganz!

    Hast du mehrere Fenster mit dem selben Title, jedoch unterschiedlicher Class? Oder umgekehrt?

    Du kannst Fenster mit gleichem Title differenzieren, indem du bei "Text" einen Text eingibst, welcher nur im gewünschten Fenster vorkommt.
    z.b.: Bei WinTV erreiche ich mit ControlSend("WinTV","ActiveMovie Window",...) das Fullscreenfenster, mit ControlSend("WinTV","WinTV Thumbnails",...) jedoch das WinTV-Controlpanel.

    lgE

  • RapidPrem UDF

    • eukalyptus
    • 14. August 2008 um 18:27

    Hey, Geil!

    UDF funktioniert tadellos!

    Allerdings hab ich beim Beispielscript ein Problem:
    Die Sammelfunktion lässt sich nicht abbrechen.

    Und beim Login-Fenster wäre OnTop nicht schlecht.

    Danke für die UDF!
    lgE

  • Variablen Hochzählen

    • eukalyptus
    • 13. August 2008 um 11:19
    [autoit]

    Global $a = 0xFFFFFF, $b[5], $k

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

    $b[1] = 0x123456
    $b[2] = 0x234567
    $b[3] = 0x345678
    $b[4] = 0xFFFFFF

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

    For $k = 1 To 4

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

    if $a = $b[$k] Then ; $1 soll anschliessend hochgezählt werden, sodass $a im nächsten Schritt mit $2 verglichen wird
    BlaBlaBla ; ich hatte es schon so probiert $($k),was aber keine gute Lösung ist und auch wegen Syntaxfehler nicht funktionert ^^
    endif

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

    Next

    [/autoit]
  • Frage zum Hotkey

    • eukalyptus
    • 12. August 2008 um 06:45

    versuch mal NOT als *(-1) zu verstehen.

    [autoit]


    $Var=5
    $Var=$Var *(-1) ;$Var hat nun den Wert -5
    $Var=$Var *(-1) ;$Var hat nun den Wert 5

    [/autoit]

    *(-1) wechselt bei jedem Aufruf das Vorzeichen der Variable -
    NOT wechselt bei jedem Aufruf zwischen TRUE und FALSE (1 und 0)

    [autoit]


    $Var=TRUE
    $Var=NOT $Var ;$Var hat nun den Wert FALSE
    $Var=NOT $Var ;$Var hat nun den Wert TRUE

    [/autoit]


    usw...


    lgE

  • Mp3-Recording via bass.dll

    • eukalyptus
    • 9. August 2008 um 00:49

    es gäbe da noch die "xaudio.dll" ;) (hab ich aber noch nicht ausprobiert)
    hast du schon meinen "Edit 2" aus dem letzten post ausprobiert?

    ich muß zugeben, ich habe die dll extra für dieses forum angepasst; vielleicht haben sich da einige bugs eingeschlichen ;)

    zumindest läuft MEIN aufnahmeprogramm auf mehreren rechnern (ca. 15) seit geraumer zeit einwandfrei!

    lgE

  • Mp3-Recording via bass.dll

    • eukalyptus
    • 6. August 2008 um 13:09

    eine mp3/wav dateiwird nur erstellt, wenn ein richtiger input der soundkarte gewählt wurde.
    wenn bei meinem beispiel Reclength -1 ist und beim drücken auf start EncoderActive 0 bleibt, dann kann von dem ausgewählten input nicht aufgenommen werden.

    //Edit 2: Die Zeile "_RecStart(1,1,44100)" muß vor GuiCreate verschoben werden, also von zeile 53 auf zeile 13.


    die bass.dll scheint mit manchen soundkarten probleme zu machen - so hab ich letztens bemerkt, daß ich den audioinput meiner pinnacle dazzle dvc100 nicht ansprechen konnte!
    mittlerweile gibt es schon eine neuere version der bass.dll, die hab ich aber noch nicht ausprobiert.

    auf http://www.autoit.de/www.un4seen.com kannst du die aktuellen versionen downloaden, incl. c/delphi/vb beispielscripts und helpfiles.
    dort gibt es auch ein forum.

    du kannst auch aufnehmen, was aus den boxen rauskommt. ich muß dazu bei meinem laptop z.b. den input "Stereomix" auswählen.

    im anhang hab ich noch die helpfiles angefügt.

    lgE


    //Edit: bei meinem beispielscript ist mir ein fehler unterlaufen; bei mehreren installierten soundkarten wurde die inputliste nicht korrekt aktualisiert, wenn man eine andere karte ausgewählt hat. Geänderte Funktion:

    Spoiler anzeigen
    [autoit]

    Func _SelectDevice()
    If _GUICtrlComboBox_GetCurSel($SelDev)+1<>$Device Then
    $Device=_GUICtrlComboBox_GetCurSel($SelDev)+1
    $String = ''
    For $i = 1 To _GetInputs($Device)
    $String = $String & "|" & _getinputname($i)
    Next
    GUICtrlSetData($SelInp, $String, _getinputname(1))
    GUICtrlSetData($Slider,_GetInputLevel(1))
    $Input=1
    _StopRec()
    If GUICtrlRead($AGC)=1 Then
    _EnableAGC(1)
    Else
    _EnableAGC(0)
    EndIf
    _RecStart($Device,$Input,44100)
    _SetAGC(20,0.96)
    EndIf
    EndFunc

    [/autoit]
  • Mp3-Recording via bass.dll

    • eukalyptus
    • 4. August 2008 um 10:04

    ich hatte ja probleme mit der callback-funktion: [ offen ] DllCallBack stürzt ab, außer ich verschiebe das GUI
    deshalb hab ich diese in eine dll "ausgelagert"
    diese basscb.dll ist in devpascal (freepascal) geschrieben.
    http://www.bloodshed.net/devpascal.html

    ich habe momentan nur die funktionen eingebaut, die ich bei meinen derzeitigen projekten benötige, allerdings halten die bass-dll´s noch unzählige weitere funktionen bereit...
    http://un4seen.com

    pascalkundige und interessierte personen sind natürlich aufgerufen das projekt wachsen zu lassen ;)

    lgE

  • Fehlendes Programmicon bei grosser Datei

    • eukalyptus
    • 29. Juli 2008 um 09:18

    erstelle mal eine verknüpfung der fertigen .exe, dann rechtsklick-eigenschaften-anderes symbol...
    schau mal nach, ob das .ico in die .exe eingebunden wurde und ob es sich auswählen lässt.

    wird das .ico richtig eingefügt, wenn du die fileinstalls deaktivierst?

    mir ist letztens aufgefallen, daß die funktion #AutoIt3Wrapper_icon nicht mit scite-lite funktioniert, sondern erst mit der extra-scite-version.

    windows vista verweigert 16bit iconlibraries (.icl), vielleicht auch 16bit icons?!?

    mehr fällt mir gad nicht ein...

    lgE

  • µit - Juli

    • eukalyptus
    • 27. Juli 2008 um 21:00

    so, ich habe nun die letzte veränderung vorgenommen...

    RAR-Passwort: @SCbPVXArZZc3v3@

  • StringRegExp bringt Skript zum Absturz

    • eukalyptus
    • 17. Juli 2008 um 10:12

    vielleicht versucht dein script unzählige emails fast zeitgleich zu verschicken...
    du solltest alle emails in eine txt-datei zusammenfassen und erst am ende gemeinsam versenden.

    bzw. versuch mal die _emailsenden zu deaktivieren - tritt der fehler dann noch immer auf?

  • µit - Juli

    • eukalyptus
    • 13. Juli 2008 um 17:04

    ich hab jetzt auch einen anderen weg gefunden!
    hab mich am anfang zusehr auf die user32.dll fixiert...

    am meisten hab ich damit gekämpft, das rechtemaus-kontextmenü loszuwerden -
    letztendlich ist die lösung einfacher, als ich dachte ;)

  • µit - Juli

    • eukalyptus
    • 7. Juli 2008 um 18:54

    ich bin auch schon fertig!


    Neue version auf seite 3

  • µit - Juli

    • eukalyptus
    • 7. Juli 2008 um 13:24
    Zitat von Oscar

    Das mit der rechten Maustaste sollten wir ändern. Zum markieren eines Wortes ist doch eigentlich ein Doppelklick mit Links erforderlich.

    genau deshalb sollen wir die rechte maustaste nehmen, sonst ist die aufgabe ja nicht wirklich eine herausforderung (wenn das wort via linksdoppelklick schon fix fertig markiert ist...)

  • µit - Juli

    • eukalyptus
    • 7. Juli 2008 um 13:04

    ich hab ein fileopendialog und eine test.txt mit folgendem inhalt:

    Spoiler anzeigen

    Ich mache es mal an dem Beispiel von MS Word. Ihr kennt doch sicher alle die Funktion, dass man einen Satz bestehend aus mehreren Wörtern schreibt und wenn man ein einzelnes Wort anwählt, es direkt nur zu diesem Wort Dinge zur weiteren Bearbeitung anzeigt wenn man rechts inmitten des wortes klickt.
    Diese Funktion, dass Word merkt, welches Wort ich meine, obwohl ich es nicht komplett markiere sondern einfach an irgendeiner Stelle innerhalb des Wortes rechts klicke und er erkennt welches Wort aus der Wortgruppe ich meine soll von euch mit AutoIt realisiert werden.
    Da dies alleine zu langweilig wäre und auch garnich klar wäre in wiefern ihr beweist, welches Wort rausgefiltert wurde, soll beim Rechtsklick auf das Wort ein Mausmenu erscheinen, oder einfach ein Feld, ist am Ende egal^^, in dem das Wort, welches rausgefiltert wurde umgekehrt gezeigt wird. Dabei soll die Groß und Kleinschreibung beachtet werden.

    das original kontextmenü bereitet mir aber noch etwas sorgen ;)

    lgE

  • µit - April

    • eukalyptus
    • 11. Juni 2008 um 01:16

    laß dir ruhig zeit ;)

    ich hab noch vor die funktion zu integrieren, daß ein komplett abgeschossenes schiff angezeigt wird.

    ich schlage vor, dass wir den abgabetermin auf unbestimmte zeit verlegen und warten, bis die übrigen teilnehmer fertig sind.
    dies widerspricht zwar den regeln, aber ich glaube, dass wir den wichtigsten punkt, "spaß am programmieren" doch berücksichtigen sollen!
    und eigentlich will ich ja nicht gewinnen, sondern die anderen scripte sehen - je mehr desto besser!

    lgE

  • µit - April

    • eukalyptus
    • 10. Juni 2008 um 09:31

    natürlich sollt ihr eure spiele fertig machen!
    vielleicht schaffen es blubkuh und gun-food auch noch ;)

    ich hab übrigens mein spiel etwas verändert, sodaß man nun bei einem treffer an der reihe bleibt.

    änderungen:

    Spoiler anzeigen


    bei zeile 20
    vorher:

    [autoit]

    _KI()
    GUICtrlSetOnEvent($NewBut, "_New")
    $Turn = 1

    [/autoit]


    nachher

    [autoit]

    If _KI() <> True Then $Turn = 1
    GUICtrlSetOnEvent($NewBut, "_New")

    [/autoit]


    bei zeile 87
    vorher

    [autoit]

    _Shot($Temp[0], $Temp[1], 1)
    GUICtrlSetData($Info, 'Du bist an der Reihe...')

    [/autoit]


    nachher

    [autoit]

    If _Shot($Temp[0], $Temp[1], 1)= True Then
    Return True
    Else
    GUICtrlSetData($Info, 'Du bist an der Reihe...')
    Return False
    EndIf

    [/autoit]


    bei zeile 326 kommt noch ein "Return True" rein

    bei zeile 483 "$Turn = 1" statt "$Turn = 0"


    geänderte version:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <StaticConstants.au3>
    #include <EditConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt("TrayIconDebug", 1)

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

    Global Const $Water = 0x0000AA, $Ship = 0x00FF00, $Hit = 0xDD11133, $Tried = 0x000066, $Mark = 0x0000AB
    Global $F_Num = 10, $F_FLD[4][$F_Num + 1][$F_Num + 1], $Ras, $Ras1, $Ra3, $Play = False, $Action, $Turn = 0, $Info, $StartBut, $DiagBox
    Global $Main, $SizeLab, $S_Gra[6], $S_Count[6], $F_Alt[6][2], $Diagonal = False, $NewBut

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

    _CreateGui()
    _New()

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

    While 1
    If $Play Then
    If $Turn = 0 Then
    GUICtrlSetOnEvent($NewBut, "")
    If _KI() <> True Then $Turn = 1
    GUICtrlSetOnEvent($NewBut, "_New")
    Else
    Do
    $Action = GUIGetCursorInfo($Main)
    If $Action[3] And ($Action[4] > $F_FLD[0][0][0]) And ($Action[4] < $F_FLD[0][0][1]) Then _SetFlag($Action[4])
    Sleep(5)
    Until $Action[2] = 1 Or Not $Play
    If $Action[2] = 1 And $Play Then
    While $Action[2] = 1
    $Action = GUIGetCursorInfo($Main)
    Sleep(5)
    WEnd
    If ($Action[4] > $F_FLD[0][0][0]) And ($Action[4] < $F_FLD[0][0][1]) Then _Move($Action[4])
    EndIf
    EndIf
    If $Play Then
    If _Winner() = 2 Then
    GUISetBkColor(0x666666, $Main)
    GUICtrlSetData($Info, 'Computer hat gewonnen!!!')
    $Play = False
    _Refresh()
    _Beep(4)
    GUISetBkColor(0x100500, $Main)
    ElseIf _Winner() = 1 Then
    GUISetBkColor(0x666666, $Main)
    GUICtrlSetData($Info, 'Gratuliere, Du hast gewonnen!!!')
    $Play = False
    _Refresh()
    _Beep(3)
    GUISetBkColor(0x100500, $Main)
    EndIf
    EndIf
    EndIf
    Sleep(10)
    WEnd

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

    #region KI
    Func _KI()
    Local $Temp[2] = [0, 0], $Temp1, $Timer = TimerInit()
    GUICtrlSetData($Info, 'Computer ertüfftelt einen genialen Spielzug...')
    _EndMark()
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    If _Mark($i, $j, $i + 1, $j) Then
    $Temp = _Find($i, $j, $i + 1, $j)
    If $Temp[0] <> 0 Then ExitLoop
    EndIf
    If _Mark($i, $j, $i, $j + 1) Then
    $Temp = _Find($i, $j, $i, $j + 1)
    If $Temp[0] <> 0 Then ExitLoop
    EndIf
    If _Check($i, $j) = $Hit Then
    $Temp = _Dir($i, $j)
    If $Temp[0] <> 0 Then ExitLoop
    EndIf
    Next
    If $Temp[0] <> 0 Then ExitLoop
    Next
    If $Temp[0] = 0 Then $Temp = _Raster()
    If $Temp[0] = 0 Then
    $Temp = _GetFree()
    EndIf
    If $Temp[0] = 0 Then $Temp = _Random()
    While TimerDiff($Timer) < 500
    Sleep(10)
    WEnd
    If _Shot($Temp[0], $Temp[1], 1)= True Then
    Return True
    Else
    GUICtrlSetData($Info, 'Du bist an der Reihe...')
    Return False
    EndIf
    EndFunc ;==>_KI

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

    Func _Raster()
    Local $Ret[2] = [0, 0], $X, $Y, $Temp
    For $i = 1 To 500
    Do
    $X = Random(1, $F_Num, 1)
    $Y = Random(1, $F_Num, 1)
    Until _Mod($X, $Y)
    $Temp = _Check($X, $Y)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $X
    $Ret[1] = $Y
    ExitLoop
    EndIf
    Next
    Return $Ret
    EndFunc ;==>_Raster

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

    Func _Mod($X, $Y)
    If ($S_Count[3] = 0) And ($S_Count[4] = 0) And ($S_Count[5] = 0) Then
    If Mod($X + $Y, 2) = 0 Then Return True
    ElseIf (($S_Count[4] > 0) And ($S_Count[5] > 0)) Or ($S_Count[5] > 0) Then
    If (Mod($X * 2 + $Y, 2.5) = $Ras1) And (Mod($X + $Y, 1) = 0) Then Return True
    ElseIf ($S_Count[3] > 0) And ($S_Count[4] = 0) And ($S_Count[5] = 0) Then
    If (Mod($X+$Y,3)=$Ra3) Then Return True
    Else
    If (Mod($Y, 4) = 0) And (Mod($X + $Y + $Ras, 4) = 0) Then Return True
    If (Mod($Y, 4) = 1) And (Mod($X + $Y + $Ras, 4) = 0) Then Return True
    If (Mod($Y, 4) = 2) And (Mod($X + $Y + $Ras, 4) = 3) Then Return True
    If (Mod($Y, 4) = 3) And (Mod($X + $Y + $Ras, 4) = 1) Then Return True
    EndIf
    Return False
    EndFunc ;==>_Mod

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

    Func _Random()
    Local $Ret[2] = [0, 0], $X, $Y, $Temp
    Do
    $X = Random(1, $F_Num, 1)
    $Y = Random(1, $F_Num, 1)
    $Temp = _Check($X, $Y)
    Until ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Tried)
    $Ret[0] = $X
    $Ret[1] = $Y
    Return $Ret
    EndFunc ;==>_Random

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

    Func _GetBySize($Size)
    Local $S = 0, $S1 = 0
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    $S1 = 0
    For $k = 0 To $Size - 1
    If _Check($i + $k, $j) = $Hit Then
    $S1 += 1
    Else
    ExitLoop
    EndIf
    Next
    If ($S1 = $Size) And (_Check($i - 1, $j) <> $Hit) And (_Check($i + $Size, $j) <> $Hit) Then $S += 1
    $S1 = 0
    For $k = 0 To $Size - 1
    If _Check($i, $j + $k) = $Hit Then
    $S1 += 1
    Else
    ExitLoop
    EndIf
    Next
    If ($S1 = $Size) And (_Check($i, $j - 1) <> $Hit) And (_Check($i, $j + $Size) <> $Hit) Then $S += 1
    Next
    Next
    If $S < $S_Count[$Size] Then Return True
    Return False
    EndFunc ;==>_GetBySize

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

    Func _GetFree()
    Local $Size, $Ret[2] = [0, 0], $S = 0, $S1, $Temp, $X, $Y, $Cord[$F_Num ^ 2][3], $CorMax = 0
    Select
    Case _GetBySize(5)
    $Size = 5
    Case _GetBySize(4)
    $Size = 4
    Case _GetBySize(3)
    $Size = 3
    Case _GetBySize(2)
    $Size = 2
    Case Else
    $Ret[0] = 0
    Return $Ret
    EndSelect
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    $S1 = 0
    For $k = 1 To $F_Num - $i
    $Temp = _Check($i + $k, $j)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $S1 += 1
    Else
    ExitLoop
    EndIf
    Next
    If ($S1 = $S) And ($S > 1) Then
    $CorMax += 1
    $Cord[$CorMax][0] = $i + Round($S / 2)
    $Cord[$CorMax][1] = $j
    $Cord[$CorMax][2] = $S
    EndIf
    If $S1 > $S Then
    $S = $S1
    $CorMax = 1
    $Cord[1][0] = $i + Round($S / 2)
    $Cord[1][1] = $j
    $Cord[$CorMax][2] = $S
    EndIf
    $Temp = _Check($Cord[$CorMax][0], $Cord[$CorMax][1])
    If ($S < $Size) Or ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then $CorMax -= 1
    If $CorMax < 0 Then $CorMax = 0
    $S1 = 0
    For $k = 1 To $F_Num - $j
    $Temp = _Check($i, $j + $k)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $S1 += 1
    Else
    ExitLoop
    EndIf
    Next
    If ($S1 = $S) And ($S > 1) Then
    $CorMax += 1
    $Cord[$CorMax][0] = $i
    $Cord[$CorMax][1] = $j + Round($S / 2)
    $Cord[$CorMax][2] = $S
    EndIf
    If $S1 > $S Then
    $S = $S1
    $CorMax = 1
    $Cord[1][0] = $i
    $Cord[1][1] = $j + Round($S / 2)
    $Cord[$CorMax][2] = $S
    EndIf
    $Temp = _Check($Cord[$CorMax][0], $Cord[$CorMax][1])
    If ($S < $Size) Or ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then $CorMax -= 1
    If $CorMax < 0 Then $CorMax = 0
    Next
    Next
    If $CorMax < 1 Then Return $Ret
    For $i = 1 To 10
    $Temp1 = Random(1, $CorMax, 1)
    $Temp = _Check($Cord[$Temp1][0], $Cord[$Temp1][1])
    If ($S >= $Size) And ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $Cord[$Temp1][0]
    $Ret[1] = $Cord[$Temp1][1]
    ExitLoop
    EndIf
    Next
    Return $Ret
    EndFunc ;==>_GetFree

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

    Func _Dir($X, $Y)
    Local $Ret[2] = [0, 0], $CO = 0, $CU = 0, $CL = 0, $CR = 0, $Temp, $O = True, $U = True, $L = True, $R = True, $D = 4
    While $O Or $U Or $L Or $R
    If $O Then
    $Temp = _Check($X - 1 - $CO, $Y)
    If ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then
    $O = False
    Else
    $CO += 1
    EndIf
    EndIf
    If $U Then
    $Temp = _Check($X + 1 + $CU, $Y)
    If ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then
    $U = False
    Else
    $CU += 1
    EndIf
    EndIf
    If $L Then
    $Temp = _Check($X, $Y - 1 - $CL)
    If ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then
    $L = False
    Else
    $CL += 1
    EndIf
    EndIf
    If $R Then
    $Temp = _Check($X, $Y + 1 + $CR)
    If ($Temp = 0) Or ($Temp = $Hit) Or ($Temp = $Mark) Or ($Temp = $Tried) Then
    $R = False
    Else
    $CR += 1
    EndIf
    EndIf
    WEnd
    If $CO = 0 And $CU = 0 And $CL = 0 And $CR = 0 Then Return $Ret
    If ($CO + $CU) > ($CL + $CR) Then
    $D = 1
    If $CO > $CU Then $D = 0
    If $CO = $CU Then $D = Random(0, 1, 1)
    ElseIf ($CO + $CU) < ($CL + $CR) Then
    $D = 3
    If $CL > $CR Then $D = 2
    If $CL = $CR Then $D = Random(2, 3, 1)
    Else
    For $k = 1 To 50
    $D = Random(0, 3, 1)
    If ($D = 0 And $CO > 0) Or ($D = 1 And $CU > 0) Or ($D = 2 And $CL > 0) Or ($D = 3 And $CR > 0) Then ExitLoop
    Next
    EndIf
    Switch $D
    Case 0
    $Ret[0] = $X - 1
    $Ret[1] = $Y
    Case 1
    $Ret[0] = $X + 1
    $Ret[1] = $Y
    Case 2
    $Ret[0] = $X
    $Ret[1] = $Y - 1
    Case 3
    $Ret[0] = $X
    $Ret[1] = $Y + 1
    EndSwitch
    Return $Ret
    EndFunc ;==>_Dir

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

    Func _Shot($X, $Y, $W)
    If Not $Play Then Return
    GUICtrlSetBkColor($F_FLD[$W][$X][$Y], 0xFFFFFF)
    Sleep(80)
    If $F_FLD[$W + 2][$X][$Y] = $Ship Then
    $F_FLD[$W + 2][$X][$Y] = $Hit
    GUICtrlSetBkColor($F_FLD[$W][$X][$Y], $F_FLD[$W + 2][$X][$Y])
    _Beep(1)
    Return True
    EndIf
    If $F_FLD[$W + 2][$X][$Y] = $Water Then
    $F_FLD[$W + 2][$X][$Y] = $Tried
    GUICtrlSetBkColor($F_FLD[$W][$X][$Y], $F_FLD[$W + 2][$X][$Y])
    _Beep(2)
    EndIf
    If $F_FLD[$W + 2][$X][$Y] = $Mark Then
    $F_FLD[$W + 2][$X][$Y] = $Tried
    GUICtrlSetBkColor($F_FLD[$W][$X][$Y], $F_FLD[$W + 2][$X][$Y])
    _Beep(2)
    EndIf
    EndFunc ;==>_Shot

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

    Func _Find($X, $Y, $X1, $Y1)
    Local $Temp, $Ret[2] = [0, 0]
    If $X = $X1 Then
    $Temp = _Check($X, $Y - 1)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $X
    $Ret[1] = $Y - 1
    Return $Ret
    EndIf
    $Temp = _Check($X, $Y + 2)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $X
    $Ret[1] = $Y + 2
    Return $Ret
    EndIf
    ElseIf $Y = $Y1 Then
    $Temp = _Check($X - 1, $Y)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $X - 1
    $Ret[1] = $Y
    Return $Ret
    EndIf
    $Temp = _Check($X + 2, $Y)
    If ($Temp <> 0) And ($Temp <> $Hit) And ($Temp <> $Mark) And ($Temp <> $Tried) Then
    $Ret[0] = $X + 2
    $Ret[1] = $Y
    Return $Ret
    EndIf
    EndIf
    Return $Ret
    EndFunc ;==>_Find

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

    Func _Check($X, $Y)
    If ($X < 1) Or ($X > $F_Num) Or ($Y < 1) Or ($Y > $F_Num) Then Return 0
    Return $F_FLD[3][$X][$Y]
    EndFunc ;==>_Check

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

    Func _Mark($X, $Y, $X1, $Y1)
    If ($X < 1) Or ($X > $F_Num) Or ($X1 < 1) Or ($X1 > $F_Num) Or ($Y < 1) Or ($Y > $F_Num) Or ($Y1 < 1) Or ($Y1 > $F_Num) Then Return False
    If ($F_FLD[3][$X][$Y] = $Hit) And ($F_FLD[3][$X1][$Y1] = $Hit) Then
    If $X = $X1 Then
    _SetMark($X - 1, $Y)
    _SetMark($X - 1, $Y1)
    _SetMark($X + 1, $Y)
    _SetMark($X + 1, $Y1)
    ElseIf $Y = $Y1 Then
    _SetMark($X, $Y - 1)
    _SetMark($X1, $Y - 1)
    _SetMark($X, $Y + 1)
    _SetMark($X1, $Y + 1)
    EndIf
    Return True
    EndIf
    EndFunc ;==>_Mark

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

    Func _EndMark()
    _MarkEnd(5, 0)
    If _GetBySize(5) = False Then _MarkEnd(4, 0)
    If (_GetBySize(5) = False) And (_GetBySize(4) = False) Then _MarkEnd(3, 0)
    If (_GetBySize(5) = False) And (_GetBySize(4) = False) And (_GetBySize(3) = False) Then _MarkEnd(2, 0)
    _MarkEnd(4, 1)
    _MarkEnd(3, 1)
    _MarkEnd(2, 1)
    EndFunc ;==>_EndMark

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

    Func _MarkEnd($Size, $EX)
    Local $S = 0, $S1 = 0, $Temp
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    $S = 0
    $S1 = 0
    For $k = -1 To $Size
    $Temp = _Check($i + $k, $j)
    If ($k > -1) And ($k < $Size) And ($Temp = $Hit) Then $S += 1
    If ($EX = True) And (($k = -1) Or ($k = $Size)) And (($Temp = 0) Or ($Temp = $Mark) Or ($Temp = $Tried)) Then $S1 += 1
    Next
    If (($Size = $S) And ($EX = False)) Or (($S1 = 2) And ($Size = $S) And ($EX = True)) Then
    If $Diagonal Then _SetMark($i - 1, $j - 1)
    _SetMark($i - 1, $j)
    If $Diagonal Then _SetMark($i - 1, $j + 1)
    If $Diagonal Then _SetMark($i + $Size, $j - 1)
    _SetMark($i + $Size, $j)
    If $Diagonal Then _SetMark($i + $Size, $j + 1)
    EndIf
    $S = 0
    $S1 = 0
    For $k = -1 To $Size
    $Temp = _Check($i, $j + $k)
    If ($k > -1) And ($k < $Size) And ($Temp = $Hit) Then $S += 1
    If ($EX = True) And (($k = -1) Or ($k = $Size)) And (($Temp = 0) Or ($Temp = $Mark) Or ($Temp = $Tried)) Then $S1 += 1
    Next
    If (($Size = $S) And ($EX = False)) Or (($S1 = 2) And ($Size = $S) And ($EX = True)) Then
    If $Diagonal Then _SetMark($i - 1, $j - 1)
    _SetMark($i, $j - 1)
    If $Diagonal Then _SetMark($i + 1, $j - 1)
    If $Diagonal Then _SetMark($i - 1, $j + $Size)
    _SetMark($i, $j + $Size)
    If $Diagonal Then _SetMark($i + 1, $j + $Size)
    EndIf
    Next
    Next
    EndFunc ;==>_MarkEnd

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

    Func _SetMark($X, $Y)
    If ($X < 1) Or ($X > $F_Num) Or ($Y < 1) Or ($Y > $F_Num) Then Return
    If $F_FLD[3][$X][$Y] = $Water Then $F_FLD[3][$X][$Y] = $Mark
    EndFunc ;==>_SetMark

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

    Func _Winner()
    Local $Com = True, $Usr = True
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    If $F_FLD[2][$i][$j] = $Ship Then $Com = False
    If $F_FLD[3][$i][$j] = $Ship Then $Usr = False
    Next
    Next
    If $Usr Then
    Return 2
    ElseIf $Com Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc ;==>_Winner
    #endregion KI

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

    Func _Move($Field)
    Local $X = 0, $Y = 0
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    If $Field = $F_FLD[0][$i][$j] Then
    $X = $i
    $Y = $j
    ExitLoop
    EndIf
    Next
    If $X <> 0 Then ExitLoop
    Next
    If ($F_FLD[2][$X][$Y] = $Hit) Or ($F_FLD[2][$X][$Y] = $Tried) Or (GUICtrlRead($F_FLD[0][$X][$Y])="X") Then Return
    If $F_FLD[2][$X][$Y] = $Ship Then
    $F_FLD[2][$X][$Y] = $Hit
    GUICtrlSetBkColor($F_FLD[0][$X][$Y], $F_FLD[2][$X][$Y])
    _Beep(1)
    $Turn = 1
    EndIf
    If $F_FLD[2][$X][$Y] = $Water Then
    $F_FLD[2][$X][$Y] = $Tried
    GUICtrlSetBkColor($F_FLD[0][$X][$Y], $F_FLD[2][$X][$Y])
    _Beep(2)
    $Turn = 0
    EndIf

    EndFunc ;==>_Move

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

    Func _Refresh()
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    If ($F_FLD[2][$i][$j] = $Ship) Or ($F_FLD[2][$i][$j] = $Hit) Or ($F_FLD[2][$i][$j] = $Water) Then GUICtrlSetBkColor($F_FLD[0][$i][$j], $F_FLD[2][$i][$j])
    If ($F_FLD[3][$i][$j] = $Ship) Or ($F_FLD[3][$i][$j] = $Hit) Or ($F_FLD[2][$i][$j] = $Water) Then GUICtrlSetBkColor($F_FLD[1][$i][$j], $F_FLD[3][$i][$j])
    Next
    Next
    EndFunc ;==>_Refresh

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

    Func _ShipPut()
    Local $CtrlID, $Size = 2, $Dir = True
    For $i = 2 To 5
    If @GUI_CtrlId = $S_Gra[$i] Then
    $Size = $i
    ExitLoop
    EndIf
    Next
    If @GUI_WinHandle <> $Main Then Return
    $CtrlID = GUIGetCursorInfo($Main)
    While $CtrlID[2]
    $CtrlID = GUIGetCursorInfo($Main)
    If $CtrlID[3] Then
    While $CtrlID[3]
    $CtrlID = GUIGetCursorInfo($Main)
    WEnd
    $Dir = Not $Dir
    _ShipPos($CtrlID[4], $Size, $Dir, 0, 1)
    EndIf
    If ($CtrlID[4] > $F_FLD[1][0][0]) And ($CtrlID[4] < $F_FLD[1][0][1]) Then
    If $F_Alt[1][0] <> $CtrlID[4] Then _ShipPos($CtrlID[4], $Size, $Dir, 0, 1)
    EndIf
    Sleep(20)
    WEnd
    If _ShipPos($CtrlID[4], $Size, $Dir, 1, 1) Then
    $S_Count[$Size] += 1
    GUICtrlSetState($StartBut, $GUI_ENABLE)
    EndIf
    EndFunc ;==>_ShipPut

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

    Func _ShipPos($CtrlID, $Size, $Dir, $Save, $W)
    Local $X = 0, $Y = 0, $Suc = True, $XS, $XE, $YS, $YE
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    If $CtrlID = $F_FLD[$W][$i][$j] Then
    $X = $i
    $Y = $j
    ExitLoop
    EndIf
    Next
    If $X <> 0 Then ExitLoop
    Next
    If $X = 0 Then
    For $i = 0 To $Size
    If $W = 1 Then GUICtrlSetBkColor($F_Alt[$i][0], $F_Alt[$i][1])
    Next
    Return False
    EndIf
    If $Dir = 0 Then
    If $X > $F_Num - $Size + 1 Then $Suc = False
    Else
    If $Y > $F_Num - $Size + 1 Then $Suc = False
    EndIf
    For $S = 1 To $Size
    $XS = $X - 1
    $XE = $X + 1
    $YS = $Y - 1
    $YE = $Y + 1
    If $XS < 1 Then $XS = 1
    If $XE > $F_Num Then $XE = $F_Num
    If $YS < 1 Then $YS = 1
    If $YE > $F_Num Then $YE = $F_Num
    For $i = $XS To $XE
    For $j = $YS To $YE
    If (Not $Diagonal) And ($S = 1 Or $S = $Size) And (($i = $X - 1 And $j = $Y - 1) Or ($i = $X - 1 And $j = $Y + 1) Or ($i = $X + 1 And $j = $Y - 1) Or ($i = $X + 1 And $j = $Y + 1)) Then ContinueLoop
    If $F_FLD[$W + 2][$i][$j] = $Ship Then $Suc = False
    Next
    Next
    If $Dir = 0 Then
    $X += 1
    Else
    $Y += 1
    EndIf
    Next
    If $W <> 2 Then
    For $i = 0 To $Size
    If $W = 1 Then GUICtrlSetBkColor($F_Alt[$i][0], $F_Alt[$i][1])
    Next
    If $Dir = 0 Then
    $X -= 1
    Else
    $Y -= 1
    EndIf
    For $i = $Size To 1 Step -1
    If $Suc Then
    If ($X > 0) And ($Y > 0) And ($X <= $F_Num) And ($Y <= $F_Num) Then
    If $W = 1 Then GUICtrlSetBkColor($F_FLD[$W][$X][$Y], $Ship)
    If $Save = 1 Then $F_FLD[$W + 2][$X][$Y] = $Ship
    EndIf
    Else
    If ($X > 0) And ($Y > 0) And ($X <= $F_Num) And ($Y <= $F_Num) And ($Save = 0) And ($W = 1) Then GUICtrlSetBkColor($F_FLD[$W][$X][$Y], 0xAA0000)
    EndIf
    If ($X > 0) And ($Y > 0) And ($X <= $F_Num) And ($Y <= $F_Num) Then
    $F_Alt[$i][0] = $F_FLD[$W][$X][$Y]
    $F_Alt[$i][1] = $F_FLD[$W + 2][$X][$Y]
    EndIf
    If $Dir = 0 Then
    $X -= 1
    Else
    $Y -= 1
    EndIf
    Next
    EndIf
    Return $Suc
    EndFunc ;==>_ShipPos

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

    Func _SetFlag($CtrlID)
    While $Action[3] = 1
    $Action = GUIGetCursorInfo($Main)
    Sleep(5)
    WEnd
    If GUICtrlRead($CtrlID)="X" Then
    GUICtrlSetData($CtrlID,"")
    Else
    GUICtrlSetData($CtrlID,"X")
    EndIf
    EndFunc

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

    Func _Start()
    Local $Proc
    Local $Suc = True
    For $i = 2 To 5
    GUICtrlSetState($S_Gra[$i], $GUI_DISABLE)
    GUICtrlSetBkColor($S_Gra[$i], $Tried)
    Next
    For $m = 1 To 100
    Switch Mod($m, 4)
    Case 0
    $Proc="–"
    Case 1
    $Proc="\"
    Case 2
    $Proc="|"
    Case 3
    $Proc="/"
    EndSwitch
    GUICtrlSetData($Info, "Computer positioniert seine Schiffe... " & $Proc)
    $Suc = True
    For $i = 1 to $F_Num
    For $j = 1 to $F_Num
    $F_FLD[2][$i][$j]=$Water
    Next
    Next
    For $j = 5 To 2 Step -1
    For $i = 1 To $S_Count[$j]
    If _CPUT($j,$m) = False Then $Suc = False
    If $Suc = False Then ExitLoop
    Next
    If $Suc = False Then ExitLoop
    Next
    If $Suc = True Then ExitLoop
    Next
    If $Suc = False Then
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    $F_FLD[2][$i][$j] = $F_FLD[3][$F_Num + 1 - $i][$F_Num + 1 - $j]
    Next
    Next
    EndIf
    $Play = True
    For $i = 1 To 20
    $Turn = Random(0, 1, 1)
    If Mod($i, 2) = 0 Then
    GUICtrlSetData($Info, "Computer")
    Else
    GUICtrlSetData($Info, "Spieler")
    EndIf
    Sleep(80)
    Next
    If $Turn = 1 Then
    GUICtrlSetData($Info, "Du darfst anfangen...")
    Else
    GUICtrlSetData($Info, "Der Computer hat den ersten Versuch...")
    Sleep(3000)
    EndIf
    GUICtrlSetState($StartBut, $GUI_DISABLE)
    EndFunc ;==>_Start

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

    Func _CPUT($L,$M)
    Local $Pos, $Dir, $a, $b
    If 70-($L*10) <= Round($M, -1) Then
    For $Pos = $F_FLD[0][0][0] + 1 To $F_FLD[0][0][1] - 1
    $Dir=Random(0,1,1)
    If _ShipPos($Pos, $L, $Dir, 0, 0) = True Then
    _ShipPos($Pos, $L, $Dir, 1, 0)
    Return True
    ExitLoop
    EndIf
    Next
    Else
    For $i = 1 To 50
    $Pos = Random($F_FLD[0][0][0] + 1, $F_FLD[0][0][1] - 1, 1)
    $Dir = Random(0, 1, 1)
    If _ShipPos($Pos, $L, $Dir, 0, 0) = True Then
    _ShipPos($Pos, $L, $Dir, 1, 0)
    Return True
    ExitLoop
    EndIf
    Next
    EndIf
    Return False
    EndFunc ;==>_CPUT

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

    Func _CreateGui()
    $Main = GUICreate("Schiffe versenken © 2008 by Eukalyptus", 600, 350, 550, 150)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetBkColor(0x100500)
    GUICtrlCreateLabel("Computer", 20, 20)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlCreateLabel("Spieler", 250, 20)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlCreateLabel("Schiffe", 500, 20)
    GUICtrlSetColor(-1, 0x00FF00)
    $S_Gra[2] = GUICtrlCreateGraphic(530, 45, 45, 15)
    GUICtrlSetOnEvent(-1, "_ShipPut")
    GUICtrlSetBkColor(-1, $Ship)
    $S_Gra[3] = GUICtrlCreateGraphic(510, 75, 65, 15)
    GUICtrlSetOnEvent(-1, "_ShipPut")
    GUICtrlSetBkColor(-1, $Ship)
    $S_Gra[4] = GUICtrlCreateGraphic(490, 105, 85, 15)
    GUICtrlSetOnEvent(-1, "_ShipPut")
    GUICtrlSetBkColor(-1, $Ship)
    $S_Gra[5] = GUICtrlCreateGraphic(470, 135, 105, 15)
    GUICtrlSetOnEvent(-1, "_ShipPut")
    GUICtrlSetBkColor(-1, $Ship)
    GUICtrlCreateLabel("Feldgröße", 470, 170)
    GUICtrlSetColor(-1, 0x00FF00)
    $SizeLab = GUICtrlCreateInput("10", 540, 165, 35, 20, $ES_READONLY)
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 20, 5)
    $DiagBox = GUICtrlCreateCheckbox("Diagonal berühren", 470, 190)
    GUICtrlSetColor(-1, 0x00FF00)
    $NewBut = GUICtrlCreateButton("Neu", 470, 220, 50, 20)
    GUICtrlSetOnEvent(-1, "_New")
    $StartBut = GUICtrlCreateButton("Start", 530, 220, 50, 20)
    GUICtrlSetOnEvent(-1, "_Start")
    $Info = GUICtrlCreateLabel("", 20, 260, 550, 75)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetFont(-1, 12)
    GUISetState(@SW_SHOW)
    EndFunc ;==>_CreateGui

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

    Func _New()
    $Play = False
    For $i = 1 To $F_Num
    For $j = 1 To $F_Num
    GUICtrlDelete($F_FLD[0][$i][$j])
    GUICtrlDelete($F_FLD[1][$i][$j])
    Next
    Next
    $F_Num = GUICtrlRead($SizeLab)
    ReDim $F_FLD[4][$F_Num + 1][$F_Num + 1]
    _CreateFields(20, 40, $F_Num, Round(200 / $F_Num), 0)
    _CreateFields(250, 40, $F_Num, Round(200 / $F_Num), 1)
    For $i = 0 To 5
    $S_Count[$i] = 0
    $F_Alt[$i][0] = 0
    $F_Alt[$i][1] = 0
    GUICtrlSetState($S_Gra[$i], $GUI_ENABLE)
    GUICtrlSetBkColor($S_Gra[$i], $Ship)
    Next
    $Ras = Random(0, 3, 1)
    $Ra3 = Random(0, 2, 1)
    Switch Random(0, 3, 1)
    Case 0
    $Ras1 = 0.5
    Case 1
    $Ras1 = 1
    Case 2
    $Ras1 = 1.5
    Case Else
    $Ras1 = 2
    EndSwitch
    GUICtrlSetState($StartBut, $GUI_DISABLE)
    If GUICtrlRead($DiagBox) = $GUI_CHECKED Then
    $Diagonal = False
    Else
    $Diagonal = True
    EndIf
    GUICtrlSetData($Info, "Ziehe beliebig viele Schiffe mit gedrückter linker Maustaste auf dein Spielfeld - ein Rechtsklick ändert die Ausrichtung (Horizontal/Vertikal)" & @CRLF & "Wenn du alle Schiffe positioniert hast, drücke START um das Spiel zu beginnen...")
    EndFunc ;==>_New

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

    Func _CreateFields($X, $Y, $F, $S, $W)
    $F_FLD[$W][0][0] = GUICtrlCreateDummy()
    For $i = 1 To $F
    For $j = 1 To $F
    $F_FLD[$W][$i][$j] = GUICtrlCreateLabel("", $X + ($j - 1) * $S, $Y + ($i - 1) * $S, $S - 1, $S - 1, $SS_CENTER)
    $F_FLD[$W + 2][$i][$j] = $Water
    GUICtrlSetBkColor(-1, $F_FLD[$W + 2][$i][$j])
    GUICtrlSetColor(-1,$Hit)
    GUICtrlSetFont(-1,Round(100/$F_Num)+2)
    Next
    Next
    $F_FLD[$W][0][1] = GUICtrlCreateDummy()
    EndFunc ;==>_CreateFields

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

    Func _Beep($B)
    Local Const $Tone[13] = [523.251, 554.365, 587.330, 622.254, 659.255, 698.456, 739.989, 783.991, 830.609, 880.000, 932.328, 987.767, 1046.50]
    Switch $B
    Case 1
    Beep($Tone[12], 20)
    Sleep(50)
    Beep($Tone[12], 30)
    Case 2
    Beep($Tone[0], 20)
    Case 3
    For $i = 0 To 12
    Beep($Tone[$i], 10)
    Next
    For $i = 11 To 1 Step -1
    Beep($Tone[$i], 10)
    Next
    For $i = 0 To 12
    Beep($Tone[$i], 20)
    Next
    Case 4
    For $i = 12 To 0 Step -1
    Beep($Tone[$i], 20)
    Next
    For $i = 6 To 0 Step -1
    Beep($Tone[$i], 80)
    Next
    EndSwitch
    EndFunc ;==>_Beep

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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


    Eistee:
    das ist eigentlich absicht. wenn der spieler sein feld mit schiffen extrem vollstopft, dann würde der computer ewig mit seiner positionierung der schiffe brauchen.
    falls der computer es nach gewissen zyklen nicht geschafft hat, dann wird einfach das feld des spielers kopiert ;)
    sozusagen eine nötige sicherheitsmaßnahme, da ich es dem spieler überlasse die anzahl seiner schiffe selbst festzulegen.

    lgE

  • Kann Autoit warten bis ein bestimmtes Gerät an den PC angeschlossen wird?

    • eukalyptus
    • 26. Mai 2008 um 11:09

    ich hab mal eine dll auf ner delphi-seite gefunden

    Spoiler anzeigen
    [autoit]

    Const $SO_CPU = 1
    Const $SO_Machine = 2
    Const $SO_Devices = 4
    Const $SO_Display = 8
    Const $SO_Network = 10
    Const $SO_Media = 20
    Const $SO_Memory = 40
    Const $SO_Storage = 80
    Const $SO_USB = 100
    Const $SO_Engines = 200
    Const $SO_APM = 400
    Const $SO_Disk = 800
    Const $SO_OS = 1000
    Const $SO_Printers = 2000
    Const $SO_Software = 4000
    Const $SO_Startup = 8000
    Const $SO_Processes= 10000
    Const $SO_Monitor = 20000
    Const $SO_All = BitOR($SO_CPU,$SO_Machine,$SO_Devices,$SO_Display,$SO_Network,$SO_Media,$SO_Memory,$SO_Storage,$SO_USB,$SO_Engines,$SO_APM,$SO_Disk,$SO_OS,$SO_Printers,$SO_Software,$SO_Startup,$SO_Processes,$SO_Monitor)

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

    $Dll=DllOpen("msic.dll")
    ;$Ret=DllCall($Dll,"long","ShowSystemOverviewModal")
    DllCall($Dll,"none","GenerateXMLReport","dword",$SO_All,"str","Test.xml")
    DllClose($Dll)

    [/autoit]

    speichert die system-infos in eine xml-datei

    vielleicht hilft dir das weiter...

    lgE

    Dateien

    msic.rar 419,49 kB – 304 Downloads
  • Dllcall return variable zu kurz

    • eukalyptus
    • 16. Mai 2008 um 20:20

    in diesem fall liefert StringStripWs($Ret[3],2): ""
    :?:


    EDIT: Wen ich das sternchen rausnehm bei "str", dann gehts!

    JUHUUU :thumbup:

    (weis zwar nicht warum, aber egal - es funzt!!!)

    Danke

  • Dllcall return variable zu kurz

    • eukalyptus
    • 16. Mai 2008 um 19:58

    hallo

    funktion in einer dll:
    CVGetDeviceName( CVVIDCAPSYSTEM capSystem, int deviceNum, char* devNameBuffer, int* nameBufLen)
    devNameBuffer - buffer to receive ASCIIZ device name. must be allocated by caller!

    [autoit]

    $Char=""
    $BSize=8
    $Ret=DllCall($Dll,"none","CVGetDeviceName","int",$HWND[1], "int", $i, "int64*", $Char, "int*", $BSize)
    MsgBox(0,"",BinaryToString($Ret[3]))

    [/autoit]

    in diesem fall erhalte ich "GRABSTER", es sollte aber "GRABSTER SERIES, Capture" lauten... (int64 kann nicht mehr!?)
    $Ret[4]=24 (das stimmt = die länge des strings)

    wenn ich statt "int64" "str" nehm, kommt ein leerer string zurück,
    wenn $BSize>8 ist, dann kommt auch nichts zurück!?


    weiß jemand zufällig, wie ich jetzt an den gesammten string komme?
    bzw. was bedeutet: "must be allocated by caller!"?

    thx
    eukalyptus

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™