이전 강의까지해서 미로 만드는 법을 마쳤습니다.

 

이젠 우리가 키보드를 이용해 직접 미로를 풀어봅시다.

 

그 전에 이전 강의까지의 코드입니다.

 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '시간지연 코드

Sub MakeMaze()

	''' 생략 '''
    
	'반복문 추가
	Do Until completeMakeMaze(maze, map_size)
		Do Until maze(row-1, col) And maze(row+1, col) And maze(row, col-1) And maze(row, col+1)
			
			''' 생략 '''
            
		Loop
        
		'미로와 맞닿은 셀을 찾는 반복문
		found = False
		For i=2 To map_size+1
			For j=2 To map_size+1
				If maze(i,j) = False Then
					If maze(i+1,j) = True And Cells(3+i+1, 3+j).Interior.ColorIndex <> 3 Then
						Cells(3+i, 3+j).Interior.ColorIndex = 6
						Cells(3+i, 3+j).Borders(xlEdgeBottom).LineStyle = xlNone
						row = i+1 'row값 수정
						col = j 'col갑 수정
						found = True
					ElseIf maze(i-1,j) = True And Cells(3+i-1, 3+j).Interior.ColorIndex <> 3 Then
						Cells(3+i, 3+j).Interior.ColorIndex = 6
						Cells(3+i, 3+j).Borders(xlEdgeTop).LineStyle = xlNone
						row = i-1 'row값 수정
						col = j 'col갑 수정
						found = True
					ElseIf maze(i,j+1) = True And Cells(3+i, 3+j+1).Interior.ColorIndex <> 3 Then
						Cells(3+i, 3+j).Interior.ColorIndex = 6
						Cells(3+i, 3+j).Borders(xlEdgeRight).LineStyle = xlNone
						row = i 'row값 수정
						col = j+1 'col갑 수정
						found = True
					ElseIf maze(i,j-1) = True And Cells(3+i, 3+j-1).Interior.ColorIndex <> 3 Then
						Cells(3+i, 3+j).Interior.ColorIndex = 6
						Cells(3+i, 3+j).Borders(xlEdgeLeft).LineStyle = xlNone
						row = i 'row값 수정
						col = j-1 'col갑 수정
						found = True
					End If
				End If
				If found Then
					Exit For
				End If
			Next j
			If found Then
				Exit For
			End If
		Next i
        
	Loop  '추가된 반복문의 끝
End Sub

Function completeMakeMaze(maze() As Variant, map_size)
	Dim isComplete As boolean
	isComplete = True
	For i=1 To map_size+2
		For j=1 To map_size+2
			If maze(i,j) = False Then
				isComplete = False
			End If
		Next j
	Next i
	completeMakeMaze = isComplete
End Function

 

우리는 Hunt And Kill 알고리즘을 구현하기 전에 조이스틱이란 키보드 이벤트를 미리 만들어 놓았습니다.

 

아래 링크를 참고해 주세요.

 

2020/02/27 - [엑셀 vba 게임] - 엑셀 vba 미로만들기(2) - 키보드 이벤트 구성

 

엑셀 vba 미로만들기(2) - 키보드 이벤트 구성

우리가 만드는 미로에서는 직접 방향키를 이용해 캐릭터를 움직여가며 미로를 풀어나갈 겁니다. 그러기 위해서는 각 방향키를 눌렀을 때 이벤트가 발생하도록 만들어야 합니다. 키보드 이벤트를 발생시키기 위해서..

comgonghakdo.tistory.com

우선 코딩의 장소를 바꿔야 합니다.

 

지금까지의 코딩 장소는 "Module1" 이었지만 키보드 이벤트를 구성하려면 이벤트가 일어나는 "Sheet2"로 옮겨야 합니다.

 

 

"Sheet2"에 아래의 코드를 작성해 줍시다.

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
	Dim row, col As Integer
	row = 2
	col = 2
	With Target.Cells
		If .Row = row-1 Then ' 위쪽 방향 키보드를 눌럿을 때
			Call MoveUp
		ElseIf .Row = row+1 Then ' 아래쪽 방향 키보드를 눌럿을 때
			Call MoveDown
		ElseIf .Column = col-1 Then ' 왼쪽 방향 키보드를 눌럿을 때
			Call MoveLeft
		ElseIf .Column = col+1 Then ' 오른쪽 방향 키보드를 눌럿을 때
			Call MoveRight
		End If
		Cells(row, col).Select
	End With
End Sub

 

각각의 키보드 이벤트에 MoveUp, MoveDown, MoveLeft, MoveRight 프로시저를 연결해 줍니다.

 

위의 프로시저들은 아직 구현하지 않은 프로시저들이므로 구현해 봅시다.

 

다시 "Sheet2"에서 "Module1"로 돌아갑시다

 

각각의 이동 프로시저를 구현하기 전에 한 가지 고려해야 할 것이 있습니다.

 

1. 플레이어의 위치는 어떤 변수에서 보관해야 하고,

