엑셀 마리오게임 본격 명령문 작성하기 :: 마리오 이동하기
1. 음악출력함수(Play/StopSound)에 인수 추가하기
기존에 만들었던 음악출력/중단함수 (PlaySound/StopSound)에 인수를 추가합니다. 함수의 내부 변수로 입력했던 FileName (음악파일주소)를 함수의 인수로 받도록 변경하여, 다른 명령문에서 PlaySound/StopSound 명령문을 엑셀함수 이용하듯 편리하게 사용할 수 있게됩니다.

'// 변경된 음악출력/중단 함수 전문 Public Sub PlaySound(FileName As String) FileName = GetShortPath(FileName) Play = mciSendString("play " & FileName, 0&, 0, 0) If Play <> 0 Then MsgBox "오디오파일을 확인할 수 없습니다. 다시 확인해주세요" End If End Sub Public Sub StopSound(FileName As String) FileName = GetShortPath(FileName) Play = mciSendString("close " & FileName, 0&, 0, 0) End Sub
2. Select Case 문 이용하기
키입력받기 모듈(KeyPressAPI 모듈)을 제대로 응용하기위해서는 Select Case문의 기초적인 동작방법을 이해해야 합니다. 우측 이미지와 같이 “A1”셀에 ‘등심’ 이라는 값이 입력되어 있다고 가정하겠습니다.

