본문 바로가기

Autohotkey강좌

Autohotkey 15편-난수 이용하여 Lotto번호 발생기 만들기

반응형

https://www.youtube.com/watch?v=Lu-zGD2YXaY

직접매크로15_lotto_using_random_number.pdf
0.17MB

오늘은 지난 시간에 배운 난수(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소스와 실행파일을 올려 드립니다.

lotto.exe
1.06MB
Lotto.ahk
0.00MB

 

일부 분들이 원하는 숫자를 고정으로 넣고 만들기를 원하시는 분이 계셔서 올려 드립니다.

그냥 재미로 하시고, 로또에 푹 빠지지 않도록 당부 드립니다.

사용 방법은 포함할 숫자칸에 1 10 20 등으로 입력해 주면 1 10 20을 포함해서 로또 번호를 만들어 줍니다.

LottoV1.1.exe
0.44MB

반응형