본문 바로가기
대학생활/수업

게임밸런스및시뮬레이션 6주차 - VBA에 대하여, 중간과제 공지

by se.jeon 2023. 10. 16.
728x90
반응형

Macro

자주 사용하는 여러 개의 명령어를 묶어서 하나의 키 동작이나 메뉴 등을 이용해 실행되도록 만든 것

 

VBA (Visual Basic for Application)

VBA는 MS-Office 응용 프로그램에서 매크로를 기록하는 데에 사용하는 프로그래밍 언어이다.

VBA 문법은 VB와 같지만, 대응 프로그램이 없으면 사용이 불가능하다.

Word나 PPT에서도 사용 가능하다.

 

- 어플리케이션 (엑셀 자체)

- 프로젝트 & 모듈 (프로시저의 집합)

- 프로시저 (명령문의 집합)

 

개발 도구 활성화하기

 

체크박스를 사용하면 개발 도구 탭이 활성화된다.

 

매크로 기록

 

매크로 기록 기능을 사용하여 내가 진행한 행동을 반복 할 수 있다.

 

F4로 이전 행동을 반복 할 수 있는데 굳이 매크로를 사용하는 이유는 무엇일까?

매크로는 기록한 기능을 꿰뚫어볼 수 있기 때문이다.

Alt + F11을 누르거나 Visual Basic을 사용하여 확인 할 수 있다.

 

주석에 대한 설명 진행

탭을 눌러 한 칸을 밀 수 있고, Shift 탭을 이용하여 앞으로 돌아올 수 있다.

 

Sub 글자굵게()
'
' 글자굵게 매크로
'
' 바로 가기 키: Ctrl+e
'
    If Selection.Font.Bold = False Then
        ' 조건이 참일 때 처리할 것들
        Selection.Font.Bold = True
    Else
        ' 조건이 참이 아닐 때 처리할 것들
        Selection.Font.Bold = False
    End If
            
End Sub

 

위와 같이 조건을 사용하고, 제공되는 기능들을 이용하여 다양한 일들을 할 수 있다.

이를 이용해서 게임을 만드는 사람들도 있을 정도.

 

셀의 특정 위치를 선택 해 보자

Range 속성

- Range("주소").Select   //ex : Range("B2").Select

 

Cells 속성

- Cells(Row번호.Column번호).Select   //ex : Cells(2.2).Select

 

속성 뒤에는 Select, Copy, PasteSpecial, Delete, Value 등의 다양한 명령들이 붙을 수 있다.

Ctrl + J로 사용할 수 있는 기능을 확인 할 수 있다.

대괄호의 경우에는 조회되지 않는다.

 

Sub 주소참조()
'
    ' 일반적으로 주소를 바로 참조할 때는 Range를 사용하지만,
    ' 상대참조를 사용할 때 Cells를 사용한다.
    
    Cells(2, 4).Select
    Range("B2:B5, 1:2").Select
    
    ' 대괄호를 사용해서도 셀 주소 지정이 가능하다.
    [E4, 1:2].Select
    
    ' D열을 복사해서 M열에 붙여넣기
    Range("D:D").Copy
    Range("M:M").PasteSpecial
    
    ' M4의 내용을 지운다.
    Range("M4").ClearContents
    
End Sub

 

Activate와 Select의 차이

- Activate : 활성화 되어있는 하나의 셀.

- Select : 선택된 모든 영역, 하나 이상의 개체.

 

VBA를 사용하면 Ctrl + Z를 이용한 되돌리기가 안 된다.

따라서 VBA를 사용 할 때는 사전에 백업을 해 두는 것이 좋다.

 

Offset 메서드는 선택된 곳으로부터 상대적인 위치를 불러올 때 사용한다.

실습 진행

선택된 셀에는 "선택", 그리고 동서남북 적기

Sub 오프셋()

    ActiveCell.Offset(0, 0).Value = "선택"
    ActiveCell.Offset(0, 1).Value = "동"
    ActiveCell.Offset(0, -1).Value = "서"
    ActiveCell.Offset(1, 0).Value = "남"
    ActiveCell.Offset(-1, 0).Value = "북"
End Sub

 

위치를 전부 참조할 수 없으면 오류가 발생한다.

한칸 왼쪽에서 스크립트를 실행시키면 서에서 오류가 남을 확인 할 수 있다.

변수 (variable)

값을 기억하기 위해 저장 영역에 부여한 이름으로, 저장되는 데이터의 종류에 따라 데이터형(타입)을 가진다.

 

