ハイスコアランキングの作り方を教えてください
Posted: 2007年11月14日(水) 19:21
c言語でシューティングゲームを作っているのですが、
ハイスコアランキングを導入しようと思い、
簡単なサンプルプログラムを作成しました。
しかし、思うように動かず困っています。
どこがおかしいのでしょうか?
具体的におかしい部分は、実行すれば分かるのですが、
SADというスコアネームが連続して表示されてしまうのです。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
struct ScoreName{ /*スコアネーム構造体*/
char name[3];
int score;
};
int BubleSort(ScoreName x[ ], int n) /*バブルソート*/
{
int i, j;
ScoreName temp;
for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
if (x[j - 1].score < x[j].score) { /* 前の要素の方が小さかったら */
temp = x[j]; /* 交換する */
x[j] = x[j - 1];
x[j - 1] = temp;
}
}
}
}
int main(void)
{
FILE *fp; /*ファイルポインタ*/
ScoreName test[10];/*={"T.S",0,"A.S",0,"NAS",0,"TOM",0,"BAK",0,
"GOM",0,"VER",0,"HOK",0,"JAK",0,"BOY",0}; */
int i,j,tmp;
ScoreName point={"SAD",0}; /*新しい点数*/
srand(time(NULL)); /*乱数の初期化*/
for(i=0;i<10;i++)
{
/*strcat(test.name,"T.S");*/
point.score = (rand()%2000)+6000; /*新しい点数に6000以上の点数を与える*/
/*test.score=(rand()%3000)+5000;*/
}
fp=fopen("score.dat","r"); /*ファイルオープン*/
for(i=0;i<10;i++)
{
fscanf(fp,"%s",test.name); /*fscanfでネームに文字列を代入*/
fscanf(fp,"%d",&test.score); /*fscanfでスコアに点数を代入*/
}
fclose(fp); /*ファイルクローズ*/
for(i=0;i<10;i++) /*バブルソート前の構造体配列(スコアネーム)を表示*/
{
printf("%s,%d\n",test.name,test.score);
}
for(i=0;i<9;i++) /*最も肝心な部分(スコアが新しいスコアより大きくて、かつ
スコアが新しいスコアより小さければ新しいスコアを代入する*/
{
if(point.score>test[i+1].score && point.score<=test.score)
{
for(j=i;j<9;j++)
{
test[j+1].score=test[j].score;
}
test=point;
}
}
BubleSort(test,10); /*バブルソートする*/
printf("ソートしました。\n\n"); /*ソートした旨の文字表示*/
fp=fopen("score.dat","w"); /*ファイルオープン(書き込み)*/
for(i=0;i<10;i++)
{
fprintf(fp,"%s\n",test.name);
fprintf(fp,"%d\n",test.score);
}
fclose(fp);
for(i=0;i<10;i++) /*ソート後の構造体配列の中身を表示する*/
{
printf("%s,%d\n",test[i].name,test[i].score);
}
return 0;
}
ハイスコアランキングを導入しようと思い、
簡単なサンプルプログラムを作成しました。
しかし、思うように動かず困っています。
どこがおかしいのでしょうか?
具体的におかしい部分は、実行すれば分かるのですが、
SADというスコアネームが連続して表示されてしまうのです。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
struct ScoreName{ /*スコアネーム構造体*/
char name[3];
int score;
};
int BubleSort(ScoreName x[ ], int n) /*バブルソート*/
{
int i, j;
ScoreName temp;
for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
if (x[j - 1].score < x[j].score) { /* 前の要素の方が小さかったら */
temp = x[j]; /* 交換する */
x[j] = x[j - 1];
x[j - 1] = temp;
}
}
}
}
int main(void)
{
FILE *fp; /*ファイルポインタ*/
ScoreName test[10];/*={"T.S",0,"A.S",0,"NAS",0,"TOM",0,"BAK",0,
"GOM",0,"VER",0,"HOK",0,"JAK",0,"BOY",0}; */
int i,j,tmp;
ScoreName point={"SAD",0}; /*新しい点数*/
srand(time(NULL)); /*乱数の初期化*/
for(i=0;i<10;i++)
{
/*strcat(test.name,"T.S");*/
point.score = (rand()%2000)+6000; /*新しい点数に6000以上の点数を与える*/
/*test.score=(rand()%3000)+5000;*/
}
fp=fopen("score.dat","r"); /*ファイルオープン*/
for(i=0;i<10;i++)
{
fscanf(fp,"%s",test.name); /*fscanfでネームに文字列を代入*/
fscanf(fp,"%d",&test.score); /*fscanfでスコアに点数を代入*/
}
fclose(fp); /*ファイルクローズ*/
for(i=0;i<10;i++) /*バブルソート前の構造体配列(スコアネーム)を表示*/
{
printf("%s,%d\n",test.name,test.score);
}
for(i=0;i<9;i++) /*最も肝心な部分(スコアが新しいスコアより大きくて、かつ
スコアが新しいスコアより小さければ新しいスコアを代入する*/
{
if(point.score>test[i+1].score && point.score<=test.score)
{
for(j=i;j<9;j++)
{
test[j+1].score=test[j].score;
}
test=point;
}
}
BubleSort(test,10); /*バブルソートする*/
printf("ソートしました。\n\n"); /*ソートした旨の文字表示*/
fp=fopen("score.dat","w"); /*ファイルオープン(書き込み)*/
for(i=0;i<10;i++)
{
fprintf(fp,"%s\n",test.name);
fprintf(fp,"%d\n",test.score);
}
fclose(fp);
for(i=0;i<10;i++) /*ソート後の構造体配列の中身を表示する*/
{
printf("%s,%d\n",test[i].name,test[i].score);
}
return 0;
}