最近,パズル&ドラゴンズ(パズドラ)で遊んでいます.行き帰りのバスの中では,読書や睡眠よりも,パズドラを好んでやっています.
そんな中,パズドラのコンボ判定は,単純な縦横3個消しではないことに気づきました.というのも,
?????? ?火火火火火 ??????
????? ?水??? ?水水水? ?水??? ?????
といった,一文字型やT字型(L字型,十字型も)のような5個消しだけでなく,
????? ?木木木? ?木木木? ?????
のように3個+3個が隣接している場合にも,これを1コンボ(この場合なら6個消し)として,判定しているからです.
ということでコンボ数判定のRubyスクリプトを書きました.ソースはGistに置いています.
手順の概略としては,縦方向,横方向にそれぞれ,消去可能な3つ揃いを検出してから,同時消しになる領域をとりまとめ,コンボ番号を振っています.
処理の主要部について,図を作ってみました.
動作確認は,CygwinとUbuntuのRuby 1.9/2.0/2.1で行いました.なお,消去後に上からドロップが落ちてきて再度コンボ判定,というのは入れていません.
今回試してみた工夫として,環境変数をもとに出力文字(日本語/ASCII)を設定するようにしてみました.動作例を載せておきます*1.
$ echo $LANG ja_JP.UTF-8 $ ruby pazdracombo.rb [start] 火闇闇水木水 火火火水木水 火光光水木水 木木木木水水 回光光光光光 [erase] *闇闇*** ****** *光光*** ****水* 回***** [combo] 1闇闇234 111234 1光光234 5555水4 回66666 $ LANG=C ruby pazdracombo.rb [start] 144232 111232 155232 333322 655555 [erase] *44*** ****** *55*** ****2* 6***** [combo] a44bcd aaabcd a55bcd eeee2d 6fffff