선언 방식

- [Dim, Static, Private, Public] As 데이터형 (생략 가능)

 

데이터형

- Byte

- Integer

- Long

- Date

- String

- Variant

- Boolean

 

코딩 스타일 표기법

카멜 표기법 : camelCase - 시작은 소문자, 각 단어의 첫글자만 대문자로

파스칼 표기법 : PascalCase - 시작 포함 모든 단어의 첫 글자를 대문자로

스네이크 표기법 : snake_case - 단어 사이에 언더바를 추가

헝가리안 표기법 : intHungarian - 접두어로 데이터형을 추가

 

전역변수, 모듈변수, 지역변수

전역변수 - Public, 프로젝트 수준, 프로그램 내 모든 프로시저에서 사용 가능

모듈변수 - Private, Module 수준, 선언된 같은 모듈 내 모든 프로시저에서 사용 가능

지역 변수 - Dim, Procedure 수준, 선언된 프로시저에서만 사용 가능, 실행할 때마다 초기화

 

Sub 변수()
    Dim 값 As Byte
    값 = 100
    
    Range("A1").Value = 값 * 5
    
End Sub

 

Byte형은 255까지 지원하기 때문에 값에 300을 넣으면 오버플로우 오류가 뜨게 된다.

 

앞으로 자주 사용하게 될 랜덤에 대해서

- WorkSheetFunction.RandomBetween(a, b) : 액셀 함수 - a와 b사이의 랜덤한 값을 불러온다.

- Application.RandBetween(a, b) : 기능 라이브러리 - a와 b 사이의 랜덤한 값을 불러온다.

 

액셀 함수가 좀 더 명확한 면이 있다.

Sub 랜덤()
    Dim 값 As Long
    
    ' 값 = Application.RandBetween(0, 1000)
    값 = WorksheetFunction.RandBetween(0, 1000)
    Range("A1").Value = 값
End Sub

실습 진행

RGB 랜덤 색상 옆으로 3개의 셀에 R, G, B를 별도로 찍어보자

각 셀에 R, G, B 값을 흰색 스트링으로 찍어주고 다른 값이 9인 상태로 표시 해 보자. (ex : r이 4이고, g와 b가 0인 상태)

Sub 색칠하기_RGB()
    Dim Red As Byte
    Dim Green As Byte
    Dim Blue As Byte
    
    ' 셀색상채우기 + 오프셋
    ' 셀랜덤값 스트링 표시
    ' 변수 선언하기 (R, G, B)
    ' 랜덤 처리
    
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
    Red = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(0, 0).Interior.Color = RGB(Red, 0, 0)
    ActiveCell.Offset(0, 0).Value = Red
    ActiveCell.Offset(0, 0).Font.Color = vbWhite
    
    Red = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(1, 0).Interior.Color = RGB(Red, 0, 0)
    ActiveCell.Offset(1, 0).Value = Red
    ActiveCell.Offset(1, 0).Font.Color = vbWhite
    
    Red = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(2, 0).Interior.Color = RGB(Red, 0, 0)
    ActiveCell.Offset(2, 0).Value = Red
    ActiveCell.Offset(2, 0).Font.Color = vbWhite

    Red = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(3, 0).Interior.Color = RGB(Red, 0, 0)
    ActiveCell.Offset(3, 0).Value = Red
    ActiveCell.Offset(3, 0).Font.Color = vbWhite
    
    
    Green = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(0, 1).Interior.Color = RGB(0, Green, 0)
    ActiveCell.Offset(0, 1).Value = Green
    ActiveCell.Offset(0, 1).Font.Color = vbWhite
    
    Green = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(1, 1).Interior.Color = RGB(0, Green, 0)
    ActiveCell.Offset(1, 1).Value = Green
    ActiveCell.Offset(1, 1).Font.Color = vbWhite
    
    Green = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(2, 1).Interior.Color = RGB(0, Green, 0)
    ActiveCell.Offset(2, 1).Value = Green
    ActiveCell.Offset(2, 1).Font.Color = vbWhite

    Green = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(3, 1).Interior.Color = RGB(0, Green, 0)
    ActiveCell.Offset(3, 1).Value = Green
    ActiveCell.Offset(3, 1).Font.Color = vbWhite
    
    
    Blue = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(0, 2).Interior.Color = RGB(0, 0, Blue)
    ActiveCell.Offset(0, 2).Value = Blue
    ActiveCell.Offset(0, 2).Font.Color = vbWhite
    
    Blue = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(1, 2).Interior.Color = RGB(0, 0, Blue)
    ActiveCell.Offset(1, 2).Value = Blue
    ActiveCell.Offset(1, 2).Font.Color = vbWhite
    
    Blue = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(2, 2).Interior.Color = RGB(0, 0, Blue)
    ActiveCell.Offset(2, 2).Value = Blue
    ActiveCell.Offset(2, 2).Font.Color = vbWhite

    Blue = WorksheetFunction.RandBetween(0, 255)
    ActiveCell.Offset(3, 2).Interior.Color = RGB(0, 0, Blue)
    ActiveCell.Offset(3, 2).Value = Blue
    ActiveCell.Offset(3, 2).Font.Color = vbWhite

