top of page
< Back

게임 개발자가 바라보는 확률의 구현

17

GG Vol. 

24. 4. 10.

한국 게임계를 뜨겁게 달구고 있는 주제 중 하나를 고르라면 아마 확률일 것이다. 법적으로 게임 내 확률을 공지가 강제되면서 이러한 규제가 도움이 되는가도 논란이 되고 있다. 게임에서는 확률이 필수 불가결이라는 의견도 있고 지나치게 사행성을 조장한다는 의견도 존재한다. 하지만 우리는 게임에서 확률을 실제로 어떻게 다루고 있는지는 알고 있을까? 게임의 확률 이야기를 하기 위한 기본 교양으로, 프로그래머 관점에서 게임 개발자가 어떻게 확률을 다루는지에 대한 기초적인 부분을 다뤄보도록 한다.

     


확률을 설명하는 두 축. 수학과 통계

     

한국의 교육과정이 계속 변해왔기 때문에 배우는 시기나 범위는 차이가 있을 수도 있겠지만 의무 교육 과정을 끝까지 수행한 사람이라면 대부분 확률과 통계를 배우게 된다. 기댓값이나 통계, 독립시행 등의 개념을 굳이 여기서 설명하지는 않는다.


확률은 비단 수학뿐만 아니라 과학, 사회학 등 다양한 분야에서 중요하게 사용되는 개념이고 그 자체를 설명하는 것만으로도 상당한 분량이 필요하기 때문이다. 다만 우리가 흔히 이야기하는 확률에 대한 해석이 다양하다는 이야기는 하고 넘어가려고 한다.


첫 번째는 어떤 일이 일어날 확률이다. 실제로 일어나지 않았으면 하는 예이긴 하지만 어떤 의사 수술의 성공률이 90%라고 해보자. 그리고 당신이 이 의사에게 수술받는다고 하면 어지간하면 성공할 거로 생각할 것이다. 두 번째는 통계적으로 일어난 일에 대한 확률이다. 앞서 말한 예에서 한 가지 조건을 추가해 보겠다. 이 의사는 앞에 9번의 수술에 성공했다. 그러면 당신의 선택은 어떻게 될까. 극단적인 예이지만 수학적인 확률과 통계적인 확률이 차이가 있다는 점만 짚을 수 있으면 넘어가도 무방할 것이다.

     

다양한 학문과 분야에서 확률을 다루듯이 게임에서도 확률을 일차원적으로 다루지는 않는다. 확률 역시 게임개발의 각 분야에서 다양하게 다루며, 크게 의도를 가지고 다루는 곳은 기획과 프로그래밍 분야일 것이다. 기획에서도 어떤 목적으로 다루느냐에 따라 그 목적이 달라지겠지만 크게는 “어떤 일이 얼마나 일어나게 할 것인가”일 것이다.

     

기획에서는 세상에서 일어나는 일의 숫자를 다루기 위해 확률을 사용한다.


     

게임 기획에서 확률에 대한 접근

     

우선 확률이란 주제가 너무 민감하게 다뤄지는 경향이 있어서 앞으로 이야기하는 모든 예시는 게임 개발자가 어떤 속임수의 의도를 가지고 확률을 다루고 있지 않다는 것을 가정하고 시작하도록 하겠다.

     

- 오크 사냥터에서 오크를 100마리를 사냥하면 오크 대검을 한 자루 얻게 세상을 기획하고 싶다면 간단하게 오크 대검의 하락 확률을 1%로 지정하면 된다.


- 어떤 사람이 만 원짜리 구매권 20장을 사서 SSR 카드를 1장 뽑게 만들고 싶다면 SSR 카드의 등장 확률을 5%로 하면 된다.


- 미사일의 명중률은 상황과 기종에 따라 다르겠지만 실전에서는 보통 사용 횟수와 격추 수로 계산하기 때문에 50%를 넘는 경우는 드물다. 현실을 반영하겠다고 미사일의 명중 확률을 50%로 집어넣어 놓을 수도 있다.

     

