june__Park 2021. 3. 1. 01:07
# 소코반

# 1. 게임 map의 사이즈는 7 x 7의 2차원 리스트이다.
# 2. 사용자로부터 벽의 설치개수를 물어 랜덤한 위치에 설치한다.
# 3. 공과 골대를 벽과 겹치지 않도록 랜덤한 위치에 설치한다.
# 4. 사용자로부터 플레이어의 위치 값을 입력받아 배치시킨다.
# 5. 플레이어는 상하좌우로 이동이 가능하다.
# 6. 플레이어를 이동시켜 공을 골대에 넣으면 게임이 종료된다.

# 예)
# 0 9 0 0 0 0 0
# 7 0 0 9 0 0 0
# 3 0 9 0 0 0 0
# 2 0 0 0 0 9 0
# 0 0 9 0 0 0 0
# 0 9 0 0 0 0 0
# 0 9 0 0 0 0 0
# 상(1)하(2)좌(3)우(4) 입력 : 1

# 0 9 0 0 0 0 0
# 3 0 0 9 0 0 0
# 2 0 9 0 0 0 0
# 0 0 0 0 0 9 0
# 0 0 9 0 0 0 0
# 0 9 0 0 0 0 0
# 0 9 0 0 0 0 0
# 게임 종료

import random

game = [[0] * 7 for i in range(7)]

size = 7
player = 2
ball = 3
goal = 7
wall = 9

wall_count = 0
p_y = 0
p_x = 0
ball_y = 0
ball_x = 0
goal_y = 0
goal_x = 0

# 벽 설치
wall_count = int(input("벽을 몇 개 설치하시겠습니까?"))
while wall_count != 0:
    r_y = random.randint(0, size-1)
    r_x = random.randint(0, size-1)

    game[r_y][r_x] = wall
    wall_count -= 1

# 공 설치
while True:
    r_y = random.randint(0, size-1)
    r_x = random.randint(0, size-1)

    if game[r_y][r_x] == 0:
        game[r_y][r_x] = ball
        ball_y = r_y
        ball_x = r_x
        break

# 골대 설치
while True:
    r_y = random.randint(0, size-1)
    r_x = random.randint(0, size-1)

    if game[r_y][r_x] == 0:
        game[r_y][r_x] = goal
        goal_y = r_y
        goal_x = r_x
        break

# 캐릭터 배치
while True:
    p_y = int(input("캐릭터의 y좌표 입력 : "))
    p_x = int(input("캐릭터의 x좌표 입력 : "))

    if game[p_y][p_x] == 0:
        game[p_y][p_x] = player
        break

# Game Start
while True:
    for i in range(size):
        for j in range(size):
            if game[i][j] == 2:
                print("[&]",end="")
            elif game[i][j] == 3:
                print("[◐]",end="")
            elif game[i][j] == 7:
                print("[★]",end="")
            elif game[i][j] == 9:
                print("[#]",end="")
            else:
                print("[ ]",end="")
        print()

    # finish
    if goal_y == ball_y and goal_x == ball_x:
        print("게임 종료")
        break

    mov = int(input("상(1)하(2)좌(3)우(4) 입력 : "))

    y = p_y
    x = p_x

    if mov == 1:
        y -= 1
    elif mov == 2:
        y += 1
    elif mov == 3:
        x -= 1
    elif mov == 4:
        x += 1
    else:
        print("[잘못된 입력입니다.]")
        continue

    if y < 0 or y >= size:
        print("[범위 초과]")
        continue
    if x < 0 or x >= size:
        print("[범위 초과]")
        continue
    if game[y][x] != 0 and game[y][x] != 3:
        print("[이동 불가]")
        continue

    # 공을 만난 경우
    if game[y][x] == 3:
        b_y = y
        b_x = x

        if mov == 1:
            b_y -= 1
        elif mov == 2:
            b_y += 1
        elif mov == 3:
            b_x -= 1
        elif mov == 4:
            b_x += 1

        if b_y < 0 or b_y >= size:
            print("[범위 초과]")
            continue
        if b_x < 0 or b_x >= size:
            print("[범위 초과]")
            continue
        if game[b_y][b_x] != 0 and game[b_y][b_x] != 7:
            print("[이동 불가]")
            continue

        game[ball_y][ball_x] = 0
        ball_y = b_y
        ball_x = b_x
        game[ball_y][ball_x] = 3

    game[p_y][p_x] = 0
    p_y = y
    p_x = x
    game[p_y][p_x] = 2