わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

pazdracombo.rb: パズドラコンボ判定プログラム

最近,パズル&ドラゴンズ(パズドラ)で遊んでいます.行き帰りのバスの中では,読書や睡眠よりも,パズドラを好んでやっています.
そんな中,パズドラのコンボ判定は,単純な縦横3個消しではないことに気づきました.というのも,

??????
?火火火火火
??????
?????
?水???
?水水水?
?水???
?????

といった,一文字型やT字型(L字型,十字型も)のような5個消しだけでなく,

?????
?木木木?
?木木木?
?????

のように3個+3個が隣接している場合にも,これを1コンボ(この場合なら6個消し)として,判定しているからです.
ということでコンボ数判定のRubyスクリプトを書きました.ソースはGistに置いています.
手順の概略としては,縦方向,横方向にそれぞれ,消去可能な3つ揃いを検出してから,同時消しになる領域をとりまとめ,コンボ番号を振っています.
処理の主要部について,図を作ってみました.


動作確認は,CygwinUbuntuRuby 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

*1:日本語のコンボ出力は,Rubyスクリプトでは丸囲み数字を用いています(10コンボまで必要なため)が,はてなダイアリーでは丸囲み文字が化ける上に,「①」などの直書きはスーパーpre記法で無効化されるので,載せるにあたり全角数字に置き換えました.