3匹の猫

みみねこの競プロ精進メモ

音ゲーマーの取り扱い方

※この記事は苫小牧高専アドベントカレンダー2021 14日目の記事です。


どうもこんにちは、音ゲーマーのみみねこです。高専といえば音ゲー高専生といえば音ゲーマー、ということで音ゲーマーの話をします。


昨日の記事はつくつくさんの僕の○○が課金制出会い系サイトに引っ掛かりかけた話|つくつく|noteでした。出会い系サイトはやってません。皆さんもデマには気を付けましょう。


※この記事ではゲームセンターにある音楽ゲームの話しかしません。スマホ音ゲー誰でもできる種類が多すぎて紹介しきれないからです。ゲーセンに行って金を落とせ!!

音ゲーマーって何がすごいの?

自画自賛です。音ゲーが上手い人はそもそも何がすごいのかを紹介します。

体力の使い方が上手い

ゲームセンターの音ゲーは体を大きく使うものが多いです。1曲あたりの曲の長さは2分から3分ですが、その間ずっと動き続けられるだけの体力が必要です。しかも、ただ筋肉があるだけではだめで、休憩地帯(他と比べてノーツの密度が低い箇所)で適度に脱力して体力をセーブする能力も必要になってきます。自分の体を知りつくし、一番ベストな動き方で限界まで遊ぶのが音ゲーマーです。

リズムに関する知識がある

どんなに体力があってもリズムを知らないと正しく叩くことができません。どんなに声が大きくても音階を知らないとカラオケで高得点を出せないのと同じです。4拍子・3拍子・変拍子、16分音符・24分音符、BPM(曲の速さ)の変化など…。音楽に関する勉強をしていない音ゲーマーでも、何となくこの辺のリズムに関する話は理解していることが多いです。

ノーツパターンを認識できる

よく、音ゲーマーって譜面を暗記してるんでしょ?と聞かれることがありますが、半分あっていて半分間違っています。後述する目標でノーミスやAPを狙っている音ゲーマーは、何度もプレイして曲のリズムや難所の配置を覚えます。しかし、目隠ししても完璧にプレイできるわけではありません。目で見た情報に対して、「このノーツの並びはこう捌く」という対応付けが脳内で出来ており、その通りに体が動いているのです。初めて見る譜面でもノーミスで捌けちゃったりするのはこの能力がすごいからです。このノーツパターンは回数を積むうちに自然に覚えていったり、自分で何度も反復して頑張って覚えたりします。

音ゲーマーの目標

人によって目標は違います。音ゲーマーが何を目標にして遊んでいるかを知れば、ゲーム画面の何を見て応援すればよいかがわかるようになります。

パターンA: クリアできるかどうか

いわゆる「エンジョイ勢」はここ。たまに嘘ついてる超上級者もいますが。
音ゲーにはたいていクリアという概念があります。これは大きく2種類に分けられます。

  • タイミングよく叩くとゲージが増え、ミスするとゲージが減る。ゲージを一定基準以上溜めた状態で終了すればクリア:太鼓の達人beatmania IIDXBeatStream、pop'n music、CHUNITHM*1、など
  • 曲全体での達成率が一定以上ならクリア:maimai、シンクロニカ、ギタドラjubeat*2、など


上記に当てはまらない例外を2つ紹介します。

  • オンゲキ:音ゲーのスコアに加え、使用するカードの強さによって成績が決まる。(音ゲー単体のスコアも出るので実力を測れないわけではない)
  • MUSECA:そもそもクリアの概念がなくスコアの計算のみだが、Graficaの効果でスコア上限も変化する。

クリアの概念が実力に関係しないタイプの音ゲーは、自分で緩めの目標を決めてプレイすることが多いです(全体の90%以上、とか)。

パターンB: ノーミスかどうか

ノーツを正しいタイミングで叩けないとミスになります。パターンBの音ゲーマーは、ミスをゼロにする、つまり全てのノーツを捌けるか?を目標に遊んでいます。

パターンC: パーフェクトかどうか

ノーツの判定はたいてい3種類以上あり、「完璧に叩けた」→「少しずれて叩いた」→「大きくずれていた」→…というように細かく分かれています。この中でも、全てのノーツを「完璧に叩けた」判定で叩くことをオールパーフェクト、略してAPとかパフェとか言ったりします(音ゲーによって呼び方が変わる)。ガチ勢とか、ランカーとか言われる人はAP前提でプレイしてます。


あくまで目標なので、実際にはずれて叩いた判定を○○個まで抑えてノーミスクリアする、とか、ミスを○○個まで抑えてクリアする、とか言う風に目標を設定しながら、音ゲーマーはパターンAからCに向かって徐々に成長していきます。

