Variable sortieren

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Variable sortieren

22 Feb 2019, 23:39

Hallo

Ist es möglich fast Identische Werte einer Variable zu entfernen ?

Diese Koordinaten stehen in der Variable:

1244,238
1244,239
1244,240
268,342
268,343
268,344
348,526
348,527
348,528
444,478
444,479
444,480


Es sind ja fast die gleichen Positionen, davon sollten jetzt 2 Zeilen gelöscht werden

Die Koordinaten sind natürlich immer andere, aber variieren um +- 2 Pixel
hd0202
Posts: 163
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: Variable sortieren

23 Feb 2019, 00:09

hier mein vorschlag:

Code: Select all

alt =
(
1244,238
1244,239
1244,240
268,342
268,343
268,344
348,526
348,527
348,528
444,478
444,479
444,480
)
vor1 =
vor2 =
loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n"
	vor1 := lfd1
	vor2 := lfd2
}
msgbox, % neu
Hubert
just me
Posts: 7224
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variable sortieren

23 Feb 2019, 04:51

Moin,

es wäre schon gut, wenn Du das etwas genauer beschreiben würdest. Deine Beispielwerte folgen immer demselben Schema:
  • Aufbau: lll,rrr ; (lll = links vom Komma),(rrr = rechts vom Komma)
  • drei identische lll folgen aufeinander
  • die rrr Teile dieser lll differieren um genau +1
Dein Text ist nicht so eindeutig. Ist das wirklich immer genau so?
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

23 Feb 2019, 10:08

Hallo

Nein das sind immer andere Werte, sie kommen von der Bildersuche mit GDip.

Es gibt bei einem Spiel Tannenbäume die man anklicken kann und jeder Spieler hat unterschiedlich viele Bäume stehen und sie stehen nie an der selben
Stelle.

Das funktioniert soweit ja auch alles gut, es kommt bloß mal vor, das er 1 Baum übersieht und wenn ich die Toleranz höher stelle, kommen eben die fast doppelten Koordinaten raus.
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

23 Feb 2019, 12:33

Vielen Dank, klappt leider nicht so wie ich dachte
Hier mal mein Script, wie bekomme ich es hin, das ich die Variable "OutputList" da sortieren kann ?

Code: Select all

#SingleInstance, Force
#NoEnv
SetBatchLines, -1
ListLines Off
Sleep, 100
#Include, D:\Tools\AutoHotkey 1.1\Gdip_All.ahk
#Include D:\Tools\AutoHotkey 1.1\Compiler\ToolTipOpt.ahk
#Include D:\Tools\AutoHotkey 1.1\Gdip_ImageSearch.ahk


ToolTipFont("s16", "arialbd")
WinActivate,ahk_exe chrome.exe
Sleep, 100
ToolTip, Wenn Du bereit bist dann drücke die linke "Strg" Taste, 95, 80, 3
KeyWait, LControl, D
ToolTip, , , , 3
pToken := Gdip_Startup()
winName := "ahk_exe chrome.exe"
clientW := 1920 ; set your client area width
clientH := 1080 ; set your client area height
WinGetPos, x, y, w, h, %winName%
winBorder := (w-clientW)/2
x := x+winBorder
y := y+(h-clientH-winBorder)
snap := Gdip_BitmapFromScreen(x "|" y "|" clientW "|" clientH)
Gdip_SaveBitmapToFile(snap, "Bilder/ScreenShot.bmp")
Sleep, 250
Gdip_DisposeImage(snap)
bmpHaystack := Gdip_CreateBitmapFromFile("Bilder/ScreenShot.bmp")
Sleep, 250
bmpNeedle := Gdip_CreateBitmapFromFile("Bilder/TannenBaum-gross.png")
Sleep, 50
bmpNeedle1 := Gdip_CreateBitmapFromFile("Bilder/TannenBaum-mittel.png")
Sleep, 50
bmpNeedle2 := Gdip_CreateBitmapFromFile("Bilder/TannenBaum-klein.png")
Sleep, 50
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,OutputList,0,0,0,0,21,"",1,0)
Sleep, 100
RET1 := Gdip_ImageSearch(bmpHaystack,bmpNeedle1,OutputList1,0,0,0,0,12,"",1,0)
Sleep, 100
RET2 := Gdip_ImageSearch(bmpHaystack,bmpNeedle2,OutputList2,0,0,0,0,12,"",1,0)
Sleep, 100
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)