물론 현실과 기획은 다르다. 통계로서의 확률은 어디까지나 아주 큰 수에서만 그 수치에 수렴한다. 아주 납작하게 계속 동전을 던진다고 가정해 보자. 우리는 학습해서 이번에 동전에 앞면이 나왔다 해서 다음에 뒷면이 나올 확률이 올라가거나 하지는 않는다는 것을 안다. 그래서 게임 기획자가 50%의 확률로 성공하는 사건을 기획해 놓았다고 하더라도 한번 성공이 반드시 그다음의 실패로 이어지지 않는다는 것은 알고 있다.

     

동전을 던졌을 때 처음 몇 번이 계속 앞에만 나온다고 하더라도 그 횟수가 무한대에 가까워질수록 앞이 나온 숫자가 뒤가 나온 숫자는 점차 같은 비율로 수렴하게 된다.

     

하지만 우리는 게임에서 모든 시도를 무한정 하지 않는다. 게임 기획자가 통 크게 강화확률을 ½ 라고 했다고 하더라도 누군가는 10번을 시도해도 실패할 수 있다. 계산도 어렵지 않다. ½을 열 번 곱해 계산할 수 있고 그 결괏값은 0.00098 정도고 퍼센티지로 표시하면 0.098 % 정도이다. 0.01 %라고 해도 무방하지 않을까 싶다. 우리가 흔히 이야기하는 만에 하나라는 정도의 확률이다.


만에 하나라는 관용구는 거의 일어나지 않음을 뜻하기도 하지만 수학적으로 만에 하나라는 의미는 어떻게 될까. 게임의 이용자 수가 10만 명이라고 하면 통계수치를 그대로 적용하면 적어도 10명은 강화를 연속으로 10번 해도 실패한다는 의미이다. 거의 일어나지 않는 확률이긴 하지만 게임 이용자의 숫자가 10만 명이면 10명은 10번 해도 실패하는 사람이 있을 수 있다는 이야기이다. 그리고 이용자 수가 많아질수록 그 숫자가 늘어날 가능성이 크다. 1/2 확률의 실패가 10번 연속으로 나에게만 일어나는 것은 부조리하게 느껴지는 일이지만 통계적으로는 존재할 수 있다는 말이다.

     

확률이 1/2보다 더 낮아지면 이러한 일을 우리는 더 많이 겪게 된다. 게임 기획에서도 이러한 것도 일종의 공정함 아닌가 하고 개입을 하지 않는 경향이 있었지만, 점차 이러한 부정적인 경험을 어떻게든 막아보기 위해 여러가지 기획적인 시도를 하게 되기도 했다. 이부분은 이후 실제 프로그래밍에서 직접적으로 사례를 이야기하겠지만 공격 등에서는 실패할때마다 성공확률을 점차적으로 높여준다던가 드랍률이 낮은 장비등의 경우라면 잡템들을 줘서 모여있는 잡템으로 교환을 할 수 있게 해주는 등의 안전망을 만들어주기도 한다.

     


아날로그 게임에서 확률 다루기

     

그렇다면 이 확률을 게임에서는 어떻게 다룰까. 굳이 비디오게임이 아니더라도 예전부터 여러 종류의 게임에서 확률을 다뤄왔다. 가장 확실하게 확률을 취급할 수 있는 도구는 역시 주사위였기 때문에 많은 보드게임이나 TRPG에서는 주사위로 확률을 다뤄왔다. 주사위가 없던 어린 친구들은 6각으로 만들어진 연필을 굴리기도 했다.


특히 TRPG에서는 확률을 정교하게 다루기 위해 여러가지 시도를 했는데 90년대 '던전 앤 드래곤'을 하려면 흔히 주사위 세트라고 불렀던 4면체부터 20면체까지 (가끔 100면체를 가지고 있는 마스터도 있었다.) 다양한 다면체로 이루어진 주사위가 필요했으며 단순히 주사위를 한번에 하나씩만 사용하지도 않았다.

     

