[Pygame(파이게임)] 게임 맵 랜덤 생성
게임 마리오나 젤다의 전설과 같은 게임들은 각 스테이지마다 맵이 정해져 있고,
언제 어디서 게임을 불러오더라도 같은 분위기와 난이도의 맵을 경험할 수 있게 해준다.
그에 비해, 고전게임 플리피버드 그리고 마인크래프트의 경우, (고정 할 수 있지만) 매 시도마다 새로운 맵을 경험할 수 있다.
특히, 마인크래프트의 경우 많이 플레이 해 본 사람들은 알겠지만 seed(시드)에 따라서 맵이 랜덤으로 생성된다.
후자의 경우 맵에 관한 데이터를 줄일 수 있고, 쉽게 플레이 횟수를 늘릴 수도 있기 때문에,
나 또한 맵이 랜덤으로 생성되도록 할 것이다.
맵 생성에 쓰이는 랜덤 생성 방식에는 여러 방법이 있겠지만,
난 전이 확률 행렬을 이용한 마르코프 체인 방식으로 맵을 만들 것이다.
P = np.array([[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
[0.2, 0.0, 0.0, 0.0, 0.4, 0.4, 0.0, 0.0],
[0.0, 0.2, 0.0, 0.0, 0.4, 0.2, 0.2, 0.0],
[0.0, 0.0, 0.2, 0.0, 0.4, 0.3, 0.1, 0.0],
[0.0, 0.0, 0.0, 0.2, 0.5, 0.2, 0.1, 0.0],
[0.0, 0.0, 0.0, 0.05, 0.1, 0.5, 0.25, 0.1],
[0.0, 0.0, 0.0, 0.05, 0.1, 0.2, 0.5, 0.15],
[0.0, 0.0, 0.0, 0.05, 0.1, 0.1, 0.3, 0.45]])
전이 확률은 다음과 같다,
높이를 총 8구간으로 나누어서 1행이 최하위층, 마지막 8행이 최상위층를 나타내고,
각 확률은 그 층에서 다음 층으로 갈 확률을 의미한다.
플레이어의 점프력에는 한계가 있기 때문에, 지하를 의미하는 1행~4행은 최대 4번까지 가능하다.
(5번 이상 지하가 선택된다면 플레이어가 점프로 땅을 넘어가지 못한다.)
그림으로 설명하자면 다음과 같다. 굵은 검은 박스가 화면일때, 빨간 박스들이 땅. 각 파란 숫자는 그 땅의 높이다.
화면 밖으로 나간 빨간 상자들은 화면에서는 보이지 않기 때문에 플레이어는 낭떠러지로 본다.
이제 이 맵의 높이와 순서대로, 앞 글에서 다룬것처럼 이미지를 보여주면 된다.
아직 할 게 조금 남았다. 플레이어가 이 땅 위에 서 있어야 한다는 것!
물론 플레이어가 서있을 땅(ground)을 계속해서 맵의 위치에서 가져오기만 한다면 된다.
하지만 생기는 또 다른 문제는
if self.p_y >= self.ground:
self.p_y = self.ground
이 코드! 이 코드에 따르면 플레이어는 자신보다 높은 땅의 x위치로 가는 것 만으로
순식간에 그 땅 위로 순간이동을 하고 만다.
pre_ground = self.ground
new_ground = map[((int(rem_d)*5+self.p_x+self.dx))//5]+200
if self.p_y <= new_ground:
self.p_x+=self.dx
self.ground = new_ground
때문에, 플레이어가 갈 위치의 땅이 (벽처럼) 플레이어 보다 높게 있을때는 움직이지 않고,
땅이 낮거나 같은 높이 일때만 움직이게 해주어야 한다.
최종적으로는 다음과 같다.
좀 더 수정할 부분이 보인다.
땅 아래 이미지를 채워줘야하고, 땅 아래로 시작 시 게임 오버가 되기도 해야한다.
이것은 다음 글에서 같이 수정 해보도록 하겠다!