時計の針が重なる時刻を当てるゲーム
遊びをつくる執筆にClaudeを使用しています。

時計の針は、1時台のどのあたりで重なるでしょうか。1時ちょうどでは時針が「1」、分針が「12」にあり、離れています。分針は速く、時針はゆっくり動くので、どこかで分針が時針に追いつくはずです。ところが、その瞬間を「1時5分ごろ」と答えても、画面上の針は少しずれているかもしれません。 この記事は、この「追いつく瞬間」をプレイヤーが針を動かして探すゲームの設計書です。式で答えを出す問題は、スライダーで針を動かして目で確かめる遊びにすると、感覚で当てにいく余地が生まれます。そこで次の問いを立てます。「プレイヤーはどのくらいの誤差で重なる瞬間を当てられるのか。角度差の表示があると、その誤差は変わるのか」。 この問いに答えが出れば、「正解とみなす許容誤差を何分にするか」という難易度の数値が、自分の手元のデータで決められます。結果はこの記事には書きません。短いコードを動かし、数人に遊んでもらって確かめる手順だけを示します。
答えを先に確かめておく
判定の基準になる正解は、先に式で出しておきます。
- 分針は1分で6度進みます(60分で360度)。
- 時針は1分で0.5度進みます(12時間で360度)。
- 分針は時針より1分あたり5.5度速く進みます。
0時0分に2本の針が重なっているとして、分針が時針を1周分(360度)追い越すまでの時間は 360 ÷ 5.5 ≒ 65.45分、正確には 720/11 分です。重なる時刻は、0時0分からこの間隔で並びます。12時間で11回重なり、n回目は 720×n/11 分後です。
- 1、重なる時刻(秒未満は四捨五入):1時5分27秒ごろ
- 2、重なる時刻(秒未満は四捨五入):2時10分55秒ごろ
- 3、重なる時刻(秒未満は四捨五入):3時16分22秒ごろ
- 4、重なる時刻(秒未満は四捨五入):4時21分49秒ごろ
- 5、重なる時刻(秒未満は四捨五入):5時27分16秒ごろ
- 6、重なる時刻(秒未満は四捨五入):6時32分44秒ごろ
- 7、重なる時刻(秒未満は四捨五入):7時38分11秒ごろ
- 8、重なる時刻(秒未満は四捨五入):8時43分38秒ごろ
- 9、重なる時刻(秒未満は四捨五入):9時49分5秒ごろ
- 10、重なる時刻(秒未満は四捨五入):10時54分33秒ごろ
n=11 は 720分後、つまり12時ちょうどです。この表から、ゲームの設計に効く事実が二つ読み取れます。
一つ目は、11時台には重なる瞬間がないことです。10回目が10時54分台で、次は12時0分になります。出題を「1〜10時台」に限るのはこのためです。11時台を出すと「重ならない」が正解になり、別のゲームになってしまいます。
二つ目は、重なる時刻が「何分何秒」という切りのよい値ではないことです。プレイヤーは分や秒の目盛りを読んで答えるのではなく、針の位置関係を見て探すことになります。
最小のプロトタイプ
出題は「h時台で針が重なる瞬間を探してください」です。プレイヤーはスライダーで0〜719.9分の「通し分」を動かします。0が0時0分、60が1時0分、719.9が11時59分ごろです。針の角度は次のとおりです。
- 時針の角度 = 通し分 × 0.5
- 分針の角度 = (通し分 を60で割った余り) × 6
正解の通し分は 720×h/11 です。誤差はプレイヤーの通し分との差の絶対値で、単位は分です。誤差1分は、針の相対的なずれにして5.5度に当たります。
HTMLファイル1枚で動きます。外部ライブラリもサーバーも使いません。
<canvas id="c" width="240" height="240"></canvas><br>
<input id="s" type="range" min="0" max="719" step="0.1" value="0" style="width:240px">
<p id="d"></p><p id="t"></p>
<button id="ok">ここだ</button> <button id="nx">次の出題</button> <button id="hb">角度差の表示 切替</button>
<script>
const g=c.getContext('2d');
let h,q=[],res=[],hint=false;
function next(){
if(!q.length)q=[1,2,3,4,5,6,7,8,9,10].sort(()=>Math.random()-.5);
h=q.pop(); s.value=0; t.textContent=h+'時台で針が重なる瞬間を探してください'; draw();
}
function hand(a,len,w){
const r=a*Math.PI/180; g.lineWidth=w; g.beginPath(); g.moveTo(120,120);
g.lineTo(120+len*Math.sin(r),120-len*Math.cos(r)); g.stroke();
}
function draw(){
const m=+s.value, hourA=m*0.5, minA=(m%60)*6;
g.clearRect(0,0,240,240); g.beginPath(); g.arc(120,120,110,0,7); g.lineWidth=2; g.stroke();
hand(hourA,60,6); hand(minA,95,3);
d.textContent=hint?'針の角度差 '+(((minA-hourA)%360+360)%360).toFixed(1)+'度':'';
}
s.oninput=draw;
hb.onclick=()=>{hint=!hint;draw();};
ok.onclick=()=>{const e=Math.abs(+s.value-720*h/11); res.push([hint?'B':'A',h,e.toFixed(1)]); t.textContent=h+'時台 誤差'+e.toFixed(1)+'分 記録:'+JSON.stringify(res);};
nx.onclick=next; next();
</script>出題は1〜10時台を1回ずつシャッフルして出します。10問で一巡するため、時台の偏りがなくなります。「角度差の表示 切替」を押すと、分針が時針より何度進んでいるかが表示されます。重なりに近づくと、この値は0度か360度に近づきます。
実験の手順と記録の取り方
準備するもの
- 上のコードを保存したHTMLファイルと、ブラウザ
- 遊んでくれる人(3〜5人が目安です。自分ひとりでも始められますが、答えを知っている人は条件が変わります)
- 記録用の表計算シートか紙
条件と順序
比べるのは次の2条件です。
- 条件A:角度差の表示なし(針の見た目だけで判断する)
- 条件B:角度差の表示あり
各条件で10問(1〜10時台を1回ずつ)解いてもらいます。同じ人が先にAをやると、針の動きに慣れた状態でBに入ります。その影響を避けるため、半数の人はA→B、残りはB→Aの順にしてください。人数が少なければ、1人ごとに順序を入れ替える形でも構いません。
記録する項目
1回の「ここだ」ごとに、次の項目を記録します。
- 遊んだ人の識別(名前でなく「P1」「P2」など)
- 条件(AかB)と、その人が何番目の条件だったか
- 時台(1〜10)
- 誤差(分)。画面に出る値をそのまま写します
- 迷った回数(任意)。「ここだ」を押す前にスライダーを大きく行き来した回数を、見ていて数えます
画面下部に出る「記録:」の配列の中身は、条件・時台・誤差の順です。ページを再読み込みすると消えるので、1人遊び終えるたびに写してください。
単位をそろえる
分析の前に、誤差の単位を決めておきます。誤差(分)に5.5を掛けると、針の相対角度(度)での誤差になります。難易度を「何度までを正解とするか」で決めたい場合は、この換算を使います。
結果の読み方
時台ごとの傾向を見る
全員の記録を、まず時台別にまとめます。見るのは中央値(真ん中の値)と最大値です。平均だけだと、一度の大外れに引きずられます。
- 特定の時台だけ誤差が大きいなら、その時台で針の重なる位置が読み取りにくい可能性があります。
- どの時台も同じ程度なら、時台ではなく「重なりを見つける動作」そのものの難しさです。
条件AとBを比べる
条件ごとに誤差の中央値を出し、比べます。
- Bの誤差がAより明らかに小さければ、角度差の表示はよく効く補助です。ゲームではヒントとして位置づけられます。
- 差がほとんどなければ、表示が使われていないか、表示がなくても見た目で十分当てられている可能性があります。迷った回数や遊んだ人の感想も合わせて確認してください。
- Bで誤差が小さいのに、Aに戻すと急に大きくなる人がいれば、その人は数字に頼っています。針そのものを見る力を問うゲームにしたいなら、ヒントの出し方を再設計する根拠になります。
許容誤差を決める
最後に、正解とみなす許容誤差を決めます。ここは実験の結果ではなく、狙う難易度で決まります。
- 全員の誤差を小さい順に並べます。
- 「プレイヤーの何割に正解させたいか」を先に決めます。たとえば半数なら中央値付近、8割なら小さい方から8割目の値を、許容誤差の候補にします。
- その値が何度に当たるか、5.5を掛けて確認します。針の太さに対して小さすぎる値は、見た目では判断できないので避けてください。
人数が少ないので、この結果は傾向を見るためのものです。数字を断定せず、気になる点があれば遊ぶ人を増やして確かめます。
起こりやすい誤り
- 通し分と時刻を混ぜる。 スライダーは0〜719.9の通し分で、60で割った余りが「何分」です。分針の角度を通し分のまま×6にすると、60分を超えたところで針が何周も回ってしまいます。
- 11時台を出題に入れる。 11時台には重なりがありません。正解が12時0分に当たるため、ゲームとして成り立たなくなります。
- 角度差の0度と360度を混同する。 表示は 0.1度 のときも 359.9度 のときも、ほぼ重なっています。遊ぶ人には「0度または360度に近いところ」と説明しておきます。
- 針の向きと基準。 画面では上が0度で、時計回りに角度が増えます。コードの sin と cos の組み合わせを逆にすると、針が反時計回りに回ります。
- 学習効果で結論を急ぐ。 同じ人が10問解くと、針の動き方に慣れて後半の誤差が小さくなりやすくなります。順序を入れ替えるのはこのためで、条件の差と練習の効果を分けて読む必要があります。
- スマホでスライダーが細かく動かない。 画面が小さいと、0.1分刻みの操作が難しくなります。遊ぶ端末を記録に残してください。
次の行動
まずコードを保存し、自分で1巡(10問)遊んで、画面の誤差が上の表と合う感覚かを確かめてください。次に条件AとBで数人に遊んでもらい、誤差の中央値を時台別・条件別に並べます。手応えが出たら、許容誤差と得点の付け方を足してゲームに仕上げてください。アソバースには、HTML直下の index.html を入口にしたファイルを直接アップロードして公開できます。サイズ上限などの条件は、投稿画面の現在の案内で確認してください。