보드게임 마니아라면 많이 익숙할 '카탄' 카탄에서는 랜덤으로 자원 판을 배치하며 해당 말에 해당하는 숫자를 주사위 2개로 결정을 하기 때문에 자연스럽게 각 자원 판에서 자원이 나올 확률이 차이가 생겨난다. 이 때 주사위의 합으로 숫자를 정하기 때문에 2의 경우는 확률로서는 1/36이.. 7의 경우 1/6 으로 존재며 7의 경우 카탄의 독특한 규칙 중 하나인 도둑이 움직이게 된다. 이로서 게임에서는 자연스럽게 도둑이 가장 많이 선택되게 된다.

     

TRPG에서는 다양한 공격이나 판정을 주사위로 진행하며 보정 또한 일어난다. 모르는 사람이 보면 마치 암호처럼 느껴질 표기방법 2D6+3 은 6면체 주사위를 2번 굴리고 그에 3을 더해준다는 의미이다. 그렇다보니 무기들에 개성을 주기 위해 다양한 주사위로 사용한다. 바스타드 소드는 공격력이 1D8이고 시미타의 공격력이 2D4 라면 둘 다 최고 데미지는 8이겠지만 바스타드 소드가 데미지가 8이 나올 확률은 1/8 이고 시미타의 데미지가 8이 나올 확률은 1/16이 된다. 언뜻보면 시미타가 나빠 보일수도 있겠지만 최소 데미지는 2이고 중간값이 좀 더 안정적으로 나오기 때문에 무난하게 사용할 수 있는 무기가 되는 셈이다.

     

TRPG에서는 판정이나 공격 성공등은 이렇게 다양한 주사위를 다양한 개수로, 성공이 힘들게 하거나 쉽게 하는 부분은 또 추가 보정을 통해서 진행하는 경우가 대부분이며 최근에 출시된 '발더스 게이트 3'에서는 이러한 계산을 굳이 노출하여 색다른 느낌을 연출하기도 했다.

 

* 그림 1:발더스 게이트의 성공판정

     


확률 계산의 주요한 수단 – 난수

     

그 뿌리를 TRPG에 둔 만큼 당연히 비디오 게임의 RPG들은 이러한 다양한 확률 계산들을 가지고 왔다. 하지만 확률이 게임을 위해서만 존재하는 것이 아니듯이 게임 개발자들이 컴퓨터 안에서 직접 확률 굴림을 해야 하는 경우는 그다지 많지 않았다. 대부분의 확률처리는 난수를 통해 진행이 되었고, 컴퓨터에서 난수를 얻어오는 기능을 게임 프로그래머가 직접 작성하는 경우는 일반적이지는 않다. 현대에서는 대부분 게임 엔진이나 사용하고 있는 언어의 수학 라이브러리에서 제공하고 있는 랜덤 기능을 사용하는 경우가 대부분이며 과거에도 거의 마찬가지였다.

     

현대 게임에서 유니티를 예로 들면 랜덤 데이터는 아래와 같이 가져온다.

     

Random.value

     

이 코드로 게임 프로그래머는 0~1 사이의 임의의 실수를 가져 올 수 있다.

     

좀 더 주사위스러운 수를 가져오고 싶다면

     

Random.Range(0,6)

     

이런 식으로 6개의 숫자중 하나를 가져올 수도 있다.

     


진정한 난수를 찾아서

     

과거부터 일반적으로는 설명한 바 처럼 프로그래밍 언어나 게임 엔진에서 제공하는 난수 생성 알고리즘을 사용하고 있지만 그것이 전부는 아니다. 게임 프로그래밍의 팁을 다룬 책들 중 전범으로 여겨지는 '게임 프로그래밍 잼스'에서는 난수를 직접 만드는 코너들도 존재한다.

     

