간단한(?) 파이썬 질문

간단한(?) 파이썬 질문

QA

간단한(?) 파이썬 질문

본문


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

초 간단 소코반이군요.

 

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

  주로 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 등)도 여전히 아쉽고요.

 

대충 여기서 끊습니다.

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

아 설명을 안적었네요.

퍼즐게임류입니다.

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

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

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

 

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

 

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

답변을 작성하시기 전에 로그인 해주세요.
전체 209
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT