今現在、STGのスコアソートに関して、大変悩んでおります。
と、いうのも、コードだけでは自分ではどこが間違っているかわからないのに、思った通りの動作をしてくれないのです。
以下から、具体的にお話しします。長くなりますがご了承ください。
今回質問したいのは、タイトルの通り、「スコアソート」です。
(というのも、ハイスコアの更新とかそのあたりもですが…汗)
≪やりたいこと≫
・ハイスコアを4機体分に分けて登録する。必要があれば、ゲーム終了のたびに更新する
・機体総合で、ハイスコアとキャラネーム(東方でいう、自由に名前を記入できるアレ)を表示する。
必要があれば、ゲーム終了時に更新する。
≪問題≫
ハイスコアもスコアソートも更新されない。
簡潔にまとめてみた物が、これです。
以下、関連のあるソースコードになります。
↓main.cpp
	//前略
		case 101://ポーズ画面処理
				pause();
				break;
			case 102://未実装のゲームオーバー画面操作
				graph_main();
				continue_game();
				break;
			case 103://リザルト表示
				graph_main();
				d_result();
				break;
			case 104://未実装のステージ移行操作
				stage_count=0;
				stage++;
				func_state=100;
				break;
			case 110://メニュー画面前の処理
				loading();
				delete_bgm();
				ini();	
				hiscore_write();
				func_state=19;
				if (sort_rec()!=-1)	func_state=130;
				break;
			case 130://スコアネーム入力画面
				nameinput();
				break;
			case 999://終了前のファイル出力。増やす可能性大
				hiscore_write();
				func_state=1000;
				break;
    //前略
void write_new_score(){
	FILE *fp;
	int hash;
	fp = fopen( "score/hiscore.dat" , "wb+" );			//hiscore.datを新規作成する
	for(int i=0;i<CHAR_KIND_MAX;i++){
		fprintf(fp,"%d\n",100000);				//4機分全てにハイスコア「100000」を登録
	}
	hash=400000%HASH;
	fprintf(fp,"%d\n",hash);
	fclose(fp);
}
int read_score(){
	FILE *fp;
	int hash,scanscore;
	all=0;
	fp = fopen( "score/hiscore.dat" , "rb" );				//4機体分のハイスコア登録
	
	for(int j=0;j<CHAR_KIND_MAX;j++){
		fscanf(fp,"%d",&scanscore);
		hiscore[j] = scanscore;
		all += hiscore[j];
	}
	fscanf(fp,"%d",&hash);
	fclose(fp);
	return hash;
}
void score_ini(){
	//ハイスコアを登録する
	int hash=0,truehash=0;
	FILE *fp;
	FILE *fps;
	if( ( fp = fopen( "score/hiscore.dat","rb"))==NULL){	//hiscore.datが見つからなかった場合
		write_new_score();
	}
	hash = read_score();
	truehash = all%HASH;
	if(truehash!=hash){
		write_new_score();
		read_score();
	}
	//レコードを登録する
	if( ( fps = fopen( filename, "rb") ) == NULL )	{
		for(int i=0;i<10;i++){
			rec_score[i].hiscore = 100000;
			sprintf( rec_score[i].name, "ナナシのシューター" );
		}
	}
	else{
		fread( &rec_score, sizeof(rec_score), 1, fps);
		fclose( fps );
	}
}
void hiscore_write(){
	FILE *fp;
	FILE *fps;
	//ハイスコアの書き出し
	int all=0,hash;
	for(int i=0;i<CHAR_KIND_MAX;i++){
		if(i==use_char){
			if(hiscore[i] < ch.hiscore)	hiscore[i]=ch.hiscore;
		}
	}
	fp = fopen( "score/hiscore.dat" , "wb" );
	for(int j=0;j<CHAR_KIND_MAX;j++){
		fprintf(fp,"%d\n",hiscore[j]);
		all+=hiscore[j];
	}
	hash=all%HASH;
	fprintf(fp,"%d\n",hash);
	fclose(fp);
	//レコード書き出し
	sort_rec();
	fps = fopen( filename, "wb");
	fwrite( &rec_score, sizeof(rec_score), 1, fps);
	fclose( fps );
}
int sort_rec(){
	int j;
	for(int i=0;i<10;i++){
		if( ch.hiscore>rec_score[i].hiscore ){
			for(j=9;j<i;j--){
				rec_score[j].chara_num	= rec_score[j-1].chara_num;
				rec_score[j].hiscore	= rec_score[j-1].hiscore;
				sprintf( rec_score[j-1].name, "%s", rec_score[j].name);
			}
			rec_score[i].chara_num	= use_char;
			rec_score[i].hiscore	= ch.hiscore;
			sprintf( rec_score[i].name, "%s",char_name);
			return i;
		}
	}
	return -1;
}