麻雀得点計算スプレッドシートを作った話
この記事は mohikanz #analog-games Advent Calendar 2019 - Adventar の14日目の記事となります。
前日は しらぬいさんの 会社でやるのにおすすめのアナログゲーム - しぃぶろぐ。 でした。
自分も前職で後輩くんが主催してたボドゲ会に参加したりしていたんですが、業務後だったので、昼休みにちょっとやるみたいな発送はなかったですね。
しかしながら、昼にやることでいい感じにリフレッシュして午後の仕事へ取り掛かるというのはとてもいいんじゃないかと思いました。
短いゲーム的にはラブレターなんかもおすすめできそうだなと感じました!
さて、今回はmohizの中で、特に麻雀やりてぇ!という話が湧き上がり、でも集計時にしくじることあるよねということで、もうちょい簡単にどうにかならんかね!ということで、作成したスプレッドシートについて話をしていこうと思います。
とは言いつつも、麻雀の知識がないとわからない話ばかりになるのは仕様上仕方がない部分ではありますので、ご容赦を
本体
フリーです。コピーしてお使いください。
壊されてもマスターは別にとってあるので、まぁ、いいでしょう。
実現したいこと
作るにあたって、以下ができればいいかなという思想でやりました
- 人数は5人まで
- 麻雀は4人でやるゲームですが、5人で1人は抜け番という形も結構あるので5人にしました
- ウマはある程度自由が効くように入力可能に
- オカも上記同様。
- 場代は割り勘
- 入力は最終的な得点だけにして、残りの煩雑な計算(後述)は自動でやってもらう
ということで、実際の仕様をみていきましょう
仕様
基本的な情報を入れるシート
- 参加者を入力する欄
- ウマ、オカを入力する欄
- 場代を入力する欄
まとめるとこんな感じ
レートはお遊び用です。何かに換算できるという話です。1とかにするとテンピンです
参加者5人というのはわかりやすいです。4人のときは「5」とかいてある箇所を削れば後の場代計算を4人にしてくれます。
ウマという制度ですが、4位から1位へ、3位から2位へ払うポイントです。
この画像の場合は
- 4位から1位へ20ポイント
- 3以下2位へ10ポイント
を支払うという意味です。いわゆるウマ、ワンツーって言ってるやつですね。ワンスリーの場合、4位から1位へ30ポイント。差し引きで60ポイント分払っているのでトップとラスの差が大きくなります。
オカは基準点です。
ルールにもよりますが、基本的に麻雀のポイントの基準点は30000点となっています。
25000点持ちスタートで30000点以上をまずは目指すことになります。
5000点の差分は4人で20000点。ポイントにすると20点なのですが、この20点がいわゆるトップ賞となります。1位を取った人へのボーナスですね。
レートは(以下略)
場代は、人のお家でやってるときはいいですが、そうではないとき、いわゆる雀荘で卓を借りることになると思いますが、そこで発生する料金のことです。
結果入力シート
ここはシンプルを保つために、結果の得点のみを入れるシートになります。
抜け番の人は「-1」を入れることで無関係となるようにしています。
場の得点は全体で10万点なので、合計がそれ以外のときはチェックで赤くなるようにしてあります。
シンプルなのはいいことだ
得点シート
最終結果を出すシートです
細かい計算を書いていきます。
まずは五捨六入
四捨五入ではなく五捨六入。なんでこうなっているかの諸説はちょっとわからん。俺はそう教わってこういうものだと思ってしまっている・・・
どういうことかというと、
24600だったら25000として扱い
24500だったら24000として扱います。
ポイント化計算
五捨六入した値ーオカ という計算をし、更に1000で割ります。
オカ30000なら
(28000-30000)/1000=-2
(35000-30000)/1000=5
という具合ですね。
順位得点の加減算
1位~4位までをポイント化したら、順位に応じたウマをつけます。
最初の方に出した、4位から1位へとかのあのポイントです。
トップへトップ賞を加算
最後に、オカから計算したトップ賞を1位の人につけます。
これで計算終わり!
で、これをどう実現するか
長々計算方法を書いてきましたが、じゃあどうやって実現するか。
まずはクラウドでネット環境さえあれば誰にでも見れて共有できるという点からGoogleスプレッドシートを採用しました。
次に、結果さえ入力すれば自動で計算するように、つまりGASはなしで。
ということで、関数で頑張って実現しよう!
だいたいは vlookup で頑張れる
表計算ソフトにはシート参照をうまく使うことで柔軟に行っていけますが、 vllokup関数はその最たる例かなと思います。
基本情報シートのB列C列あたりが順位が確定できれば使えそうですね。
参照情報さえしっかり管理できれば上記の計算はすべて適用ができそうです
使った関数一覧
- rank
- 順位算出用
- round
- 五捨六入用
- vllokup
- 順位の数字をもとにいろいろな計算をするため
- if
- 分岐は必須よね
- isBlank
- isError
- 空白やエラーはなるべく自前でキャッチして計算したい
関数組み合わせ
計算式さえわかれば怖くない!ということで、計算式の完成形
=if(isBlank('結果入力'!B2),0,if(rank('結果入力'!B2,'結果入力'!$B2:$F2,0)=1,(C2+D2+E2+F2)*-1 ,if('結果入力'!B2=-1,0,round('結果入力'!B2/10000-0.01,1)*10-('基本情報'!$D$2)/1000+if(isError(vlookup(rank('結果入力'!B2,'結果入力'!$B2:$F2,0),'基本情報'!$B$2:$C$7,2,false)),('基本情報'!$D$2)/1000,vlookup(rank('結果入力'!B2,'結果入力'!$B2:$F2,0),'基本情報'!$B$2:$C$7,2,false)))+if(isBlank('結果入力'!B2),0,if(rank('結果入力'!B2,'結果入力'!$B2:$F2,0)=1,20,0))))
上で書いた計算がすべてここに入ってきます。
順位計算は rank('結果入力'!B2,'結果入力'!$B2:$F2,0)
五捨六入してポイント化は round('結果入力'!B2/10000-0.01,1)*10
ウマの計算は vlookup(rank('結果入力'!B2,'結果入力'!$B2:$F2,0),'基本情報'!$B$2:$C$7,2,false)
トップ賞は if(rank('結果入力'!B2,'結果入力'!$B2:$F2,0)=1,20,0)
後は細かなエラーとか空白を抑制するための分岐で構成されています
レート、チップ、場代の計算は割愛します!
終わりに
後は拡張するなら
- 半荘10回以上の入力への対応
- チップが固定値になっているのを基本情報で制御するようにする
くらいですかね。割といじるところが少なくなっていて自分的には満足です。
実は書いてないんですが、トップの人は2~4位の人の合算値にトップ賞を足す形にしています。こまい話なんですが、五捨六入のケースによっては端数が出るというのが1回目に使用した時に判明したので、この形になっています。
このツールで得点計算への煩わしさから開放されるといいなと思います!