End Sub

 

 

매크로를 제외하고 저장할 것인지를 물어보는 것이기 때문에 예를 하면 큰일난다.

xlsm으로 저장해야 한다.

 

사용자와의 피드백

Inputbox : 사용자에게 값을 입력받는 함수

변수명 = inputbox("메세지 내용" [, "제목"], [, 기본값], [,가로 위치], [세로 위치])

 

Msgbox : 사용자에게 값을 리턴해주는 함수

변수명 = msgbox("메시지 내용" [, 단추 종류 + 아이콘 종류 ... ] [, "제목])

 

Sub 사용자인터랙션()
    Dim 석식 As String
    석식 = InputBox("오늘 저녁은 뭘 먹을까?", "저녁 메뉴 결정")
    
    ' Range("A1").Value = 석식
    MsgBox 석식
    
End Sub

다양한 msgbox 설정값들

실습 진행

인풋박스로 값을 3개 입력 받아서 RGB 색상의 색을 엑셀 인테리어로 표시하기

중간 과제 공지

캐릭터 밸런스 분석하기

깊이 있는 밸런스 과제를 위해 형평성을 해제하였다.

가장 자신 있고, 잘 알고 있는 게임을 자유롭게 골라 캐릭터 밸런스를 분석하는 과제

 

특정 게임의 캐릭터 (or 클래스) 분석하기

- 자유 형식으로 캐릭터 (or 클래스) 분석

- 캐릭터 기획의도 및 목적성을 명확하게 분석 (장, 단점 포함)

- 스탯값 및 스킬 고찰 필수 (비교를 통한 거시적 분석)

- 분석한 내용을 통해 문제점이 있을 경우 밸런스 수정 제안 (기획 의도 파악 후 해당 캐릭터를 더욱 목적성에 맞도록 수정 제안)

 

필요 항목

게임에 대한 기본적인 정리 (이해를 돕기 위한 개요)

밸런스 요소 정리 (밸런스에 영향을 주는 항목 뽑기)

선택한 캐릭터 분석 (자유 형식을 통한 분석)

캐릭터 수정 보완 제안 (캐릭터의 목적성에 맞도록)

 

캐릭터 밸런스 분석하기 - 예시

캐릭터의 목적성에 집중한다. (ex : 벽을 깨부술 수 있는 곡사화기 영웅이 필요해 나온 정크랫)

장/단점(특징과 차이점 및 상성) 분석

스탯, 스킬 분석을 통해서 정량적 밸런스에 접근한다. 캐릭터는 스탯과 스킬을 통해 기본적인 캐릭터성을 갖는다.

다양한 접근이 가능하다 (개발자의 밸런스 노트, 유저 자유 게시판의 밸런스 갑론을박)

누군가의 결과물을 그대로 카피할 생각은 하지 말자. 본인의 성장에도 도움이 되지 않을 뿐더러, 평가 형평성에도 문제를 일으킨다.

 

이번 중간과제는 발표하지 않습니다.

- 과제 가독성 매우 중요.

- 부연 설명의 경우 슬라이드 노트를 활용하자.

 

필수 제출 과제물

과제의 이름 맞춰서 보낼 것 (학번_ㅇㅇ게임ㅇㅇ캐릭터분석서_이름)

'옵션'에서 파일의 글꼴을 포함해서 보낼 것

 

총 40점

1. 캐릭터 분석 관찰 범위와 깊이의 우수성 20점

2. 능력치 수치에 대한 밸런스 고찰의 우수성 20점

 

제출 기한 : (2주) 오늘부터 ~ 10월 29일 일요일 22시까지

제출 방식 : 교수님 이메일로 메일 보내기

728x90
반응형