https://www.youtube.com/watch?v=Lu-zGD2YXaY
오늘은 지난 시간에 배운 난수(Random variable)를 이용하여 Lotto 번호 발생기를 만들어 보겠습니다.
대략적인 내용은 다음과 같습니다.
1) CompseGUI
2) Array
•Array := [item1, item2,….] , or array :=[], array[0] :=5,…
•Array := Array(item1,item2,….)
•Array[1,2] := 3, Array := [ [4,5,6], 7,8]
3) Sort
•Sort, variable, options
4) GUI Item에서 값 읽어 오기 내보내기
•Gui, Submit, NoHide
•GuiControl, ,variable, value : value as Editboxvariable
5) String to Integer
•Editboxvariable is string value, if you want to changit to integer, just add 0.
6) Script Properties( www.autohotkey.com/docs/Variables.htm )
•%A_Index%
•%A_Space%
•%A_Tab%
------------------------------------------------------------------------
본격적으로 시작합니다.
1) Compse GUI
2) Lotto Function구성
다음으로 lotto함수를 만들려면 어떻게 해야 할까요?
1~45사이에서 6개의 다른 난수를 만들어 주면 됩니다.
난수 만드는 방법은 지난시간에 배웠죠?
기억이 안 나는 분들을 위해서 다시 말씀 드립니다.
Random, , Seed
Random, variable, min, max
우리는 아래처럼 사용했습니다.
Random, ,A_TickCount
Random,no, 1,45
그런데 중복이 되면 안 되겠죠? 그래서 중복이 되는지 검사를 해야 합니다.
일반적인 다른 언어들에서는 IndexOf() 라는 이름으로 내용중에 동일한 항목이 있는지 검사하는 method를 제공하지만
여기서는 직접 구현했습니다.
중복검사가 끝나면 해당 숫자들을 정렬해 줘야 합니다. 오름차순으로 정렬하면 됩니다.
이때는 Sort라는 기능을 사용하면 됩니다.
문법은 다음과 같습니다.
Sort, variable, options
우리는 아래와 같이 사용했습니다.
Sort, ret, N D%A_Space%
여기서 사용된 option은 숫자를 의미하는 N과 delimeter를 의미하는 D를 사용했는데
사용한 delimeter가 space이므로 ' '를 쓰고 싶지만 인식이 안 되므로 %A_Space%로 사용해야 합니다.
%를 붙이지 않으면 역시 인식이 안 됩니다.
그렇게 정렬이 다 되었으면 결과값을 반환해 주는 것으로 구성했습니다.
Lotto()의 실제는 다음과 같습니다.
Check(Hash, key)
{
For i, x in Hash
{
if( x = key )
return i ; A_index
}
return 0
}
Lotto( )
{
global cand
cnt :=1
Loop 6
{
Loop
{
Random,no, 1,45
if( 0=Check(cand,no) )
{
cand[cnt] := no
break
}
else
continue
}
cnt := cnt +1
}
ret :=""
For i, x in cand
ret = %ret% %x%
Sort, ret, N D%A_Space%
return ret
}
3) 실제로 Generate버튼의 동작은 어떻게 구성할까요?
일단 정상적으로 한 벌의 Lotto번호를 불러 오는지 시험을 해 보고 확장하는게 좋습니다.
시험삼아 ans := Lotto()를 해 보면 잘 됩니다.
해당 결과를 Editbox에 뿌리면 됩니다.
이것은 어떻게 가능할까요?
GuiControl, ,variable, value : value as Editboxvariable
우리의 경우는 GuiControl, Num1, ans 라고 하면 되겠죠?
그런데 우리는 Num1부터 Num5까지 넣고 싶습니다.
그 경우 어떻게 하면 될까요?
그렇습니다. Loop를 하나 생성해 주고
Num%A_Index%를 해주면 됩니다.
결국 다음문장처럼 사용하면 됩니다.
ans := Lotto()
GuiControl,, Num%A_Index%, %ans%
그런데 우리는 사용자가 원하는 갯수만큼만 만들려면 어떻게 할까요?
사용자가 선택한 갯수를 Count로 받아 왔으므로 Count만큼 Loop를 돌려 주면 됩니다.
그런데 사용자가 입력한 Count는 Text 즉 string값입니다.
그러면 string to integer변환을 해야 하는데....어떻게 하지?
Autohotkey에서는 약간 색다르게 아래처럼 0을 더해 주는 방법도 가능합니다.
Count += 0
그러면 string 변수였던 Count가 integer변수가 됩니다.
최종 함수는 다음과 같습니다.
ButtonGenerate:
{
global Count, Num1, Num2, Num3, Num4, Num5, cand
Gui, Submit, NoHide
Loop 5
{
GuiControl,, Num%A_Index%,
}
Count += 0
Loop %Count%
{
ans := Lotto()
GuiControl,, Num%A_Index%, %ans%
}
}
return
4) 매번 generate 버튼을 누르기 싫을 경우 Enter키를 눌렀을때 가능하도록 하기
처음에는 기능적으로만 동작하면 되지만, 실제로 많이 사용하는 사람들은 버튼 클릭하는 것을 귀찮아 합니다.
그냥 enter키를 누르면 Generate를 누른 효과를 내려면 어떻게 하면 될까요?
Enter키가 눌리면 ButtonGenerate로 jump하도록 하면 됩니다.
단 여기서 주의할 사항은 이 기능이 동작하면 다른 프로그램에서도 Enter키가 제대로 동작하지 않으므로
해당 프로그램 실행시에만 그렇게 동작하도록 한정할 필요가 있습니다.
다음처럼 autohotkeyGUI가 사용중일 경우에만 ENTER키가 동작하도록 지정하면 가능합니다.
#IfWinActive ahk_class AutoHotkeyGUI
Enter::Goto ButtonGenerate
return
#IfWinActive
5) 비상시 탈출함수 만들어 놓기
이 프로그램은 무한루프로 빠지는 경우가 없지만 항상 대비를 해 놔야 합니다.
ESC키가 눌리면 해당 프로그램이 종료되도록 설정하세요.
만약의 사태에 대비해서 준비해 놓는 사람만이 행복하게 살 수 있습니다.
ESC::ExitApp
return
실제로 실행해 보시죠.
typing하기 싦은 분들을 위해 script소스와 실행파일을 올려 드립니다.
일부 분들이 원하는 숫자를 고정으로 넣고 만들기를 원하시는 분이 계셔서 올려 드립니다.
그냥 재미로 하시고, 로또에 푹 빠지지 않도록 당부 드립니다.
사용 방법은 포함할 숫자칸에 1 10 20 등으로 입력해 주면 1 10 20을 포함해서 로또 번호를 만들어 줍니다.
'Autohotkey강좌' 카테고리의 다른 글
Autohotkey 17, 미니탭과 엑셀간 데이터(그래프) 이동 (0) | 2020.06.23 |
---|---|
Autohotkey 16. Minitab 매크로(글로벌 매크로) (0) | 2020.06.21 |
Autohotkey 14편-Random variable(난수) 생성하기 및 화면터치하는 프로그램 디버깅 (0) | 2020.05.14 |
Autohotkey 13편 - Random variable(임의값) 생성하기 및 화면터치하는 프로그램 만들기 (0) | 2020.05.13 |
Autohotkey 12편- 오토핫키 이용해서 백그라운드에서 두 프로그램간(R과 Excel)에 데이터나 그래프 이동하기 (0) | 2020.04.26 |