Pygame

[Pygame(파이게임)] 게임 맵 랜덤 생성

namu999 2025. 6. 4. 15:13
728x90

게임 마리오나 젤다의 전설과 같은 게임들은 각 스테이지마다 맵이 정해져 있고,

언제 어디서 게임을 불러오더라도 같은 분위기와 난이도의 맵을 경험할 수 있게 해준다.

그에 비해, 고전게임 플리피버드 그리고 마인크래프트의 경우, (고정 할 수 있지만) 매 시도마다 새로운 맵을 경험할 수 있다.

특히, 마인크래프트의 경우 많이 플레이 해 본 사람들은 알겠지만 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

때문에, 플레이어가 갈 위치의 땅이 (벽처럼) 플레이어 보다 높게 있을때는 움직이지 않고,

땅이 낮거나 같은 높이 일때만 움직이게 해주어야 한다.

 

최종적으로는 다음과 같다.

좀 더 수정할 부분이 보인다. 

땅 아래 이미지를 채워줘야하고, 땅 아래로 시작 시 게임 오버가 되기도 해야한다.

이것은 다음 글에서 같이 수정 해보도록 하겠다!

728x90