기본 콘텐츠로 건너뛰기

게임의 수학, 스탯과 대미지 계산 시스템을 효과적으로 재미있게 만드는 방법

    목차


대부분의 게임들은 스탯이라는 시스템을 가지고 있습니다.

이 스탯이라는 시스템은 대부분의 게임에서 캐릭터가 레벨업을 하거나, 스탯을 추가 시켜주는 아이템을 장착하거나, 스킬을 사용해서 올릴 수 있게 되어 있습니다.

하지만 많은 플레이어들은 이런 스탯을 그저 숫자 쪼가리 이상에 의미를 두려고 하지 않습니다. 그저 자신의 직업에 필요한 스탯의 숫자가 크면 좋다고 느끼는 것입니다.


예를 들어, 메이플 스토리의 스탯은 아예 자동 배분이라는 시스템을 도입하여, 대부분의 플레이어들이 같은 스탯으로 배분되게 되어, 스탯을 찍는다는 행위 자체가 없어졌습니다.
또한, 코어 플레이어가 아닌 일반적인 유저들은 자신의 스탯이 얼마인지, 어떤 방식으로 대미지 계산이 들어가는 지 모르고, 알려고 하지도 않습니다.
이는 메이플 스토리의 스탯과 대미지 계산 시스템이 지나치게 복잡해졌기 때문입니다.

이것은 메이플 스토리의 스트라이커라는 직업이 레벨 10에 배울 수 있는 매우 초반에 활용되는 스킬입니다.
하지만 그럼에도 '90초 동안', '1%확률', '30초 동안', '방어력을 1% 무시', '뇌전 버프', '최대 1회 누적 가능'
이라는 많은 효과와 조건들이 붙어 있습니다.

메이플 스토리의 대미지 계산식을 분석한 한 유저가 적은 대미지 계산식은 아래와 같습니다.
미지 = [ (주스탯 * 4 + 부스탯) * 총 공격력 * 무기상수 * 직업보정상수 / 100 ] * (스킬 퍼뎀 / 100) * (크리티컬 발동시) 크리티컬 미지 보정 * [ (100 + 공격력%) / 100 ] * [ (100 + 미지% + 보공%) / 100 ] * 방어율 무시 보정 * 렙차 보정 * 속성 보정 * (아케인포스 필요 적의 경우) 아케인포스 보정 * 숙련도 보정 * [ (모든 최종미지 계산값% + 100) / 100 ]      (1.1)
외울 수도 없을 만큼 복잡한 계산식을 두고 사람들은 '계산기 게임'이라는 말로 비아냥대기도 합니다.
이런 게임 특성상 다르게 표현할 수도 없겠지만, 이런 복잡한 시스템이 이 게임의 대미지 시스템을 지나치게 어렵게 만들고 있고, 코어 유저들과 라이트 유저간의 간극이 심하게 발생하게 됩니다.

유저들에게 직관적이고 알기 쉬운 게임을 만들기 위해서는 이런 스탯 시스템과 대미지 계산을 최대한 간결하게 만들어야 합니다.
디비니티 : 오리지널 씬2의 경우에도 메이플 스토리와 비슷하게 스탯을 배분하는 시스템이 있습니다. 힘, 기교, 지능, 건강, 기억, 재치로 총 6가지가 있습니다.
하지만 이 게임에서 공격력에 직접 영향을 주는 스탯은 힘, 기교, 지능 3가지입니다.
건강은 캐릭터의 체력을 늘려주고, 기억은 사용할 수 있는 스킬의 갯수, 재치는 치명타 확률 및 아이템 발견 확률 증가로 나뉘어져 있습니다.

여기서 알 수 있는 것은 앞서 말한 메이플 스토리는 모든 스탯이 공격력에 관련되어 있기 때문에 하나의 스탯에 모두 투자할 수 밖에 없습니다.
하지만 디비니티에서는 자신의 캐릭터가 부족한 점을 매꿔준다는 느낌과 장비 아이템의 필요 스탯을 중촉하는 만큼만 분배하게 됩니다.

이 외에도 전투 능력이라는 스탯 또한 존재하기 때문에 전투 시에 아쉬웠던 점을 다시 생각하게 되고, 다른 게임들의 '세부 직업'이라는 것을 이 전투 능력 스탯에서 직접 만들어 나간다는 점은 이 스탯 분배에 또 다른 재미를 줄 수 있습니다.

이런 점은 플레이어들에게 더 캐릭터를 육성한다는 느낌을 주게 되고, 레벨업을 하고 전략적 고민을 하게되면서, 실제로 스탯 하나하나에 캐릭터가 크게 성장하기 때문에 성장이라는 요소를 더 많이 느낄 수 있습니다.

게임의 대미지 계산은 수치가 크지 않아야 하고 간결해야 합니다.

