본문 바로가기

기타 잡 코딩

슈퍼마리오 1을 플레이하는 AI를 만드는 방법(2)

1부에서는 슈퍼마리오 1의 현재 화면을 전처리하기 위해 메모리 뷰어를 뜯어보았고,

 

땅, 벽돌, 파이프 등의 정적 정보가 있는 메모리 위치를 파악 하였다.

 

하지만 정적 정보만으로는 인공지능이 적절한 행동을 판단하기에 부족하다.

 

마리오의 위치, 몬스터의 위치 등 플레이를 함에따라 움직이는 동적정보가 필요하다.

 

동적 정보들을 저장하고 있는 값들은 메모리의 특정 주소에 저장되어있을 것으로 파악된다.

 

특히 동적 할당 영역으로 추정되었던 0800 이전의 주소에 있을 것이다. (1부 참고)

 

 

주소를 정확히 찾기 위해서는 치트 엔진과 같은 프로그램이 매우 도움이 된다.

 

내가 원하는 값(예: 점수, 목숨 등)의 주소를 찾기 위해서 해당 값을 검색하거나 값의 변화를 검색해서

 

원하는 값의 후보 주소들을 줄여준다.

 

원하는 값의 주소를 찾았다면 직접 값을 바꿀 수도 있다.

 

 

놀랍게도, VirtualNES 에서는 이런 기능을 가진 "치트 도우미"를 제공한다.

 

위 처럼 마리오의 위치를 변화시켜가면서 위치 값을 저장하는 주소를 찾을 수 있다.

 

마리오의 x위치는 0086 006D이다

마리오의 y위치는 00CE

마리오의 x속도는 0057

마리오의 y속도는 009F

마리오의 상태는 0754 0756 : 꼬마는 10 성인은 01 불쏘는 성인은 02

각 몬스터의 x위치는 0087 0088 0089 008A 008B 

                           006E 006F 0070 0071 0072

각 몬스터의 y위치는 00CF 00D0 00D1 00D2 00D3

각 몬스터의 종류는 0016 0017 0018 0019 001A

 

observation 에 필요한 정보는 대략 다 찾은 것 같다.

 

reward에 필요한 정보는 무엇이 있을까

점수, 시간, 앞으로 나아간 정도, stage 정도가 있을 것 같다.

점수: 07DD ~ 07E4 (BCD 코드)

시간: 07F8 ~ 07FA (BCD 코드)

앞으로 나아간 정도: 071B 071C

stage: 075C 075F

 

reward도 다 찾았다.

 

이제 남은건

 

필요한 정보들을 시각화해서 각 주소값들이 필요한 정보들을 정확히 반영하는 지 알아보고

 

해당 정보들을 AI 한테 주는 일만이 남았다...

 

3부에서 계속