본문 바로가기
잡생각/일기쓰기

[가설] 풋볼데이 구동 알고리즘

by Thdnice 2014. 1. 16.
반응형

들어가기에 앞서





http://thdnice.tistory.com/144 를 먼저 읽어주시길 바랍니다. 

(물리적으로 접근한 풋볼데이 카드 확률에 대한 내용)


  일단 이 글은 리버스 엔지니어링이라던가, 소스를 어떻게든 해킹해서 풀어낸 내용이 아니라, 추측에 의한 가설이므로 본문의 내용을 맹신한다던가, 또는 이를 완전히 맞다고 가정하고 나서 생기는 불이익이나 비난으로부터 필자는 완전히 자유로움을 명확히 한다. 다만 현재까지 알려진 여러가지 정황상 이런식으로 구동되고 있을 확률이 높다 라는 것만 미리 밝혀둔다. 




득점가능 상황에 대하여

  일단 알려진 몇가지 정황을 먼저 정리하고 넘어가자

  •  하이라이트 관련
    • 하이라이트 장면을 통해서 득점상황이 발생한다.
    • 그러나 하이라이트 자체는 게임과 아무런 관계가 없다.
    • 하이라이트는 중복된 장면이 많다.
    • 게임을 진행중 인터넷 연결을 종료하면 게임이 멈추지만, 하이라이트의 경우에는 하이라이트 장면이 끝난뒤에 종료된다.


  자, 일단 하이라이트 장면을 통해서 득점상황이 발생하는 건 대부분의 유저들이 알고 있을 것이다. 단, 자유게시판에 하이라이트 없이 점수차가 발생한 경우에 대한 제보가 있으나, 그 이후 확인된 바가 없고, 주변 지인을 통해서도 하이라이트 없이 득점된 경우가 없기에 이는 무시하고 넘어간다. (사실 꼭 하이라이트가 있을 필요는 없지만 이해를 위해서 득점 = 하이라이트 상황 발생 이라고 두는 편이 직관적이므로)


  두번째는 하이라이트 안에서 발생한 상황이 게임과 아무런 관계가 없다는 것이다. 이는 이미 게시판에서 많은 분들이 제보해주신 내용인데,( #1, #2, #3, #4, #5 ) 세번째와 연계해서 생각해봤을 때, 하이라이트는 그냥 미리 녹화된 (혹은 만들어진) 많은 장면중 하나이며, 어떤 조건이 만족되면 하이라이트중 하나를 불러와서 호출하는 것으로 이해된다. 이는 전에도 어떤 분께서,  하이라이트에서 이루어진 패스와 실제 기록되는 패스의 수치가 일치하지 않음을 밝히신것과 일맥상통한다.


  마지막으로 네번째 사실에서 다시한번 확인 할 수 있지만, 하이라이트는 "아마도" 미리 저장된 여러가지 상황중 하나를 로드해서 재생하는것 이상도 이하도 아니다. (밑에 해설이 정확히 일치하는 것만 보아도 미루어 짐작할 수 있는 바이긴 하지만..)

 



알고리즘을 구현한다면..

  그렇다면 하이라이트는 어떤 조건에서 호출되는가가 게임의 핵심 알고리즘이 될 텐데, 이에 대한 본인의 가설을 설명하기전에 웹게임의 가장 기초적인(그리고 원시적인) 형태의 게임을 하나 소개한다.


아스트랄 투닥투닥 (출처 "http://blcat.kr/@/fight.php") 


  의외로 간단한 구동방식으로 이름을 적어 넣으면, 이름을 적당한 스탯으로 변환한뒤, Turn-by-Turn으로 적당한 난수값과 함께 공격/방어등의 수치를 넣어 계산한뒤에 이를 체력에서 제해 체력에 0이 되면 패배하는 알고리즘이다. 난수 seed가 고정되어 있는 것으로 보이므로, 아무리 반복해도 계속 똑같은 결과만 나타나며, 이름이 모든 스탯을 정하므로 최고의 이름만 알 수 있다면 100전 100승이 가능하다. 


  아무튼 이제 풋볼데이를 이런 구동형식을 가진 알고리즘이라고 가정해보자. 풋볼데이는 얼핏 보면 90분 + @의 시간을 가지는 리얼타임 시뮬레이터로 보이지만, 자세히 보면 시간이 지속적으로(Continuous)하게 진행되는게 아니고, Discrete하게 진행되므로 충분히 Turn-by-Turn으로 계산된다고 가정할 수 있다. 즉 대략 10초를 1턴(혹은 1틱) 으로 계산되고, 이를 토대로 대충 계산해보면 대략 600Turn짜리 턴게임으로 변환가능하다. (이를 물리에서는 quantize되어 있다고 표현하며 양자역학의 핵심내용중 하나이지만 여기서는 설명을 생략한다.)


  그러면 과연 내가 웹게임 구현을 할 때, 어떻게 하면 득점상황(정확히는 득점가능상황)을 호출 할 수 있을까? 가장 편한 방법은 Highlight 변수를 stack up 하는 방법이다. 일단 어떤 변수가 있는데 기본값은 0이고 이 값이 100이 차면 하이라이트를 불러 온다고 치자. 그리고 턴마다 (우리팀의 공격능력 - 상대팀의 수비능력)을 반영한 어떤 값을 채운다. 그리고 그 값이 100이 되면 하이라이트를 불러온다. 예를들어 한번에 10씩 채운다고 하면 약 10턴 뒤에 하이라이트변수는 100이 되게되고, 하이라이트를 호출 하게 된다. 이렇게 만든다면 구현도 쉽고, 구현 원리도일리가 있어 보인다. 


  그런데 이대로라면 너무 규칙적으로 하이라이트가 불러지는 문제가 있다. 즉 매 10턴 마다 하이라이트가 불러져야하는데, 실제 게임을 보면 그렇게 규칙적이지는 않다. 이 문제는 매번 차는 값에 일정량의 난수를 더하거나 곱하는 방법을 취함으로서 쉽게 해결된다. 조금더 복잡한(또는 흥미진진한) 결과를 위해서 특정 포메이션이나 전술상황에서는 100대신 90만 되어도 하이라이트를 호출 할 수 있도록, 어떤 포메이션에서는 110이 되어야 하이라이트를 호출 할 수 있도록 만들 수 있다. 


  그러면 마지막으로 골이 들어가는 하이라이트와, 골이 들어가지 않는 하이라이트는 어떻게 구별하는가. 이는 두가지 방법이 있는데, 애초에 변수를 2개 만들어서 골이 들어가지 않는 하이라이트를 따로 채우는 방법이 있을 수 있지만, 이보다는 차라리 하이라이트가 100이 찼을 때, 다시 한번 난수를 만들어서 골이 들어가는 하이라이트를 부를지, 안들어가는 하이라이트를 부를지를 결정하는게 더 큰 변수를 만들 수 있으므로 이쪽이 더 논리적으로 보이지만, 뭐 내가 알 수 있는 바가 없으니 넘어가도록 하고.


  물론 여기까지 순전히 나의 추측이고 가설이므로 이게 맞을 것이라는 보장은 전혀 없다. 다만 이런식이면, 하이라이트가 가짜(상황에 관계없이 그냥 여러가지중에 하나를 보여줄 뿐이라는)라는 말도 잘 설명되고, 또한 게임에서 지는게임을 반복하다보면 이기는 경우도 있는 이유도 잘 설명할 수 있다. 그렇다면 하이라이트를 호출하는 변수를 어떤값으로 채우는가에 대한 연구가 필요한데, 이건 그야말로 소스를 확인하지 않는 이상 정확히 아는것은 불가능하다. 


 다만 한가지 확인가능한것은, 선수 개개인의 능력이 반영되는지, 아니면 팀 전체의 값으로서 반영되는지는 확인 할 수 있는 방법이 있는데, 이는 지금 실험중이며, 최종 결과는.... 역시 공개하지 않으려한다. (도움을 주신분들께만 공개할 예정)










반응형