制作環境はwindows7、VisualStudioExpress2012、DXライブラリです。
流れは、
タイトル画面(ランキングが表示されている)→ゲーム開始(タイム計測)→被弾するとリザルト画面へ(タイムの表示、ランキング更新)→タイトル画面
のような流れです。
stimeとranking[10]はグローバル変数として宣言してあります。
まずタイトル画面の処理ですが、
for(int i=0;i<RANKING_MAX;i++){
DrawFormatString(120,100+(i*30),GetColor(255,255,255),"%d 位 %.1f 秒",i+1,ranking[i]);
}
ゲーム中は で時間を取得しています。
そしてリザルト画面で
void ranking_sort(double score){
int i;
int j;
for(i=0;i<RANKING_MAX;i++){//1位から比較
//今の順位よりも高ければそれが今回の順位となる
//(1位より高ければ1位、1位より低く2位より高ければ2位、…)
if(score>ranking[i]){
for(j=RANKING_MAX -1;j>i;j--){//今回の順位以降のスコアをずらす
ranking[j]=ranking[j-1];
}
ranking[i]=score;//今回のスコアを記憶
break;//以降の順位は調べない
}
}
}
void result(){
ranking_sort(stime);
}
と書きました。
実行すると最初のタイトル画面では1位~10位まで0.0秒と表示。ゲームで5.0秒のタイムを出したとしリザルト画面を経てタイトルに戻ります。
そうすると1位~10位まで全て5.0秒というタイムになってしまいます。
そこからまたタイムを更新し、5.5秒の記録を出したとすると、1位~10位まで全て5.5秒のタイムが表示されます。タイムを更新しなければ何も変化なしです。
恐らくbreakが動作していないと思うのですが・・・
理想とする実行結果はタイムが長い順(降順)に1位から順番に表示していく、一つずつランキングの更新をしていく事です。
また、10位のタイムよりタイムが長ければ10位にタイムを代入。そこからバブルソートで順位を降順にソートする方法も考え組んでみました。
void ranking_sort2(double score){
if(score > ranking[9]){ //ranking[9]より高ければranking[9]にその数を入れる
ranking[9] = score;
}
int i,j;
double temp;
for (i = 0;i < RANKING_MAX - 1;i++) {
for (j = 0;j <RANKING_MAX - 1;j++) {
if (ranking[j + 1] < ranking[j]) {
temp = ranking[j];ranking[j] = ranking[j + 1];ranking[j + 1] = temp;
}
}
}
}
このように書きましたが10位のタイムだけが更新され、1位~9位が0.0秒、10位が5.0秒という結果になってしまいます。そこからタイムを更新すると1位~9位が0.0秒、10位が5.5秒といった結果です。
ポインタやアドレスを扱うのでしょうか・・・。一通り見てみましたが配列(ranking[])に対してポインタを使う方法は探せませんでした。
なぜこのプログラムで実行がうまくいかないのか、どうすればランキングの実装ができるのか、ご教授下さい。よろしくお願いします。