오토핫키 강좌 #1 - 변수 (오토핫키 붙여넣기)




안녕하세요~ 킴영감입니다.


오토핫키 기초강좌를 마무리하고 여름 휴가를 다녀왔습니다.


원래 까만 피부였는데 돌이킬수 없을만큼 타서 돌아왔네요...ㅠ


충분히 쉬었으니 오늘부터 쪼~금 깊이있는 내용을 다뤄볼까 합니다. (초보자 분들에게만 해당됩니다...^^)


우선 게시판 이름은 "오토핫키 붙여넣기"인데요~ 이렇게 정한 이유는 원하는 부분에 붙여넣듯이 똑같이 적어서 사용할 수 있도록 강좌를 진행할 것이기 때문입니다.


기초강좌를 보시고 프로그래밍에 대해서 조금은 알겠다고 느끼신 분은 붙여넣는다는 것이 와닿을 것이라 생각합니다. (와닫지 않으신 분들은 다시 기초강좌를 보시면서 실습을 하시다보면 분명 그 순같이 올 것입니다.)


그럼 오토핫키 붙여넣기 첫번째 강좌를 시작하겠습니다.


오늘 강좌의 주제는 "변수"입니다.


"이제와서 변수를 왜?"라고 생각하시는 분도 계실 것 같습니다.


하지만!! 단순히 변수사용방법만 알려드린다면 킴영감이 아니겠죠??^^ 변수의 개념과 사용방법, 그리고 응용까지 제가 가진 노하우를 알려드릴 것입니다.



1. 변수의 의미


"변수"라는 단어는 중학교 수학시간에 처음 들었던 것으로 기억합니다. (아닐수도 있지만요...ㅋ)


변수는 문자로 표기하며 특정한 값을 가질 수 있는 것을 의미합니다.


수학공식에서 항상 쓰이는 x와 같은 개념입니다. x에는 어떠한 숫자이든지 들어갈 수 있습니다. 이 개념을 똑같이 적용해서 프로그램에서 어떠한 값이든지 넣을 수 있는 공간변수라고 합니다. 더 깊게 생각할 필요없이 "어떤 값을 저장할 수 있는 공간"이라고만 생각하시면 됩니다.


그럼 "어떤 값"은 무엇일까요?? 다들 알고 계시는 "숫자", "문자", "문자열"과 함께 "참", "거짓"을 나타내는 "true"와 "false"등이 있습니다. (이후부터는 참 거짓 값을 bool값이라고 하겠습니다.)


이처럼 값은 여러 형태가 있으며, 다른 프로그래밍 언어에서는 값의 형태에 따라 변수를 구분해서 사용합니다. 하지만!! 고맙게도 오토핫키에서는 형태의 구분없이 사용하도록 만들어 놓았습니다. (이것은 아래에서 설명드리겠습니다.)


2. 변수 사용방법


"변수"의 사용방법은 간단합니다.


우선 변수에 값을 대입하는 방법은 아래와 같습니다.


 변수이름 := 값 


변수 이름은 사용하고 싶은 이름을 공백없이 적으시면 됩니다. 영어와 한글 모두 사용 가능합니다.

":="는 대입 연산자로 기호의 오른쪽에 있는 값을 왼쪽에 있는 변수에 저장하겠다는 뜻입니다.

""을 적을 때는 값의 형태에 따라 정해진 규칙이 있습니다. 


먼저 숫자는 그냥 적으시면 됩니다. (ex. 변수1 := 1)

문자는 작은 따옴표 안에 적으셔야 합니다. (ex. 변수2 := 'a')

문자열은 큰 따옴표 한에 적으셔야 합니다. (ex. 변수3 := "킴영감")

bool값은 그냥 적으시면 됩니다. (ex. 변수4 := true(또는 false))


기본적인 사용방법을 배웠으니 여기서 한가지 응용 들어갑니다.


