AutoHotKey 條件迴圈問題

2014-09-08 3:29 pm
我自己大概看一下網路寫了下面這一串語法
我想做一個無限迴圈
color1不是0xa7494b顏色的時候按一下1,
color2不是0x981c21顏色的時候按一下2,
color3不是0x740a15顏色的時候按一下3,

但他卻直接忽略了顏色的條件直接按按鍵
不知道是我哪裡錯了,請幫忙指點,感謝。



Loop
{
PixelGetColor, color1, 120,868
If (color1 = "0xa7494b")
{
PixelGetColor, color2, 120,904
If (color2 = "0x981c21")
{
PixelGetColor, color3, 120,940
If (color3 = "0x740a15")
{
Continue
}
else
{
Send {3}
sleep 500
}
}
else
{
Send {2}
sleep 500
}
}
else
{
Send {1}
sleep 500
}
}
更新1:

我覺得我表達得很清楚,你問的問題挺奇怪的..... 假設不是顏色A的時便按一下1,不是顏色B按一下2,不是顏色C按一下3。 那麼如果是顏色D(即不是A或B或C),你要的是? 都不是就重新執行迴圈 因為" 點 "是固定的所以顏色D就即不是ABC,那如果不是當然是執行點ABC該按的按鍵 我想設定的是一個階層迴圈 點1不是這顏色時按1(最後) <點2不是這個顏色的時候按2(次要)< 點3不是這個顏色的時候按3(優先) 我當然知道寫程式需要邏輯,重點是我不太清楚這個語法該如何寫 因網上教學都是簡單的 沒有這麼深,且若不討論階層

更新2:

Loop { PixelGetColor, color1, 120,868 If color1 = 0xa7494b Send {1} } 就光寫這樣好了,我嘗試過任何寫法,他就是直接無視顏色條件而去按按鍵"1", 所以我的重點在於PixelGetColor這個語法要如何搭配條件迴圈,麻煩了。

更新3:

Loop { PixelGetColor, color1, 120,868 If color1 != 0xa7494b Send {1} } 然後想請問If color1 != 0xa7494b 這個!的功能是 (?

更新4:

回:本周之星 沒錯,但不知為何執行的時候你的11行是錯誤的

更新5:

且我只是貼上來網路沒有編排 你給我的只是排過的.....一模一樣阿!哪招

回答 (2)

2014-09-09 1:44 am
✔ 最佳答案
先不理上面的程式,在你要求的設計下本身都有邏輯上的問題要解決。
如果未能攪清楚,是沒有辦法寫好這個程式的。

邏輯上的問題是:
假設不是顏色A的時便按一下1,不是顏色B按一下2,不是顏色C按一下3。
那麼如果是顏色D(即不是A或B或C),你要的是?
a) 只按一下1
b) 只按一下2
c) 只按一下3
d) 123都按一下

如果是顏色B(即不是A或C),你要的是?
a) 只按一下1
b) 只按一下3
c) 1和3都按一下

上述的程式在if中一旦不是顏色A就走到else send{1}。
這是電腦語言的if...else...的意思,一旦 if 的條件不符,它絕對不會再看 if 內裏的 if 條件了。
這就是上面提及要攪清楚的邏輯。
如果你要做的是123都按的情況,你應該將上面的程式直接用3個分開的if,而不是nested if。
如果你要做的是只按某一個按一下,就要好好組合if...elseif...elseif...else...的次序。

2014-09-17 14:51:42 補充:
你的描述跟你寫在程式是不同的表達。
描述就如你所說,可以是全部執行點ABC該按的按鍵(我的結果d - 123都按一下),但看不到你要求的優先次序(你要的是321)。
「我想設定的是一個階層迴圈 點1不是這顏色時按1(最後) <點2不是這個顏色的時候按2(次要)<點3不是這個顏色的時候按3(優先)」
程式寫的是只按1次,沒有見到123/321的意思,這就是大家一直未能回答你的主因。

說回正題:
Loop
{ PixelGetColor, color1, 120,868
If color1 = 0xa7494b
Send {1}
}
按這個寫法,理應正確。不過有兩點可留意:

2014-09-17 15:00:52 補充:
1) PixelGetColor所參照的點(120,868)一定要在畫面見到,而且這function有機會因為某些應用程式的問題而令到該程式畫面的點的顏色索取唔到。你可以先加個MsgBox The color at the current cursor position is %color1%.睇睇個PixelGetColor得到的顏色係咪正確。

2) 假如正確,if statement係另一個位要debug。AutoHotKey if statement同if (expression) statement原來有分別的。if color1 = 0xa7494b有機會唔識認0xa7494b,可

2014-09-17 15:05:20 補充:
用if color1 = "0xa7494b"或先將顏色碼放落variable(即 targetcolor := 0xa7494b)然後再比對[用if (%color1% = %targetcolor%)]

然後想請問If color1 != 0xa7494b 這個!的功能是 <== ! 是NOT,所以!=是<>,兩個是一樣的。
參考: 我本人
2014-09-09 7:44 am
我不知你的邏輯,現改寫你的IF CASES,注意,如果IF COLOR1 = FALSE,以下COLOR2,COLOR3都不會CHECK,直到最底的SEND1,這是你要的邏輯嗎﹖

Loop {
PixelGetColor, color1, 120,868
If (color1 = "0xa7494b") {
PixelGetColor, color2, 120,904
If (color2 = "0x981c21") {
PixelGetColor, color3, 120,940
If (color3 = "0x740a15") {
Continue }
else {
Send {3}
sleep 500 }
}
else {
Send {2}
sleep 500 }
}
else {
Send {1}
sleep 500 }
}


收錄日期: 2021-04-29 22:49:57
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20140908000051KK00013

檢視 Wayback Machine 備份