외부 요소 없이 컴퓨터 자체만으로 만들어내는 난수는 진정한 난수가 아니기 때문이다. 그래서 우리가 컴퓨터에서 생성하는 난수는 의사난수(Pseudo Random) 이라고 부른다. 지금은 그렇지 않지만 과거 컴퓨터에서 특별한 절차 없이 앞서 언급한 프로그래밍 언어의 수학 라이브러리를 사용하여 난수를 생성하는 경우 똑같은 수를 생성할 때가 있었다.

     

이처럼 컴퓨터의 난수 생성 과정은 내부에 보유한 거대한 난수표를 통해 이루어지며, 특별한 절차가 없다면 난수표의 시작지점이 동일해 계속 같은 난수를 얻게 된다. 그렇다보니 예전 피처폰용 고스톱을 동시에 시작하면 양쪽 폰에서는 같은 순서의 패의 나열이 만들어져서 한쪽 폰으로 패의 순서를 파악해 다른 쪽의 게임을 쉽게 진행하는 일종의 치팅도 존재했다.

     

보다 확실하게 난수를 얻기 위해서 복잡하게는 wifi신호의 노이즈를 이용하는 것부터 간단하게는 현재 시간으로 난수표의 시작 지점에 난수를 섞어서 다른 값이 나오도록 하여 진정한 난수를 얻을 수 있게 하려는 시도들이 있다. 보다 확실하게 난수를 얻어야 하는 분야에서는 마우스의 움직임 등으로 난수를 생성하기도 한다.

     


의사난수를 게임에서 활용하기

     

전략 게임을 즐겨하는 플레이어들이라면 가끔 1% 명중률을 맞추기 위해서 리셋 노가다를 하는 경우들이 있을 것이다. 혹은 명중률 99%로 표시되는 상황에서 공격했는데 빗나가는 우울한 상황을 맞이해서 게임을 꺼버리고 다시 시도하는 경우들도 존재할 것이다.


* 그림 2: 엑스컴 에너미 언노운의 명중률표기

     

다시 실행을 하면 새로 계산하면서 공격이 명중하기를 바라면서 말이다. 하지만 대부분은 게임을 종료하고.. 혹은 전원을 껐다 켜고 게임을 다시 실행해서 저장한 게임을 다시 불러와서 공격을 시도해도 99%에서도 어이없이 빗나가는 공격 화면을 바라보는 경우가 많을 것이다.

     

이는 게임 개발자들이 그렇게 만들었기 때문이다. 이렇게 만든 이유는 이미 아주 먼 옛날부터 이런식으로 리셋을 해서 확률을 지배하려는 노력을 게임 플레이어가 해왔기 때문이고 게임 기획자들은 이 것이 자신들이 만든 경험을 온전히 즐기는데 방해된다고 판단을 했기 때문이다.

     

앞서 말했듯이 진정한 랜덤을 위해 시간이든 우주방사선이든 노이즈를 섞어서 난수를 만들어냈다면 안 그래야하는 것 아닌가요? 라는 질문이 있을 수 있을 텐데, 이러한 상황을 만드는 것도 여러 가지 방법이 존재한다. 쉬운 방법이라면 미리 난수를 계산해서 저장하는 방법이다. 이것은 난수가 저장되는 시점에서 우리는 모르지만 이미 결정이 되어있으므로 마치 운명처럼 어떻게 하든 결괏값은 항상 같을 수도 있다.

     

아니면 랜덤함수에서 제공하는 Seed라고 부르는 것을 사용하였을 수도 있다. 앞서 말했듯이 컴퓨터의 의사 난수는 진정한 난수가 아니라 일종의 거대한 난수표를 사용한다. 그렇다면 그 시작점을 의도적으로 정할 수 있다고 하면 어떨까. 만약에 이 난수의 씨앗 값이 같다면 난수표의 시작 위치가 같아서 항상 같은 결과가 나오게 할 수도 있다. 앞서 말한 잡신호를 섞는 것도 사실 이 씨앗 값에 현재 시각, 혹은 전파 잡신호, 마우스 움직임, 온도 등 뭐든지 섞어서 만드는 경우가 보통이다.

     