어떤 변수가 값을 가지고 있을 때 이 값을 다른 변수에 복사하듯이 똑같이 저장할 수 있습니다. 방법은 아래와 같습니다.


 변수 := 변수 


값이 들어갈 자리에 변수를 적어주는 것입니다. 이렇게 적으면 오른쪽에 있는 변수의 값을 왼쪽에 있는 변수에 복사하듯 저장하게 되는 것입니다.


이처럼 변수에 어떤 값을 저장할 때에는 ":="를 사용할 수 있습니다.


다음으로 기초강좌의 "if"에서 배웠던 "변수의 값을 비교하는 방법"에 대해 알려드리겠습니다.

사용 방법은 아래와 같습니다.


 변수와 값 또는 변수와 같은지 비교

 변수 = 값 (변수 = 변수)

 변수가 값 또는 변수의 값 보다 큰지 비교

 변수 > 값 (변수 > 변수)

 변수가 값 또는 변수의 값 보다 작은지 비교

 변수 < 값 (변수 < 변수)


이처럼 왼쪽과 오른쪽의 값이 같은지 비교할 때는 "="를 사용합니다. 나머지 기호는 무슨의미인지 아실테니 넘어가겠습니다.


마지막으로 Gui에서 배운 Text와 같이 숫자나 문자를 표시하는 부분에 변수를 사용하는 방법을 알려드리겠습니다.


오토핫키에서는 고유의 방법으로 변수 내부의 값을 다른 기능에 바로 사용할 수 있도록 해 놓았습니다.


사용 방법은 아래와 같습니다.


 %변수이름% 


위와 같이 변수의 이름 양 옆에 "%"기호를 넣어주시면 변수 내부의 값을 의미하게 됩니다. (비교하는 부분에서는 예외입니다.)


바로 사용하실 수 있게 예를 들어드리겠습니다.


Gui의 Text를 업데이트할 때 GuiControl을 사용합니다. (기초강좌에서는 그냥 따라서 적으셨을 것입니다. GuiControl의 사용방법은 다음에 자세하게 알려드리겠습니다.)

Text를 GuiControl을 사용해서 업데이트할 때 아래와 같이 사용했었습니다.


 Gui, Submit, nohide

 GuiControl, , Text에 할당된 변수이름, 표시하고싶은 숫자나 문자 또는 문자열


두번째 줄에 있는 "표시하고 싶은 숫자나 문자 또는 문자열"부분에 아래와 같이 바로 원하는 문자열을 적어서 표시할 수 있습니다.


 GuiControl, , Text에 할당된 변수이름, 킴영감


하지만 스크립트를 작성하다보면 프로그램을 실행해서 돌아가는 중에 계속 변하는 값을 표시하고 싶을 때가 있죠? 기초 강좌에서는 클리어횟수를 나타내는 변수가 그것이었구요^^ 이처럼 변하는 값을 Text에 표시하고 싶을 때는 변수를 이용하면 편리하며 아래와 같이 사용할 수 있습니다.


GuiControl, , Text에 할당된 변수이름, %변수이름% 



3. 변수 응용방법


이제 기본적인 사용방법을 모두 배웠으니 응용을 해봐야겠죠?


제가 이번 강좌 주제를 변수로 정한 이유는 지금부터 알려드릴 응용 방법이 제 강좌를 보시는 모든 분들께서 아주 유용하게 사용할 수 있을 것이라는 확신이 있어서 입니다. 거창하게 시작하지만 엄청 쉬운 내용이며 단지 경험 부족으로 생각을 못해서 저처럼 사용 못하시는 분들께 도움을 드리고자 하는 것입니다.


저는 스크립트를 작성할 때 특정 기능을 구현해 놓고 이 기능이 동작을 했는지 안했는지를 체크하기위해 변수를 사용합니다. 쉽게 설명하면 우리가 어떤 이미지를 찾아서 클릭을 하는 프로그램을 만들었을 경우 클릭을 했는지 안했는지 체크하는 것입니다. 이같이 동작 상태를 체크하는 변수를 사용했을 때 프로그램은 더욱더 고급지게 바뀔 수 있습니다.


