"가위, 바위, 보!"의 "보"에 정확히 결과를 맞추기
가위바위보는 "가위, 바위, 보!" 하고 외치는 맛에 합니다. 이용자에게서 "손을 누르면 바로 구호가 나오고, 보 소리가 날 때 결과를 보여 달라"는 요청을 받고 구호 목소리를 넣었습니다.
간단해 보였지만 핵심은 타이밍이었습니다. 결과가 "보"보다 먼저 나오면 김이 빠지고, 늦게 나오면 답답합니다. 이 글은 그 타이밍을 맞춘 방법을 정리한 개발 일지입니다.
시간을 정해 두면 왜 안 될까
가장 쉬운 방법은 "0.4초마다 한 단어"처럼 시간을 정해 두는 것입니다. 하지만 브라우저가 글자를 소리로 바꾸는 음성 합성은 기기와 목소리마다 속도가 다르고, 첫 단어가 나오기까지 걸리는 시간도 매번 다릅니다. 시간을 고정하면 어떤 기기에서는 결과가 "바위"쯤에, 어떤 기기에서는 구호가 끝난 뒤에야 나옵니다.
방법: 단어마다 "소리 시작" 신호를 기다리기
그래서 구호를 한 문장으로 읽히지 않고 "가위", "바위", "보" 세 조각으로 나눠 차례로 읽게 했습니다. 음성 합성은 각 조각이 소리 나기 시작할 때 신호(onstart)를 보내 줍니다. 화면은 이 신호에 맞춰 손을 흔들고 단어를 크게 띄우며, 마지막 조각 "보"의 시작 신호가 오는 순간 아리의 손과 결과를 공개합니다.
- 손을 누르는 순간 세 조각을 음성 합성 대기열에 한꺼번에 넣습니다(누르는 동작이 있어야 소리가 허용되는 브라우저가 많아서 이때 바로 넣습니다).
- 조각마다 소리가 시작되면 화면에 그 단어를 띄우고 두 손을 한 번 흔듭니다.
- "보"(묵찌빠 공격 중에는 "빠")가 시작되는 순간 결과를 공개합니다. 아리의 손은 이때 처음 정해지므로, 내가 누른 손을 미리 보고 정하지 않습니다.
시험할 때는 가짜 음성 합성으로 바꿔 각 단어가 시작되는 시각과 결과가 화면에 뜨는 시각을 기록했습니다. 결과는 매번 "보"가 시작되는 바로 그 순간에 나왔습니다.
목소리가 늦거나 없을 때
- 한국어 목소리가 없는 기기: 목소리 대신 박자음으로 0.33초 간격의 구호를 냅니다.
- 목소리가 늦게 시작되는 경우: 0.5초 안에 첫 단어가 시작되지 않으면 화면이 먼저 진행하고, 단어 사이도 0.85초 넘게 기다리지 않습니다. 소리가 조금 어긋나도 게임이 멈추지는 않습니다.
- 조용히 하고 싶을 때: "구호 목소리" 버튼으로 끄면 박자음만 납니다.
어려움 아리는 무엇을 기억할까
가위바위보는 상대가 완전히 무작위로 내면 어떤 전략으로도 이길 확률이 3분의 1입니다. 그래서 "보통" 아리는 브라우저의 암호학적 난수로 완전히 무작위로 냅니다. "어려움" 아리만 이용자의 습관을 읽습니다.
어려움 아리는 3×3 표 하나를 기억합니다. "직전에 낸 손"이 가위·바위·보일 때 "그다음에 낸 손"이 각각 몇 번이었는지 세는 표입니다. 기록이 3번 이상 쌓이면 가장 많이 나온 다음 손을 예상하고 그 손을 이기는 손을 냅니다. 다만 읽히지 않도록 4번 중 1번은 일부러 무작위로 냅니다.
| 직전 내 손 | 다음에 가위 | 다음에 바위 | 다음에 보 | 아리의 예상 |
|---|---|---|---|---|
| 바위 | 1번 | 0번 | 4번 | 보를 낼 것 → 가위로 대응 |
| 보 | 3번 | 1번 | 1번 | 가위를 낼 것 → 바위로 대응 |
위 표는 습관이 있는 사람의 예시입니다. 바위 다음에 보를 자주 내는 버릇이 있으면, 어려움 아리는 금방 가위로 받아칩니다. 이 표는 게임을 새로 열면 비워지고, 어디에도 저장되지 않습니다.
한 판으로 끝나지 않게: 하트와 피버
구호를 넣으면서 한 판씩 끝나는 구조도 바꿨습니다. 나와 아리가 하트 3개씩 들고 시작해, 이기면 상대 하트가 하나 깨지고 먼저 상대 하트를 모두 깨면 매치에서 이깁니다. 3연승부터는 "피버"가 되어 이길 때마다 하트를 2개씩 깹니다. 무작위 상대에게 3연승할 확률은 약 3.7%(비기는 판을 빼고 보면 8분의 1)라, 피버는 자주 오지 않지만 오면 크게 반가운 보상이 됩니다.
작은 디테일들
- 결과가 나온 뒤에도 마지막 단어("보!")를 화면에 남겨 두었습니다. 처음에는 결과와 함께 지웠는데, "보"를 외친 느낌이 사라져서 되돌렸습니다.
- 묵찌빠에서는 공격권을 정하기 전까지는 "가위, 바위, 보", 공격권이 정해진 뒤에는 "묵, 찌, 빠"로 구호가 바뀝니다.
- 같은 버튼을 빠르게 연타해도 구호가 겹치지 않도록, 새 구호가 시작되면 이전 구호의 남은 신호는 무시합니다.
자주 묻는 질문
- 목소리가 안 나와요.
- 기기에 한국어 음성 합성 목소리가 없으면 박자음으로 대신합니다. 휴대폰이 무음 모드인지도 확인해 주세요.
- 아리가 내 손을 보고 내는 건 아닌가요?
- 아니요. 아리의 손은 결과를 공개하는 순간, 그전까지의 기록만 보고 정합니다. 이번에 누른 손은 쓰지 않습니다.