今年も北海道カーリングツアーが始まっています。北海道カーリング協会が2022年度に立ち上げた国内初のツアー戦で、6月から9月にかけて帯広・札幌・稚内・北見を回る全5ラウンド。全大会の結果にWCFのツアーポイントが付きます。しかも、ほとんどの試合がYouTubeで無料配信されています。
先月、ツアー第2戦のどうぎんカーリングクラシック(8月20〜23日、札幌)を流しっぱなしにして作業していたら、昔カーリングを題材にしたパズルゲームと、その試合を書き残すための記譜法を考えていたことを思い出しました。書きかけの仕様が手元に眠っていたので、引っ張り出して物理演算のほうを書き直し始めたのですが。
気がついたら、局面の勝率まで出るカーリングシミュレーターができあがっていました。CurlFlux(カールフラックス)です。ブラウザだけで動いて、無料で、登録もいりません。
🚀 忙しい人向けまとめ
- 公式寸法のシートで石を投げられる作戦ボード。ドラッグで投げる、狙って投げる、置いて並べる、の3通りの操作ができます
- 五輪・世界選手権・日本選手権など29試合の実戦記録を再生できて、途中の局面から自分で投げ直せます
- 「提案」を開くと、その局面の勝率・狙うべき点数・候補ショットの難易度が出ます。元データはWorld Curlingの公式記録22,384試合と47万投
- 記録は自作の記譜フォーマットPCNで保存。共有リンクで局面をそのまま人に渡せて、配信向けの画面もあり、スマホでも動きます

どんなものか
画面の真ん中がカーリングのシートです。石をつかんで氷の手前から投げると、速度が落ちるほど強くなる摩擦で減速しながら、回転の向きに応じた横向きの加速度で曲がって、止まります。石どうしがぶつかったときは反発係数と接線方向の摩擦で弾き、回転が相手の石に移ってヒットアンドロールになります。
石もハウスもWorld Curlingの公式規格どおりの寸法で、ホッグ間タイムやカール量は試合ごとの実測値に合わせることができます。
投げ方は3つ用意しました。
- ドラッグ投球。石をつかんで放すと、矢印の先が止まる位置の目安になります
- 狙って投球。ブルーム(狙い)とウェイト(強さ)を指定して投げる、実際のスキップの指示に近い形です
- 配置。石を置いて並べるだけ。局面づくりや、紙に描いていた作戦図の代わりに
ドラッグしている間は、すべての石がどう動いてどこで止まるか、そのショットが終わったあとの順位まで予測して出します。狙いを少し動かすと結果がどう変わるのか、投げる前に見えるわけですね。さすがに簡単すぎるので、実戦モードにすると番号も予測も消えて、本物のカーリングと同じ情報量で投げられます。

もうひとつが、スキップの指示をそのまま入力する形です。氷面をタップしてブルーム(狙い)を置き、ウェイトをガード・ドロー・ハック・ボード・ノーマル・ピールから選んで、回転の向きを決めて投げます。ウェイトを選ぶとホッグ間のタイムが出るので、実際の試合で聞く「14.1秒」みたいな数字と突き合わせられます。

得点ボードもあるので、自分たちの試合を1投ずつ記録して、あとで振り返ることもできます。
実戦の記録を再生できる「リプレイ」
いちばん作りたかったのがこの機能です。2018年平昌五輪の3位決定戦、日本とイギリス。第10エンド、イギリスのスキップが最後の一投でダブルテイクアウトを狙って外し、日本が5対3で銅メダルを決めた、あの場面。そのまま開けます。

もう8年も前になるんですね。この試合はTVerのアーカイブでも見られます。
再生バーでエンドや投球を行き来できて、石の軌跡も出ます。上の「ゲーム」タブに切り替えると、その盤面を引き継いで自分で投げられます。ミュアヘッド選手が外したダブルテイクアウト、あなたなら決められますか?

記録はWorld Curlingが公開しているShot by Shot(1投ごとの公式記録)から起こしたもので、現時点で五輪・世界選手権・日本選手権など29試合が入っています。ただしPDFに載っているのは投げ終わったあとの配置だけなので、前後の配置の差分からリゾルバで投球を逆算しています。実際の氷にはシミュレーターでは読めないばらつきがあるので、29試合のうち10試合は中継映像から氷の速さを測り、全投球を目で確認しながら手で直しました。
「提案」で勝率と狙いが出る
作りながら面白くなってしまったのがこちらです。「提案」を開くと、いまの局面でどれくらい勝てそうか、このエンドで何点を狙うべきか、候補のショットとその難易度が出ます。