같은 랜덤에서 같은 시드값이 주어졌다면 랜덤이 나오는 숫자의 순서는 항상 같을 것이다. 게임에서 난수를 사용하는 것은 확률 뿐이 아닌데, 절차적 생성 또한 이러한 난수를 사용한다. 가끔 아주 적은 세이브 용량에서 거대한 세계가 만들어지는 것을 볼 때가 있을 것이다. 간단한 예를 찾아보자면 항상 다른 행성을 만들어 주는 게임인 <노 맨즈 스카이>를 생각해 보자. 절차적 생성에서는 같은 시드값에서는 같은 난수의 배열을 얻을 수 있다는 점을 이용하여 시드값만 저장하고 난수를 만드는 알고리즘 혹은 난수표를 같게 사용하여 시드값만으로 게임 세상을 저장하기도 한다. 또는 같은 시드값으로 같은 세상을 만들어 내기도 한다.

     


확률 조작과 보정의 사이

     

앞서 이야기한 확률의 보정에 대해 좀 더 언급해 보도록 하자


* 그림3. 슈퍼로봇대전의 전투전 확률 표기

     

이런 확률 보정을 그냥 스킬 등으로 대치할 수도 있다. '슈퍼로봇대전'은 반드시 공격을 피하는 스킬인 “섬광”이나 반드시 공격을 맞추는 스킬인 “필중”을 넣어 굳이 게임기를 리셋하지 않더라도 확률을 지배할 수 있게 하였다.

     

앞서 이야기 했듯 게임 기획에서 굉장히 희소한 가치의 재화 (이는 장비가 될 수도 있고 캐릭터가 될 수도 있다.)가 존재할 수 있다. 한 서버에서 하나만 존재하는 검이 기획 상 존재한다면 어떨까. 이 장비의 드롭확률은 굉장히 낮겠지만 한번 생성되면 그 때부터는 0이 될 것이다. 이 것은 게임 월드의 보정을 위한 확률 보정이다.

     


가챠에서의 천장을 생각해보자

     

가챠 게임에서의 확률 보정은 조심스러운 부분이 존재한다. 필연적으로 확률 보정은 복잡한 공식이 필요하며, 이는 사람이 이해하기 힘들게 하기 때문이다. 금전이 오가는 문제라면 민감한 부분이다.

     

가챠의 확률 보정은 마케팅을 위한 특정 횟수 (일반적으로 10회) 뽑기를 시도했을 경우 높은 등급의 (최고등급을 주는 경우는 드물다) 카드를 한 장 주는 방식과 함께 이용자가 특정 최고 등급 카드를 몇 백 만원을 써도 얻지 못하는 경우를 피하게 해주기 위해서 특정 회수 이상 뽑기를 시도하면 반드시 해당 카드가 나오게 하는 천장이라고 부르는 형태의 시스템이다.


* 그림 4: 페이트 그랜드 오더 스크린샷 – 필자제공

     

'페이트 그랜드 오더'의 경우를 예로 들자면 330번 뽑기를 시도해도 카드가 안 나왔을 경우 100% 해당 카드를 제공하는 뽑기 시스템이다. 뽑기를 시도하려면 게임 내 재화가 필요하며 이 재화는 게임을 진행하면서도 얻을 수 있지만 구매로 얻는 경우가 대부분이고 약 180개가 10만원이며 11번 뽑는데 (1번은 보너스다.) 30개가 필요하다.


