[파이썬 게임] 미로 찾기 게임 만들기 with 터틀그래픽

파이썬 게임 중에서 터틀 그래픽을 활용하여 간단한 게임인 미로 찾기 게임을 만들어 볼 수 있다. 터틀 그래픽 모듈을 활용하기 때문에 pygame 같이 모듈을 추가로 설치하지 않고 파이썬만 설치하다면 기본 라이브러리에 있는 turtle을 활용하여 누구나 만들어서 해볼 수 있는 게임 코드이다.

미로찾기 터틀 그래픽 게임 파이썬 게임

미로 찾기 게임 만들기

1. 코드 설명

  • 미로 데이터 : 미로는 2D 리스트로 표현한다. (숫자로 구분되어 있음, 0~3)
    • 0 : 터틀이 움직일 수 있는 길
    • 1 : 터틀이 지나갈 수 없는 벽
    • 2 : 터틀이 시작할 위치
    • 3 : 터틀이 최종적으로 도착할 위치

2. 게임 방법

  • 키보드를 활용하여 터틀이 움직일 수 있도록 하였으며, 벽은 통과할 수 없고 비어있는 공간만 지나 갈 수 있다. 미로에는 숨겨진 출구가 있는데 최종적으로 터틀이 그 위치에 도달하게 되면 게임은 종료가 된다. 간단하게 출구를 찾는 미로 찾기 게임이기에 만약 본인이 원하는 내용을 추가로 구현하여 시간내에 도착하거나 몇 초만에 도착하는지 등을 넣어 게임 요소를 변경 할 수 있으니 응용해보는 것을 추천한다.

3. 미로 그리기 함수의 원리

def draw_maze(maze):
    for y in range(len(maze)):
        for x in range(len(maze[y])):
            screen_x = -288 + (x * 24)  # x 좌표 계산
            screen_y = 288 - (y * 24)  # y 좌표 계산
            if maze[y][x] == 1:
                maze_turtle.goto(screen_x, screen_y)  # 터틀을 해당 좌표로 이동
                maze_turtle.stamp()  # 터틀 모양을 찍어서 벽을 그림
            elif maze[y][x] == 2:
                player_turtle.goto(screen_x, screen_y)  # 플레이어 시작 위치로 이동
                global start_x, start_y
                start_x, start_y = screen_x, screen_y  # 시작 좌표 저장

3.1. 이중 루프를 사용해 2차원 배열 탐색

"for y in range(len(maze))" : 미로 배열의 행을 탐색하는 코드

"for x in range(len(maze[y]]))" : 각 행의 열을 탐색하는 코드

3.2. 화면 좌표 계산

"screen_x = -288 + (x * 24)" : 배열의 x 좌표를 화면의 x 좌표로 변환한다. 여기서 -288은 화면의 왼쪽 가장자리 좌표이고, 24는 각 셀의 크기를 의미한다.

3.3 미로 구성 요소 그리기

"if maze[y][x]y == 1" : 배열 값이 "1이면 벽을 의미한다.
- "maze_turtle.goto(screen_x, screen_y)" : 터틀을 해당 위치로 이동시킨다.
- "maze_turtle.stamp()" : 터틀 모양을 찍어서 벽을 그린다. 모양은 네모 모양으로 설정.
"elif maze[y][x] == 2" : 배열값이 "2"이면 플레이어의 시작 위치를 의미한다.
- "plyayer_turtle.goto(screen_x, screen_y)" : 플레이어 터틀을 해당 위치로 이동 시킨다.
- "start_x, start_y = sscreen_x, screen_y" : 시작 좌표를 저장한다.

4. 미로 찾기 게임 최종 스크립트

import turtle

# 미로 데이터
maze = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 2, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],
    [1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1],
    [1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1],
    [1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]

# 터틀 초기 설정
screen = turtle.Screen()
screen.title("미로 찾기 게임")
screen.setup(700, 700)
screen.bgcolor("white")

# 터틀 객체 생성
maze_turtle = turtle.Turtle()
maze_turtle.shape("square")
maze_turtle.color("black")
maze_turtle.penup()
maze_turtle.speed(0)

player_turtle = turtle.Turtle()
player_turtle.shape("turtle")
player_turtle.color("blue")
player_turtle.penup()
player_turtle.speed(0)

# 메시지를 표시할 터틀 객체
message_turtle = turtle.Turtle()
message_turtle.hideturtle()
message_turtle.penup()
message_turtle.goto(0, 320)

# 게임 상태 변수
is_game_over = False

# 미로 그리기 함수
def draw_maze(maze):
    for y in range(len(maze)):
        for x in range(len(maze[y])):
            screen_x = -288 + (x * 24)
            screen_y = 288 - (y * 24)
            if maze[y][x] == 1:
                maze_turtle.goto(screen_x, screen_y)
                maze_turtle.stamp()
            elif maze[y][x] == 2:
                player_turtle.goto(screen_x, screen_y)
                global start_x, start_y
                start_x, start_y = screen_x, screen_y

# 플레이어 이동 함수
def go_up():
    if not is_game_over:
        move_player(0, 24)

def go_down():
    if not is_game_over:
        move_player(0, -24)

def go_left():
    if not is_game_over:
        move_player(-24, 0)

def go_right():
    if not is_game_over:
        move_player(24, 0)

def move_player(dx, dy):
    global is_game_over
    new_x = player_turtle.xcor() + dx
    new_y = player_turtle.ycor() + dy
    if (new_x, new_y) not in walls:
        player_turtle.goto(new_x, new_y)
        if maze[int((288 - new_y) / 24)][int((new_x + 288) / 24)] == 3:
            message_turtle.write("축하합니다!! 출구를 찾았네요!! ", align="center", font=("굴림", 16, "bold"))
            is_game_over = True
            screen.update()

# 벽 좌표 저장
walls = []
for y in range(len(maze)):
    for x in range(len(maze[y])):
        if maze[y][x] == 1:
            screen_x = -288 + (x * 24)
            screen_y = 288 - (y * 24)
            walls.append((screen_x, screen_y))

# 키보드 입력 설정
screen.listen()
screen.onkey(go_up, "Up")
screen.onkey(go_down, "Down")
screen.onkey(go_left, "Left")
screen.onkey(go_right, "Right")

# 미로와 플레이어 초기 위치 설정
draw_maze(maze)

# 메인 루프 실행
screen.mainloop()

Loading

댓글 남기기