gross := 0
mittel := 0
klein := 0

;---------------OutputList-----------
alt = %OutputList% ;Das klappt leider nicht
vor1 =
vor2 =
loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n"
	vor1 := lfd1
	vor2 := lfd2
    }
FileDelete, neu.txt
Sort, neu, U P
Sleep, 100
FileAppend,%neu%, OutputList.txt
;msgbox, % neu

;-------------OutputList ende----------------

;FileDelete, OutputList.txt
;Sort, OutputList, U P
;Sleep, 100
;FileAppend,%OutputList%, OutputList.txt
;FileAppend,%OutputList1%, OutputList1.txt
;FileAppend,%OutputList2%, OutputList2.txt

;---------Großer Tannenbaum-------------
ToolTip, %ret% große Tannenbäume gefunden, 100, 900, 12
ToolTip, %ret1% mittlere Tannenbäume gefunden, 100, 930, 13
ToolTip, %ret2% kleine Tannenbäume gefunden, 100, 960, 14
ZeilenArray := StrSplit(neu, "`n", "`r")
;ZeilenArray := StrSplit(OutputList, "`n", "`r")
For ZeilenNummer, ZeilenInhalt In ZeilenArray {
	xy:= StrSplit(ZeilenInhalt, ",")
SeitenAngabeX := xy[1]
SeitenAngabeY := xy[2]
	MouseMove, %SeitenAngabeX%, %SeitenAngabeY%, 0
   Sleep, 100
   SendEvent, {Click, Rel 5, 15, 0}
   Click, Left, 1
   Sleep, 1500
   MouseMove, 800, 690, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1000
   MouseMove, 1266, 932, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 100
   gross += 1
ToolTip, %gross%, 460, 900, 15   
   }
;---------Großer Tannenbaum ende-------------

;---------Mittlerer Tannenbaum-------------
ZeilenArray := StrSplit(OutputList1, "`n", "`r")
For ZeilenNummer, ZeilenInhalt In ZeilenArray {
	xy:= StrSplit(ZeilenInhalt, ",")
SeitenAngabeX := xy[1]
SeitenAngabeY := xy[2]
	MouseMove, %SeitenAngabeX%, %SeitenAngabeY%, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1500
   MouseMove, 800, 690, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1000
   MouseMove, 1266, 932, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 100
   mittel += 1
ToolTip, %mittel%, 460, 930, 16
   }
;---------Mittlerer Tannenbaum Ende-------------

;---------Kleiner Tannenbaum-------------
ZeilenArray := StrSplit(OutputList2, "`n", "`r")
For ZeilenNummer, ZeilenInhalt In ZeilenArray {
	xy:= StrSplit(ZeilenInhalt, ",")
SeitenAngabeX := xy[1]
SeitenAngabeY := xy[2]
	MouseMove, %SeitenAngabeX%, %SeitenAngabeY%, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1500
   MouseMove, 800, 690, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1000
   MouseMove, 1266, 932, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 100
   klein += 1
ToolTip, %klein%, 460, 960, 17
   }
;---------Kleiner Tannenbaum Ende-------------
EXIT_LABEL4: ; be really sure the script will shutdown GDIP
Gdip_Shutdown(gdipToken)
ToolTip, Keine Weihnachtsbäume mehr vorhanden, 750, 520, 6
Sleep, 1000
ToolTip,,,,6
ToolTip,,,,12
ToolTip,,,,13
ToolTip,,,,14
ToolTip,,,,15
ToolTip,,,,16
ToolTip,,,,17
Gdip_ShutDown(pToken)
Sleep, 100
ExitApp
return
F8::
ExitApp
return
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

24 Feb 2019, 00:29

Hallo Just Me

Aufbau: lll,rrr ; (lll = links vom Komma),(rrr = rechts vom Komma)
drei identische lll folgen aufeinander
die rrr Teile dieser lll differieren um genau +1

Ja das ist wirklich immer so

lll = links vom Komma
rrr = rechts vom Komma

Hier mal 1 Bild, wie die Weihnachtsbäume stehen, wie gesagt, immer anders je nachdem wo der User die hinstellt.
Baum.jpg
Baum.jpg (280.94 KiB) Viewed 2446 times
just me
Posts: 7224
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variable sortieren

24 Feb 2019, 05:48