대략 10만원으로 66번 뽑는다고 생각하면 적어도 한 캐릭터를 뽑는데 55만원 이상은 쓰지 않게 기획된 것이며 실제로 이 시스템이 적용되는 특정 카드만 뽑을 수 있게 하는 픽업 가챠의 경우 해당 최고 등급 카드의 등장확률은 0.8%이기 때문에 실제 기댓값은 125번 정도 뽑기를 시도하면 (20만원) 한 장 뽑을 수 있게 디자인되어있다고 할 수 있다. 실제로는 10번이상 뽑을 경우 무조건 4성이상 카드가 나오게 되어있기 때문에 실제 수치는 조금 더 작지 않을까 싶은데 여기서 이 금액이 과도한지 아닌지에 대한 가치판단은 하지 않겠다.

     

강화 역시 확률 보정이 일어나는 쉬운 사례 중 하나인데, 대부분의 장비 강화는 장비가 높은 등급이 될 때마다 확률이 떨어지게 기획되는 경우가 존재한다. 물론 이러한 기획은 대부분 명시가 되는 경우가 보통이다. 등급이 올라갈수록 확률이 낮아지는 것 역시 놓치기 쉽지만 확률의 보정이다.

     

어떤 사람이 오크를 10마리를 잡으면 열쇠를 얻을 수 있게 열쇠를 얻을 수 있게 열쇠의 드롭 확률을 10%로 잡아놓으면 어떨까. 운 좋은 사람들이라면 한번에 열쇠를 얻었겠지만 운이 없는 사람이면 100번 해도 열쇠를 얻지 못할 수도 있다. 간단하게 오크 머리를 20개를 가져오면 열쇠랑 바꿔주게 기획하는 손쉬운 해결책도 있겠지만 게임 설정상 이 곳은 던전 안이라 오크 머리를 열쇠로 바꿔줄 NPC를 넣을 수가 없다면 어떻게 해야 할까. 그렇다면 10번째 오크부터는 열쇠가 나올 확률을 점차적으로 올리거나 아니면 반드시 열쇠가 나오게 해서 문제를 해결할 수도 있다. 반드시 나오는 것보다는 확률을 점차적으로 올리는 것이 좀 더 재미를 주는 기획에 가까울 수도 있다.

     

퀘스트를 위해 특정 몬스터를 잡으면 아이템을 얻는 경우도 있다. 오크를 잡으면 얻을 수 있는 오크 이빨은 퀘스트에서만 이용되는 것이기 때문에 퀘스트를 수행중에만 받으며 퀘스트 필요량을 다 채울 경우 필요 없다. 오크 이빨을 다른 사람이 대신 얻어주는 것도 기획에 어긋나기 때문에 오크 이빨은 딱 필요량만 얻어져야한다면 여기서도 확률 보정이 들어간다. 퀘스트를 받으면 오크 이빨이 10%확률로 나오고, 퀘스트의 수를 다 채우면 0%가 되는 것이다.

     

이렇게 다양한 확률 보정이 게임 안에 존재할 수 있다.

     

근데 이걸 다 합쳐 놓았다고 상상해보자. 오크 이빨도 나오고 칼도 나오고 열쇠도 나와야 하는데 이 확률 분포들은 100이 이미 넘어갔고 프로그래머는 내부 계산에서 100까지만 계산을 해서 확률 처리를 하게 해 놓았다. 계산식에 의하면 오크 열쇠는 105~115까지의 숫자가 나와야 드롭되는데 프로그래머는 숫자 처리를 100까지만 하게 했다. 여기서 열쇠를 얻어야만 던전을 나갈수 있다. 이런 식의 기획이라도 추가되었다면.. 결말은 여러분의 상상에 맡기겠다.

     

실수를 하는 것이 인간이다.

     

이렇게 난수를 다루다보면 가끔 원하는 대로 결과가 나오지 않는 경우가 있다. 특정 코드에서 에러가 나는 오류라면 쉽게 해결되지만 1~6까지 숫자가 나와야 하는데 6이 안 나오고 있는 문제는 의외로 쉽게 드러나지 않는다. 심지어 6이 적게 나온다면…?

     

