카테고리 없음

VBA기초부터(2)

자동산양 2024. 1. 21. 22:33

오늘은 VBA를 이용해서 전투계산식 시뮬레이터를 만들어보겠습니다

 

기획 의도는 계산식을 효율적으로 보기 쉽게 하기 위함 입니다

 

우선 어떤 변수를 입력받을지부터 정해봅시다

 

1. 번호 

 - 캐릭터를 쉽게 불러오기 위해 번호를 지정해줍시다

2. 이름(Name)

 - 캐릭터의 이름입니다

3. 체력(HitPoint)

 - 체력이 0이 되면 해당 캐릭터는 사망합니다

4. 마나(Mana) - 스킬을 사용하기 위한 자원

 - 스킬을 사용하기 위한 별도의 자원입니다

5. 공격력(AttackDamage)

 - 공격 시 물리 피해량에 관여합니다

6. 주문력(AbilityPower)

 - 공격 시 마법 피해량에 관여합니다

7. 방어력(Armor)

 - 공격 받았을 시 물리 피해량을 감소시켜줍니다

8. 저항력(Resistance)

 - 공격 받았을 시 마법 피해량을 감소시켜줍니다

9. 공격속도(Attack Speed)

 - 1초당 공격하는 횟수입니다

10. 주문가속(AbilityHaste)

 - 스킬 쿨 타임에 관여합니다

11. 치명타확률(CriticalChance)

 - 공격 시 치명타 비율에 따른 피해량을 증가시킵니다

12. 치명타비율(CriticalRatio)

 - 치명타 성공 시 몇배의 데미지를 줄지 결정합니다

13. 이동속도(MoveSpeed)

 - 움직임에 관여합니다

14. 사거리(Range)

 - 기본 공격 범위에 관여합니다

예시

일단 변수는 많이 지정해줬지만 입력받은 모든 변수를 사용해서 식을 짜기에는 어렵습니다

 

따라서 최소한의 변수로 식을 완성시켜서 점차 더해가는 식으로 접근해봅시다

 

일반적으로 데미지 계산은 [체력] - [피해량] = [남은 체력] 

 

으로 계산하며 여기에서 남은 체력이 0 이하일 경우 캐릭터가 사망하여 패배처리됩니다

 

위의 예시로 게산하면 A캐릭터는 665의 체력을 가지고 있고 68의 피해량을 주는 상대와 전투 시

10번희 전투 후에 체력이 0 이하가 되어 사망합니다

 

하지만 여기서 방어력이라는 개념을 넣어 데미지 계산식에 변화를 줍시다

 

1) 피해량 = 공격력

 

에서

 

2) 피해량 = 1/(1+방어력*0.01) * 공격력 으로 바꿔줍시다

 

그럼 피해량은 1/(1+36*0.01) * 68

 

1/1.36 * 68 = 0.7352.... * 68 = 50 의 피해량이 적용 되게 됩니다

 

[현재 체력] - [피해량] = 남은 체력(남은 체력이 0 이하면 사망)

 

[현재 체력]  - [1/(1+방어력*0.01) * 공격력]

 

이렇게 단순히 뺄셈만 하는 식에서

 

덧셈 곱하기 나누기까지 필요한 계산식으로 바뀌었으니 이를 엑셀로 보기 편하게 바꿔보겠습니다

 

오늘 추가로 써볼 명령어는 Worksheets(). 입니다

 

시트가 1개가 아닌 여러 개의 시트를 사용 할 때 혼선을 방지하기 위해 사용합니다

 

예시) Worksheets("Sheet2").Range("c2") 라고 입력 했을 경우

 

작업중인 시트 위치와 상관 없이 sheet2 시트의 c2 칸을 지정하게 됩니다

 

그렇게 시트 2의 특정 값을 시트 3으로 옮기는 예제를 사용해봅시다

Sub Calculator()
    
    a = Worksheets("Sheet2").Range("c2")
    
    Worksheets("Sheet3").Range("b2") = a

End Sub

 

위의 식을 사용하게 되면

 

1)a에 Sheet2의 c2위치에 있던 값을 저장

2)Sheet3의 b2칸에 a의 값을 대입

하여 Sheet2의 c2위치의 값이 Sheet3의 b2칸으로 이동되게 됩니다

 

이제 다른 시트의 값을 가져오는 방법을 알았으니 스크립트를 작성해봅시다

Sub Calculator()
    
    'A캐릭터 체력 가져옴
    A_Hp = Worksheets("Sheet2").Range("c2")
    
    '체력 A_Hp 변수에 저장
    Worksheets("Sheet3").Range("b2") = A_Hp
    
    '데미지 값 변수에 저장
    A_Damage = Worksheets("Sheet2").Range("E2")
    
    '방어력 값 변수에 저장
    A_Armor = Worksheets("sheet2").Range("G2")
    
    '피해량 계산식 적용
    A_DamageResult = (1 / (1 + A_Armor * 0.01)) * A_Damage
     
    '피해량 출력
    Worksheets("Sheet3").Range("c2") = A_DamageResult
    
End Sub

이제 해당 코드를 매크로 버튼으로 만들어준뒤 실행하면

 

이렇게 체력과 피해량을 불러오게 됩니다

 

이제 응용하여 옆에 남은체력도 표시되게 합시다

'남은 체력
    Worksheets("Sheet3").Range("d2") = A_Hp - A_DamageResult

 

이제 값이 입력되어있는 sheet2로 돌아가 값을 변경해본뒤 실행시켜봅시다

변경 전
변경후 공격력은 2배 방어력은 3배

 

바뀐 수치에 따라 피해량과 남은 체력도 변경 된것을 확인 할 수 있습니다

 

# 오늘 해본 것

# Vba특정 시트에 있는 값 가져오고 연산하기

# Vba특정 시트에 있는 값 변경 확인

# 공격력과 방어력을 이용해 피해량 계산식 작성하기

# 입력받은 값을 이용해 다양한 값 시뮬레이팅 하기

 

이제 다음 장에는 남은 변수를 활용하여 더 다양한 계산식을 작성해보겠습니다