セーブデータの作り方

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

セーブデータの作り方

#1

投稿記事 by 名無しのやる夫 » 16年前

はじめまして。
某サイトを参考にテトリスを作ってみました。
一通り動くようになったので、ハイスコアを記録するようにしたいと思っています。

//同時に消したラインの数をカウント
switch(lines) {
case 1:
oneline++;
score = score + 200;
break;
case 2:
twoline++;
score = score + 400;
break;
case 3:
threeline++;
score = score + 600;
break;
case 4:
fourline++;
score = score + 1000;
break;
default:
break;

このscoreを保存したいんです。

・scoreを保存したい
・scoreが改変されないように保存したscoreを暗号化したい

この二つがどうしてもうまくいきません。良ければ教えていただけないでしょうか?
よろしくお願いします。

kazuoni

Re:セーブデータの作り方

#2

投稿記事 by kazuoni » 16年前

暗号化についてはググれば詳しいのは出てきますが、
簡単にだと
http://dixq.net/g/#t2
でできますが、どうでしょうか?

名無しのやる夫

Re:セーブデータの作り方

#3

投稿記事 by 名無しのやる夫 » 16年前

>kazuoniさん
暗号化は出来ました!ありがとうございます!
あとはコレをセーブファイルに保存すればいいのですが、どうも上手くいきません(´・ω・`)

たか

Re:セーブデータの作り方

#4

投稿記事 by たか » 16年前

>あとはコレをセーブファイルに保存すればいいのですが、どうも上手くいきません(´・ω・`)

ファイル入出力の知識はありますか?
あればfopenやfwriteを使えばできるの思うのですが。

まずは、どこが上手くいかないのか提示してみてはどうでしょうか。

Dixq (管理人)

Re:セーブデータの作り方

#5

投稿記事 by Dixq (管理人) » 16年前

規約をご覧頂けるとわかって頂けるかと思いますが、「うまくいきません」という質問は特に回答がしづらいのです。
例えば、パソコンに疎い友達が名無しのやる夫さんに、こんな事を聞いて来たとします。

「ねぇ、パソコン使いたいんだけど、うまく使えないんだよね。何が原因なんだろう?」

この問いに的確に答えられるでしょうか。もし、聞き返すことが出来ない状態だとすると

「君がパソコンに疎いからだよ。」

そう答えるほか無い状態ですよね。しかし、これじゃ解決になりません。
これを今回の件に置き換えてみると

Q「ファイルに保存したいんですが、うまくいきません」

A「君がC言語に疎いからだよ」

となってしまいますが、これじゃ解決になりませんよね。
そういうことで、「うまくいかない」という表現はよくないんですよね。

何が出来なくて困っているのか、エラーが出たならそのエラーメッセージはなんだったのか、
ファイルに正常な数値が書き出されなかったのならその数値はどんな数値だったのか、
そういうことを具体的に書くことで、具体的な回答が得られると思います。

質問が具体的になるほど、回答も具体的なものが期待できると思います。

さしあたり、ゲームの館のサンプルと同じようにプログラムを書けば保存、読み込みは出来ると思いますが、
どの辺で困っているのでしょうか?

名無しのやる夫

Re:セーブデータの作り方

#6

投稿記事 by 名無しのやる夫 » 16年前

お手を煩わせてしまい申し訳ありません。

int main()
{
typedef struct{
int highscore; //ハイスコア
}save_data_t;
char *name = "save_data.txt"; // save_data.txt(セーブデータファイル)
FILE *fp;
save_data_t save_data;


int time = 0; //時間カウント

Initialize(); //初期化

//ゲームオーバー判定
while(!gameover){

//キー入力の操作判定
if(kbhit()){
ControlBlock();
}
//時間がきたらブロックを1マス落下させる。時間が来てなければ時間を1だけインクリメント。
if(time < 20000){
time++;
}
else {
DropBlock();
time = 0;
}
}

/*ファイルの内容からデータをロード*/
{
if( ( fp = fopen( name, "rb" ) ) == NULL ) {
printf("ファイルオープンエラー\n");
}
else{
//ファイルからデータを読み込む
fread( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
printf("ハイスコア:%d\n",
save_data.highscore);
}
}

{
save_data.highscore = ("%d", score);
}

/*ファイルの内容からデータをロード*/
{
if( ( fp = fopen( name, "wb" ) ) == NULL ) {
printf("ファイルオープンエラー\n");
}
else{
fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
}
}

return 0;
}

>>1のスコアをセーブデータのハイスコア、に記録したいのですが、上記の用に記入してもスコアの得点がハイスコアに記録されないんです。
何が駄目なのか教えていただければ嬉しいです。よろしくお願いします。

Dixq (管理人)

Re:セーブデータの作り方

#7

投稿記事 by Dixq (管理人) » 16年前

コンパイル出来る形でコードを提示することは出来ますか?
後、ソースコードを投稿する時はプレタグを使って下さい。詳しくは規約をご覧下さい。

途中よくわからない部分はありますが、ファイルの読み込み、書き込みについてだけ言えば問題ありません。

後、

save_data.highscore = ("%d", score);

このように代入する理由はあるのでしょうか?

名無しのやる夫

Re:セーブデータの作り方

#8

投稿記事 by 名無しのやる夫 » 16年前

えっと、セーブデータの保存ができるようになったら、次にゲームをした時のスコアと比較させ、今回のスコアがそれまでのハイスコアを上回っていれば更新されるようと思いそのようにしました。
まだ比較まで手が届いていないのでアレなのですが・・・。

non

Re:セーブデータの作り方

#9

投稿記事 by non » 16年前

>上記の用に記入してもスコアの得点がハイスコアに記録されないんです。

記録されないとは?ハイスコアが更新されず、前の値のままということでしょうか?
もし、そうなら、fwriteの場所にブレークポイントを設けて、save_data.highscoreの
値を確認して、正しい値か確認してみてください。

名無しのやる夫

Re:セーブデータの作り方

#10

投稿記事 by 名無しのやる夫 » 16年前

>nonさん
セーブファイルに値は入るのですが、その値がスコアではなく4698だったり0だったりと統一されないんです。

御津凪

Re:セーブデータの作り方

#11

投稿記事 by 御津凪 » 16年前

save_data.highscore = ("%d", score);
上記の部分はおかしなことをするので、間違いです。
save_data.highscore = ((save_data.highscore < score) ? score : save_data.highscore);
こうではないですか?

# 確認ですが、保存するファイルはバイナリ形式ですよね?
# ファイル名の拡張子が"*.txt"になっていますが…。

non

Re:セーブデータの作り方

#12

投稿記事 by non » 16年前

fwriteのときの、save_data.highscoreをデバッグしたら正しい値なのに、保存したファイルの中身を
バイナリエディタで確認したら、4698だったり0だったりというわけですね。
ファイルの中身の確認をテキストエディタでやってるなんていう、オチはないですよね。

閉鎖

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