놀이터 › 가위바위보 › 서버 없이 하루 443판을 맞추는 법, 시계만으로 회차를 세는 구조
서버 없이 하루 443판을 맞추는 법, 시계만으로 회차를 세는 구조
이 게임에는 회차를 관리하는 서버가 없습니다. 그런데도 지구 반대편에서 열어도 같은 회차가 같은 시각에 끝납니다. 시계만 보고 계산하기 때문입니다. 자정부터 몇 초가 지났는지를 195로 나누면 몇 번째 판인지, 그 판의 몇 초째인지가 한 번에 나옵니다.
시간 구조
| 구간 | 길이 | 무슨 일이 |
|---|---|---|
| 고르는 시간 | 180초 (3분) | 가위 바위 보 중 하나를 고르고 바꿀 수 있습니다 |
| 그중 잠금 구간 | 마지막 10초 | 더 못 바꿉니다 |
| 결과 시간 | 15초 | 답이 공개되고 기록에 쌓입니다 |
| 한 판 전체 | 195초 |
하루는 86,400초입니다. 195로 나누면 443판이 나오고 15초가 남습니다. 그 15초는 다음 날 자정을 기다리는 시간입니다. 매일 같은 시각에 1회차가 시작되게 하려고 남겨 둔 것입니다.
기준 시각은 한국 시간 자정입니다. 그래서 시차가 다른 곳에서 열어도 회차 번호는 같습니다. 브라우저의 시계만 맞으면 됩니다.
서버가 없어도 되는 이유
보통 이런 게임은 서버가 회차를 관리합니다. 서버가 "지금 150회차, 남은 시간 72초"를 모두에게 알려주는 식입니다. 그러면 서버가 멈추면 게임도 멈추고, 사람이 몰리면 서버를 키워야 합니다.
여기서는 반대로 했습니다. 회차를 계산으로 구합니다.
| 구하는 것 | 계산 |
|---|---|
| 지금 몇 회차인가 | 자정부터 지난 초 ÷ 195, 소수점 버림 |
| 고르는 중인가 결과 중인가 | 195로 나눈 나머지가 180 미만이면 고르는 중 |
| 남은 시간 | 180 빼기 그 나머지 |
같은 시각을 넣으면 누가 계산해도 같은 답이 나옵니다. 그래서 서로 맞춰 볼 필요가 없습니다. 접속자가 한 명이든 만 명이든 계산량은 똑같습니다.
이렇게 하면 비용도 거의 들지 않습니다. 정적인 파일 몇 개만 올려 두면 되고, 사람이 늘어도 서버 비용이 늘지 않습니다.
마감 10초 전 잠금
고르는 시간 180초 중 마지막 10초는 잠깁니다. 그 동안은 버튼을 눌러도 안 바뀌고, 안내 창이 한 번 흔들립니다.
이것이 없으면 3분이 통째로 의미를 잃습니다. 마감 직전에 누르는 것이 손해 볼 일 없는 선택이 되기 때문입니다. 모두가 마지막 1초에 누르면 앞의 179초는 아무 일도 안 일어나는 시간이 됩니다.
10초로 정한 이유는 사람이 "아 지금 눌러야겠다"고 생각하고 손을 움직이는 데 걸리는 시간보다는 길고, 기다리기 답답할 만큼은 아니기 때문입니다.
홀짝과 15초 어긋나게
같은 구조로 도는 게임이 하나 더 있습니다. 홀짝입니다. 둘의 시간 구조는 같지만 홀짝은 15초 늦게 시작합니다.
| 게임 | 하루 중 시작 | 한 판 | 하루 판 수 |
|---|---|---|---|
| 가위바위보 | 자정 정각 | 195초 | 443판 |
| 홀짝 | 자정 + 15초 | 195초 | 443판 |
15초를 어긋나게 한 이유는 두 게임이 동시에 끝나지 않게 하려는 것입니다. 동시에 끝나면 둘 다 하는 사람은 같은 순간에 두 결과를 봐야 합니다. 어긋나 있으면 하나가 끝나고 숨 돌릴 때 다른 하나가 끝납니다.
15초라는 숫자는 하루를 195로 나누고 남은 나머지에서 왔습니다. 남는 시간을 버리지 않고 쓴 것입니다.
새로고침해도 남는 것과 안 남는 것
| 항목 | 새로고침하면 |
|---|---|
| 지금 회차와 남은 시간 | 다시 계산되므로 그대로입니다 |
| 지난 결과 (최근 10판) | 남습니다 |
| 내가 이번 판에 고른 것 | 사라집니다 |
| 어제 기록 | 사라집니다 |
회차와 시간은 계산해서 나오는 값이라 새로고침과 상관이 없습니다. 결과는 이 브라우저에 날짜와 함께 저장해 두기 때문에 새로고침해도 남습니다. 날짜가 바뀌면 통째로 비웁니다.
지금 판에 고른 것은 안 남습니다. 저장해 두면 창을 여러 개 열어 두고 여러 번 고르는 길이 생기기 때문입니다.
서버로 보내는 것이 없으니 다른 기기에서는 내 기록이 보이지 않습니다. 휴대폰에서 고른 것과 PC에서 고른 것은 서로 모릅니다.
같은 구조를 다른 게임에 쓸 수 있나
시간만 보고 회차를 세는 구조는 가위바위보에만 쓸 수 있는 것이 아닙니다. "정해진 간격으로 돌고, 모두가 같은 회차를 보고, 결과가 끝나는 순간 뽑히는" 형태면 무엇이든 됩니다.
지금은 가위바위보와 홀짝 두 개가 같은 코드로 돌아갑니다. 다른 점은 고를 수 있는 가짓수와 시작 시각뿐입니다. 가위바위보가 3개, 홀짝이 2개입니다.
대신 못 하는 것도 분명합니다. 여러 사람의 선택을 모아 결과를 내는 것은 안 됩니다. 몇 명이 무엇을 골랐는지 아무도 모으지 않기 때문입니다. 그런 게임을 만들려면 결국 서버가 필요합니다.