채택완료

간단한(?) 파이썬 질문

2020-09-05 (토) 23:43:47 3,818
Copy
def move(data) :

    global a , x , y

    """i는 x, j는 y를 나타냄"""

    i = 0

    j = 0

    if data == "R" :

        i = 1

    elif data == "U" :

        j = -1

    elif data == "L" :

        i = -1

    elif data == "D" :

        j = 1

    elif data == "RESTART" :

        print("재시작 하겠습니다.")

        restart()

        return

    else :

        print("올바른 커맨드를 입력해주세요.")

        return

    if a[y+j][x+i] != "X" :

            if a[y+j][x+i] == "." or a[y+j][x+i] == "-" :

                x += i

                y += j

                a[y][x] = "0"

                a[y-j][x-i] = "."

                return

            x += i

            y += j

            a[y][x] = "0"

            a[y-j][x-i] = "."

            if a[y+j][x+i] == "*" and a[y+(j*2)][x+(i*2)] != "X" :

                if a[y+i][x+j] == "*" and a[y+(j*2)+i][x+(i*2)+j] != "X" :

                    a[y+(j*2)][x+(i*2)] = "*"

                    a[y+i][x+j] = "."

                    a[y+(j*2)+i][x+(i*2)+j] = "*"

                elif a[y-i][x-j] == "*" and a[y+(j*2)-i][x+(i*2)-j] != "X" :

                    a[y+(j*2)][x+(i*2)] = "*"

                    a[y-i][x-j] = "."

                    a[y+(j*2)-i][x+(i*2)-j] = "*"

                else :

                    a[y][x] = "*"

                    a[y-j][x-i] = "0"

                    x -= i

                    y -= j

                    print("그곳으로는 움직일수 없습니다1.")

            elif a[y+j][x+i] == "*" and a[y+(j*2)][x+(i*2)] == "X" :

                a[y][x] = "*"

                a[y-j][x-i] = "0"

                x -= i

                y -= j

                print("그곳으로는 움직일수 없습니다.")

    else :

        print("그곳으로는 움직일수 없습니다.")


 

def restart() :

    global a , x , y

    a = [\

        ["X","X","X","X","X","X","X","X","X","X"],\

        ["X",".",".","X","X","X",".",".",".","X"],\

        ["X",".",".",".",".",".",".",".",".","X"],\

        ["X",".","X","X",".","0",".",".",".","X"],\

        ["X",".",".","X",".",".",".",".",".","X"],\

        ["X",".","*","*",".",".","X","-","-","X"],\

        ["X",".","*","*",".",".","X","-","-","X"],\

        ["X",".",".",".",".",".",".",".",".","X"],\

        ["X","X","X","X","X","X","X","X","X","X"]\

        ]

    for i in range(0,len(a)) :

        for j in range(0,len(a[i])) :

            if a[i][j] == "0" :

                x = j

                y = i

    


 

a = [\

    ["X","X","X","X","X","X","X","X","X","X"],\

    ["X",".",".","X","X","X",".",".",".","X"],\

    ["X",".",".",".",".",".",".",".",".","X"],\

    ["X",".","X","X",".","0",".",".",".","X"],\

    ["X",".",".","X",".",".",".",".",".","X"],\

    ["X",".","*","*",".",".","X","-","-","X"],\

    ["X",".","*","*",".",".","X","-","-","X"],\

    ["X",".",".",".",".",".",".",".",".","X"],\

    ["X","X","X","X","X","X","X","X","X","X"]\

    ]

for i in range(0,len(a)) :

    for j in range(0,len(a[i])) :

        if a[i][j] == "0" :

            x = j

            y = i

"""a[y][x] 이다"""

goal_x = [7,8]

goal_y = [5,6]

result = list()

"""도착지까지 옮겨놓았을때까지 실행했던 명령어들을 기록"""

 

