ランキングを更新する関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
humu.

ランキングを更新する関数

#1

投稿記事 by humu. » 10年前

今制作しているSTGで、ランキングを実装したいのですが、ハイスコアを更新する処理がうまく行きません。

現状では

コード:

void hiscore_judge(int cl_stage){
	int i,j;

	for (i = 9;i >= 0;i--){
		if(ranking[select_Char[0]][select_Char[1]].hiscore[i] < ch.score){
			//if(i != 0){
				i += 1;
			//}
			for(j = 9;j > i;j--){
				ranking[select_Char[0]][select_Char[1]].hiscore[j] = ranking[select_Char[0]][select_Char[1]].hiscore[j - 1];
			}
			ranking[select_Char[0]][select_Char[1]].hiscore[i] = ch.score;
			ranking[select_Char[0]][select_Char[1]].stage[i] = cl_stage;
			break;
		}
	}
}
のようになっているのですが、この状態で一位のスコアを更新すると、スコアが代入される場所がおかしくなってしまいます。
自分でも何度か修正を試みたのですが、自力では解決できそうに無いと思い相談させていただきました。
なにかいい方法がありましたら教えてください。

この関数は最後のステージをクリアするか、ゲームオーバー後コンティニューせずに終了した時に呼ばれています。

box
記事: 2002
登録日時: 13年前

Re: ランキングを更新する関数

#2

投稿記事 by box » 10年前

ranking[][]
を含む構造体の定義を見せてください。
humu. さんが書きました:

コード:

			//if(i != 0){
				i += 1;
			//}
配列の定義範囲外の領域にアクセスしているような気がしないでもありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ランキングを更新する関数

#3

投稿記事 by ISLe » 10年前

何位に入るか調べるのと、入賞順位以下を繰り下げるのを、同時にやりたいなら、繰り下げるのは1つずつで良いです。
何位に入るか調べるのと、入賞順位以下を繰り下げるのを、分ければ、繰り下げるのをまとめてできます。
どっちかにしましょう。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: ランキングを更新する関数

#4

投稿記事 by Tatu » 10年前

こんな感じでしょうか?

コード:

	//ranking[0]が1位
	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;//以降の順位は調べない
		}
	}

humu.

Re: ランキングを更新する関数

#5

投稿記事 by humu. » 10年前

Tatuさんのコードを参考に修正したら解決出来ました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る