nacken012 wrote:
23 Feb 2019, 12:33
Vielen Dank, klappt leider nicht so wie ich dachte ...

Code: Select all

...
;---------------OutputList-----------
alt = %OutputList% ;Das klappt leider nicht
vor1 =
vor2 =
...
Was klappt leider nicht?
hd0202
Posts: 163
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: Variable sortieren

24 Feb 2019, 23:52

Suchst Du Gedankenleser, dann bist Du hier im falschen Forum :lol:

Übrigens, meine Glaskugel fragt: Hast Du auch an OutputList1 und OutputList2 gedacht ?
Sind die Listen wirklich schon wie angegeben, oder warum sortierst Du sie anschließend ?

Hubert
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

25 Feb 2019, 09:07

Hallo, sorry, bin immer am am grübel.

Ja an OutputList1 und 2 habe ich natürlich auch gedacht.

Code: Select all

alt = 
(
%OutputList%
)
vor1 =
vor2 =
loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n"
	vor1 := lfd1
	vor2 := lfd2
    }
    
ZeilenArray := StrSplit(neu, "`n", "`r")
For ZeilenNummer, ZeilenInhalt In ZeilenArray {
	xy:= StrSplit(ZeilenInhalt, ",")
SeitenAngabeX := xy[1]
SeitenAngabeY := xy[2]
	MouseMove, %SeitenAngabeX%, %SeitenAngabeY%, 0
   Sleep, 100
   SendEvent, {Click, Rel 5, 15, 0}
   Click, Left, 1
   Sleep, 1500
   MouseMove, 800, 690, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1000
   MouseMove, 1266, 932, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 100
   mittel += 1
ToolTip, %mittel%, 460, 930, 15   
Sleep, 1000
   }
Dachte, ja jetzt klappt es, aber leider nicht ganz und es hat lange gedauert bis ich gesehen habe wieso.

Sagen wir er hatte 3 Koordinaten Reihen, hat die Bäume auch schon angeklickt und danach einfach irgendwo im Bild.

Gesehen habe ich es erst, als ich die Liste im Editor geöffnet habe,

Hier wird in der letzter Zeile eine Freizeile erstellt, also ohne Koordinaten, deswegen auch der Klick irgendwo im Bild zum Schluß

Code: Select all

alt = 
(
%OutputList%
)
vor1 =
vor2 =
loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n"
	vor1 := lfd1
	vor2 := lfd2
    }
   
just me
Posts: 7224
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variable sortieren

26 Feb 2019, 02:43

Moin,

hast Du das erkannte Problem nun selbst gelöst?
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

26 Feb 2019, 09:07

Noch nicht, arbeite ich aber weiter dran wenn ich mehr zeit habe.

Vielen Dank für die Hilfe von Euch
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

27 Feb 2019, 02:22

Da bin ich wieder, jetzt habe ich nur mal das obere Script genommen, was ja soweit auch funktioniert.

Code: Select all

alt =
(
1244,238
1244,239
1244,240
268,342
268,343
268,344
348,526
348,527
348,528
444,478
444,479
444,480
)
vor1 =
vor2 =
loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n"
	vor1 := lfd1
	vor2 := lfd2
}
fileappend,%neu%,test55.txt
msgbox,%neu%
return
Das Problem ist aber, das eine Leerzeile an letzter Stelle erzeugt wird, wie ich einfach nicht weg bekomme, siehe Bild.
Leerzeile.jpg
Leerzeile.jpg (16.22 KiB) Viewed 2295 times
just me
Posts: 7224
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variable sortieren

27 Feb 2019, 02:50

Moin,

diese letzte leere Zeile entsteht hier

Code: Select all

loop, parse, alt, `n
{
	stringsplit, lfd, a_loopfield, `,
	if (lfd1 <> vor1) or (lfd2 <> vor2 + 1)
		neu .= a_loopfield "`n" ; <<<<<
	vor1 := lfd1
	vor2 := lfd2
}
weil jeder Eintrag in neu mit einem Zeilenvorschub `n abgeschlossen wird.

Gängige Lösungen nach Ende der Schleife:

Code: Select all

neu := RTrim(neu, "`n")
; oder
neu := SubStr(neu, 1, -1)
Damit wird der letzte Zeilenvorschub wieder entfernt.
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Variable sortieren

27 Feb 2019, 04:44

Vielen lieben Dank, das funktioniert perfekt :-)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 4 guests