while True :

    counts = 0

    for i in goal_y :

        for j in goal_x :

            if a[i][j] != "*" and a[i][j] != "0" :

                a[i][j] = "-"

    for i in range(0,len(a)) :

        for j in range(0,len(a[i])) :

            print(a[i][j],end = "   ")

        print("\n")

    for i in range(0,len(a)) :

        counts += a[i].count("-")

    if counts == 0 :

        break

    answer = input("이동할 방향을     입력해주세요 : ")

    move(answer)

print("성공!")

제가 파이썬을 배운지 얼마안됫지만 저번 행맨에 이어 두번째로 만든 작품입니다.

혹시 좀더 효율적으로 코드를 바꿀수 있거나, 필요없는 부분이 있는지 궁금한데

조언 부탁드립니다!

|

답변 3개 / 댓글 3개

채택된 답변
+20 포인트
2020-09-06 (일) 12:28:52

초 간단 소코반이군요.

파이썬 커뮤니티에 올리는 것이 낫지 않을까 싶군요.

  주로 PHP/HTML/JavaScript/CSS를 다루는 곳이라;

키 입력은 여전히 불편하군요. 단일 키 이벤트를 찾아보세요.

  대문자만 입력받는데, 소문자도 신경썼으면 좋았겠죠?

  커서키 이용을 못하면, 많이 사용하는 w a s d 조합도 좋겠죠?

  또는 2, 4, 6, 8 조합(키패드, NumLock Off) - wasd(WASD), 2468 모두 조건 추가하면 편하겠네요.

맵은 한 번 할당하면 되겠고

  배열이 아닌 텍스트로 할당하는 것이 보기도 좋고 수정도 편하겠죠?

  단일 상자, 단일 골인 지점이니 따로 goal_x, goal_y 할당할 필요도 없겠고요.

화면도 여전히 불편하군요.

  이동 방향 입력 : [커서 입력 위치]

  [맵 출력 위치]

  아니면, 화면 지우는 것 한 줄(import까지 두 줄) 추가하면 좋겠네요.

  세로로 한 줄 떨어져 있어서, 가로로도 한 칸 떨어뜨리는 것이 나아보이고요.

  * 아스키 코드 좋은데, 한글 환경에서 번거로우니 패스

  주로 1X1 기준이라 편했는데, 상자가 2X2 기준이라 은근 신경쓰이네요.

중지 처리(Q, Ctrl+C 등)도 여전히 아쉽고요.

대충 여기서 끊습니다.

답변에 대한 댓글 1개

파이썬 커뮤니티도 한번 찾아봐야겠네요!
이번에도 많은도움이 되었습니다! 정말 감사합니다!

효율적인 것을 찾지 마시고,  그 시간에 그냥 다양하게 코딩을 해 보세요.  다른 사람 코딩 스타일도 분석해 보시고,

나중에 본인이 짠 코드를 다시 보면,  이렇게 하는 것이 더 효율적인 것 같다는 느낌이 든다면,  그 때 부터 실력이 늘고 있다는 것입니다.

그리고 코드를 올리고 싶으면 파이썬 소모임에 https://sir.kr/so_python  올리세요

답변에 대한 댓글 1개

좋은조언 감사합니다!!
2020-09-06 (일) 00:58:43

제가 파알못이라 그러는데 이거 뭐 하는 프로그램이죠? 게임 같은데...

답변에 대한 댓글 1개

아 설명을 안적었네요.

퍼즐게임류입니다.

R U L D (Right Up Left Down) 라는 커맨드를 입력해 0를 움직여서 2x2로 되어있는 물체를 밀어서 2x2로되어있는 도착지점(-) 에 물체를 도달시키면 되는 게임입니다.

X로 표시된곳은 일명 장애물으로 물체 / 0 이 갈수없는 곳이고, 더는 도착지점으로 갈수없다고 판단될때 플레이어는 RESTART 를 쳐서 게임을 처음부터 다시 시작할수있습니다.

답변을 작성하려면 로그인이 필요합니다.