Array Anfängerproblem

  • Habe schon ein paar Scripts erstellt. Zurückblickend schauen die sehr Laienhaft aus.
    Tausende Zeilen immer wieder das Gleiche.
    Nun steht das Thema Arrays an. Je länger ich mich damit beschäftige, desto komplizierter wird meine Denkweise.

    Ich habe mir als Array-Übungsbeispiel eines meiner Erstlingswerke zur Brust genommen. Konnte aber keine befridigende Lösung finden.
    Sind zu viele offene Fragen. Wie zb. werden Koordinaten als ein oder 2 dimensional angesehen, kann ich Farbwerte als zusätzliche Dimension anhängen.
    Meine Vorgaben vom alten Script:

    Habe 80 fixe Bildschirmkordinaten ( x,y ). ( wie in einer Tabelle mit 8 x 10 Felder )
    Von diesen Koordinaten werden nacheinander die Farbwerte(Pixel) abgerufen, und je nach Rückmeldung Aktionen gesetzt.
    (Bei der Pixelabafrage habe ich 15 fixe Farbwerte definiert, die als Aktionsauslöser dienen. )

    Das alte Script hat über 2.500 Zeilen mit immer ähnlichen select-Befehle wie unten als Beispiel für die Koordinaten von Position 16.

    $Pos16 = PixelGetColor ( 300, 150 )
    Select
    Case $Pos16 = 0x00FFFF or $Pos16 = 0x0C3CAE
    MouseClick("left", 300, 150, 1)
    Case $Pos16 = 0x1A50B8 or $Pos16 = 0x9E50B8 or $Pos16 = 0xD49575
    MouseClick("right", 300, 150, 1)
    EndSelect

    Mein Ziel war es, das Script auf einen Bruchteil der derzeitigen Zeilenanzahl zu reduzieren. ( War => heißt, ich hab resigniert ohne Hilfe weiterzutüfteln )

    Wer kann mir helfen, die 80 Kordinaten in Arrays zu verpacken und nach 15 verschiedene Farben (auch als Array deklariert ) absuchen zu lassen. ( 15 verschiedene Farben haben 15 verschiedene Reaktionen zur Folge )


    Gruß
    PowerMax

    Altes Script funktioniert. Mich interessiert nur wie mann das Umsetzt und wie klein man das Script machen kann.

  • An die Profis: Stimmt diese Funktion?

    Spoiler anzeigen
    [autoit]

    Func _PixelClick($pos,$x,$y)
    Select
    Case $pos = 0x00FFFF or $pos = 0x0C3CAE
    MouseClick("left", $x, $y, 1)
    Case $pos = 0x1A50B8 or $pos = 0x9E50B8 or $pos = 0xD49575
    MouseClick("right", $x, $y, 1)
    EndSelect
    Endfunc

    [/autoit]
  • Sind die Bildschirmkoordinaten beliebig oder haben sie ein erkennbares Muster?
    Bei einer Regelmäßigkeit würde ich mit einer For-Schleife arbeiten zum Array einlesen.

  • wenn ich das richtig sehe braucht er:

    :!: eindimensionales array mit den positionen (die er von hand füllt? ->fix)
    :!: eine schleife die das Array durchläuft (also 80 Durchläufe)
    :!: und darin eine Case-anweisung welche die 15 verschiedenen Funktionen (je nach Farbe) ausführt

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Zu Taek:
    Ja , die Koordinaten sind wie in einer Tabelle angeordnet. Absolute FIXPUNKTE, keine Variablen !. ( 8 Spalten mit 10 Zeilen, ) Wie n Sodoku Feld.
    Die Funktion Pixelclick kenn ich leider nicht. Vom Namen her glaub ich nicht, daß ich das für die Farbauslese der jeweiligen Koordinate verwenden kann. Ich brauch die Farbwerte um eine Folgeaktion zu starten.

    Ich hab die Not mit dem definieren von den Positionen(X,Y) und Farben als Arrays. Es sollte die erste Koordinate( oder nennen wir es Feld) nach dem Farbwert abgefragt werden, und danach eine meiner 15 Funktionen ( je nach Farbe ) aktiviert werden. Danach die 2te, 3te ... bis zur 80ten.

    Zu ctec:
    a:
    Die Positionen ( 80 Koordinaten ) werden von Hand befüllt , oder besser gesagt sind 80 fix definierte Konstanten (X,Y)
    b:
    Die Schleife durchläuft das ganze Array. Jede Position sollte nach der Pixelfarbe abgefragt werden und wenn sie mit einer der 15 definierten Farbwerten übereinstimmt eine Aktion ausgeführt werden. ( zum Teil nur Mouseclicks, zum Teil Funktionen, und zum Teil einfach nur weiter).
    c:
    Case-Anwiesung erscheint mir die sinnvollste Lösung.

    Einmal editiert, zuletzt von PowerMax (31. Juli 2008 um 16:29)

  • Schon klar, das du nicht jedesmal verschiedene Punkte abfragen willst, ich meinte:
    Sind die Punkte 5, 10, 15, 20 (Regelmäßigkeit +5) oder wild durcheinander 17, 11, 3, 9 ?

  • ja, die Abstände hab ich damals schön gleichmässig gesetzt. Bin nicht an meinem PC, aber die Koordinaten machen auf der X-Achse immer den gleichen Step und auf der y-Achse auch.

    X,Y

    300,150 310,150 320,150 330,150 ...
    300,180 310,180 320,180 330,180
    300,210 310,210 320,210 330,210
    ....

    Einmal editiert, zuletzt von PowerMax (31. Juli 2008 um 16:42)

  • So müsste das passen:

    Spoiler anzeigen
    [autoit]


    Dim $array[80][2], $a = 0
    For $i = 0 To 7
    For $j = 0 To 9
    $array[$a][1] = 150 + 30 * $i
    $array[$a][0] = 300 + 10 * $j
    $a+=1
    Next
    Next

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

    While 1
    For $i = 0 To 79
    $color = PixelGetColor( $array[$i][0], $array[$i][1] )
    Switch $color
    Case 0x00FFFF
    _1()
    Case 0x0C3CAE
    _2()
    ;...
    EndSwitch
    Next
    WEnd

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

    Func _1()
    EndFunc
    Func _2()
    EndFunc
    ;....

    [/autoit]

    limette =)

    Edit: lass dir lieber einmal mit _ArrayDisplay die Koordinaten anzeigen, ob das die sind, die
    du brauchst. Ich hoffe aber mal deine Angaben richtig interpretiert zu haben ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Sieht auf den ersten Blick sehr gut aus, obwohl ich s noch nicht richtig verdaut habe.
    Muß mir das nochmals in Ruhe durch den Kopf gehen lassen. ( Zuhause und nicht bei der Arbeit )
    Vor allem bei Zeile 4 und 5 verstehe ich das * $i und das * $j nicht ganz.

  • Einmal kommentiert ^^

    Spoiler anzeigen
    [autoit]


    Dim $array[80][2] ; Erstellt eine Tabelle mit 80 Zeilen und 2 Spalten, Spalte [0] für x, Spalte [1] für y.
    $a = 0 ;$a ist hier der Index der zu beschreibenden Zeile, start bei 0
    For $i = 0 To 7 ;0 bis 7 = 8 Zeilen
    For $j = 0 To 9 ; 0 bis 9 = 10 Spalten, so hattest du deine 'fiktive Tabelle' an Koordinaten erklärt.
    $array[$a][1] = 150 + 30 * $i
    $array[$a][0] = 300 + 10 * $j
    $a+=1
    Next
    Next

    [/autoit]

    Du sagtest ja selbst, wie eine Tabelle mit 8 Zeilen und 10 Spalten, so habe ich mir die
    vorgestellt.
    Also $i ist die Zeilennummer dieser 8x10 Tabelle, damit berechne ich die y-Koordinate, da die vom
    Anfang ( 150 ) immer um 30 erweitert wird. Also beim ersten Eintrag für y: 150 + 30*0 = 150

    $j ist die Spaltennummer. Ich gehe mit der 2. For-Next-Schleife für jede Zeilennummer alle 10 Spalten
    durch und addiere hier zur Ausgangs-X-Koordinate von 300 immer 10 für jedes weitere Spalte ;)

    Wenn das noch zu kompliziert ist, frag nochmal, dann kann ich das vll an ner kleinen Graphik erläutern x)

    limette =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Was soll er denn an Script posten ?
    Er hat eine Frage zu dem gestellt, was ich ihm als
    als Lösung geposted habe und das anscheinend auf funktioniert :S

    Alles klar soweit ? ;)
    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Hallo limette

    Hat klick gemacht. Habs schon in einem Testscript laufen lassen und es funktioniert !!
    Hätte mich schon früher mit Arrays auseinandersetzen sollen. Bin gespannt wie klein mein ursprüngliches Script wird. ( Grob geschätzt um 90 % kleiner, Zeilenmässig . Naja das alte war ja auch eines meiner ersten Gehversuche )

    Riesen THX an dich und an die anderen Ideenlieferanten !

    Gruß

    Powermax