数字は感覚ではなく、World Curlingの公式記録の集計です。勝率は4人制22,384試合のラインスコアから、ショットの難易度は47万投の採点から作りました。たとえば「同点で最終エンドを迎えた後攻の勝率」は全体で72.9%、「1点ビハインドの後攻」はどの局面でも50%を下回る、といった数字がそのまま入っています。
この集計の話はnoteで別に連載を始めました。カーリングを見る目が少し変わるかと思います。
コーチの代わりになるかというと、まだです
提案がどのくらい当てになるのか、意見ではなく数字で知りたかったので、一致率を測るツールを作りました。実戦6試合・229投について、提案の1位が実際に投げられたショットの種別と同じかを数えるだけのものです。
結果は48.9%。上位3つまで広げると69.4%でした。それなりに見えますが、「常にヒット系と答える」だけの基準線が40.6%あるので、実質8ポイントちょっとしか勝っていません。しかも終盤の局面の8割で、上位の候補どうしを統計的に区別できていない。「ドローかヒットか」までは言えても、「どこに置くか」は言い切れないわけです。
測って初めて分かった欠陥もありました。最初の計測でレイズ系の一致が47投中0。原因を追うと、候補を作るときにレイズをドローウェイトでしか投げていませんでした。実戦のレイズは味方のガードを押し込むプロモーションが多く、テイクアウトに近い強さで投げます。軽い球しか候補に出さないと、この系統がまるごと抜け落ちる。トップの選手が5投に1投は選ぶ手を、100投に1投しか思いつかない道具になっていました。
いまの立ち位置としては、エンドの最終投のように盤面がそのまま得点になる局面では強くて、中盤は目が粗い。コーチの代わりというより、電卓を持った勉強熱心な分析者、という感じです。この研究については続けていこうかと思います。
カーリングには記譜がない
作りながら、いちばん時間を使ったのが記録の形式でした。
カーリングは「氷上のチェス」と言われるくらい頭を使う競技なのに、チェスのPGNや将棋の棋譜にあたる、広く共有された記譜がありません。過去の試合を追いかけようとすると、World CurlingのShot by ShotというPDFに行き着きます。1投ごとに投げた選手・ショットの種別・回転の向き・0〜4点の評価が並び、各投球後の石の配置図まで付いた、かなり充実した資料です。
ただ、これを読んで試合を再現するのは骨が折れます。配置図は投げ終わったあとの静止画なので、石がどう動いて、どれが弾き出されたのかは、前後の図を見比べて頭の中で補うしかありません。慣れた人はできるのでしょうが、僕のような素人には難しい。そのうえPDFなので、検索も差分も取れず、プログラムから扱おうとすると画像認識から始めることになります。
そこで、チェスのPGN・チェッカーのPDNに倣ってPCN(Portable Curling Notation)という形式を作りました。1投1行のテキストです。
End 3 hammer=R
1 Y F>4
2 R D>4
3 Y T<43行目は「3投目、黄の石、テイクアウトを反時計回りで投げて4点(成功)」。種別と評価の記号はWorld Curlingの統計員マニュアルの定義をそのまま借りていて、回転だけは曲がる向きが目で見て分かるように > < に置き換えました。
この形式の良いところは、手元にある情報の深さに合わせて書ける点かと思います。エンド別得点だけの記録から、投球の記述、各投球後の全石座標、リリース時の速度まで、4段階のどこまで書いてもかまいません。テキストなのでgrepできますし、差分も読めます。1行ずつ足していけばライブ記録にもなります。
CurlFluxのライブラリはすべてこの形式で持っていて、リプレイは記録を読んで物理演算で動かし直しています。

仕様はCC BY 4.0でGitHubに置きました。
記譜だけで話が長くなるので、こちらは別の記事であらためて書きます。
共有と配信
局面はリンク1本で共有できます。物理演算を決定論的に作ってあるので、リンクを開いた人の画面でも同じ軌跡で同じ結果になります。Xに貼る局面カードもここから作りました。
配信をする人向けには、得点ボードとテロップだけを出す「配信ビュー」を用意しています。OBSで重ねると中継風の画面になります。

スマホでも動くので、電車の中で平昌の最終投を投げ直す、ということもできるようになりました。

あとは、中継で表示されるハウス内の画像を読み込めば、石を自動で認識して、そのままシミュレートできる機能も。

おわりに
作戦ボードのつもりで始めたのに、実戦の記録を入れて勝率を計算しはじめたら、カーリングを「見る道具」にもなってきました。中継を開きっぱなしにしておいて、気になった局面をその場で投げてみる、という使い方がいちばん楽しいという感じです。
北海道カーリングツアーは残りのラウンドも配信があるので、次は画面を2つ並べて見ようかと思っています。使ってみて気になったところがあれば、X(@creco)か Bluesky(@creco.net)で教えてください。

コメント