LoginSignup
3
3

More than 5 years have passed since last update.

objective-cでfloat値のゲーム・ランキングのロジックを作る

Posted at

苦戦したので、メモがてら残します。
もっといい方法があると思いますが。。。

得点など(float値)の保存

値を格納するarrayに初期値を登録する。
これをやらないと、呼び出すときにエラーになる模様。

objective-c
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
NSArray *testArray=[NSArray array];
[defaults setObject:testArray forKey:@"RECORDS"];
[ud registerDefaults:defaults];

今回の得点などを追加する

NSUserDefaultsにはNSMutableArrayは保存できないようなので
保存するのはあくまでNSArray。

ゲーム終了時に今回の得点などをarrayに追加して再保存するのですが
そのために一旦mutableCopyする必要があります。

objective-c
NSArray *recordArray =[ud objectForKey:@"RECORDS"];
NSMutableArray *mutableRecordArray= [[NSMutableArray alloc]init];

mutableRecordArray = [recordArray mutableCopy];
[mutableRecordArray addObject:[NSNumber numberWithFloat:score]];
//scoreは今回の結果

recordArray=[mutableRecordArray copy];
//NSArrayに戻して再保存
[ud setObject:recordArray forKey:@"RECORDS"];

最高記録のランキングを表示する
保存してあるarrayを取り出してソートします。
float値のソート方法はこちらで教えてもらいました。

こちらを参考に
intをfloatに換えて

objective-c
NSArray *sorted_array = [recordArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) {
  return b.floatValue - a.floatValue; // ソート
 }]; //ダメな例

とかも試してみたんですが、何故かダメでした。
(数値が5つぐらいになるとランキングが前後する)

ちなみに今回の値を表示させたい場合はソートする前のarrayの
最後の値を取ってくればいいのでlastObjectメソッドが使えます。

objective-c
NSArray *recordArray=[ud objectForKey:@"RECORDS"];
//float score =[[recordArray lastObject]floatValue];
NSArray *sorted_array =[recordArray sortedArrayUsingSelector:@selector(compare:)];

あとはsorted_arrayから順番に取り出せば
ランキングが作成できます。

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3