音ゲーマーの褒め方

ゲーセンに遊びに行ったとき、音ゲーマーは音ゲーしかやりません。音ゲーマーはUFOキャッチャーが嫌いです。音ゲーしている音ゲーマーとどう付き合うか。

雑に褒めてはいけない

結局、その音ゲーマーが何を目標にしてプレイしているかは本人に聞いてみないとわからないです。なので、高い目標を掲げていた音ゲーマーに対して「ノーミスじゃん!」とか褒めると、(当たり前だろ…)とか思われてしまいます。いやそうじゃないんだよと。褒めてくれる気持ちもわかるけど、ずれてる判定が××個も出てるからこのリザは褒められるに値しないんだよと。俺がひねくれすぎているだけかもしれない。

いつ褒めるべき?

一番わかりやすい褒めるタイミングは、自己ベストを更新したタイミングです。これは明らかに過去のどの自分よりも上手かった証拠なので、「すごい!自己べ更新おめでとう!」と言ってあげましょう。
そのほかにも、本人がなんか嬉しそうにしていたら褒めておきましょう。たいてい自分の中で設定していた目標を達成したときです。

先に目標を聞いておく

いっそのことプレイ前に、どれくらいできたら(本人にとって)凄いのか、その基準を聞いておくのもアリです。きっと楽しそうに自分の基準を語ってくれるはず。褒めるタイミングも明確になるので最高。

おわり

以上です。ブログで音ゲーの話をするのは初めてだったのでホントはあと5倍くらい音ゲーの話をしたかったのですが、投稿日になってしまったのでここでやめます。オチはありません。

ちなみにアドベントカレンダーはまだ空いているので、気が向いたら技術系の話を書くかも…しれません。たぶん書く。


明日はLa+あおてん( 'ω') (@osaten_KKG) | Twitterの15日目の記事です。お楽しみに!

*1:使用スキルによってクリア難度が変わる

*2:シャッターボーナスによる加点アリ

過去にタイムスリップする方法

※今日は12月3日ですが、この記事は 苫小牧高専 Advent Calendar 2021 - Adventar 2日目の記事です。
以上、分身したみみねこでした。どうやら14日目も担当しているようですので、お楽しみに。

明日の記事はおおやま君の TypeScriptの型でFizzBuzz | おおやま手記 でした!

昨日の記事はさたけ君(https://twitter.com/satakenkoki)が担当します!

ZONeエナジー プログラミングコンテスト “HELLO SPACE”参加記(~D問題)

ABC級のコンテスト。ストーリーの関係でCとDの配点が逆転していた。

A - UFO Invasion

文字列中に含まれるZONeの数をカウントする。大文字小文字の区別や、文字配列の範囲外参照などに気を付けて実装する。
計算量はO(|S|)

B - Sign of Friendship

それぞれの遮蔽物ごとに分けて考える。その遮蔽物しかないと仮定すると、その遮蔽物の頂点とUFOの座標を結んだ直線とタワーの交点が最適解(最小値)となる。これは、三角関数などを用いてO(1)で求めることができる。
よって、すべての遮蔽物について考えたときの最適解の最大値が答え。全体の計算量はO(N)

ちなみに、解となる高さを二分探索しても解が求まる。この解法の計算量はO(N\log D)

C - MAD TEAM

3人の各パラメータの最大値の最小値の最大値を求める。(????)
一気に考えると混乱するので、ひとつずつ考察を詰めていく。愚直解はO(N^3)でダメ。

まず、最終的になにかの最小値の最大化をしたい。これは今話題の典型90問でも取り上げられていたが、「解の二分探索」が有効である場合がある。今回も解の二分探索をする方針で考察を進める。
解の二分探索を適用すると「3人の各パラメータの最大値の最小値をk以上にできるか?」という簡単な問題になる。しかしこのままだと結局この小問題を解くのにO(N^3)かかるので、もう一工夫必要。
選ばれる3人のうち、誰かのあるパラメータがk以上なら、そのパラメータについては必ず条件を満たす。あるパラメータの数値がk以上(必ず条件を満たせるライン)なら1、そうでないなら0とすることで、選ばれた3人の各パラメータの論理和がすべて1なら条件を満たしているということができる。さらに、各人の各パラメータの数値は2通りなので、N個ある選択肢を2^5個に圧縮することができる。これなら全探索しても{2^5}^3 = 32768通りの組合せしかないため、十分高速である。

計算量は…公式解説に倣って、パラメータの個数をM、選ぶ人数をK、二分探索の上限値をX = \max{A_i, B_i, C_i, D_i, E_i}としてO((NM+2^{MK})\log X)である。

D - Message from Aliens

操作を「文字の追加」「文字対の削除」の2つのフェーズに分ける。

(1) 文字の追加
愚直に操作を実行すると、文字列を反転するたびにO(|T|)の計算量がかかってしまうため、全体の最悪計算量はO(|S|^2)となる。反転しても文字列の並びは変わらないことを利用して、「今文字列が反転しているか?」というフラグを持ち、このフラグがtrueのときTは反転しているとみなして処理を行う。つまり、反転しているときは文字列の先頭に文字を追加する。

(2) 文字対の削除
ある隣接する同じ文字の組(文字対)を削除しても、他の文字対が削除できなくなることはない(状況が悪化しない)ので、文字対を見つけたら貪欲に削除してよい。stackを用いると、この操作をO(|S|)で出来る。

出力するとき、文字列の反転フラグを参照することを忘れない。全体の計算量はO(|S|)

E - Sneaking

(r, c)\to (r, c-1)への移動を使うことはないと考察して動的計画法を書いたがWA。グラフの最短距離を求める問題に帰着できるらしい。

感想

AtCoder Regular Contest 120参加記(~C問題)

一か月ぶりの参加。
f:id:mmnkblog:20210523232738p:plain

A - Max Add

kが決まっているときの数列aの最大値をa_{\max_k}とする。数列の値はすべて正なので、i=1のときa_1の値はa_1+a_{\max_k}となり、これまでの最大値を更新する。この状態でi=2のときの操作を行うと、a_2の値はa_2+(a_1+a_{\max_k})となる。このようにしてi=kまでの操作を終えたときのai番目の値は
\displaystyle a_{\max_k} + \sum_{j=1}^i a_j
となる。これの総和は、
\displaystyle \sum_{i=1}^{k} (a_{\max_k} + \sum_{j=1}^i a_j)
\displaystyle=k\times a_{\max_k} + \sum_{i=1}^k \sum_{j=1}^i a_j
となる。ここで、
\displaystyle x_k= \sum_{i=1}^k \sum_{j=1}^i a_j
と定義すると
\displaystyle x_{k+1}= x_k + \sum_{j=1}^{k+1} a_j
であり、2項目は累積和を用いることでO(1)で計算できる。各kに対して前から計算することで、全体の計算量はO(N)となる。

B - Uniformly Distributed

最初DPかな?と思ったけど違った。考察は大事。
マス目から2\times 2の領域を切り取って考えると、左上から右下へ行く方法は2通りある。このとき、もし左下のマスの色と右上のマスの色が異なる場合、これら以外のマス目をどう塗ろうと赤に塗られたマスの数が異なる経路が存在してしまう(このような配置が一か所でもある場合答えは0となる)。
なので、例えば左下がRで右上が.の場合、条件を満たすためには右上のマスを赤に塗るしかない。左下も右上も.の場合は、両方とも同じ色に塗ればいいので赤赤か青青の2通りとなる。

f:id:mmnkblog:20210524001022j:plain

斜め方向、厳密にはi+jが等しいようなマス(i, j)はすべて同じ色で塗る必要がある。これらのマスがすべて.なら答えを2倍していけばよい。計算量はO(H+W)

C - Swaps 2

操作の特徴をつかむ。
i番目にあった数をj番目の位置に移動させたときの値はA_i + i - jとなる。つまり、A_iの最終的な位置はB_iから絞ることができる。
また、すべてのiに対して、i番目の数をj番目の位置に移動させると決めたときの操作回数は、バブルソートの交換回数に等しい。バブルソートの交換回数は転倒数と等しく、O(N\log N)で求める方法がある。
A_iの移動先の候補が複数通りある場合、ABに一致させることが可能ならば、同じ移動先の候補を持つ数がAの中に移動先の候補の数だけ存在する。さらに、移動先の候補が等しい2つの数A_i, A_jを「操作」によって交換しても見かけ上の値は変わらない(つまり交換する必要がない)。よって、移動先の候補が等しい数のうち左からi番目の数を、移動先の候補の左からi番目に移動させると決めるのが最適である。

例)A = \{14, 11, 3, 2, 1\}, B = \{5, 4, 10, 2, 10\}の場合、A_iの移動先をC_iで表すとするとC = \{5, 3, 1, 2, 4\}となる。この数列Cの転倒数は6であり、これが解となる。

移動先を調べるのはmapを用いた。全体の計算量はO(N\log N)

感想

これで水パフォなのか