테스트 사이트 - 개발 중인 베타 버전입니다

간단한(?) 파이썬 질문 채택완료

송고쟝 5년 전 조회 3,667

</p>

<p>def move(data) :</p>

<p>    global a , x , y</p>

<p>    """i는 x, j는 y를 나타냄"""</p>

<p>    i = 0</p>

<p>    j = 0</p>

<p>    if data == "R" :</p>

<p>        i = 1</p>

<p>    elif data == "U" :</p>

<p>        j = -1</p>

<p>    elif data == "L" :</p>

<p>        i = -1</p>

<p>    elif data == "D" :</p>

<p>        j = 1</p>

<p>    elif data == "RESTART" :</p>

<p>        print("재시작 하겠습니다.")</p>

<p>        restart()</p>

<p>        return</p>

<p>    else :</p>

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

<p>        return</p>

<p>    if a[y+j][x+i] != "X" :</p>

<p>            if a[y+j][x+i] == "." or a[y+j][x+i] == "-" :</p>

<p>                x += i</p>

<p>                y += j</p>

<p>                a[y][x] = "0"</p>

<p>                a[y-j][x-i] = "."</p>

<p>                return</p>

<p>            x += i</p>

<p>            y += j</p>

<p>            a[y][x] = "0"</p>

<p>            a[y-j][x-i] = "."</p>

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

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

<p>                    a[y+(j*2)][x+(i*2)] = "*"</p>

<p>                    a[y+i][x+j] = "."</p>

<p>                    a[y+(j*2)+i][x+(i*2)+j] = "*"</p>

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

<p>                    a[y+(j*2)][x+(i*2)] = "*"</p>

<p>                    a[y-i][x-j] = "."</p>

<p>                    a[y+(j*2)-i][x+(i*2)-j] = "*"</p>

<p>                else :</p>

<p>                    a[y][x] = "*"</p>

<p>                    a[y-j][x-i] = "0"</p>

<p>                    x -= i</p>

<p>                    y -= j</p>

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

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

<p>                a[y][x] = "*"</p>

<p>                a[y-j][x-i] = "0"</p>

<p>                x -= i</p>

<p>                y -= j</p>

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

<p>    else :</p>

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

<p>

 </p>

<p>def restart() :</p>

<p>    global a , x , y</p>

<p>    a = [\</p>

<p>        ["X","X","X","X","X","X","X","X","X","X"],\</p>

<p>        ["X",".",".","X","X","X",".",".",".","X"],\</p>

<p>        ["X",".",".",".",".",".",".",".",".","X"],\</p>

<p>        ["X",".","X","X",".","0",".",".",".","X"],\</p>

<p>        ["X",".",".","X",".",".",".",".",".","X"],\</p>

<p>        ["X",".","*","*",".",".","X","-","-","X"],\</p>

<p>        ["X",".","*","*",".",".","X","-","-","X"],\</p>

<p>        ["X",".",".",".",".",".",".",".",".","X"],\</p>

<p>        ["X","X","X","X","X","X","X","X","X","X"]\</p>

<p>        ]</p>

<p>    for i in range(0,len(a)) :</p>

<p>        for j in range(0,len(a[i])) :</p>

<p>            if a[i][j] == "0" :</p>

<p>                x = j</p>

<p>                y = i</p>

<p>    </p>

<p>

 </p>

<p>a = [\</p>

<p>    ["X","X","X","X","X","X","X","X","X","X"],\</p>

<p>    ["X",".",".","X","X","X",".",".",".","X"],\</p>

<p>    ["X",".",".",".",".",".",".",".",".","X"],\</p>

<p>    ["X",".","X","X",".","0",".",".",".","X"],\</p>

<p>    ["X",".",".","X",".",".",".",".",".","X"],\</p>

<p>    ["X",".","*","*",".",".","X","-","-","X"],\</p>

<p>    ["X",".","*","*",".",".","X","-","-","X"],\</p>

<p>    ["X",".",".",".",".",".",".",".",".","X"],\</p>

<p>    ["X","X","X","X","X","X","X","X","X","X"]\</p>

<p>    ]</p>

<p>for i in range(0,len(a)) :</p>

<p>    for j in range(0,len(a[i])) :</p>

<p>        if a[i][j] == "0" :</p>

<p>            x = j</p>

<p>            y = i</p>

<p>"""a[y][x] 이다"""</p>

<p>goal_x = [7,8]</p>

<p>goal_y = [5,6]</p>

<p>result = list()</p>

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

<p> </p>

<p>while True :</p>

<p>    counts = 0</p>

<p>    for i in goal_y :</p>

<p>        for j in goal_x :</p>

<p>            if a[i][j] != "*" and a[i][j] != "0" :</p>

<p>                a[i][j] = "-"</p>

<p>    for i in range(0,len(a)) :</p>

<p>        for j in range(0,len(a[i])) :</p>

<p>            print(a[i][j],end = "   ")</p>

<p>        print("\n")</p>

<p>    for i in range(0,len(a)) :</p>

<p>        counts += a[i].count("-")</p>

<p>    if counts == 0 :</p>

<p>        break</p>

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

<p>    move(answer)</p>

<p>print("성공!")</p>

<p>

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

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

조언 부탁드립니다!

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

답변 3개

채택된 답변
+20 포인트
B
5년 전

초 간단 소코반이군요.

 

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

  주로 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개

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

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

5년 전

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

 

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

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

송고쟝
5년 전
좋은조언 감사합니다!!

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

송고쟝
5년 전
아 설명을 안적었네요.

퍼즐게임류입니다.

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

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

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

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

로그인