본문 바로가기
AutoHotKey

프리셀 게임 보조프로그램

by 닝구르 2014. 9. 20.

 

 

 

freecell2.exe

 

freesell_100416.ahk

 

 

 

 

약간수정된 소스와 파일 같이올립니다


#SingleInstance force
menu, tray, nostandard
menu, tray, add, 게임번호설정
menu, tray, add, 설정
menu, tray, add
menu, tray, add, 기록
menu, tray, add
menu, tray, add, HELP
menu, tray, add
menu, tray, add, 종료

help=
(

이 프로그램은 한글 윈도우XP 의 프리셀 게임을 보다 효과적으로 사용하기 위한 보조프로그램입니다.

기존의 프리셀 게임은 게임선택시 랜덤방식으로 게임번호가 무작위로 선택되어지고 있습니다.

이 프로그램은 랜덤방식의 게임을 사용자가 게임시작번호를 설정하여 게임번호를 선택하면,

그 번호부터 게임을 시작하여 게임이 끝나면 다음번호의 게임을 자동으로 시작하도록 설정되었습니다.

또한 게임의 최단기록을 측정할 수 있으며, 마지막 게임이 언제 실행되었는지를 확인이 가능합니다.

-----------------------------------------------------------------------------------------------

만든이 : ( 대간지기 )  블로그 : http://blog.daum.net/melsec_setup

버전 : 2010년 04월 25일 0.420

)

mainstart:
ifnotexist, %A_WINDIR%SYSTEM32freecell.exe  ;; 프리셀 영문파일이름 게임이 윈도우폴더에 있는지를 확인한다
 {
   msgbox, 프리셀 게임을 윈도우 폴더에서 찾을수 없습니다.`n`n게임이 더이상 진행되지 않습니다.
   exitapp
 }
IFnotexist, %A_WINDIR%SYSTEM32freecell.ini   ;; ini 파일이 있는지를 검사한다.
 {
   msgbox, 프리셀 게임의 시작번호 설정파일이 없습니다.`n`n게임 시작번호를 설정합니다.
   goto, 게임번호설정
 }
iniread, checkbar, %A_WINDIR%SYSTEM32freecell.INI, 시작선택설정, yesorno
if checkbar=
  iniwrite, no, %A_WINDIR%SYSTEM32freecell.INI, 시작선택설정, yesorno
iniread, outputbar3, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
  goto,check_1      ;;  ini파일을 검사후 정상이면 게임실행한다.

;;;=======================실제 게임화면을 open하여 번호를 설정하고 게임을 하는곳이다. ========================
gamestart:
  {
    Run, %A_WINDIR%SYSTEM32freecell.exe
  }
SetTitleMatchMode, slow
winwaitactive, 프리셀    ;;;; 프리셀 게임이 실행되기를 기다린다.
  {
    WinMaximize   ;;; 게임창을 최대화로 한다
  }
iniread, checkbar, %A_WINDIR%SYSTEM32freecell.INI, 시작선택설정, yesorno
if checkbar=no
  goto,open
else
  goto,gameloop
open:
send, !{g}  ;;; 게임을 연다.alt키와 키보드 g를 누른것과 같다
send, ^{s}  ;;; 게임을 선택하는 창을 나타낸다.콘트롤키와 키보드s를 누른것과 같다.

restart:
iniread, outputbar, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO  ;;;; INI파일의 실행완료번호를 outputbar 으로 읽어들인다
winwait, 게임 번호, 게임 번호를 선택하십시
IfWinNotActive, 게임 번호, 게임 번호를 선택하십시, WinActivate, 게임 번호, 게임 번호를 선택하십시
WinWaitActive, 게임 번호, 게임 번호를 선택하십시
mousemove, 84, 86
sleep,50
send, %outputbar%
sleep,50
send, {enter}
;;;;;;;  이곳까지는 게임을 실행하고 있는 부분이다.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;========================== 게임이 실행되고 있는동안 작은 윈도우 창이 어떤것이 열리는지 계속적으로 감시한다.=========
gameloop:
checktime:=a_tickcount ;; 게임시간을 측정한다
LOOP
{
SetTitleMatchMode, slow
IFWINEXIST, 게임 끝, 게임에 이겼습니   ;;;; 게임에 이겼을때 열리는 창
  {
    winwait, 게임 끝, 게임에 이겼습니
    ifwinnotactive, 게임 끝, 게임에 이겼습니, winactivate, 게임 끝, 게임에 이겼습니
    winwaitactive, 게임 끝, 게임에 이겼습니
      {
        if outputbar=1000000  ;;  게임번호가 프리셀 마지막게임번호까지 완료하면 처음 1번으로 설정한다
          {
            outputbar=0
          }
        outputbar1:=(outputbar+1)
        iniwrite, %outputbar1%, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO  ;; 현재 게임완료된번호에 +1을 더하여 다음게임번호를 선택한다
        iniwrite, %outputbar%, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, ENDNO  ;; 현재 게임완료된 번호를 저장한다
        FormatTime, timerecord,r  ;;  현재 게임완료된 번호의 마지막 시간을 ini파일에 저장한다.
        iniwrite, %timerecord%, %A_WINDIR%SYSTEM32freecell.INI, LASTTIME, Timer

        sec:=floor((a_tickcount-checktime)/100)
        sec1:=floor(sec/10)
        msec:=mod(sec,10)
        if sec1>60
          {
            min:=floor(sec1/60)
            min1:=mod(sec1,60)
          }
        wintime=%min%분%min1%초%msec%
        iniread, oldsec, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, oldtime  ;; 이전게임의 최고기록 시간을 읽어들인다
        if oldsec=
          {
            iniwrite, %sec%, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, oldtime ;; 최고기록 시간이 없으면 시간을저장한다.
          }
        iniwrite, %wintime%, %A_WINDIR%SYSTEM32freecell.INI, LASTTIME, record  ;;실행게임의 기록시간을 저장한다.
        if (sec<oldsec)
          {
            iniwrite, %outputbar%, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, bestno
            iniwrite, %timerecord%, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, timer
            iniwrite, %wintime%, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, record
            iniwrite, %sec%, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, oldtime
          }
      }
    sleep, 1000
    GOTO, gamewin
  }
SetTitleMatchMode, slow
IFWINEXIST, 프리셀, 이 게임을 그만 두   ;;; 게임을 실행도중 그만두려고 할때 열리는 창.
  {
    sleep, 1000
    GOTO, GAMEEND2
  }
SetTitleMatchMode, slow
IFWINEXIST, 게임 끝, 게임에 졌습니다. 더 이상   ;;; 게임에 졌을때 열리는 창
  {
    sleep, 1000
    GOTO, GAMEEND2
  }
SetTitleMatchMode, slow
  wingettitle, titlebar, 프리셀 게임
  ifwinnotexist, %titlebar%
    {
      sleep,500
      goto,종료
    }
}
;;;;;;;;=====================  이곳까지가 게임이 실행되는 동안의 loop 문으로 게임 계속실행되는지 확인한다 ========


gamewin:
LOOP
{
  wingettitle, titlebar, 프리셀 게임
  ifwinnotexist, %titlebar%
    {
      goto,종료
    }
  SetTitleMatchMode, slow
  ifwinexist, 게임 번호, 게임 번호를 선택하십시
    {
      goto,restart
    }

}
GAMEEND2:
loop
  {
        SetTitleMatchMode, slow
        wingettitle, titlebar, 프리셀 게임
        ifwinexist, %titlebar%
          {
            sleep,1000
            goto,gameloop
          }
  }

;;======================================================
게임번호설정:
IFnotexist, %A_WINDIR%SYSTEM32freecell.ini   ;; ini 파일이 있는지를 검사한다.
 {
   fileappend,  [게임번호선택]`nNO=`n[실행완료번호]`nSTNO=`nENDNO=`n[LASTTIME]`ntimer=`nrecord=`n[시작선택설정]`nyesorno=`n[최고기록]`nbestno=`ntimer=`nrecord=`noldtime=, %A_WINDIR%SYSTEM32freecell.INI
 }
inputini:
inputbox, inputbar, 게임번호, 게임시작번호를 입력하세요.`n기본설정은 (1)이 시작입니다.`n`n             ( 1 - 1000000 ),,215,170,,,,, %outputbar3%
if ErrorLevel=0        ;; 입력값이 있다
  {
    iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
    iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
  }
if ErrorLevel=1        ;; 입력값이 없거나 cancel버튼이 눌렸거나 gui화면을 종료하였을때 기본적으로 값을 1을 쓴다.
  {
    iniread, outputbar3, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
    if outputbar3=
      {
        iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
        iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
      }
  }
check_1:               ;;  입력값이 정상적인 숫자가 입력되었는지 검사한다.
iniread, outputbar3, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
if outputbar3 is not integer   ;;  숫자가 아닐경우에 입력값을 설정하는 화면을 다시 나타낸다.
  {
    inputbox, inputbar, 게임번호, 게임시작번호를 입력하세요.`n기본설정은 (1)이 시작입니다.`n`n             ( 1 - 1000000 ),,215,170,,,,, %outputbar3%
    if ErrorLevel=0
      {
        iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
        iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
      }
    if ErrorLevel=1
      {
        iniread, outputbar3, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
        if outputbar3=
          {
            iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
            iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
          }
      }
    goto, check_1
  }
else           ;;  숫자값이 입력되었을때 게임번호내에 있는 번호인지를 확인한다.
  {
    If outputbar3<=1000000           ;;  프리셀 게임번호내에 정상적으로 있을때 게임실행
      {
        SetTitleMatchMode, slow     ;;  현재 게임창이 열려있지 않으면 게임을 실행하고 열려있으면 리턴한다.
        wingettitle, titlebar, 프리셀 게임
        ifwinnotexist, %titlebar%
          {
            sleep,500
            goto,gamestart              ;; 이곳에서 게임실행항목으로 이동한다.
          }
        else
          return
      }
    else       ;;  입력값이 높거나 다른값이 입력되었을때 검사행으로 다시이동
      goto, check_2
  }