기초강좌에서 1번 이미지를 클릭 했을 때 2번 이미지를 클릭하도록 스크립트를 작성했던 것 기억나시죠?? 그때 작성했던 코드는 아래와 같습니다.


오토핫키 변수


위 코드를 변수를 응용해서 바꿔보겠습니다.


우선 루프 밖에 "클릭상태 := false" 라고 적습니다. 그 다음 위 코드를 아래와 같이 수정합니다.


오토핫키 if


위에서 부터 찬찬히 살펴보면 While 밖에 "클릭상태"라는 변수를 추가하고 "false"값을 저장했습니다.


그 다음 1번 이미지를 찾고 클릭하는 부분에 "클릭상태 := true"를 넣음으로써 1번이미지가 클릭 되어야만 "클릭상태"변수에 "true"값이 저장되도록 하였으며, 이는 1번이미지가 클릭되었다는 것을 "클릭상태"변수를 통해 알 수 있게 된 것입니다.


"클릭상태"변수에 "true"값을 넣고 if의 중괄호를 빠져나가 아래로 내려가면 빨간 박스안에 있는 if를 만나게 됩니다. if의 조건으로 "클릭상태"변수 안에 있는 값이 "true"와 같을 경우를 주었고, if 중괄호 내부에 2번이미지를 찾고 클릭하는 코드가 있기때문에 결과적으로 원래의 코드와 똑같은 동작을 하게 되는 것입니다. 


마지막으로 맨 아래에 있는 "클릭상태 := false"를 추가 함으로써 다음번에 1번 이미지를 다시 클릭하기 전까지 "클릭상태"변수에 "false"가 들어가 있게 되어 1번 이미지 클릭한번당 2번이미지 클릭 한번을 하게 되는 것입니다.


위와 같이 어떤 동작을 했는지를 판단하는 용도로 변수를 사용할 수 있으며, 특정 조건을 만족할경우 다른 특정 동작을 하게 하도록 프로그램을 만드는데 활용할 수 있습니다.


이제 여러가지 조건을 만들어 가면서 실습을 해 보시면서 응용 능력을 기르시면 됩니다.



오늘은 오토핫키에서 변수를 사용하는 방법과 변수를 응용하여 프로그램을 작성하는 방법에 대해서 알려드렸습니다. 마지막 내용은 처음 강좌를 보셨을 때와 같이 와닫지 않을 수 있습니다. 하지만 그때와 마찬가지로 반복적으로 생각하고 바꿔가면서 실습하시다보면 내것이 되는 순간이 반드시 올 것이라 생각합니다.


앞으로 진행될 오토핫키 붙여넣기 강좌에서는 기본적으로 그날 주제가 되는 명령어 또는 함수들의 사용방법을 그대로 사용하시면 되게끔 알려드리는 것을 기본으로 할 것이며, 필요하다고 생각되는 부분에서 오늘처럼 응용방법까지 알려드리려고 합니다.


제 강좌를 보시는 모든분들이 얻는 것이 있도록 킴영감의 오토핫키 강좌는 꾸준히 이어나가겠습니다. 그러니 제 강좌를 보시는 모든분들이 포기하지 마시고 꾸준히 따라오시기를 바랍니다.


이것으로 오토핫키 붙여넣기 첫번째 강좌를 마치겠습니다.

블로그 이미지

킴영감

프로그래밍과 게임공략, 게임과 관련된 프로그램에 대한 내용을 다룹니다.

