パソコンで 「花札」を作るにあたって、役の配点についての考察
花札は、決められた役を揃え、相手より高得点を競うゲームである。役の配点には特に定まったものはなく、行う人によって適切に定めればよいのであるが、
(役の期待値)=(役の配点)×(役のできる確率)
として、どの役に対してもその期待値がほぼ等しくなるようにするのが、ゲームをおもしろくする要点であると考えられる。したがって、その役ができる確率を得る必要にせまられる。
花札の場合長い歴史の結果、役ができるおおよその確率は経験的に知られ、配点は自然に落ち着くところに落ち着いていて、人によって異なりはあってもそれほど大差はないものと思われる。したがって、パソコンゲーム「花札」を作るにあたっても、それらの幾つかを参考にして役の配点を定めることもできる。そうなのであるが、役のできる確率を理論的に計算できるものならばそれに越したことはあるまい。
ところが、役のできる確率を理論的に厳密に求めることは、容易なことではないということにすぐに気付かされる。その因はルールの複雑さにあることは言うまでもない。また、互いに高得点を目指すプレーヤの取る手法自体が役のできる確率に影響を及ぼす。さらに、いったん役の配点を定めたとして、その配点自体がプレーヤの取る手法に影響を与える。このような複雑な経過を経て最終的に落ち着くところに落ち着いたものが、適切な役のできる確率であり、役の配点となる。
すなわち、先に役のできる確率だけを単独に求めることはできなく、2人のプレーヤーの戦法や手腕も関わって決まる。このようなことを正しく表した多元連立方程式なるものができるなら、コンピュータを用いて数値計算でも行えば目的を達成できるであろう。しかしながら、このようなことを正しく数式で表すにはどうしたらよいのか。私の頭脳をもってしては、ただただ途方に暮れるのみである。
そこで、役のできる確率として次のように簡単に定義する。まず、2人のプレーヤーが全く思考をしないとする。すなわち、自分の手番になったとき手持ち札の1枚をランダムに選び場に出す。また、めくった山札に対して同種の札が場に2枚あったときはランダムにどちらかを選ぶ。この条件のもとで、役のできる確率をその役のできる確率とする。
これなら私の弱い頭脳でもなんとか確率を厳密に計算できるように思う。ということで、私がもう少し若くて元気があればそれに挑戦するところなのだが、そう若くはないし、またなんでもパソコンに頼って楽をしたがるズボラな私は、パソコンでシミュレーションしてみることを思いついた。
● まず、花札のルールにそったパソコンゲームを作る。2人のプレーヤーは、どちらもコンピュータとし、COM(A) と COM(B) とする。ただし得点はいっさい計算しないし、勝敗も付けない。したがって、役の配点は定めておく必要はない。札の点は、フケの回数を調べるために、3種の札に対して5点、1点、0点とし、役ができたときやシマ札が出来たときはフケにはしない。 ● COM(A) と COM(B) には、全く思考はさせない。すなわち、自分の手番になったら、手札からランダムに1枚選びそれを場に出す。また、山札を1枚めくったとき、場札に同種の札が2枚あったときはそのうちの1枚をランダムに選ぶ。
● このようなやり方で、ゲームを1000000回行なわせ、どの役が何回出来たかをカウントする。
結果を 表-1 に示す。この試行では、COM(A) を常に親(先手)にして行った。先手、後手によって役のできる回数に有意差があるように見える。また、「十短」については、1000000回の試行では回数が足りないと思われる。これらのことより、「十短」を除き、計の回数で役のできる確率を求めた。
表-1 1000000回ゲームを行って求めた、役のできる確率
※ COM(A) が常に親(先手) |
| COM(A) | COM(B) | 計 |
十短 | 0 | 0.000005 | 0.000005 |
七短 | 0.000252 | 0.000340 | 0.000592 |
六光 | 0.001051 | 0.001277 | 0.002328 |
五光 | 0.002654 | 0.002988 | 0.005642 |
四光 | 0.008819 | 0.009774 | 0.018593 |
松桐坊主 | 0.027610 | 0.029970 | 0.057580 |
てっぽう | 0.027685 | 0.029618 | 0.057303 |
猪鹿蝶 | 0.040221 | 0.043962 | 0.084183 |
月見で一杯 | 0.054756 | 0.056675 | 0.111431 |
花見で一杯 | 0.054624 | 0.056242 | 0.110866 |
大山 | 0.038936 | 0.042602 | 0.081538 |
小山 | 0.040805 | 0.043705 | 0.084510 |
赤短 | 0.040269 | 0.043634 | 0.083903 |
青短 | 0.040233 | 0.043407 | 0.083640 |
ニゾロ | 0.107192 | 0.119330 | 0.226522 |
フケ | 0.013744 | 0.011246 | 0.024990 |
(0点フケ) | 0.000075 | 0.000053 | 0.000128 |
(1点フケ) | 0.000768 | 0.000597 | 0.001365 |
(2点フケ) | 0.003392 | 0.002689 | 0.006081 |
(3点フケ) | 0.009509 | 0.007907 | 0.017416 |
|
七短の配点=10000点 としたとき、七短の期待値=10000×0.000592=5.92 となる。そこで、役の期待値が 5.92 になるように、他の役の配点を定めると、表-2 で配点-1 のようになる。
表-2 役の配点(点) |
| 配点-1 | 配点-2 |
十短 | | 1000000 |
七短 | 10000 | 10000 |
六光 | 2543 | 2500 |
五光 | 1049 | 1000 |
四光 | 318 | 300 |
松桐坊主 | 103 | 100 |
てっぽう | 103 | 100 |
猪鹿蝶 | 70 | 70 |
月見で一杯 | 53 | 50 |
花見で一杯 | 53 | 50 |
大山 | 72 | 70 |
小山 | 69 | 70 |
赤短 | 69 | 70 |
青短 | 69 | 70 |
ニゾロ | 25 | 30 |
フケ | 237 | (相手の得点) |
|
このようにして定めた 配点-1 において、区切りのよい配点に修正したものが 配点-2 である。配点-2 では、十短の配点はそのおおよそのできる確率から考えて、1000000点 とした。また、自分の得点が3点以下のときのフケについては、本来は250点の配点にすべきであるが、相手の得点がフケ勝者の得点、相手は0点とすることにする。
とりあえず、役の配点として 配点-2 を採用し、前回と同じやり方で 1000000回の試行を行ってみた。今回は総計得点も求め1ゲーム当たりの得点を求めた。またおよび勝率も求めた。結果は 表-3 である。前回と同じように COM(A) が常に親(先手)とする場合の他に、勝者が次のゲームで親(先手)になる場合でもやってみた。勝者が次のゲームで親(先手)になる場合には勝率がほぼ50%になる。このことより、後手の方が若干有利であると言える。
表-3 1000000回ゲームを行ったとき、1ゲーム当たりの得点(点)、勝率(%)、および役のできる確率 ※ 役の配点は、表-2 の 配点-2 を採用 |
| COM(A) が常に親(先手) | 勝者が親(先手) |
| COM(A) | COM(B) | 計 | COM(A) | COM(B) | 計 |
得点 | -7.813423 | 7.813423 | | 1.738594 | -1.738594 | |
得点(十短点は除外) | -5.813423 | 5.813423 | | -0.261406 | 0.261406 | |
得点(十短、フケ点は除外) | -5.327529 | 5.327529 | | -0.296260 | 0.296260 | |
勝率(%) | 48.162 | 51.838 | | 50.039 | 49.961 | |
十短 | 0.000005 | 0.000007 | 0.000012 | 0.000005 | 0.000003 | 0.000008 |
七短 | 0.000267 | 0.000348 | 0.000615 | 0.000309 | 0.000309 | 0.000618 |
六光 | 0.001012 | 0.001226 | 0.002238 | 0.001094 | 0.001169 | 0.002263 |
五光 | 0.002706 | 0.003053 | 0.005759 | 0.002795 | 0.002850 | 0.005645 |
四光 | 0.008978 | 0.009825 | 0.018803 | 0.009283 | 0.009392 | 0.018675 |
松桐坊主 | 0.027759 | 0.029789 | 0.057548 | 0.028847 | 0.028597 | 0.057444 |
てっぽう | 0.027748 | 0.029407 | 0.057155 | 0.028535 | 0.028816 | 0.057351 |
猪鹿蝶 | 0.040312 | 0.043896 | 0.084208 | 0.042178 | 0.041898 | 0.084076 |
月見で一杯 | 0.055072 | 0.056260 | 0.111332 | 0.055602 | 0.055428 | 0.111030 |
花見で一杯 | 0.055084 | 0.056271 | 0.111355 | 0.055747 | 0.055943 | 0.111690 |
大山 | 0.039414 | 0.042552 | 0.081966 | 0.040940 | 0.041254 | 0.082194 |
小山 | 0.040554 | 0.043987 | 0.084541 | 0.041950 | 0.042412 | 0.084362 |
赤短 | 0.040132 | 0.043383 | 0.083515 | 0.041574 | 0.042076 | 0.083650 |
青短 | 0.040180 | 0.043746 | 0.083926 | 0.041984 | 0.041851 | 0.083835 |
ニゾロ | 0.106481 | 0.118483 | 0.224964 | 0.113318 | 0.112508 | 0.225826 |
フケ | 0.013702 | 0.011317 | 0.025019 | 0.012505 | 0.012444 | 0.024949 |
(0点フケ) | 0.000068 | 0.000064 | 0.000132 | 0.000056 | 0.000063 | 0.000119 |
(1点フケ) | 0.000747 | 0.000585 | 0.001332 | 0.000577 | 0.000661 | 0.001238 |
(2点フケ) | 0.003320 | 0.002687 | 0.006007 | 0.003071 | 0.003016 | 0.006087 |
(3点フケ) | 0.009567 | 0.007981 | 0.017548 | 0.008801 | 0.008704 | 0.017505 |
|
以上のシミュレーションの結果より、役の期待値が役によらず同じにするには、役の配点を 表-2の配点-2 とするのが妥当である。しかしながら、ゲームをよりおもしろくするためには、お得な役 を2、3作っておいたほうがよい。そのように考え、私は役の配点を 表-4 のようにした。
表-4 私の採用した役の配点(点)と期待値(点) |
| 配点 | 期待値 |
十短 | 1000000 | 5.0 |
七短 | 10000 | 5.9 |
六光 | 3000 | 7.0 |
五光 | 1000 | 5.6 |
四光 | 500 | 9.3 |
松桐坊主 | 300 | 17.3 |
てっぽう | 300 | 17.2 |
猪鹿蝶 | 300 | 25.2 |
月見で一杯 | 50 | 5.6 |
花見で一杯 | 50 | 5.5 |
大山 | 50 | 4.1 |
小山 | 50 | 4.2 |
赤短 | 50 | 4.2 |
青短 | 50 | 4.2 |
ニゾロ | 30 | 6.8 |
フケ | (相手の得点) | |
|
表-4 には、期待値もあわせて示している。これをみて分かるように、「猪鹿蝶」、「松桐坊主」および「てっぽう」を特にお得な役として設定している。
∞∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
なにも思考をしない2人のプレーヤーが、勝者が次のゲームで親(先手)になるとして戦えば、勝率はほぼ50%になるのは当然である。では、一方は今まで通り全く思考しないプレーヤーとし、他方は役ができるならその札を選んだり、できるだけ5点札を取るようにするなど、思考するプレーヤーに設定した場合、役の出来る確率はどのようになるか、また勝率はどの程度変わるのかがとても興味のあるところである。
そこで、COM(A) の方だけ、役ができるならその札を選んだり、できるだけ5点札を取るように設定して、シミュレーションを行ってみた。結果を 表-5 に示す。
表-5 1000000回ゲームを行ったとき、1ゲーム当たりの得点(点)、勝率(%)、および役のできる確率 ※ COM(A):思考プレーヤー COM(B):無思考プレーヤー
※ 役の配点は、表-4 の 配点 を採用
※ 勝者が親(先手)
|
| COM(A) | COM(B) | 計 |
得点 | 96.250307 | -96.250307 | |
得点(十短点は除外) | 72.250307 | -72.250307 | |
得点(十短、フケ点は除外) | 86.530040 | -86.530040 | |
勝率(%) | 70.724 | 29.276 | |
十短 | 0.000024 | 0 | 0.000024 |
七短 | 0.001095 | 0.000086 | 0.001181 |
六光 | 0.004374 | 0.000241 | 0.004615 |
五光 | 0.007600 | 0.001032 | 0.008632 |
四光 | 0.024274 | 0.003250 | 0.027524 |
松桐坊主 | 0.052668 | 0.014794 | 0.067462 |
てっぽう | 0.056192 | 0.014142 | 0.070334 |
猪鹿蝶 | 0.074162 | 0.024540 | 0.098702 |
月見で一杯 | 0.072865 | 0.040562 | 0.113427 |
花見で一杯 | 0.070918 | 0.040748 | 0.111666 |
大山 | 0.081570 | 0.019124 | 0.100694 |
小山 | 0.072488 | 0.023691 | 0.096179 |
赤短 | 0.073945 | 0.026432 | 0.100377 |
青短 | 0.068954 | 0.025538 | 0.094492 |
ニゾロ | 0.122080 | 0.101220 | 0.223300 |
フケ | 0.001222 | 0.039249 | 0.040471 |
(0点フケ) | 0.000001 | 0.000297 | 0.000298 |
(1点フケ) | 0.000026 | 0.002723 | 0.002749 |
(2点フケ) | 0.000212 | 0.010817 | 0.011029 |
(3点フケ) | 0.00983 | 0.025412 | 0.026395 |
|
当然のことながら、思考する方が圧倒的に強い。といっても勝率が70%くらいであって100%にはならないのは、花札というゲームが偶然の要素を含んだものであることを意味している。この70%という勝率は理論的に限界なのかどうか気になるところである。COM(A) の思考をいろいろ変えたり、ちょっと複雑なものにして試みてみたが、私のアルゴリズム作成能力ではこの70%を越えることはできなかった。今後の課題である。
COM(B) の方も COM(A) と同じ思考をさせて戦わせてみた結果を 表-6 に示す。表-1 と比較して役のできる確率に多少の違いがあるが、傾向には違いはないようである。
表-6 1000000回ゲームを行ったとき、1ゲーム当たりの得点(点)、勝率(%)、および役のできる確率 ※ COM(A)、COM(B):同じ思考するプレーヤー
※ 役の配点は、表-6 の 配点 を採用
※ 勝者が親(先手)
|
| COM(A) | COM(B) | 計 |
得点 | 4.960498 | -4.960498 | |
得点(十短点は除外) | 1.960498 | -1.960498 | |
得点(十短、フケ点は除外) | 0.939491 | -0.939491 | |
勝率(%) | 50.102 | 49.898 | |
十短 | 0.000008 | 0.000005 | 0.000013 |
七短 | 0.000398 | 0.000420 | 0.000818 |
六光 | 0.001287 | 0.001296 | 0.002583 |
五光 | 0.003357 | 0.003283 | 0.006640 |
四光 | 0.010449 | 0.010423 | 0.020872 |
松桐坊主 | 0.032314 | 0.032458 | 0.064772 |
てっぽう | 0.031448 | 0.031187 | 0.062635 |
猪鹿蝶 | 0.047173 | 0.047202 | 0.094375 |
月見で一杯 | 0.058534 | 0.058622 | 0.117156 |
花見で一杯 | 0.057720 | 0.057391 | 0.115111 |
大山 | 0.044636 | 0.044404 | 0.089040 |
小山 | 0.045187 | 0.044988 | 0.090175 |
赤短 | 0.050064 | 0.049549 | 0.099613 |
青短 | 0.046014 | 0.045920 | 0.091934 |
ニゾロ | 0.109562 | 0.110159 | 0.219721 |
フケ | 0.007177 | 0.007304 | 0.014481 |
(0点フケ) | 0.000007 | 0.000013 | 0.000020 |
(1点フケ) | 0.000271 | 0.000251 | 0.000522 |
(2点フケ) | 0.001520 | 0.001554 | 0.003074 |
(3点フケ) | 0.005379 | 0.005486 | 0.010865 |
|
|