일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 파이썬 기초
- Latent Dirichlet Allocation
- 타인의
- 공간밀도
- 정치
- 사회이슈
- 파이게임
- 응답하는
- 고통에
- 헌법
- 공부
- 지금 다시
- 네트워크
- 글쓰기
- python
- 사회면
- LDA
- 과학의과학
- 연구하며
- 인구
- 지금다시헌법
- 사법부
- 점프
- 사법
- 파이썬
- 사회
- pygame
- 횡스크롤
- 주요일간지
- 다정한것이살아남는다
- Today
- Total
RoNS 님의 블로그
[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
때문에, 플레이어가 갈 위치의 땅이 (벽처럼) 플레이어 보다 높게 있을때는 움직이지 않고,
땅이 낮거나 같은 높이 일때만 움직이게 해주어야 한다.
최종적으로는 다음과 같다.
좀 더 수정할 부분이 보인다.
땅 아래 이미지를 채워줘야하고, 땅 아래로 시작 시 게임 오버가 되기도 해야한다.
이것은 다음 글에서 같이 수정 해보도록 하겠다!
'Pygame' 카테고리의 다른 글
[Pygame(파이게임)] 캐릭터와 맵 적용 (0) | 2025.05.15 |
---|---|
[Pygame(파이게임)] 그림판 (0) | 2025.05.07 |
[Pygame(파이게임)] 플레이어 움직이기3 (점프 강약 만들기) (0) | 2025.04.30 |
[Pygame(파이게임)] 플레이어 움직이기2 (점프 만들기) (0) | 2025.04.24 |
[Pygame(파이게임)] 플레이어 움직이기1 (상하좌우 이동) (1) | 2025.04.24 |