check_2:
inputbox, inputbar, 게임번호, 게임시작번호를 입력하세요.`n기본설정은 (1)이 시작입니다.`n`n             ( 1 - 1000000 ),,215,170,,,,, %outputbar3%
    if ErrorLevel=0
      {
        iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
        iniwrite, %inputbar%, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
      }
    if ErrorLevel=1
      {
        iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, STNO
        iniwrite, 1, %A_WINDIR%SYSTEM32freecell.INI, 게임번호선택, NO
        return
      }
    goto, check_1
return
;;======================================================================

설정:

;;  gui화면을 설정한다
; Generated using SmartGUI Creator 4.0
Gui, Show, x131 y91 h231 w241, 설정
Gui, Add, GroupBox, x6 y10 w225 h110 , 바로가기 설정

Gui, Add, CheckBox, x26 y30 w170 h20 vmycheck1, 시작메뉴에 바로가기 만들기
Gui, Add, CheckBox, x26 y60 w180 h20 vmycheck2, 바탕화면에 바로가기 만들기
Gui, Add, CheckBox, x26 y90 w180 h20 vmycheck3, 빠른실행에 바로가기 만들기

Gui, Add, GroupBox, x6 y130 w225 h50 , 시작번호설정
if checkbar=no
  {
    Gui, Add, CheckBox, x16 y150 w200 h20 vmycheck4, 다음부터 자동으로 시작하지 않기
  }
else
  {
    Gui, Add, CheckBox, x16 y150 w200 h20 vmycheck5, 다음부터 자동으로 시작하기
  }
Gui, Add, Button, x16 y190 w50 h25 , 적 용
Gui, Add, Button, x95 y190 w50 h25 , 취 소
Gui, Add, Button, x175 y190 w50 h25 , 확 인
Return

button적용:
Gui, Submit, NoHide
{
    if mycheck1=1
      {
        ifnotexist, %A_ProgramsCommon%게임
          {
            FileCreateDir, %A_ProgramsCommon%게임
            FileCreateShortcut, %A_WorkingDir%freecell2.exe, %A_ProgramsCommon%게임프리셀.lnk, %A_WINDIR%system32,,프리셀 게임을 시작합니다.
          }
        else
          FileCreateShortcut, %A_WorkingDir%freecell2.exe, %A_ProgramsCommon%게임프리셀.lnk, %A_WINDIR%system32,,프리셀 게임을 시작합니다.
      }
    if mycheck2=1
      {
        FileCreateShortcut, %A_WorkingDir%freecell2.exe, %A_Desktop%프리셀.lnk, %A_WINDIR%system32,,프리셀 게임을 시작합니다.
      }
    if mycheck3=1
      {
        FileCreateShortcut, %A_WorkingDir%freecell2.exe, C:Documents and SettingsAdministratorApplication DataMicrosoftInternet ExplorerQuick Launch프리셀.lnk, %A_WINDIR%system32,,프리셀 게임을 시작합니다.
      }
    if mycheck4=1
      {
        iniwrite, yes, %A_WINDIR%SYSTEM32freecell.INI, 시작선택설정, yesorno
      }
    if mycheck5=1
      {
        iniwrite, no, %A_WINDIR%SYSTEM32freecell.INI, 시작선택설정, yesorno
      }
    return
}

BUTTON취소:     ;; 취소버튼을 누를경우 gui화면을 닫는다.
 gui,destroy
BUTTON확인:     ;; 닫기버튼을 누를경우 gui화면을 닫는다.
 gui,destroy
return 

기록:
iniread, outputbar2, %A_WINDIR%SYSTEM32freecell.INI, 실행완료번호, ENDNO
iniread, outputbar4, %A_WINDIR%SYSTEM32freecell.INI, LASTTIME, Timer
iniread, outputbar6, %A_WINDIR%SYSTEM32freecell.INI, LASTTIME, record
iniread, outputbar7, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, bestno
iniread, outputbar8, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, timer
iniread, outputbar9, %A_WINDIR%SYSTEM32freecell.INI, 최고기록, record

; Generated using SmartGUI Creator 4.0
Gui, show, x131 y91 h333 w285, 기록

Gui, Add, GroupBox, cBlue x6 y10 w270 h95 , 최고기록
Gui, Add, Text, x20 y30 w60 h20 , 게임번호 :
Gui, Add, Text, x80 y30 w194 h20 , ( %outputbar7% ) 번
Gui, Add, Text, x20 y55 w60 h20 , 날 짜 :
Gui, Add, Text, x80 y55 w194 h20 , %outputbar8%
Gui, Add, Text, x20 y80 w60 h20 , 게임시간 :
Gui, Add, Text, x80 y80 w194 h20 , %outputbar9%

Gui, Add, GroupBox, cBlue x6 y110 w270 h65 , 처음게임
Gui, Add, Text, x20 y130 w60 h20 , 게임번호 :
Gui, Add, Text, x80 y130 w194 h20 , ( %outputbar3% ) 번
Gui, Add, Text, x20 y155 w60 h20 , 날 짜 :
;; Gui, Add, edit, readonly cBlue x80 y155 w194 h20 , %outputbar3%
Gui, Add, Text, x80 y155 w194 h20 , %outputbar5%

Gui, Add, GroupBox, cBlue x6 y185 w270 h95 , 이전게임
Gui, Add, Text, x20 y205 w60 h20 , 게임번호 :
Gui, Add, Text, x80 y205 w194 h20 , ( %outputbar2% ) 번
Gui, Add, Text, x20 y230 w60 h20 , 날 짜 :
Gui, Add, Text, x80 y230 w194 h20 , %outputbar4%
Gui, Add, Text, x20 y255 w60 h20 , 게임시간 :
Gui, Add, Text, x80 y255 w194 h20 , %outputbar6%
Gui, Add, Button, x96 y290 w100 h30 gmybt, 확 인
return

mybt:     ;; 닫기버튼을 누를경우 gui화면을 닫는다.
 gui,destroy

GuiClose:
 gui,destroy

return

HELP:
MSGBOX,,HELP, %HELP%
RETURN

종료:
exitapp