_Riseのブログ

_Riseのブログ

osu!、音楽、DJ、プログラミング。他にもいろいろ。

Amebaでブログを始めよう!

3年前から憧れてたTWCのメンバーになれて死ぬほどうれしいのですが早速グループステージの予定が合わなくて出場できなくなってしまいました。来週こそは出たい。

 

で、春休みにするべきことも大体終わり、ちょっと暇になったので、osu!taikoでこんな大会あったら面白いなーってのをちょっと考えていました。考えていくと結構面白そうな感じになった(と思っているのは僕だけかもしれませんが)ので、ちょっと紹介してみようと思います。

 

どういう大会なん

いままでの大会って、譜面ごとに選べるmodが指定されていて(FreeModもHD, HR, HDHR限定)、とりあえずそのmodで譜面を練習しまくって本番で高い点とったほうが勝ちみたいな、いわば力と力のぶつかり合いみたいな大会がほとんどだったと思うんです。
 
しかも最近は大会でScoreV2がよく使われるようになったことにより、従来のスコア方式より精度力が高い人が有利になったと感じています。
ミスしてる人に対してフルコンボしたのに負けるって、なんかとても悔しいですよね。
 
この2つの問題を良い感じに解消したのが今から紹介する大会案です。(大会の内容考えてから上の文章考えたのでそうとは限らないかもしれないこともないかもしれません。知りません。)
 
ではいきます。

Mappool

試合本番の1週間前ぐらいにMap Selectorが譜面を選び、公開します。画像は例。

このとき従来の大会と違うのは、ほとんどの譜面は譜面ごとに使用するmodが指定されていないということです。
これはつまりどういうことかというと、プレイヤーが譜面を選ぶと同時に、その譜面をどのmodでプレイするか選べるということです。この要素は、この大会の軸となる点になります。
ただし、ここで選ぶことのできるmodは決められていて、プレイヤーはこの中から上手くmodを選んで譜面をプレイしていかなければなりません。
これから、試合の大まかな流れとともにこれを詳しく説明していきます。
 

試合の流れ

大会は、個人対個人のものや、複数人がチームになってチーム対チームで戦う形式のものなどがありますが、今回は個人対個人という体で話を進めていきます。
①プレイヤーが両方集まったら従来の大会通り2曲ぐらい自由に選んで適当にウォームアップします。
 

②各プレイヤーは!rollを打ちます。出た数字の大きいほうが、まず譜面をBANするか、相手が使用できるmodをBANするか選びます。

②ー1 譜面をBANする場合、mappoolの中にある譜面から1つをBANします。
このときBANされた譜面は、両方のプレイヤーがこの試合が終わるまで選択できなくなります。
②ー2 modをBANする場合、相手が選ぶことのできるmodから1つを選び、そのmodを使えなくさせることができます。
今回の場合は、各プレイヤーはNM(NoMod), HD, HR, HDHR(HDとHRを重ね掛け), FL, DT, NC, EZ, HT, NFの10種類が選択できるということにします。
このときBANされたmodは、譜面と違いBANされた側のプレイヤーのみが、この試合が終わるまで選択できなくなります。上の絵はプレイヤー1がプレイヤー2のHDをBANした場合ですが、この場合HDが使えなくなったのはプレイヤー2のみです。
 
③!rollの数字が低いほうが、 ②-1または②ー2 の操作を行います。
 
④ここからは ② で!rollを打ったときに数字の低かったほう(もう1回!roll打って高いほうでもいいかも?)から交互に試合を進めていきます。点数方式はScoreV2を使用します。
 
⑤順番の当たったプレイヤーは、プレイする譜面と、その譜面をどのmodでプレイするかを選びます。このとき、各譜面は1試合を通して1回ずつしか選択できません。
ここからは、modを選ぶ時のルールについて書いていきます。
 
⑤ー1 各modは1回ずつしか選択できない。
例えば、下の絵のような状態を考えてみましょう。バツ印がついているのは、BANされたmod、もしくはすでに使用したmodです。
ここでプレイヤー2のターンのとき、プレイヤー2はすでに使用したHD、HRは選択することができないため、他のmodを使用しなければなりません。
 
