テツポンドのブログ

テツポンドのブログ

テツポンド(Twitter : https://twitter.com/tetspond)のブログです。

【ポケモン】うたう1on1で後攻側やヒメリのみ持ちはどれくらい有利なのかプログラミングで調べてみる

うたう1on1についてプログラミングで調べてみたい 

 

(「プログラミング」で検索してこの記事を見つけたプログラマーの方々へ:この記事は、プログラミング初級者がポケットモンスターというゲームの中での特殊ルールについて計算した記事です。)

 

はじめに 

 

 うたう1on1という大会が開かれています。覚えさせることができる技が「うたう」のみ・1対1のルールです。うたうのPPが0になり出せる技がなくなった後、最終的にわるあがきで決着がつきます。

 詳細は醤油さんの以下の大会要綱参照です。正式名称は第一発言者に因んで「第一回珍獣歌う杯」となっています。通称が「うたう1on1」です。

showyu-frozen.hatenablog.com

 

 このルールについて考える中で抱いた疑問をプログラミングを使って調べてみました。今回の記事はそのことについて書きます。

 

 

※ 筆者はプログラミング経験時間3桁時間の初心者です。また、プログラミング以外の部分に関しても考えが足りていない可能性があります。この記事のどこかに間違いがあるかもしれないことをご了承ください。何か気がついた場合はご指摘くだされば幸いです。

 

 

基本データ・前提

 

技:うたう

相手をねむり状態にします。

PPは15(今回はポイントアップなどでPPを増やす行為は禁止されています)

命中率は55%

 

ねむり状態

 一般に信じられている言説に従い、ねむり状態により動けないのが1回であるのは1/3の確率、2回であるのも1/3の確率、3回であるのも1/3の確率であるとします。

 下記がねむりターンに関する検証動画です。1/3から大きく外れていることはないと思われます(本当は統計学の知見を使ってちゃんと記述すべきですが雑に書きました)。

【ポケモン剣盾】最速起きは何%?最長眠りは?さいみんじゅつの眠りターン確率を検証 - YouTube

 

技:わるあがき

威力50の物理技

持っている技のPPが0になると自動的に出る技

使用者は体力の1/4(小数点以下四捨五入)の反動ダメージを受けます。

 

 

持ち物:ヒメリのみ

持っているポケモンの技のPPが0になったときに発動し、PPを10回復します。

この道具を持っているポケモンはうたうを15+10で25回使えます。

 

 

抱いた疑問

 

 この「うたう1on1」では、「PPが先になくなったほうが、先行してわるあがきをするので基本的には反動ダメージにより先に倒れやすくなる よって、わるあがきが出るタイミングを遅くできるようにすばやさは低いほうがいい」という論があります。

 また、「ヒメリのみを持っていると、ヒメリのみを持っていないポケモンに対してわるあがき回避という点では有利」という論があります。

 

 これらの"どちらかに有利に働く要素"が実際どの程度の影響を与えるのか、気になったので調べてみたいと考えました。

 まずは、先攻と後攻のどちらがどのくらい有利か分かる仕組みを作り、そこから条件を変えてヒメリのみについても調べるという流れにしました。

 

 

準備 うたう1on1における「技うたうの使用」とは何であるのか

 

 うたう1on1における「技うたうの使用」とはどのような行動であるのかについて、考えました。構造把握のようなものがしたかったです。

 

 現在自分が行動するタイミングであるとします。どちらも起きている状態でこちらがうたうを使用する場合、4パターンの結果に別れます。

 以下、起きて行動するタイミングを「手番」と呼びます。 

 

(1)はずれ 45%の確率で生じる技はずれのパターン。発生確率135/300。PPを1消費した状態で相手の手番(起きて行動するタイミング)になります。

 

(2)あたり+1回ねむり 55%で当てた後、1/3の確率で相手の眠り行動不能が1回であるパターン。(相手視点で)通称・最短起き。発生確率55/300(18.33...%)。うたうで眠らせたターンと、眠っている相手に対してうたうを空打ちするターンで合わせてPPを2消費した状態で、相手の手番になります。 

 

(3)あたり+2回ねむり 55%で当てた後、1/3の確率で相手の眠り行動不能が2回であるパターン。発生確率55/300。眠らせるときに1、眠っている相手へ2、PPを使います。PPを3消費した状態で相手の手番になります。

 

(4)あたり+3回ねむり 55%で当てた後、1/3の確率で相手の眠り行動不能が3回であるパターン。通称・最長眠り。発生確率55/300。眠らせるときに1、眠っている相手へ3、PPを使います。PPを4消費した状態で相手の手番になります。

 

  以上のように、ターンではなく、「起きて行動するタイミング(=手番)」という区切りで眺めると、うたうの使用は何であるかを次のように考えることができます。

 

 うたうの使用は、自分のPPを

27/60の確率で1

11/60の確率で2  

11/60の確率で3  

11/60の確率で4 減らして、

相手に手番を渡す行為である 

 

 うたう1on1の序盤はこの繰り返しでできています。こちらが乱数でPPを減らし、あちらが乱数でPPを減らし、こちらが乱数でPPを減らし……という流れです。

 

 この捉え方をすることによって、ねむり状態をコード上で直接表現する必要がなくなるため、かなり楽になりました。

 

 

 

コード

 

Macに最初から入っているPython2で書きました。

+=と-=を使っていませんでした。

import random

s = 0
t = 0
u = 0

for i in range(1000000):
    a = 15
    b = 15
    c = 0
    d = 0

    while a>0 or b>0 :

        x = random.randrange(300)
        if a>0:
            if x< 135:
                a = a-1
            elif x>=135 and x<190:
                a = a-2
            elif x>=190 and x<245:
                a = a-3
            elif x>=245 and x<300:
                a = a-4
            if  a < 0:
                c = c - a
        else:
            c = c+1

        y = random.randrange(300)
        if b>0:
            if y<135:
                b = b-1
            elif y>=135 and y<190:
                b = b-2
            elif y>=190 and y<245:
                b = b-3
            elif y>=245 and y<300:
                b = b-4
            if b < 0:
                d = d - b
        else:
            d = d+1

    if c<d:
        s = s+1
    elif c==d :
        t = t+1
    elif c>d:
        u = u+1

print (s,t,u)

 

 初期値として、PPが15、わるあがきカウンターが0に設定されています。先攻側のPPがa、後攻側のPPがb、先攻側のわるあがきカウンターがc、後攻側のわるあがきカウンターがdです。

 

#

 先攻側と後攻側それぞれの手番で乱数に基づいてPPを減らします。PP0で手番を迎えた場合はわるあがきカウンターに+1します。

 PPが負の数になったときはその絶対値の数だけわるあがきをしているということなので、その分だけわるあがきカウントに加算します。たとえば、PP1でのうたうで最長眠りの乱数を引くとPPは-3になりますが、このときわるあがきカウンターに+3します。

 

 後攻側の手番が終わったときにどちらのPPも0である場合、終了するようになっています。終了するときにわるあがきカウンターを比較して、先攻側が多い、同じ、後攻側が多いの3つに分けます。

  わるあがきした回数が先攻側≧後攻側であれば、先攻側が先行してわるあがきをしていることになりますし、先攻側<後攻側であれば後攻側が先行してわるあがきをしていることになります。

#

 

 ##内を100万回繰り返し(本当に100万回)、その結果の分布を表示させます。

 

 

結果 

 

 初めて両方が”眠っていない相手へのわるあがき”をするターン開始時のわるあがき使用回数が

(a)先攻側<後攻側となるのはだいたい41.75%くらい

(b)先攻側=後攻側となるのはだいたい16.5%くらい

(c)先攻側>後攻側となるのはだいたい41.75%くらい

 

 プログラムの構造のとおり対称性があり、真ん中の(b)がそのまま両者の差になっています。先攻側有利のはずが対称性があり最初は戸惑いを生じさせますが、(b)では先攻側が(先攻なので)先行してわるあがきをするので、先攻側の先行わるあがきに含まれます。後攻である利点が発揮されるのは(b)の場面ということになります。

 

 先攻側が先行してわるあがきする確率は、下2つの(b)(c)を合わせて約58%でした。 

 

 「初めて両方が”眠っていない相手へのわるあがき”をするターン開始時」というタイミングで判定するようになっているのはプログラムの都合です。後攻側の手番が終わったときにどちらのPPも0である場合に判定に移るようになっているので、これを手番という言葉を使わずに表現すると「初めて両方が”眠っていない相手へのわるあがき”をするターン開始時」となります(のはず)。

 簡略化のために「うたうの使用=PPの減少」という解釈をもとにして簡単なコードにしたのですが、このために発生したこの判定タイミングが何か実戦との違いを生み出しているかもしれません。自分自身では問題ないと考えてはいるのですが。

 

 

ヒメリのみ

 

 先ほどの初期条件をちょっといじって、ヒメリのみを持っていることがどれくらい結果に影響するのか調べてみます。

 他は同じ条件で、片方または両方にヒメリのみを持たせた状態(=PP初期値を25にした状態)で実験しました。

 

 先攻側だけヒメリのみを持ったとき 先攻側の先行わるあがき確率は5.5%程度

 後攻側だけヒメリのみを持ったとき 先攻側の先行わるあがき確率は97.5%程度

 両方がヒメリのみを持ったとき 先攻側の先行わるあがき確率は56.75%程度

でした。

 

 ヒメリ持ちのすばやさ高いポケモンVSヒメリ持ちでないすばやさ低いポケモンのとき、1/20以上の確率でヒメリ持ちのほうが先行してわるあがきしてしまうようです。「5.5%」は、先ほどの(b)に当たる3%と(c)に当たる2.5%を足したものです。

 

 両方にヒメリのみを持たせたときに、どちらもヒメリのみを持っていないときと比べて先行わるあがき確率が下がっています。これは、うたうのPPが両者5である場合と両者1000である場合を考えると納得します。行動回数が多くなるほど、先攻後攻の影響が薄れていきます。

 

 

備考

 

 たくさんシミュレーションした結果の分布を見て書いていますが、厳密にやるなら統計学の知見に基づいて書くべきだと思います。

 先行してわるあがきしている側が必ず負けるとは限らない(これがこのルールを面白くしている)ことからもともと参考程度にしかならない調査なので、このくらいのレベルでやりました。

 

 

おわりに

 

 初めて自分が書いたコードを公開するので不安はありますが、面白いルールの大会考察にプログラミングを持ち込んでみたのでそれを見てもらいたいという気持ちが勝りました。

 

 今回は具体的なポケモンについては触れませんでしたが、そちらの考察もとても面白いルールです。別記事でどれだけ書くか分かりませんがいずれ自分の使用ポケモンなどの記事を公開しようと思います。

 

 今回はちょっと長いくらいの約4800字でした。

 お読みいただきありがとうございました。

 

 

記事一覧 - テツポンドのブログ

わるあがき カテゴリーの記事一覧 - テツポンドのブログ 

 

Twitterアカウント

テツポンド (@tetspond) | Twitter