슬레이 더 스파이어에 대한 이미지 검색결과
전략 카드 로그 라이크 게임인 '슬레이 더 스파이어'는 이런 점에서 매우 훌륭한 게임입니다.
플레이어들은 이 게임을 플레이 하면서 다른 게임과는 조금 다른 점을 느낄 수 있을 것입니다.
플레이어들은 몬스터들의 HP와 내가 주게 될 피해량을 하나하나 계산하게 됩니다.
이것이 가능한 이유가 이 게임은 대미지 계산이 간결하고, 수치가 크지 않기 때문입니다.

%EB%AA%BD%EB%91%A5%EC%9D%B4%EC%A7%88.png
'몽둥이질'카드
출처 : Slay The Spire 위키

이 게임의 캐릭터 아이언 클래드의 카드인 '몽둥이질'의 효과는 3코스트에 32의 피해를 입힌다. 입니다.
%EC%97%B0%ED%83%80.png
'연타'카드
출처 : Slay The Spire 위키
'연타'카드의 경우에는 1코스트에 2의 피해를 4번 줍니다. 입니다.

이렇게 누가 봐도 간결하고 알아보기 쉽기 때문에, 플레이어들은 어떤 상황에서 어떤 카드를 사용하는 것이 유용한 지 바로 알아볼 수 있습니다.

위의 경우에도 만약 적의 HP가 30인 경우에는 '몽둥이질'카드가 효율적이지만, HP가 10인 적이 있다면 두 카드 모두 사용하기 애매하기 때문에 한번 더 고민할 수 있게 됩니다.

또한 슬레이 더 스파이어의 스킬 카드들 또한 매우 생각하기 쉽게 디자인 되어 있습니다.
'신경독'카드는 모든 적에게 중독4, 약화2를 줍니다.
'촉매'카드는 적의 중독 수치를 2배 늘립니다.
플레이어들은 바로 '신경독'카드를 상용하고, 강한 적에게 '촉매'카드를 사용할 것입니다.

이런 경험을 느끼면서 플레이어들은 자신의 플레이가 대단해보이고, 전략적인 선택을 했다고 생각하게 되고 재미를 느낍니다. 모두 플레이어들 스스로 상상하고 예측했기 때문입니다.

이것이 가능한 것은 슬레이 더 스파이어의 피해량, 적의 HP가 매우 적기 때문입니다.
메이플 스토리는 억대가 넘어가는 피해량에 재미를 느끼지만, 이 게임은 아무리 커도 최대 4자리 정도가 최대입니다.
만약 연타 카드가 82,900의 피해를 13번 주고, 몽둥이질 카드가 14,000,000의 피해를 줬다면 이 게임의 재미를 느낄 수 없었을 것입니다.

또, 이 게임엔 %가 없습니다. %는 플레이어가 바로바로 계산하기가 매우 어렵기 때문입니다.
모든 카드들은 '피해를 2배로 줍니다.', '카드를 1장 버리고 새로 뽑습니다.', '방어도를 10얻고 10의 피해를 줍니다.'등 헷갈리게 만드는 요소가 전혀 없습니다.


유저들에게 게임의 전투 시 조금 더 전략적으로 생각할 수 있게 하는 방법, '딱딱 맞아 들어가는 플레이'에 재미를 느끼게 하기 위해서는 여러가지가 있겠지만, 그 기본은 대미지 계산을 플레이어들이 알 수 있고, 예측할 수 있게 만들어야 하고, 그 수치들의 값이 적어야한다는 것을 알 수 있었습니다.
대부분의 게임들에 이런 규칙을 적용하기에는 무리가 있겠지만, 분명 슬레이 더 스파이어는 이런 점이 매우 매력적인 게임이고, 이것을 잘 활용하여 특히 로그 라이크 게임들에 이런 규칙을 적용하는 것은 좋을 것 같습니다.

댓글

이 글도 관심 있으실 것 같아요!

놀이의 4대 요소 (Agon(아곤), Mimicry(미미크리), Ilinx(일링크스), Alea(알레아))

