Crystal에는 Bool이라는 타입이 있어요.
이 타입은 true와 false 값을 나타내요.
Crystal에는 세 개의 논리 연산자(!, ||, &&)가 있어요. 이 연산자들은 Bool을 조합해서 서로 다른 값을 만들어 내는 표현식을 만들어요.
&&)Crystal에서 and 연산자는 &&로 나타내며, 두 값이 모두 true이면 true를 반환하고, 그렇지 않으면 false를 반환해요.
and 연산자를 사용할 때는 &&의 오른쪽에 Bool 하나를, 왼쪽에 다른 하나를 놓아요.
true && true
# => true
true && false
# => false
||)Crystal에서 or 연산자는 ||로 나타내며, 주어진 값 중 적어도 하나가 true이면 true를 반환해요.
두 값이 모두 false이면 false를 반환해요.
or 연산자를 사용할 때는 ||의 오른쪽에 Bool 하나를, 왼쪽에 다른 하나를 놓아요.
true || true
# => true
true || false
# => true
false || false
# => false
!)Crystal에서 not 연산자는 !로 나타내며, 주어진 Bool이 false이면 true를 반환하고, true이면 false를 반환해요.
not 연산자를 사용할 때는 연산자(!) 뒤에 Bool 하나를 놓아요.
!true
# => false
!false
# => true
())불리언을 다룰 때는 괄호를 사용해서 어떤 Bool을 먼저 평가할지 정할 수 있어요. 괄호를 어떻게 사용하느냐에 따라 결과가 달라질 수 있어요. Crystal에서는 괄호 안에 있는 것이 먼저 평가돼요.
true && false && false || true
# => true
true && false && (false || true)
# => false
괄호 안에 있는 것이 먼저 평가되기 때문에, 다음 예제에서는 not 연산자가 괄호 안의 표현식에 적용돼요.
!true && false
# => false
!(true && false)
# => true
괄호는 결과에 영향을 줄 때만 사용해야 해요. 그렇지 않으면 생략하는 게 좋아요.
지금 호평을 받는 신작 게임 Crystal Hunter를 개발하고 있어요. 게임 속에서 이리저리 돌아다니며 크리스탈을 모으는 캐릭터가 돼요. 플레이어는 크리스탈을 모두 주우면 이겨요. 플레이어가 도적과 접촉하면 크리스탈을 전부 잃고 게임에서도 지게 돼요. 이 규칙에는 예외가 있어요. 플레이어가 활성화된 파워업을 가지고 있으면 도적에게 보이지 않게 돼요.
목표는 게임에서 사용할 규칙 몇 가지를 작성하는 거예요.
게임에서 캐릭터는 파워업을 가진 상태로 도적과 접촉하면 보너스 점수를 받아요.
Rules#bonus_points? 메서드를 정의해요. 이 메서드는 두 개의 인자(_캐릭터가 활성화된 파워업을 가지고 있는지_와 캐릭터가 도적과 접촉하고 있는지)를 받아서, 캐릭터가 보너스 점수를 받을지 여부를 알려 주는 불리언 값을 반환해요.
이 메서드는 캐릭터가 활성화된 파워업을 가지고 있으면서 도적과 접촉하고 있을 때만 true를 반환하고, 그렇지 않으면 false를 반환해야 해요.
Rules.new.bonus_points?(false, true)
# => false
플레이어는 게임에서 크리스탈이나 파워업을 주우면 점수를 얻어요.
Rules#score? 메서드를 정의해요. 이 메서드는 두 개의 인자(_캐릭터가 파워업과 접촉하고 있는지_와 캐릭터가 크리스탈과 접촉하고 있는지)를 받아서, 캐릭터가 점수를 얻었는지 여부를 나타내는 불리언 값을 반환해요.
이 메서드는 캐릭터가 파워업이나 크리스탈과 접촉하면 true를 반환하고, 그렇지 않으면 false를 반환해야 해요.
Rules.new.score?(true, true)
# => true
Rules#lose? 메서드를 정의해요. 이 메서드는 두 개의 인자(_캐릭터가 활성화된 파워업을 가지고 있는지_와 캐릭터가 도적과 접촉하고 있는지)를 받아서, 캐릭터가 지는지 여부를 나타내는 불리언 값을 반환해요.
이 메서드는 캐릭터가 도적과 접촉하고 있으면서 활성화된 파워업이 없으면 true를 반환하고, 그렇지 않으면 false를 반환해야 해요.
Rules.new.lose?(false, true)
# => true
Rules#win? 메서드를 정의해요. 이 메서드는 세 개의 인자(캐릭터가 모든 크리스탈을 주웠는지, 캐릭터가 활성화된 파워업을 가지고 있는지, 캐릭터가 도적과 접촉하고 있는지)를 받아서, 캐릭터가 이기는지 여부를 나타내는 불리언 값을 반환해요.
이 메서드는 캐릭터가 모든 크리스탈을 모았고 3번에서 정의한 인자를 기준으로 지지 않았다면 true를 반환하고, 그렇지 않으면 false를 반환해야 해요.
Rules.new.win?(false, true, false)
# => false
Exercism에 가입하고 Crystal 트랙을 개념 26개연습 문제 142개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.