게임 수학 - 더하기, 빼기 연산자

게임에서 사용하는 더하기 연산자에 대해 알아보고 주의사항을 살펴본다.

언어에서 데미지를 주거나 현재 HP 구현하는 경우 다음과 같이 사용할 수 있다.

int main() {
    int hp = 100;
    printf("Current HP: %d", hp);

    return 0;
}

Current HP: 100

코드의 100 값의 HP 변수로 만들고 캐릭터에게 할당할 수 있게 된다.


플러스(+) 연산자

다음으로 레벨업이 되어 최대 HP 설정하고 싶다면 더하기 연산자를 사용하면 된다.

int main() {
    int hp = 100;
    int level_hp = 20;
    hp += level_hp;
    printf("MAX HP: %d", hp);

    return 0;
}

MAX HP: 120

한계를 정하지 않고 계속 레벨업하게 된 경우 int 형 타입이 정해진 최댓값을 넘기게 된 경우 문제가 발생한다.
이는 오버플로우 발생으로 생기는 문제인데 살펴보도록 한다.

int main() {
    int current_hp = 0x7fffffff; // 2147483647
    printf("Current HP: %d\n", current_hp);

    int level_hp = 1;
    current_hp += level_hp;

    printf("Level UP!\n");
    printf("Current HP: %d", current_hp);

    return 0;
}

Current HP: 2147483647
Level UP!
Current HP: -2147483648

극단적인 상황이지만 int 형의 양수의 정수 끝의 값은 2147483647 이다.
이를 넘기게되면 오버플로우가 발생해 양수의 값이 음수로 변하게 된다.

이러한 현상을 오버플로우 또는 정수 오버플로우라고도 한다.

int형 타입의 값

그리고 플러스 연산자는 앞의 값과 뒤의 값 순서는 상관없다.

예: A + B = B + A

  • 10 + 15 = 25
  • 15 + 10 = 25

빼기(-) 연산자

빼기 연산자는 앞에서 설명한 현재 HP 코드 예시를 가져다 사용하도록 하겠다.
현재 HP가 피해를 입어서 감소하는 상황이 있다.

int main() {
    int hp = 100;
    printf("My Current HP: %d\n", hp);
    
    int effect_damage = 15;
    printf("Monster Attact!: %d\n", effect_damage);

    hp -= effect_damage;
    printf("My Current HP: %d", hp);

    return 0;
}

My Current HP: 100
Monster Attact!: 15
My Current HP: 85

음수 빼기

음수를 뺀다는 것은 그 수를 더하라는 것과 같다.
예를 들어 "10 - (-7)"수식과 같이 주어진 경우 본인은 문맥에서 아직 이해하기 어려워 -1 * (-x) = x 계산한다고 생각하고 있다.

예:

  • 0 - (-7) = 17
  • - (-7) + 10= 17

뺄셈 순서

뺄셈은 덧셈과 다르게 연산 앞 뒤 값을 파악해야한다.
다음과 같은 실수가 발생할 수 있다.

예:

  • A - B != B - A
  • 10 - 15 = -5
  • 15 - 10 = 5
  • -5 != 5

참고문헌

Arithmetic - Wikipedia