2. 어떻게 이동 프로시저에 전해줄까

 

이를 해결하기 위해서 전역변수를 사용해야 합니다. 플레이어의 위치를 전역변수로 사용하게 된다면 모든 이동 프로시저에서 공유가 가능하므로 위의 2가지 문제점이 해결됩니다.

 

그럼 코드를 작성해 봅시다.

 

먼저 전역변수 선언부터 해 줍시다. 전역변수 선언은 코드의 맨 위에 해 주어야 합니다.

 

전역변수를 선언해 주는 김에 MakeMaze() 프로시저 안에 있는 지역변수인 map_size도 전역변수로 다시 선언해 줍시다.

 

map_size도 MakeMaze() 프로시저뿐만 아니라 다른 프로시저에서도 이용해야 하기 때문입니다.

 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '시간지연 코드

Option Explicit ' 전역변수 선언
Dim player_row, player_col As Integer
Dim map_size As Integer ' map_size를 전역변수로 선언

Sub MazeMaze()
    
    ' Dim map_size As Integer 삭제!
    
''' 이하 생략 '''

 

player_row 와 player_col 이라는 플레이어 위치를 저장할 전역변수를 선언해 줍니다.

 

그럼 처음으로 전역변수에 값을 넣는 곳은 어디일까요.

 

당연히 미로가 모두 만들어지고 난 후 입니다.

 

그러나 MakeMaze() 프로시저 끝에 미로가 모두 만들어지고 난 후의 코드까지 구현하는 것은 코드가 복잡해질 수 있으니 AfterMakeMaze() 프로시저를 하나 더 만들어 봅시다.

 

Sub AfterMakeMaze()
	
End Sub

이 프로시저에서 해야할 일은 여러가지가 있습니다.

 

1. 플레이어 위치 초기화 시키기

2. 시작 위치와 도착 위치의 셀 배경색 바꾸기

3. 조이스틱 셀 선택하기 (우리의 조이스틱인 2행 2열로 셀 선택을 옮겨야 키보드 이벤트를 이용할 수 있습니다.)

 

그럼 코드로 구현해 봅시다.

 

Sub AfterMakeMaze()

    '플레이어 위치 초기화
    player_row = 5
    player_col = 5
    
    '시작 셀과 도착 셀 배경색 바꾸기
    Cells(5,5).Interior.ColorIndex = 33
    Cells(map_size+4, map_size+4).Interior.ColorIndex = 33
End Sub

 

프로시저를 구현하고 MakeMaze() 프로시저 맨 마지막에 Call AfterMakeMaze 를 추가하는 걸 잊으면 안됩니다!!

 

이젠 각각의 이동 프로시저를 구현해야 합니다.

 

만약 플레이어가 오른쪽 방향키를 누른다면 우선 현재 위치해 있는 셀에서 오른쪽 테두리가 있는지 없는지 확인해야 합니다.

 

오른쪽 테두리가 비어있다면 이동할 수 있으므로 이동 후 셀의 배경색을 33으로 바꾸어 줍니다.

 

또한 플레이어가 이동한 흔적을 남기기 위해 이동 전 셀의 배경색도 바꿔주기로 합시다. 이때는 43으로 바꿉시다.

 

마지막으로 전역변수 player_row 값을 바꾸면 됩니다.

 

코드로 구현해봅시다.

Sub MoveUp()
    If Cells(player_row, player_col).Borders(xlEdgeUp).LineStyle = xlNone Then
        Cells(player_row-1, player_col).Interior.ColorIndex = 33
        Cells(player_row, player_col).Interior.ColorIndex = 43
        player_row = player_row - 1
    End If
End Sub

 

나머지도 구현해 봅시다.

 

Sub MoveDown()
    If Cells(player_row, player_col).Borders(xlEdgeDown).LineStyle <> xlNone Then
        Cells(player_row+1, player_col).Interior.ColorIndex = 33
        Cells(player_row, player_col).Interior.ColorIndex = 43
        player_row = player_row + 1
    End If
End Sub

Sub MoveLeft()
    If Cells(player_row, player_col-1).Borders(xlEdgeLeft).LineStyle <> xlNone Then
        Cells(player_row, player_col-1).Interior.ColorIndex = 33
        Cells(player_row, player_col).Interior.ColorIndex = 43
        player_col = player_col - 1
    End If
End Sub

Sub MoveRight()
    If Cells(player_row, player_col).Borders(xlEdgeRight).LineStyle <> xlNone Then
        Cells(player_row, player_col+1).Interior.ColorIndex = 33
        Cells(player_row, player_col).Interior.ColorIndex = 43
        player_col = player_col + 1
    End If
End Sub

끝났습니다.

 

이젠 미로를 생성하고 직접 미로를 플레이하면 됩니다.

 

이것으로 엑셀 vba 미로만들기를 모두 마치겠습니다~.

 

고생하셨습니다.


WRITTEN BY
컴공학도

,