간단한(?) 파이썬 질문 채택완료
</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개
초 간단 소코반이군요.
파이썬 커뮤니티에 올리는 것이 낫지 않을까 싶군요.
주로 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개
댓글을 작성하려면 로그인이 필요합니다.
답변에 대한 댓글 1개
퍼즐게임류입니다.
R U L D (Right Up Left Down) 라는 커맨드를 입력해 0를 움직여서 2x2로 되어있는 물체를 밀어서 2x2로되어있는 도착지점(-) 에 물체를 도달시키면 되는 게임입니다.
X로 표시된곳은 일명 장애물으로 물체 / 0 이 갈수없는 곳이고, 더는 도착지점으로 갈수없다고 판단될때 플레이어는 RESTART 를 쳐서 게임을 처음부터 다시 시작할수있습니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
이번에도 많은도움이 되었습니다! 정말 감사합니다!