⑤ー2 modの重ね掛けができる。
例えば、プレイヤー1が簡単な"譜面2"をめっちゃ頑張って暗記したとしましょう。プレイヤー1は譜面2にFLをつければほぼ勝つことができるという自信がありますが、ここで欲張って
なんてことができます。なんか例えが下手な気がしますが、このような場合のほかにも速いBPMのHDが得意な人はHDとDTを同時にかけたり、HDとHRを同時に使ってHDHRみたいにするということもできるわけです。
ここで注意したいのは、重ね掛けしたmodはすべてこの試合が終わるまで使えなくなるということです。例えばHDとFLを重ね掛けした場合そのあとはHDもFLも使えなくなります。
プレイヤー1は汎用性の高いHDを選ぶことができなくなり後悔しています。
あと、EZとHRとか、DTとHTとか、HDとHDHRとか、重ね掛けできないmodを重ね掛けするのは禁止です。というか意味がありません。
 
⑤ー3 選んだ譜面に使用するmodが限定されている場合、そのmod以外の使用は認められない。
mappoolの譜面5を見てみてください。
この譜面は「HD限定」なのでこの譜面を選んだときは絶対にHDをつけてプレイしなければなりません。
また、同時にHRをつけてHDHRでプレイするなど、modの重ね掛けも認められません。
ここで気になるのが、「HD限定の譜面をプレイした後、他の譜面でHDは使えなくなるのか」というところなのですが、HDが使える状態でHD限定の譜面をプレイした場合、この試合が終わるまで他の譜面でHDを使用することはできません。ただし、すでにHDが使えなくなっている状態でHD限定の譜面を選択することはできます(このルールややこしめなので削除してもいいかも)この場合もmodはHDをつけてプレイします。
 
⑤ー4 選んだ譜面に使用するmodが禁止されている場合、そのmod以外のものを使用しなければならない。
mappoolの譜面15を見てみてください。
この譜面はクソムズ(とても難しいという意味です)なのですが、NM, EZ, NFをつけてプレイすることが禁止されています。このような場合、EZHDなど、重ね掛けした場合もその中にひとつでも禁止されているmodがあればそれは使用することができません。
 
⑤ー5 特殊ルール「Mod Change」
例えば、プレイヤー2はHDが苦手なので、"譜面6"をHRで確実に点数が取れるように練習したとします。
そして本番、プレイヤー2は早めに譜面6を選択し、1点を先取しておきたいところですが、先攻はプレイヤー1に。まあ後攻でも早めに譜面6選べばいいかと思っていたら、↓
HRでたくさん練習してきた譜面6を苦手なHDでやらされる羽目に。プレイヤー2の作戦負けです。
しかしここで、プレイヤー2(譜面を選択したプレイヤーでないほう)は、「Mod Change」というルールを発動させることができます。
Mod Changeを使うときは、Mod Changeを発動することと、modをどれに変更するかを言います。これで譜面6はHRでプレイすることができるようになり、プレイヤー2は無事に点を取れましたとさ。
しかし、Mod Changeにはデメリットがあります。それは、Mod Changeを発動した側のプレイヤーは、変更する前のmodと変更した後のmodが両方使えなくなるということです。今回の例の場合は、HDを変更してHRにしたので、プレイヤー2はHDとHRが選択できなくなってしまいました。
ちなみに、Mod Changeを使用された側は、選択しようとしていたmodが使えなくなるということはないので、プレイヤー1は再度HDを選択することができます。
このMod Changeは1試合につき各プレイヤー1回ずつしか使用できないので、いつ使うかの見極めが重要です。
また、当たり前といえば当たり前なのですが、譜面を選択する側はMod Changeを使用できません。
 
⑤ー6 特殊ルール「V1 Challenge」
これは冒頭に言っていた「ScoreV2で精度マンが有利になった」の対策として考えてみました。
これはどういうルールかというと、譜面とmodが選択されたタイミングで「V1 Challenge」と宣言したとき、その譜面のスコアはScoreV2でなく従来の方式で計算されることになります。具体的には、マルチの「勝敗条件」のところが、"Score V2"から"Score"に変更されます。
V1 ChallengeもMod Changeと同じく1試合につき各プレイヤー1回ずつしか使用できません。ここぞというときに使ってみましょう。
あと、V1 Challengeは譜面を選択する側と選択される側の両方が使用可能です。さらに、Mod Changeとの併用も可能なので、上手く使って試合をひっくり返しちゃいましょう。
 
⑥以上のルールにより選択された譜面とmodで高いスコアを取ったほうに点数が入ります。
 
⑦どちらかのプレイヤーが規定の点数に達するまで、各プレイヤーが交互に ⑤~⑥ を繰り返します。
 
⑧先に規定の点数に達したほうが勝ち!
 
 
 
…いかがだったでしょうか。文章力ないから自分の言いたいことがちゃんと伝わってるか心配。
個人的にはなかなか面白い感じになるかな~とは思うのですが、少しルールを複雑にしすぎたかもしれません。あとルールに不備がないかも怖いです。
評判良かったらいつか開催してみたいですね。
それでは。

冬コミ2017で頒布されるCDを自分の独断と偏見でセレクトして雑に紹介してみたいと思います。日本語が拙いのは許してください。

説明文にある時間表記はプレビューの開始時間を表しています。

 

 

Irui

Feryquitousの3枚目のソロアルバム。

アナログな打楽器や弦楽器を使用した音楽が中心。ピアノの音がとても綺麗で、他に鳴っている音を聴いても電子的な要素はあまり感じ取れない。

…かと思ったら物凄いワブルしてる曲があったり(1:48~)、疾走感抜群のDrum'n'Bassがあったり(5:38~)で、Feryquitousが作れる音楽ジャンルの広さがよくわかる。

 

 

Kick's For Liberation 6

USAOの"友達の数より多い"6枚目のソロアルバム。ジャケットのお姉さんの胸がデカイ。

1曲目(0:00~)からUSAOらしい個性的なベース音でのBassHouseで攻めてきており、1曲1曲の破壊力が半端ない。4つ打ちも非4つ打ちもたくさん収録されていてお得。

個人的には、3曲目(1:34~)とか9曲目(7:11~)のゴリゴリのDubstepがお気に入り。

Fucking High(5:05~)は前に買ったHardcore Syndrome Xにも入っていた。ドロップ前の声ネタが非常に気持ちいい。

なお、12~14曲目にはMassive New Krew、lapix、TanukichiによるUSAOの曲のRemixが収録されている。

 

 

REGULATION OUTSIDER

wavformeからのコンピアルバム。

未来の巨大コロニーでの出来事をイメージしている(めっちゃかっこいいWebページを参照)ようで、アルバム全体を通して近未来的で宇宙的な印象が強い。

非4つ打ちが中心で、全体的に重い雰囲気の曲が多い。

ノリノリで聴くというよりはヘッドホンでじっくりと聴いてみるほうがいい感じ。

 

 

INSIGHT

Unitoneからのコンピアルバム。ジャケットがとてもスタイリッシュで綺麗。

Progressive House, Future Houseのコンピ。ダークな印象の曲から明るい曲調のものまで収録されており、まさに"色彩感溢れる"一枚。

個人的には1曲目~3曲目の頭を空っぽにして踊れる感じの曲がとても好き。

収録曲が7曲と少なめなのが寂しいが、その分だけ凝縮された音楽を楽しむことができるだろう。

 

 

Quad Nights [code:XXXX]

LAZのソロアルバム。

非4つ打ち、特にDrum'n'Bassが中心。低音域がごつい曲から優しいビートの曲まで揃っており幅広い。余談ですがこのブログを書いた人はDrum'n'Bassが大好きです。

自分はいままでLAZの曲をあまり聴いたことがなかったのだが、このアルバムのプレビューで一目惚れしてしまった。特に2曲目(1:03~)と6曲目(5:20~)はアドレナリン全開!!って感じでもう最高。

 

 

Virtual Odyssey: Emotion

Lilium Recordsからのコンピアルバム。

"「エモい」が知りたければ、辞書を引くよりこれを聴け!"というキャッチフレーズの通り、様々なジャンルの"エモい"を聴くことができる。

個人的にエモかったのは1曲目のFuture Bassと最後のDnB(4:35~)。他の曲もすべてノリノリで聴ける。

 

 

HA[ZA]RD ATTACK 3

こちらもLilium Recordsからのコンピアルバム。

Virtual Odyssey: Emotionの明るいイメージに対して、こちらはダークでハードなイメージが強い。

4つ打ちはもちろん、Drum'n'Bass、Dubstep、Drumstep、Hardstyle等、自分の好きなジャンルの曲が勢ぞろいしていて、個人的にはぜひ買いたい一枚。

3曲目(0:56~)、5曲目(1:51~)、10曲目(4:07~)は特にチェックしておきたい。

 

 

トリックリーク

みかん汁の3枚目のソロアルバム。

全曲でボーカルであるみかん汁がメインとなるアルバムだが、ゲストのコンポーザーがlapix、Maozon、Kobaryo、Massive New Krew、Blacklolita、C-Showと物凄く豪華。

美しいボーカル、歌詞を聴く目的で買うのももちろん良いが、バックで鳴っている音楽のクオリティも非常に高いので、そちらを目的に買うのも良いだろう。

 

 

以上。ほかにも今回の冬コミで頒布される予定のCDはたくさんあるので確認してみるといいと思います。

盛大な勘違い
文字列aの末尾と文字列bの先頭が等しいか比較するときに

----
a.end() == b.begin()
----

としていたが、明らかにtrueなテストケースを試しても結果がtrueにならないので調べてみたところ、

----
front()で文字列の先頭をchar型で参照、
back()で文字列の末尾をchar型で参照。
begin()とend()はイテレータが返るぜ!
----

とのこと。そりゃ絶対falseになるわ…

まず、四捨五入するときの方法。

 

0.5を足してキャスト

四捨五入したいdouble型変数をave、四捨五入した後の値を代入する変数をansとすると、

----

int ans = (int)(ave + 0.5);

----

とすることでaveの四捨五入ができる。処理速度が速い。

 

round()関数を使用

さきほどと同じ例で行くと、

----

    int ans = round(ave);

----

こっちのほうが簡単に見えるが、処理速度がものすごく遅い(らしい)。

 

ちなみに、ansがどんな値になっているか確認するために表示させるときは、iostreamをincludeして、

----

    cout << ans;

----

とする。

 

そうじゃないんだよ

上に書いたことは調べるとすぐ出てくるが、今回自分がしたい事とは違う。

今回やりたいのは小数を整数に丸める方法じゃなくて、小数第2位とかまである数を小数第1位に丸めて(52.7652.8にするなど)、その値を表示する方法。

というわけで忘備録的に解説。

 

小数第二位で四捨五入する方法

四捨五入したいdouble型変数をave、四捨五入した後の値を代入する変数をansとすると、

----

    double ave = 52.76;

    double ans = (int)(ave * 10 + 0.5) / 10.0;

----

とするとできる。分解すると、

----

    double ave = 52.76;

 

    double ans = ave * 10

//aveを10倍する(527.6)

    double ans = ans + 0.5

//10倍したやつに0.5を足す(528.1)

    double ans = (int)ans / 10.0

//0.5を足したやつをintで丸めて(528)、10で割る(52.8)

----

できた。

 

小数第3位で四捨五入したい場合は、

----

    double ave = 52.768;

    double ans = (int)(ave * 100 + 0.5) / 100.0;

----

と、かける数、割る数それぞれ10倍にすることで実現できる。

 

表示

さっきと同じように、

----

    cout << ans;

----

とすればできる。たとえば52.8を出力すると

52.8

と出てくるし、70.0を出力すると、

70

 

あれ?

70.0って出ないの?

おそらくC++の仕様上、double型であっても小数部分が0のものはそれを表示しないようになっていると思うのだが、今回、自分は70と出てくるこれを70.0と表示したかった。結構悩んでしまったので、その過程を書いておきます。

 

最後に無理やり".0"をくっつけよう

----

    int ans = (int)(ave * 10 + 0.5);
    string s = (ans % 10 == 0 ? (to_string(ans / 10) + ".0") : to_string(ans / 10.0));
    cout << s;

----

何をしているのかというと、

----

    int ans = (int)(ave * 10 + 0.5);

//さっきの四捨五入の過程を、intでキャストするところまでで止めておく。
    string s = (ans % 10 == 0 ? (to_string(ans /10) + ".0") : to_string(ans / 10.0));

//ansが10で割り切れる(=小数部分が0)なら、ansを10で割ってto_string()で文字列に変換した後、それの後に".0"をつける。そうでなかったら ansを10.0で割って文字列変換。
    cout << s;

//出力。

----

というふうになる。

 

※2行目でどっちみちansを10.0で割るんだったら1行目であらかじめやっておいてもよくない?と思って

----

    double ans = (int)(ave * 10 + 0.5) / 10.0;
    string s = (ans % 1.0 == 0.0 ? (to_string((int)ans) + ".0") : to_string(ans));
    cout << s;

----

というのも試してみたが、これは2行目の(ans % 1.0 == 0)のところでdoubleはバイナリ操作できないというコンパイルエラーが出てしまうため断念。Javaだとできるんだけどなあ。

 

で、このプログラムを実行すると、70.0は

70.0

としっかり表示されたが、今度は52.8などの数が

52.800000

と表示されるようになってしまった。どうやらdouble型変数をto_string()で変換すると後に0がつけれるだけつくらしい。

 

stringに代入しないでそのまま出力

----

    int ans = (int)(ave * 10 + 0.5);
    if(ans % 10 == 0) cout << (ave / 10) << ".0" << endl;
    else cout << (ave / 10.0) << endl;

----

というふうに、10で割り切れるか判定した後の処理を直接出力に持っていく方法。

これでやっと自分の望んでいたように表示されるようになった。

 

以上。もっといい方法ないんですかね…

SR計算のアルゴリズムが大体把握できたのでメモ書き程度に。数字ゴリゴリのやつは今度書きます。

 

StarDifficultyってどうやって計算されてるの?

StarDifficulty(以降SR)...osu!taikoのBeatmapもとい譜面においてその難しさを表す数字。その数字が大きくなるほど譜面が難しいということを表す。
 
計算方法...例えば ddkdkkd (d = ドン、k = カツ)という配置の譜面があった場合、この7つの音符それぞれにstrainという値が与えられる。strainを(いろいろしてから)足し合わせたものがSRとなる。
 
strainは以下の式で計算される。
strain = (1個前の音符のstrain) × (前の音符と間隔が狭いほど大きくなる数字)(後述) + (逆手配置ボーナス(後述) + 難解リズムボーナス(後述))  × (ゲームバランス崩壊を防ぐ数字(後述))
以下に、それぞれの項目の計算方法を示す。
 

前の音符と間隔が狭いほど大きくなる数字

名前の通り。当たり前だが、音符の間隔を狭くすればするほどプレイヤーはより速く指を動かさなければいけなくなるので、SRも上昇する。ただし、間隔を0にする(音符を重ねる)と値は逆に小さくなる。
 

逆手配置ボーナス

逆手配置は、両手の指を少し器用に動かす必要があり、初心者~中級者には難しいものとされるため、SR上昇の条件に組み込まれたのではないかと考える。逆手配置と判定される条件は以下のとおりである。
計算対象の音符の色が1秒未満の間隔にある1個前の音符と変わったとき、計算対象の音符の前にある2色の音符それぞれの数の組み合わせが偶数と奇数、または奇数と偶数となるとき。
文章で書くと少しややこしくなるので例を使って説明する。
 
例えば、dkkdという配置があった場合、最後のdは1秒以内の間隔にある(ことにする)1個前のkと音符の色が変わっている。さらに、そのdの直前にある2色の音符たち(d  kk)の数は、それぞれ奇数と偶数になっている。よって、最後のdは逆手配置ということになり、逆手配置ボーナスが加算される。
 
※注意1 一般に逆手配置とされるdddkkkdddkkk...という配置は、同色音符の数がすべて奇数であり、osu!taikoではどの音符も逆手配置の条件に当てはまらない。叩きにくくSRもあがらないという配置なので、pp譜面目的でマッピングする場合は気をつけたいところである。
 
※注意2 基本的には音符密度を上げたほうがSRは上がるのだが、実は逆手配置ボーナスが加算される音符とその1個前の音符の間隔を50ミリ秒未満(BPM200の24分音符、BPM300の16分音符より間隔が狭いということ)にしてしまうとosu!側に「欲張りすぎ!SR低くすっぞ!!ムカムカムカムカムカムカ」とSRを少し下げられてしまう(具体的には、先に書いた"ゲームバランス崩壊を防ぐ数字"が小さくなる)。
 

難解リズムボーナス

難しいリズムを刻ませると、SRが上昇する。難しいリズムは精度の低下やミスを誘発しやすいため、SR上昇の条件に入っているのだろう。条件は記述するのが難しすぎるため割愛。代わりに、計算により条件を満たすか否か判定できるような表を作成した。
 
例として3つの音符がd___ddのような間隔で配置されている場合を考える。1つめと2つめの音符の間隔が2つめと3つめの音符の間隔の何倍かを計算し、その数字を覚えておく。このとき、1.0倍未満になってしまう場合はその逆数をとる(電卓で 1 ÷ (逆数にしたい数) と叩くと出てくる)。例の配置は3倍ということにしておく。
 
次に、計算した値と下の表を見比べて、一番近い倍率のところを探す。その数字の背景が青いところはリズムが複雑だと判定され、3つめの音符に難解リズムボーナスが加算される。例えば、倍率が3の場合は下の表の"3.0"の背景が青くなっているので、リズムが難解であると判断される。
 
※注意 逆手配置ボーナスと同様に、難解リズムボーナスが加点される音符とその1個前の音符の間隔が50ミリ秒未満だとosu!に怒られ"ゲームバランス崩壊を防ぐ数字"が小さくなり、SRが低くなってしまうので注意が必要。
 
以上が基本的なSRの計算方法である。今後いろいろと加筆予定。