NCMBでは、自分のスコアを元にランキングの順位を検索出来る。
やり方は以下に書いている。
「(自分のスコアよりも大きなものがいくつ存在するのかカウント)+1」というやり方だ。
// 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
public void fetchRank( int currentScore )
{
// データスコアの「HighScore」から検索
NCMBQuery<NCMBObject> rankQuery = new NCMBQuery<NCMBObject> ("HighScore");
rankQuery.WhereGreaterThan("Score", currentScore);
rankQuery.CountAsync((int count , NCMBException e )=>{
if(e != null){
//件数取得失敗
}else{
//件数取得成功
currentRank = count+1; // 自分よりスコアが上の人がn人いたら自分はn+1位
}
});
}
では、別の条件でカウントしたい場合はどうするのか。
答えはここに書かれている。
WhereXXXXXX()関数がたくさんあって、それぞれの通りに書けばOK
では、複数の条件でカウントしたい場合はどうだろう。
実はその場合はWhereXXXXX()を複数個書けばよいらしい。
rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
rankQuery.WhereLessThan("Score2", Score2);
これで両方の条件に当てはまるものを持ってきてくれる。
しかし、AND条件で持ってくるために、以下のルールではちょっと問題が起きる。
ハイスコアの決め方が、以下のルールならどうだろう。
-点数の高いものがより良い順位(500点と1000点なら1000点の勝ち)
-点数が同じ場合は死亡数の少ないものが勝ち(2回死んだ場合と1回死んだ場合は1回死んだ側の勝ち)
以下のように書いてみる。
// 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
public void fetchRank( int currentScore )
{
// データスコアの「HighScore」から検索
NCMBQuery<NCMBObject> rankQuery = new NCMBQuery<NCMBObject> ("HighScore");
rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
rankQuery.WhereLessThan("Death", currentDeath);
rankQuery.CountAsync((int count , NCMBException e )=>{
if(e != null){
//件数取得失敗
}else{
//件数取得成功
currentRank = count+1; // 自分よりスコアが上の人がn人いたら自分はn+1位
}
});
}
実はコレは思ったとおりに動作しない。
(自分のスコア)Score=100 , Death=2
(他人のスコア)Score=100 , Death=1
(他人のスコア)Score=500 , Death=3
(他人のスコア)Score=200 , Death=3
自分のスコアは、本来は4位であるが、2位となってしまう。
検索条件が
2 <= currentScore && currentDeath < 100
となっているためである。
「Aで並び替えた後に、Bで並び替え」という方法ではなく
「Aに該当 かつ Bに該当」という絞込み。
複数条件によるカウント方法を用いた順位は、この方法では上手くいかないようだ。