• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

키를 눌렀다가 떼는 이벤트에서,

21.03.08 16:06 작성 조회수 189

0

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                character_to_x = 0

두번째 줄을

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or pygame.K_RIGHT:
                character_to_x = 0

이렇게 바꿔도 작동하는거 같은데, 
이렇게 하면 안되는 이유가 있을까요???

답변 1

답변을 작성해보세요.

1

김경민님의 프로필

김경민

2021.03.09

안녕하세요! 첫번째 사진의 두번째 줄 if문을 풀어서 읽어보면

event.key == pygame.K_LEFT 가 True일 경우, 즉 '비교'의 결과가 True인 경우

or

event.key == pygame.K_RIGHT 도 '비교'의 결과가 True인 경우에

if 문 안의 내용이 실행됩니다.

하지만 두번째 사진의 두번째 줄은

event.key == pygame.K_LEFT 까지는 동일하지만,

or 연산자 다음에 오는

pygame.K_RIGHT

== 과 같은 비교연산이 아닌,  pygame.K_RIGHT 라는 pygame 라이브러리 안에 정의된

K_RIGHT 라는 "상수"입니다.

(수정) 괄호가 없을 시 or 보다 == 이 먼저 실행됩니다. *연산자 우선순위)

print(pygame.K_RIGHT)의 결과를 확인해 보세요!

파이썬의 조건문에 오는 0이 아닌 상수는 참으로 취급됩니다.

if (조건문) or (상수) 는 하나만 참이면 True를 반환하는

or 연산자에 의해 (조건문)에 상관 없이 상수 인해 항상 True가 됩니다.

다음 if문의 결과를 한 번 테스트해보세요

if 1234:

  print("1234")

if -1234:

  print("-1234")

if 0: 

  print("0") 이 줄은 출력되지 않습니다

(추가)

event.key == (pygame.K_RIGHT or pygame.K_LEFT)

처럼 괄호로 묶어도 올바른 결과가 나오지 않습니다.

uki020226님의 프로필

uki020226

질문자

2021.03.09

== 가 or 보다 우선순위를 가지고 있고,

따라서, 제 생각한대로, 

pygame.K_LEFT or pygame.K_RIGHT

둘중에 어떤 키든 떨어져도, 라는 조건이 되는게 아니라, 


event.key == pygame.K_LEFT

가 떨어지거나, 항상. ( pygame.K_RIGHT 는 상수이므로)

으로 작용하게 되서,
여기선 잘 작동하는 것처럼 보일지는 몰라도, 다른 키와 섞었을떄, 다른키가 떨어질떄에도, 오른쪽 키가 떨어진 것 처럼 작용할 수 있단 말인거죠?( 항상이니까)


김경민님의 프로필

김경민

2021.03.10

앗...  제가 우선순위를 반대로 말씀드렸네요... 실수했습니다 죄송해요 ㅠㅠ

== 가 or 보다 우선이기 때문에,

a == b or c 는 == 가 먼저 연산되어서

  1. a == b
  2. or c

순서가 됩니다.

문법에 오류는 없어 실행은 되지만, 첫번째줄 if문만 통과하면 두번째 if문으로 조건을 건 것은

상수를 대상으로 한 "or" 연산 때문에 항상 참이 되어 어떤 키가 눌렸는지 의미가 없어지는것이 맞습니다.