지금은 이러한 실수 때문에 거의 사용하지 않는 패턴이지만 예전에는 난수를 실숫값이 아니라 정숫값을 얻어올 수도 있었다. 주로 2진법을 사용하는 컴퓨터의 특성상 그 숫자는 최댓값이 십진법이 아니게 되는데, 좀 더 직관적으로 생각하기 위해 여기서는 8비트, 0부터 255까지만 생각해 보겠다. 만약 임의의 난수가 0~255까지 나온다고 가정하고 우리가 여기서 0~9까지 10개의 숫자를 임의로 얻고 싶다고 할 때 어떤 방법을 쓸까.

     

컴퓨터에서는 나머지 연산(Mod 흔히 %로 표기)이 있어서 나머지를 통해 쉽게 숫자들을 얻을 수 있다. 근데 이걸 나머지 연산으로 0~9부터 구하면 과연 이 숫자의 분포가 고르게 될까…? 255는 숫자가 작아서 상대적으로 차이가 좀 커 보이지만 0~5까지의 숫자가 다른 숫자보다 경우의 수가 하나씩 더 존재하게 된다. (이 경우 0~5는 사례가 21개, 6~9는 20개씩이다.)

     

앞서 이야기했듯이 이런 오류는 찾기 힘들다. 몇 년이 지나서 발견될 수도 있고 게임을 하는 이용자 수가 적어서 개발자도 이용자도 모르고 넘어갈 수도 있다.

     

아니면 적어도 1개는 쉽게 얻을 수 있는 아이템의 확률을 계산하려면 어떨까. 어떤 가상의 게임에서 부활의 물약은 플레이어가 1개는 가지고 있으면 좋으니까 1개는 쉽게 나오고 2개부터는 있으면 좋으니까 좀 어렵게 나오게 만들고 싶다. 그래서 인벤토리에 부활의 물약이 있는지 체크하고 없다면 부활의 물약이 나올 확률을 높여주고 있다면 그때부터는 확률을 점차 줄여나가기로 했다. 이 기획은 잘 동작했다.

     

그리고 어느 날 새로운 기획자가 와서 해당 기능이 있는 것을 보고 이 확률 계산을 10개가 필요한 퀘스트 아이템에 적용했다. 그리고 프로그래머가 만들어 둔 수식대로라면 인벤토리에 아이템이 8개가 되는 순간부터 아이템이 나올 확률이 마이너스가 된다고 하면 어떨까. 누구도 의도하지는 않았지만, 어느 날 이용자들이 퀘스트 아이템이 모두 8개부터 나오지 않는다는 사실을 서로 비교해 보면서 깨닫게 되고 이용자 게시판은 불길에 휩싸일 것이다.

     

현대의 게임은 복잡하고 확률을 다루는 것은 더 복잡하며 프로그래밍에서 레거시라고 부르는 과거의 코드들은 블랙박스처럼 아무도 이게 왜 돌아가는지 모르는 경우가 상당수이다. 프로그래머의 경험으로서는 잘못된 데미지 계산 수식이 1년 동안 동작하고 있었고, 기획자가 잘못된 데미지 계산 수식을 기초로 (경험을 통해) 밸런싱을 하다가 1년 후에 발견하는 바람에 원 기획대로 수정했다가 게임이 난리가 난 적도 있었다.

     

개발자가 인간인 이상 실수 없이 완전하게 세상을 통제하는 것은 불가능하다.


     

그렇다면 확률을 게임에서 어떻게 다뤄야 할까.

     

다시 한번 강조하지만 여기서는 의도적으로 얻지 못하게 하는 식의 확률 보정을 하지는 않는다는 가정을 했다. 나는 사기에 가까운 의도의 확률 보정은 게임의 재미를 해치게 만드는 편이라고 생각했으며 그러지 않을 것이라고 생각했다. 하지만 그 생각이 틀렸다는 것을 지금은 잘 알고 있다.

     