네덜란드의 고전 학자인 '요한 하위징아'의 저서인 「호모 루덴스 」에서 인간을 '유희의 인간'이라고 칭했습니다. 프랑스의 '로제 카유아'라는 학자는 「호모 루덴스 」의 이론을 발전시켜 그의 저서인 「놀이와 인간」 (원제 「 Man, plays and games 」) 에서 ‘놀이의 4대 요소’를 말했습니다. 저자는 그것을 아곤, 미미크리, 알레아, 일링크스로 소개했습니다. 이 네 가지 놀이의 요소는 인간의 모든 유희, 놀이에서 발전되어 현대의 비디오 게임에서도 매우 중요한 이론으로 알려져있습니다. 먼저, 아곤(Agon), 경쟁 아곤은 놀이의 주체와 객체간의 경쟁을 의미합니다. 사람들은 경쟁에서 승리함으로써 성취감을 얻고, 우월감을 느끼게 합니다. 이 아곤을 현대의 게임에 대입 시켜보면 경쟁은 최근 가장 많이 플레이 하는 게임 중 하나인 ‘배틀 그라운드’나 ‘리그 오브 레전드’같은 게임들도 경쟁에 기반이 되어있고, 혼자 플레이 하는 게임에서도 자기 자신과의 경쟁, AI와의 경쟁 등이 포함되어있습니다. 예를 들어, 슈퍼 마리오 같은 게임에서도 플레이어들은 어떻게 이 게임을 더 빨리 클리어하기 위해 경쟁하고, 더 많은 점수를 받기 위해 노력합니다. 또한 비교적 MMR시스템이 잘 짜여져있는 '리그 오브 레전드'같은 AOS게임에서도 플레이어의 등급을 결정하는 랭크 게임 시스템이 중점적으로 돌아가고 있고, '오버워치'의 경쟁전 등 많은 게임에서 이런 경쟁을 유도하는 시스템을 만들어 놓았습니다. 게임을 계속 플레이하게 만드는 가장 큰 요소가 아곤입니다. 많은 게임에서 플레이어의 경쟁을 어떻게 잘 이끌어 나갔느냐에 따라서 그 게임의 성공이 나뉠 수도 있습니다. 미미크리(Mimicry), 역할 미미크리는 역할을 의미합니다. 사람들은 실제 세계에서 하지 못하는 일들을 놀이에서 느끼면서 큰 기쁨을 느낄 수 있습니다. 이 역할은 롤플레...

FastAPI 실시간 영상 스트리밍 OpenCV

  FastAPI와 OpenCV를 활용한 실시간 영상 스트리밍 Permalink 실시간 영상을 스트리밍 하는 방법을 찾던 중 파이썬 FastAPI를 활용한 방법을 시도 해보았다. 필수 라이브러리 Permalink 필요한 것은 Python3.9버전 (애플 M1칩셋 맥북에어에서 3.8 버전으로 시도 해보니 OpenCV라이브러리 설치에서 문제가 발생했었다) FastAPI uvicorn OpenCV 정도면 될 것 같다. 라이브러리들은 모두 설치 되었다고 가정 하고, 예제 코드 Permalink # main.py # 라이브러리 import # StreamingResponse를 가져와야함 from fastapi import FastAPI from fastapi.responses import StreamingResponse # cv2 모듈 import from cv2 import get_stream_video # FastAPI객체 생성 app = FastAPI () # openCV에서 이미지 불러오는 함수 def video_streaming (): return get_stream_video () # 스트리밍 경로를 /video 경로로 설정. @ app . get ( "/video" ) def main (): # StringResponse함수를 return하고, # 인자로 OpenCV에서 가져온 "바이트"이미지와 type을 명시 return StreamingResponse ( video_streaming (), media_type = "multipart/x-mixed-replace; boundary=frame" ) # cv2.py import cv2 def get_stream_video (): # camera 정의 cam = cv2 . VideoCapture ( 0 ) while True : ...

Python FastAPI 알아보고 설치하고 초기 설정 해보기

  Python FastAPI, 설치하고 초기 설정 해보기 Permalink 파이썬 웹 서버를 만들어야 하는 일이 생겼늗데, 최대한 빠르고 안정적인 서버를 선택 해야했다. 그래서 기존에 사용하던 Flask보다 훨씬 빠르다고 하는 FastAP를 사용해보기로 했다. ❓ FastAPI란? Permalink 👉 FastAPI 공식 한국어 페이지  https://fastapi.tiangolo.com/ko/ FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다. FastAPI는 파이썬에서 사용 가능한 웹 프레임워크 중 하나인데, Flask나 Django보가 훨씬 빠른 속도를 보여준다고 하고, 확인 해봐야 하겠지만 Go언어와도 비슷한 속도를 보여준다고 한다. 또, 쉽고 간결한 코드, 200% ~ 300% 까지 증가하는 개발 속도를 기대할 수 있다고 하는데, 시작 해보자! 👏 Permalink FastAPI 설치 Permalink 먼저 공식 사이트에선 pip를 이용해 설치 하라고 나와있는데, 나는 anaconda를 이용해서 설치를 했다. bash $ pip install fastapi anaconda 사용 시 $ conda install fastapi 그리고 ASGI서버도 필요해서 같이 설치하라고 하는데, Univorn을 설치 해보자. bash $ pip install uvicorn[standard] anaconda 사용 시 $ conda install uvicorn FastAPI 예제 Permalink 설치가 완료되면 이렇게 vscode에서 FastAPI() 클래스가 자동 완성 되는걸 확인할 수 있다. 그리고 정말 간단히 API를 만들 수 있는데, main.py 파일을 만든 후에 from typing import Optional from fastapi import FastAPI app = FastAPI () @ app . get ( "/"...