
対戦テトリスを抽象的に捉えてみよう(掘り編)
前回(火力編):
対戦テトリスにおいて攻撃手段にあたる「火力」と防御手段である「掘り」がどれだけ上手いかは大事になってくる要素の一つである、という話から、今回は防御手段の「掘り」を考えていきます。前回の記事を読んだ人向けのものなので、まだ読んでない人は置いてけぼりになります。気になる人は火力編も読んでみて。
「掘り指数」を考えてみよう
掘りを抽象化するのは難しい
前回と同じように、どれだけ「掘り」ができているかの指標である掘り指数をつくるために、掘りを構成する要素を挙げてみるわけですが、かなり難しいことが分かってくると思います。試しに軽いイメージを書き起こします。
サッと手際よくお邪魔を消していって上手くやり過ごしてる感じ
まあこんなもんですかね。サッと手際よくがいわゆる速く効率良くにあたるわけで、これは前回語った通り速度と積みの効率の話ですね。
お邪魔を消していってがおそらく掘りの定義に入るものでしょう。お邪魔を消すことが防御手段であり、その防御手段を掘りと呼ぶので、要素としては無視して構わないです。次に上手くやり過ごしてるを考えてみます。
「上手くやり過ごしてる」できることをさらに具体的に挙げてみましょう。
不利な状況から五分にまで持ち込んだり、死なずに耐えたりすること
とでも書きましょうか。不利な状況から五分にまで持ち込んだりがまだ不明瞭なのでまた「不利な状況から五分にまで持ち込んだり」できることを挙げてみると、
自分のリソースが相手と同じくらいになること
くらいなものですかね。じゃあ「リソース」ってなんやねんって話なんでまずはリソースが何なのかって話から・・・
…なんか多くないっすか?
こんな感じで掘りの要素はめちゃくちゃ多いです。前回と同じように考えていくと要素が多すぎて一つの式にまとめたときに複雑になりすぎちゃうんですよね。具体的な話をされると色々ありすぎてよく分かんなかったことを、全体を見ることで少しは簡単に捉えられる、ということがこの記事のテーマなので、複雑になってしまうのは元も子もないわけです。
なんでこんな複雑になるんだって気になる人のためにもう少し話をします。
とはいっても掘りが防御手段であることが理由で、防御というのはそもそも相手から攻撃されないことには始まりません。
つまりは掘りとは相手に依存した行動なんですね。その攻撃手段にも色々あるぞ、というのを前回考えてみたんですが、1つの攻撃方法に対していなすための防御方法は複数あるでしょう(単にダメージを軽減するか、カウンターに走るかなど)。
ここから掘り全体の要素を挙げようとすると、その要素はすべての火力に対応する行動すべてが持つものになってくるわけで、単純に火力の要素の数倍は多くなるでしょう。
長々と書きましたが、前回と同じようにやっていくのは得策ではないというだけです。リソースに関しては後々書きますので一旦スルーします。
簡単に定義してみる
ここでは掘りとは「受けたお邪魔を消す行為」と定義します。
いきなりどうしたって感じですが、これは要素を簡略化するための再定義のようなものです。掘りに該当しそうなもののうち、グレーなもの(掘りにあたるか微妙なやつ)をノイズとして排除することで、半ば強制的に抽象化できます。
グレーなものといえば、例えば置きミスして崩れた地形をRENで整える、といった行動は掘りなのか?などがありますが、今回はそれは全て掘りには該当せず、あくまで火力を出す行為としてみなします。
再定義は具体から抽象へ移る今までの方法と違い、抽象を固める・・・みたいな感じです。まあこういう方法もあるんだなと思っておいてください。
これにより掘り指数Dは「受けたお邪魔をどれだけ消せたか」を表すものになるので、掘り量をdownstackのd[L/m]とでもすると、
$$
\,\\
掘り指数D = \frac{d}{受けた火力量}\\
\,
$$
となるわけです。
(掘り量の単位量について、本当は実在する単位量であるDPM(d/m)にしたかったところなんですが、複雑にならないように、わざわざ消去ライン数を示すLと区別する必要はないと思い、L/mとしています。)
今回、掘り指数は割合を示しているので、0≦D≦1です。
ここからは「受けた火力量」はどういった値になるかを考えてみます。
実質火力は掘りの要素である
ここからは前回の記事の引用ラッシュです。
$$
火力指数A = ev [A/m]
$$
$$
実質火力指数R = r・ev = r・A [f/m]
$$
↑より、自分の火力指数、実質火力指数をそれぞれA1、R1=r1・A1とし、
相手の火力指数、実質火力指数をそれぞれA2、R2=r2・A2とします。
ここで、実質火力について、
実質火力は先打ちした火力のみに絞ったということです。
という記載があるように、実質火力指数とは先打ち火力指数のことであることから、逆に後打ち火力指数は、
$$
後打ち火力指数 = A-R \, \ (= (1-r)・A )[f/m]
$$
と表せます。何してんの?と思うかもしれませんが、これは「受けた火力量」を定義するうえで大事なことです。
受けた火力とは、相手から送られてきた火力のうち、相殺できなかった火力です。そりゃそうなんですが、またも前回の記事より
後打ちはいわゆる相殺をしたということになるんですが
と書かれている通り、後打ちは相殺するということに等しいです。つまり後打ち火力指数とは相殺火力指数、とも言い換えられるわけで、相手から送られてきた火力とは相手の実質火力のことなので、
$$
受けた火力量= (相手の実質火力指数)-(相殺火力指数)
\\=R2 -(A1-R1) [f/m]\ \ \ \
$$
と表せるわけです。ここまでくればようやく、と思いきや、これだけではまだ例外があって、例えばA1=51, R1=25, R2=25 のように、値が負となるパターンが存在してしまうんですね。これより、R1+R2とA1の大小によって場合分けして、
$$
受けた火力量= \begin{cases} R2 -(A1-R1) (R1+R2>A1)\\ 0 (R1 + R2 ≦ A1) \end{cases} [f/m]
$$
にしてしまいます。0である理由に関しては、A1のほうが大きければそもそも盤面としては何も受けていないのと同じになりますからね。
ここまでやってようやく、掘り指数Dは、
$$
掘り指数D = \begin{cases}\frac{d}{R2 -(A1-R1)} (R1+R2>A1)\\ 1 (R1 + R2 ≦ A1) \end{cases}[L/f]
$$
と表せるということがわかりました。受けた火力量が0であるとき、完全に掘りきっているのと同じなので、1としています。
今回最も注目してほしいのは、防御手段である掘りがどれだけできているかを表す指標に、実質火力が登場しているという点です。さらに言えば相手の実質火力にも依存しているので、いかに対人を想定した行動であり、かつ火力と密接に関わっているかが分かるかと思います。
掘り指数Dの値が大きくなる場合を考えてみると、分子のdの値が大きくなるか、もしくは分母のR2-(A1-R1)=R1+R2-A1の値が小さくなるかのどちらかが発生することが必要です。dの値を増やすことは、お邪魔をよりたくさん消しただけなので深く語ることはないので、分母のR2-(A1-R1)の値を小さくするということがなんなのかを考察してみましょう。
おわーってなってるかもしれないですけど、単純に考えれば相殺火力指数A1-R1の値を増やすか、相手の実質火力指数R2の値を減らすかのいずれかができれば良いということですね。実戦的な話を交えると、この両方をともに叶えることは非常に難しいことが分かりますが、今回は抽象的な話なので省きます。いつかの自分に丸投げしておきます。
これらから、より「掘り」ができるために必要なこととして、
お邪魔をたくさん消すこと
相殺火力を増やす
相手の実質火力を減らす
の3つが必要になることが分かると思います。これにて、掘りの要素を挙げることに成功し、まあまあ上手く抽象化できたのではないでしょうか。
定義した指数から見える「勝利条件」
勝利に必要なこととは
我々がなぜ対戦テトリスをしているのか、それは「勝つため」にほかなりません。では何を行えば勝ちなのでしょうか?
相手がゲームオーバーになれば勝ちじゃんという声が聞こえてくる気がしますが、それば相手にやらせることです。今聞いているのは、自分が何をすれば勝ちなのか、すなわち能動的な勝利とは何か、というわけですね。
ゲームオーバーとは、大抵の場合テトリミノの出現位置が積まれたブロックによって遮られたときに起こるものです。ここで、例外を除いてある程度上手いプレイヤーであれば、自分の置いたテトリミノによってゲームオーバーになるということはなくなっていきます。では何がゲームオーバーを引き起こすかといえば、お邪魔ブロックになります。
お邪魔が盤面を完全に塞ぎきり、置く場所を完全に奪うまで戦い続けるわけです。これより、ゲームオーバー、すなわち敗北条件とは「お邪魔を一度に20ライン以上蓄積させること」と言い換えてもあまり問題はなさそうですね。なぜ20ラインかといえば、対戦テトリスで設けられる盤面は縦20ライン、横10ラインの長方形で構成されているからです。
ライフの減らしあいと捉えると
ここからかなり複雑な内容になるかもしれないので、流し見でも結構です。
以下では R1+R2>A1 を常にみたしているとします。
掘り指数Dは一分間に送られたお邪魔を平均でどれだけ消せたかの割合を示すため、(1-D)は一分間に消せなかった平均のお邪魔の割合を表します。
このとき、受けたお邪魔量R2 -(A1-R1)を用いて、{R2 -(A1-R1)}・(1-D)は一分間に消すことができず蓄積された平均お邪魔量であるため、時間をt[m]とすると、お邪魔量G= $${G_t}$$ は
$$
お邪魔量G_t= (R2 -(A1-R1))・(1-D)・t
\\=(R2-(A1-R1) -d)・t[L] \\
$$
と表せます。これより、自身の盤面にある余剰分として、体力Sを、
$$
体力S=20-G_t[L]
$$
と定義します。S≦0となるとき、ゲームオーバーとなり敗北となります。
何を言ってんねんって話ですが、つまりは「耐久レース」として対戦テトリスを捉えています。
自分と相手の体力をそれぞれS1、S2とすると、S1が0以下になる前にS2が0以下となれば相手は敗北し、自身は勝利をおさめます。これより体力が0になるまでの時間がより長いほうが勝つことが分かります。
勝利条件として、「相手より長く生き残る」ことに重きを置いて考えてみた、というわけですね。別の角度からも考えてみます。
「総合火力指数」を定義したときの勝利条件
ここで、総合火力指数Cを、
$$
総合火力指数C=A+d
$$
と定義します。いきなり新しい用語を追加してパニックだと思いますので、ここで定義した「総合火力」とは何なのかを書いていきます。
総合火力とは、事実上作り出したといえる火力全体のことです。
(この記事オリジナルの用語なので覚える必要はとくにありません)
「下穴で3ライン消しをすればbtb付きTSDを完全相殺したといえる」みたいな話を聞いたことはありませんか?
初めて聞いた人であればどういうことやねん、頭おかしくなったんか?と言われても仕方ないので、細かく説明していきます。
まず下穴とはお邪魔のことです。そういう言い方もあるってだけですね。次にbtb付きTSDの火力は4ラインにbtbボーナスの1ラインを足し、5ライン。対して3ライン消しの火力は2ラインです。
5-2で3ライン相殺できてないやんけってなるのは当然なんですが、この残りの3ラインは当然お邪魔としてせり上がります。しかし、3ライン消しが全てお邪魔を消したものであればどうでしょう?
$$
体力S=20-G_t[L]
$$
の考え方を用いると、3ラインお邪魔を消したので体力が3回復した後に、3ラインお邪魔がせりあがることで体力が3削られます。つまりは共に打ち消しあってしまい、体力の値に変化が見られない、というわけです。
結果としてお邪魔の配置が変わってしまっただけなので、その場面だけを切り抜くと、元からその配置だったか、それとも上記のような操作を行ったか全く分からないために、完全相殺したといえる、といえてしまいます。
この一連の行為を、完全相殺の行動とみなしたとき、何がいえるでしょう。
5ラインを2ライン攻撃で相殺したため、残りの3ラインをどこかからもって来ないと完全相殺の辻褄が合わない。だから消したお邪魔量3ラインを事実上の火力としてみなして、2+3の5ラインを送ったと考えるわけです。
これこそが総合火力の正体であり、その指標として毎分の平均で示したのが総合火力指数C、ということが理解できたでしょうか。
ここで、自分の総合火力指数をC1(=A1+d)とします。
$$
お邪魔量G_t=(R2-(A1-R1) -d)・t[L]
$$
から、$${R2-(A1-R1)-d = R1+R2-(A1+d)=R1+R2-C1}$$
なので、$${G_t}$$ と総合火力指数には深い結びつきがあります。
R1+R2の値はそのままに、C1の値を増加させた場合、同時刻でのお邪魔量は減少することがいえ、すなわち体力Sが0以下になるまでの時間を引き伸ばすことができます。ここから、総合火力の大小によって勝敗が決まる、ということが示せました。面白い発見ですよね。
実は、この総合火力指数Cは、有名な対戦テトリスのファンゲームである、TETR.IO内で採用されているVS SCOREに登場します。
TETR.IOはブラウザで簡単に遊べるんでやったことない人は試しにやってみて
VS SCOREの算出方法としては、
[(lines sent + garbage cleared) / pieces]・PPS・100
で表せるんですけど、実はこれを大幅に変形することで、
$$
(A+d)・60・100 = 6000C
$$
と書けてしまいます。つまりVS SCOREとはほとんど総合火力指数そのものであり、このスコアの大小は勝敗に大きく関わってくるわけです。
おまけ:「リソース」という考え方
ここまで読んでくださった、本当にお疲れ様でした。
さて、ここからは後述するとした、リソースの話をお届けします。
リソースの定義と性質
リソースとは、盤面にあるブロックの個数のことです。
(これ以外にも色々解釈があるんですが、最も広いものを採用しています。)
開始時は0であり、テトリミノを1つ置くことで4増加し、お邪魔を受けると1ラインごとに9増加し、TSDを行えば20減少する・・・といった具合にものすごい回数の変化が生じる値なんですね。
さらにいえば、火力を出すためには必ずリソースの消化が必要です。火力を出すことはライン消去することなので、当たり前ですよね。
以前の記事で火力効率についての話題を挙げましたが、これは置いた個数に対する火力の割合、という考え方以外にも、消化したリソースに対する火力の割合、とも捉えられることが分かると思います。
「即時リソース」と「暫時リソース」
対戦テトリスではしばしば「即時火力」という言葉が出現します。言葉の通り、すぐに放てる火力のことなんですが、何故こんな言葉が存在するかというと、これとは真逆の、積み込みというテクニックが存在します。
リソース放出を絞り、絶好の機会を虎視眈々と狙う・・・
RENでもまとめ打ちでも、この積み込みは必要不可欠であり、リソースの削り方の違いから、攻撃方法が変化することをおさえたいわけです。
ここで、即時火力となるリソースを即時リソース、そうでないものを対義語として暫時リソースと呼ぶことにします。打つ文字を減らすための便宜上の策なわけですが、この即時・暫時リソースの割合の推移から攻撃方法がなんとなく分かってくるわけですね。ちなみに明確な定義が存在していない都合上なんとなくでしか説明できないことはご了承ください。
LST積みなどは即時リソース多めであり、4列RENなどは暫時リソース多め、みたいな感じです。
このとき一番考えておきたいのは、お邪魔はどちらに入るのか、だと思います。ただ、この答えはおそらく両方だと思うんですよね。
テトリスを打てそうな、いわゆる直列の形をしたお邪魔は、Iミノ一つで消化できるため、どう考えても即時リソースだと思います。
でも配置がバラバラな、いわゆる穴バラの場合はどうでしょう。掘りRENで解決!みたいな答えが定番ですが、この掘りRENはRENである都合上テトリミノを多く設置する必要がありますし、火力が出るのは後半に差し掛かってからだと思います。だとすれば暫時リソースにおいたほうが納得感は高いと思います。こう考えれば、お邪魔の配置によることが分かります。
どっちが良いってわけではないんですけど、穴バラは火力を出すために掘りRENという難しい問題を解かなきゃいけないのに対して、直列はIミノで一発な分好まれます。
穴バラだけでなく、暫時リソース全般にいえることとして、ためこみすぎるとかえって状況を悪くするという性質があります。ジャブみたいな即時リソースと違って大きく戦況を変えられるものでもありますが、使い方次第だということは理解したほうがいいでしょう。
リソースと勝利条件の関係
ゲームオーバー、すなわち敗北条件とは「お邪魔を一度に20ライン以上蓄積させること」と言い換えてもあまり問題はなさそうですね。
と書いた通り、お邪魔を20ライン以上貯えれば敗北となります。このときのリソース量は、必ず180以上となることが分かると思います。
お邪魔は1ラインごとにリソースを9増加させるので、それが20セットあることから、9・20 = 180 以上のリソースを蓄えてることになりますね。
これ、別にお邪魔だけに限った話じゃなくて、自分で積んだ分のリソースでも同じことがいえると思います。これは、リソースが単に盤面にあるブロック数を示すからこそ、境界線がなくなってるというイメージです。
リソースが180近くになっているとき、体力がかなり減っていて、負けが近づいている・・・みたいに捉えられますね。
ただ、例外も存在します。テトリミノの出現位置の影響で、両端だけ高く積み、お邪魔を大量に受けたときはリソースが200を超えることもおかしくなく、この場合はむしろ有利な局面であることも多いです。
180以上のリソースを蓄えられる特殊な例ですが、この特殊な例を巧みに利用し勝利をつかみ取るのがこのゲームにおける上位勢なんですよね。
まあ一旦は無視して考えるほうが良いかなとは思います。
さて、上記の通りリソースの多さは火力量に直結します。つまり体力が少ないほど高い攻撃力を得られる、といえるのではないでしょうか。
これを踏まえると、過剰な積み込みなどはかえって自分の首を絞める行為であったり、相手がお邪魔をたくさん受けているときほど大きなカウンターをくらう可能性があることは理解しやすいと思います。
何事も程々が肝要というわけですが、なんとなく分かっていたものが論理だって言えたということが面白く思ってくれたら嬉しいです。
さいごに
今回、掘り指数を表す式をつくり、そこからの要素の抽出、さらには今までのものを応用して、簡易的な勝利条件を定義することを行いました。
該当する用語が少なくて途中から定義ラッシュだったんですけど、読み応えだけは間違いなくあるかな、と思います。難しくてごめん
さて、まとめに入っていきます。
掘りと実質火力には深い結びつきがある
勝利条件の捉え方の一つとして、受けた火力量をどれだけ掘れたかを基準にすることができる(耐久レースと考えられる)
火力量(攻撃力)と掘り量(防御力)を足したもの(総合火力)は、その値の大小によって勝敗を決することができる
盤面にあるブロックの個数のことをリソースと呼び、リソースが180を超えるとき、例外を除き高確率で敗北している。
くらいですかね。今回、掘りや勝利条件、さらにはリソースについても、
「簡易化した定義づけ」を行っています。すべての条件内に共通している部分のみを定義に据え、その後に複数の解釈を考え、要素の抽出を行う、といった感じです。前回のものほど完成度が高くはないですが、要素が複雑に絡み合っていたり、そもそも要素数が多すぎたりするときに使えます。
書いた通りやっていることはノイズ除去に近いです。またこれも、大枠を捉えるために使える手段なので、覚えておいて損はないかなと思います。
これにて対戦テトリスの抽象化に関する記事はひとまず完成です。また書きたい内容ができればふとした時に上げようと思います。では。