'// Select Case문 사용예제 Select Case Range("A1").Value '// = 등심 case "사과", "오렌지", "귤" msgbox "과일입니다." case "오이", "배추", "상추" msgbox "야채입니다." case "등심", "안심", "삼겹살" msgbox "고기류입니다." case else msgbox "기타 재료입니다.“ end select
Select Case 문을 통해, 첫번째로 A1셀의 값인 ‘등심’을 받아옵니다.
이후 각 Case(논리상황)을 통해
1) 사과 or 오렌지 or 귤일 경우,
⇨ “과일입니다” 안내메세지 출력
2) 오이 or 배추 or 상추일 경우,
⇨ “야채입니다” 안내메세지 출력
3) 등심 or 안심 or 삼겹살일 경우,
⇨ “고기류입니다” 안내메세지 출력
4) 위의 3가지 경우가 모두 아닐 경우,
⇨ “기타 재료입니다” 안내메세지 출력
본 예시에서 받아온 Case는 셀 A1의 값인 “등심”이므로, 3번째 Case에서 걸리게 되고 “고기류입니다.” 라는 안내메세지를 출력한 뒤 Select Case 문은 종료됩니다.
- Select Case문은 IF문보다 가독성이 뛰어납니다. 만약 처리해야 할 조건이 3개 이상이라면 Select Case문을 ‘무조건’ 사용하시길 권장합니다.
- 엑셀의 최대 행 개수인 100만개정도의 자료를 단순반복계산시, Select Case문은 IF문보다 약 3-5초정도 느리게 동작합니다. 이는 프로그래밍에서 매우 치명적인 단점이지만, 엑셀이라는 다소 한정된 범위안에서 코드를 작성할 경우 100만개의 자료를 다루는 경우는 상당히 드물며, 대부분이 사용자는 10만행 이내의 범위안에서 자료를 다루게 됩니다. 따라서 이는 처리속도에 아주 미미한 차이만 발생하므로, 여러 개의 조건 사용시 IF문보다 Select Case문 사용을 적극 권장합니다.
- Select Case문은 For문과 같이 응용하여 선택된 범위안에서 셀을 하나씩 비교하여 논리계산을 할 때 많이 사용됩니다. 이에 대한 자세한 내용은 이후 관련강의를 준비할 때 좀 더 다루도록 하겠습니다.
3. GameSheet에 KeyPressAPI 시트모듈 붙여넣기
이전강의에서 만들었던 KeyPressAPI 모듈을 GameSheet 안에 복사하여 붙여넣기 합니다. KeyPressAPI 모듈에 대한 자세한 설명은 아래 영상강의를 참고하세요.
KeyPressAPI 클래스 모듈 관련강의 바로가기
'######################################################################################################################## '# 해당 명령문에 대한 저작권은 오빠두엑셀(https://www.oppadu.com)에 있습니다. '# 모든 정보는 Cretive Commns License에 의해 저작권을 보호받습니다. '# 영리를 목적으로 하지 않는 사용 및 공유는 허용됩니다. 반드시 저작자, 오빠두엑셀(https://www.oppadu.com)을 명시해야합니다. '# This VBA Code is protected by Creative Commons License. '# All information can be posted, uploaded, shared at online for NON-commercial use only. '# The Author, '오빠두엑셀(https://www.oppadu.com)' have to be mentioned when you post this code. '######################################################################################################################## Dim WithEvents KeyPressWatcher As KeyPressAPI Sub Start_KeyPress() If KeyPressWatcher Is Nothing Then Set KeyPressWatcher = New KeyPressAPI End If KeyPressWatcher.StartKeyPress End Sub Sub End_KeyPress() If KeyPressWatcher Is Nothing Then Exit Sub KeyPressWatcher.StopKeyPress End Sub Private Sub KeyPressWatcher_KeyPressed(ByVal KeyAscii As LongPtr, ByVal KeyCode As LongPtr, ByVal Target As Range, Cancel As Boolean) '(msgMessage.wParam, iKeyCode, Selection, blnCancel) '// 여기에 키입력시 동작할 명령문을 작성하세요. End Sub
4. 이전 강의에서 만들었던 보조함수/변수 활용하여 명령문 작성하기
이전 강의에서 만들었던 보조함수와 변수를 활용하여 게임시작/종료 명령문을 작성합니다. 이전에 작성했던 함수 목록은 아래와 같습니다.
A. 키입력 이벤트 모듈 (KeyPressAPI)
키입력이벤트(KeyPressAPI) 관련 강의 바로가기
A-1. Start_KeyPress :
키입력 받기 이벤트를 활성화합니다.
A-2. End_KeyPRess :
키입력 받기 이벤트를 종료합니다.
A-3. KeyPressWatcher_KeyPressed :
입력된 키를 함수의 인수로 반환합니다.
B. 시트 초기화 모듈
시트 초기화 모듈 작성강의 바로가기
B-1. Init :
활성화된 셀 기준 시트 초기화
B-2. Sheet_Init :
전체 시트 초기화
C. 공통변수
C-1. Facing :
마리오가 바라보는 방향을 결정
C-2. PointRng :
마리오를 출력할 기준 셀
5. 게임 시작/종료 명령문 작성
A. KeyPressWatcher_KeyPressed 이벤트 명령문 작성
'// ############################################### '// KeyPressWatcher_KeyPressed 명령문 안에 넣어주세요 '// ############################################### Select Case CLng(KeyAscii) '// 만약 입력된키가 '// 1. 오른쪽 방향키 Case 39 '/39 = 오른쪽 방향키 If pointRng.Column >= 76 Then Exit Sub '// Facing = True Facing = True '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제) init pointRng '// 활성화된 셀을 오른쪽으로 한칸 이동 Set pointRng = pointRng.Offset(0, 1) '// 활성화된 셀을 기준으로 오른쪽을 바라보고 있는 마리오 그림을 출력 Mario_RW pointRng '// 2. 왼쪽방향키 Case 37 '/37 = 왼쪽 방향키 If pointRng.Column = 1 Then Exit Sub '// Facing = false Facing = False '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제) init pointRng '// 활성화된 셀을 왼쪽으로 한칸 이동 Set pointRng = pointRng.Offset(0, -1) '// 활성화된 셀을 기준으로 왼쪽을 바라보고 있는 마리오 그림을 출력 Mario_LW pointRng End Select
B. 게임시작/종료 명령문 작성
Sub Game_Start() '// 혹시모를 상황에 대비하여 게임을 실행하는 범위 외의 셀을 초기화 GameSheet.Range("CN:XFD").Delete GameSheet.Range("47:1048576").Delete '// BGM 출력 StopSound ActiveWorkbook.Path & "\MarioBGM.mp3" PlaySound ActiveWorkbook.Path & "\MarioBGM.mp3" '// 이전에 만들었던 함수 사용 -> 시트 초기화 Sheet_init '// 마리오게임을 시작하기 위한 시작셀을 지정 (PointRng) Set pointRng = GameSheet.Range("F21") '// Facing = True Facing = True '// 키입력받기 이벤트를 활성화 Start_KeyPress End Sub Sub Game_End() '// 키입력 받기를 종료 End_KeyPress '// 실행중인 마리오 게임 음악 종료 StopSound ActiveWorkbook.Path & "\MarioBGM.mp3" '// 마리오 게임 종료 음악 출력 PlaySound ActiveWorkbook.Path & "\PlayerDown.mp3" '// 메세지 박스 출력 MsgBox "게임이 종료되었습니다." End Sub