로제 카이와는 놀이와 인간에서 게임을 4가지로 분류했고, 그 중 알레아는 확률이 엮여있는 게임을 이야기한다. 모든 게임이 운의 요소를 배제할 필요는 없다고 생각한다.

     

싱글 게임이라면 상관없지만, 멀티게임이라면 그리고 그 세상에서 누구나 가질 수 없는 재화가 존재해야 한다면 우리는 그것을 확률로 관리할 수밖에 없다. 아니라면 선착순이란 방법도 있겠지만 사람들이 카트라이더를 스피드전만 하는가.

     

확률이 노출되면 게임이 더 재밌어질까? 아니면 게임이 더 공정해질까? 그런 부분은 게임마다 다르리라 생각한다. 과거의 MMORPG 이용자 중에서는 레벨이 노출되는 그것조차 거부하면서 자신이 실제 가상의 게임 공간에서 생활하는 것처럼 플레이하는 사람들도 있었다. 이 사람들한테 오크를 때리면 50% 확률로 출혈 효과를 입힐 수 있습니다. 라고 표시를 해준다면 어떻게 느낄까. “어우 깬다.”라고 느낄 수도 있을 것이다.

     

하지만 적어도 확률을 사용한다면, 특히 재화 등에서 확률을 사용한다면, 프로그래머라면 좀 더 안전장치를 마련할 필요가 있을 수도 있다. 물론 게임이 성공하면 발생하는 문제이긴 하지만 해킹이나 돈 복사 등이 아니더라도 실제 게임 내 풀리는 재화를 실시간으로 모니터링하고 게임 기획자들이 확률 등을 입력해서 적어도 천번 만번 정도를 직접 테스트하지 않더라도 자동으로 계산해서 성공 횟수와 실패 횟수 등을 테스트할 수 있게 해준다면 (물론 기획자들은 이 계산을 엑셀에서 한다! - 하지만 게임 내부의 수식 처리 결과가 과연 같을까…?) 적어도 실수 사례는 줄어들 것으로 생각한다.

     

하지만 역시 필요한 건 주사위를 굴려서 6만 6번 이상 나올 수 있는 사람이 존재할 수 있다는 상상력일 것이다. 퍼센티지로 따지자면 0.002 %지만 통계적으로는 5만 번 중 한번 존재할 수 있다. 게임에서는 이 숫자가 적은 게 아니다. 오크를 100마리 잡아 오라는 퀘스트를 던지는 게임에서는 이 숫자가 절대 적은 숫자가 아니다. 그냥 1만 명이 5번씩만 하면 5만 번이다. 그리고 1만 명 중의 한 명한테는 그게 5번만의 일어난 일이다.

     

물론 이러한 부조리함조차 현실을 반영한 게임의 재미일 수 있다. 하지만 적어도 그런 일이 존재할 수 있다는 일을 적어도 잊지는 않는 것이 중요하지 않을까 싶다. 럼즈펠드 말대로 알지 못한다는 것을 알지 못하면 언젠가는 더 크게 비용을 치를 수도 있으니까.

     

마지막으로 적어도 사기는 치지 말자.

Tags:

이경혁.jpg

(게임개발자, 연구자)

게임애호가, 게임프로그래머, 게임역사 연구가. 한국게임에 관심이 가지다가 자료를 모으고 정리하는 것에 취미를 붙이고 2006년부터 꾸준히 자료를 모으고 정리하고 있다. 〈한국게임의 역사〉, 〈81년생 마리오〉등의 책에 공저로 참여했으며, 〈던전 앤 파이터〉, 〈아크로폴리스〉, 〈포니타운〉, 〈타임라인던전〉 등의 게임에 개발로 참여했다.

이경혁.jpg

bottom of page