댓글을 달아 주세요

  • 궁금 2015.08.13 11:31  댓글주소  수정/삭제  댓글쓰기

    저어 혹시 그럼 변수안엔 이미지서칭은 넣을수없는건가요?

    • 킴영감 2015.08.13 12:09 신고  댓글주소  수정/삭제

      변수에 명령어를 넣는다는 것은 개념적으로 맞지 않는 것입니다. 변수에는 "값"만 저장할 수 있습니다. 강좌에 언급한 것 외에는 못넣는다고 생각하시면 됩니다.
      부연 설명을 드리면 이미지서칭은 명령어입니다. 명령어는 변수와 완전히 다른개념입니다. 오토핫키에서 특정 기능을 수행하도록 함수를 만들어놓고 이를 개발자들이 사용할 수 있도록 형태를 만들어 놓은 것이 명령어라고 생각하시면 됩니다.
      말씀하신 이미지서칭이 찾을 이미지를 말씀하시는 것이면 넣을 수 없습니다.^^

  • 궁금 2015.08.13 14:15  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다.
    그걸 토대로 처음보다는 많이 씸플하게 만들었는데 또 궁금한게 생겼습니다!

    화면 := 0
    Loop
    {
    화면 := 화면검색1()
    if(화면 = 1)
    ;; 이런식으로 쭉~ 7까지 존재
    }

    화면검색1()
    {
    이미지서칭 1~7 까지 존재
    }

    이렇게 만들었는데 문제는 순서대로 처리를 해서 그런가 물약을 먹어야 하는데 그 전에 화면검색으로 다른일처리를 합니다. 이럴경우엔 그냥 그 물약먹는 부분 순서를 맨위쪽으로 올려주면 해결이 될까요?

    • 킴영감 2015.08.13 14:35 신고  댓글주소  수정/삭제

      화면검색1 함수에 물약을 먹어야되는 상황을 판단하는 이미지가 들어가 있다면 그렇게 해결하실 수 있습니다. 하지만 그 상황에서 물약먹는 부분의 아래줄을 실행하고 있다면 조금의 딜레이가 생깁니다^^

      눌러야할 버튼 여러개가 한 화면에 들어간다면 이 강좌에서 설명드린 "상태를 나타내는 변수"를 활용하신다면 좀더 확실한 동작을 보장받을 수 있습니다.
      예를 들어 두개의 버튼이 한 화면에 있을 경우에 각각 버튼이 동작되는 상황을 판단하는 이미지를 찾는 것을 화면검색에 넣으시고 두개의 버튼 중 우선적으로 클릭해야 하는 곳에 상태를 나타내는 변수를 추가해서 변수가 true일 경우에 다른 것을 클릭하지 않도록 하는 것입니다.
      예시 코드를 적어드리면 싸우는 도중에 물약을 먹어야 되기때문에 물약을 먹어야되는 상태를 나타내는 이미지를 2번이미지라고 두고 2번이미지를 찾으면 상태를 true로 바꿉니다. 그럼 물약을 먹어야되는 상황이라는 것을 알기 때문에 다른 행동을 하지 않도록 아래와 같이 작성할 수 있습니다.

      ;상태를 나타내는 변수
      global 상태1 := false

      화면 := 0

      Loop
      {
      화면 := 화면검색1()
      if(화면 = 1 && 상태1 = false)
      {
      ;내용
      }
      if(화면 = 2)
      {
      ;내용
      상태1 := false
      }
      ;; 이런식으로 쭉~ 7까지 존재
      }

      화면검색1()
      {
      ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *30 %A_ScriptDir%Image%\1번 상황을 판단하는 이미지.bmp
      if (ErrorLevel = 0)
      {
      return 1
      }
      ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *30 %A_ScriptDir%Image\2번 상황을 판단하는 이미지.bmp
      if (ErrorLevel = 0)
      {
      상태1 := true
      return 2
      }

      나머지 이미지서칭 3~7 까지 존재
      }

      이처럼 상태를 나타내는 변수를 활용해 다른 버튼의 동작여부를 지정해주게되면 물약을 먹어야하는 시점에 절대 다른 동작을 하지않는다는 보장을 받을 수 있게 되는 것입니다.

  • 차차차 2015.09.07 11:02  댓글주소  수정/삭제  댓글쓰기

    만약 0~1까지 숫자가 렌덤으로 돌때

    내가 무슨 숫자가 나오면 이미지서치로 그 숫자를 알아내는방법으로
    (휴대폰이라 다적지 못하겟음 ㅠㅠ 이해하실거라믿음...)

    ims vX,vY ,1,1,a_w,a_h 0.bmp
    errolevel =0
    {
    찾앗을때 0사진이니 숫자 0을 출력하고싶습니다.
    else
    ims vX,vY ,1,1,a_w,a_h 1.bmp
    errolevel = 0
    { 1이맞다면 1을 출력함.

    .
    .
    .
    .
    ..

    9까지.

    }

    RETUNE



    이런식의 메커니즘이 맞느지를 궁금합니다. 다른 메커니즘이 더쉽거나 위 메커니즘을 하는법 부탁드립니다...

    모든걸 아시는 분이기에 이런 횡설수설도 이해하시리라 믿습니다....

    • 킴영감 2015.09.07 11:26 신고  댓글주소  수정/삭제

      0~1까지의 경우는 2가지 이기 때문에 if와 else를 사용하시면 됩니다.
      하지만 경우의 수가 많아질 경우 모든 경우를 다 확인해줘야 하며 이때는 else 없이 ImageSearch를 나열해 주는 것이 좋습니다. 이때 효율을 위해 if내부에 continue를 추가해주시면 좋습니다. continue는 루프 내부의 제일 위로 돌아가는 것을 의미합니다.

      예시코드
      Loop
      {
      ImageSearch, FoundX, FoundY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, *30 1.bmp
      if (ErrorLevel = 0)
      {
      1 출력하는 코드
      continue
      }
      ImageSearch, FoundX, FoundY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, *30 2.bmp
      if (ErrorLevel = 0)
      {
      2 출력하는 코드
      continue
      }
      ImageSearch, FoundX, FoundY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, *30 2.bmp
      if (ErrorLevel = 0)
      {
      3 출력하는 코드
      continue
      }
      }

    • 차차차 2015.09.07 21:33  댓글주소  수정/삭제

      천재적이십니다...

      숫자키는 누르고잇지못하나요???

      send, {enter down}
      으로되는거같은데.... 오토핫키 에서 쓰는 키보드 코드는 어디가야 볼수있는건가요 ㅠㅠ

    • 킴영감 2015.09.07 22:08 신고  댓글주소  수정/삭제

      과찬이십니다^^

      숫자키를 누르고 있는 동작은 오토핫키 홈페이지에 있는 내용(링크 -http://ahkscript.org/docs/commands/Send.htm)으로는 Send {원하는숫자 down}을 입력하면 된다고 나와있는데 테스트 해보니까 안되네요.ㅠ
      임시방편으로 Send, 1을 Loop에 넣으시면 될 것 같습니다.
      Loop
      {
      Send, 1
      Sleep, 100
      }
      이런식으로요^^

    • 킴영감 2015.09.07 22:08 신고  댓글주소  수정/삭제

      과찬이십니다^^

      숫자키를 누르고 있는 동작은 오토핫키 홈페이지에 있는 내용(링크 -http://ahkscript.org/docs/commands/Send.htm)으로는 Send {원하는숫자 down}을 입력하면 된다고 나와있는데 테스트 해보니까 안되네요.ㅠ
      임시방편으로 Send, 1을 Loop에 넣으시면 될 것 같습니다.
      Loop
      {
      Send, 1
      Sleep, 100
      }
      이런식으로요^^

    • 차차차 2015.09.08 02:55  댓글주소  수정/삭제

      또문제에 봉착했습니다
      알려주신 루프를이용해보려고하였으나 뜻밖에 그림1모영을 발견시 숫자 1을 출력 <<이것을 목짜겟습니다 ㅠ

      0~1렌덤으로 카드가 나오는데

      0카드면 숫자 1을 출력
      2카드면 숫자2

      이거맞는데 출력하는법을 모르겟스빔다 ㅠㅠ

      그리구 이미비서치절에서 왜 1.1 %a_w% 왜 변수로 넣엇는지도 모르겟습니다...
      사이다 한병 같은 예문 한번더 부탁드립니다

    • 킴영감 2015.09.09 14:34 신고  댓글주소  수정/삭제

      어디에 출력하실지를 말씀 안해주셨네요^^
      만약 메세지박스를 띄우고 싶으시면 이미지를 찾았을때 실행하는 부분에 "MsgBox, 1 " 이라고 작성하시면 됩니다.

      그리고 이미지 서치에 넓이와 높이를 적는 부분에 적어놓은 것은 오토핫키에 미리 정의되어 있는 명령어이며 각각 다음을 의미합니다.
      A_ScreenWidth - 화면 전체 넓이
      A_ScreenHeight - 화면 전체 높이

    • 차차차 2015.09.10 12:53  댓글주소  수정/삭제

      숫자의 형태로 나타내고 싶습니다 0이니 0 1이니 1이렁싱으로요...

      아 제가 질문한건 %a_scw%면 변수로 놓은거 아닌가 해서 뭔 가 뜻이있나 했습니다.

    • 킴영감 2015.09.10 13:20 신고  댓글주소  수정/삭제

      숫자를 표시하는 부분은 어디에 표시하고 싶으신지를 말씀해 주셔야 답변을 드릴수가 있습니다^^

    • 2015.09.10 16:11  댓글주소  수정/삭제

      비밀댓글입니다

    • 차차차 2015.09.10 16:11  댓글주소  수정/삭제

      비밀이면 저도 못보나요....헐 ....

  • 너무 궁금궁금 2018.11.09 23:11  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 킴영감님 유튜브 강의보고 막 입문한 새내기 입니다.

    다름이아니라 MOUSECLICK 을 진행하는 도중 IF문을 작성하기 전까진 영상대로 횟수가 올라가는게 보이나

    집 좌표에서 클릭을 하지 못하여 소리가 나지 않고, IF문을 작성하여 실행시에는 1회에서 더이상 올라가지 않습니다.

    꼼꼼히 살펴보았지만, 다른점을 느낄 수 없어 도움을 요청하고자 합니다. ㅠㅠ

    Gui, Add, Text, x60 y30 w50 h20 v횟수, 0 회
    Gui, Add, Edit, x48 y50 w50 h20 v제한, 0 회
    Gui, Add, Button, x20 y80 w110 h20, 시작
    Gui, Add, Button, x20 y110 w110 h20, 멈춤
    Gui, Add, Button, x20 y140 w110 h20, 종료
    Gui Show, , 매크로

    매크로상태 := false

    return

    Button시작:
    {
    CoordMode, Mouse, Screen
    Gui, Submit, nohide
    Loop, %제한%
    {
    Click 361, 566
    GuiControl, , 횟수, %A_Index% 회
    Sleep, 1000

    if(매크로상태 = false)
    {
    break
    }
    }
    }
    return

    Button멈춤:
    {
    매크로상태 := false
    }
    return

    Button종료:
    {
    ExitApp
    }
    return

    GuiClose:
    {
    ExitApp
    }
    return

    무엇이 잘못되었는가요..

  • QC 2019.03.29 02:59  댓글주소  수정/삭제  댓글쓰기

    직업상 오토핫키를 꼭 익혀야해서 공부중인데,, 가장 설명이 잘되어 있어 북마크해놓고 매일 보고 있습니다.
    그런데 하나요... 저기 위에
    "그 다음 원래 2번 이미지를 찾고 클릭하는 부분에 "클릭상태 := true"를 넣음으로써~" 여기서 2번 이미지가 아니라 1번 이미지 아닌가요? 오타인건지요? 아니면...... 제가 뭘몰라서인지 몰겠네요..