今現在、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;
}