セーブデータの作り方
セーブデータの作り方
はじめまして。
某サイトを参考にテトリスを作ってみました。
一通り動くようになったので、ハイスコアを記録するようにしたいと思っています。
//同時に消したラインの数をカウント
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を暗号化したい
この二つがどうしてもうまくいきません。良ければ教えていただけないでしょうか?
よろしくお願いします。
某サイトを参考にテトリスを作ってみました。
一通り動くようになったので、ハイスコアを記録するようにしたいと思っています。
//同時に消したラインの数をカウント
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を暗号化したい
この二つがどうしてもうまくいきません。良ければ教えていただけないでしょうか?
よろしくお願いします。
Re:セーブデータの作り方
>kazuoniさん
暗号化は出来ました!ありがとうございます!
あとはコレをセーブファイルに保存すればいいのですが、どうも上手くいきません(´・ω・`)
暗号化は出来ました!ありがとうございます!
あとはコレをセーブファイルに保存すればいいのですが、どうも上手くいきません(´・ω・`)
Re:セーブデータの作り方
>あとはコレをセーブファイルに保存すればいいのですが、どうも上手くいきません(´・ω・`)
ファイル入出力の知識はありますか?
あればfopenやfwriteを使えばできるの思うのですが。
まずは、どこが上手くいかないのか提示してみてはどうでしょうか。
ファイル入出力の知識はありますか?
あればfopenやfwriteを使えばできるの思うのですが。
まずは、どこが上手くいかないのか提示してみてはどうでしょうか。
Re:セーブデータの作り方
規約をご覧頂けるとわかって頂けるかと思いますが、「うまくいきません」という質問は特に回答がしづらいのです。
例えば、パソコンに疎い友達が名無しのやる夫さんに、こんな事を聞いて来たとします。
「ねぇ、パソコン使いたいんだけど、うまく使えないんだよね。何が原因なんだろう?」
この問いに的確に答えられるでしょうか。もし、聞き返すことが出来ない状態だとすると
「君がパソコンに疎いからだよ。」
そう答えるほか無い状態ですよね。しかし、これじゃ解決になりません。
これを今回の件に置き換えてみると
Q「ファイルに保存したいんですが、うまくいきません」
A「君がC言語に疎いからだよ」
となってしまいますが、これじゃ解決になりませんよね。
そういうことで、「うまくいかない」という表現はよくないんですよね。
何が出来なくて困っているのか、エラーが出たならそのエラーメッセージはなんだったのか、
ファイルに正常な数値が書き出されなかったのならその数値はどんな数値だったのか、
そういうことを具体的に書くことで、具体的な回答が得られると思います。
質問が具体的になるほど、回答も具体的なものが期待できると思います。
さしあたり、ゲームの館のサンプルと同じようにプログラムを書けば保存、読み込みは出来ると思いますが、
どの辺で困っているのでしょうか?
例えば、パソコンに疎い友達が名無しのやる夫さんに、こんな事を聞いて来たとします。
「ねぇ、パソコン使いたいんだけど、うまく使えないんだよね。何が原因なんだろう?」
この問いに的確に答えられるでしょうか。もし、聞き返すことが出来ない状態だとすると
「君がパソコンに疎いからだよ。」
そう答えるほか無い状態ですよね。しかし、これじゃ解決になりません。
これを今回の件に置き換えてみると
Q「ファイルに保存したいんですが、うまくいきません」
A「君がC言語に疎いからだよ」
となってしまいますが、これじゃ解決になりませんよね。
そういうことで、「うまくいかない」という表現はよくないんですよね。
何が出来なくて困っているのか、エラーが出たならそのエラーメッセージはなんだったのか、
ファイルに正常な数値が書き出されなかったのならその数値はどんな数値だったのか、
そういうことを具体的に書くことで、具体的な回答が得られると思います。
質問が具体的になるほど、回答も具体的なものが期待できると思います。
さしあたり、ゲームの館のサンプルと同じようにプログラムを書けば保存、読み込みは出来ると思いますが、
どの辺で困っているのでしょうか?
Re:セーブデータの作り方
お手を煩わせてしまい申し訳ありません。
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のスコアをセーブデータのハイスコア、に記録したいのですが、上記の用に記入してもスコアの得点がハイスコアに記録されないんです。
何が駄目なのか教えていただければ嬉しいです。よろしくお願いします。
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のスコアをセーブデータのハイスコア、に記録したいのですが、上記の用に記入してもスコアの得点がハイスコアに記録されないんです。
何が駄目なのか教えていただければ嬉しいです。よろしくお願いします。
Re:セーブデータの作り方
コンパイル出来る形でコードを提示することは出来ますか?
後、ソースコードを投稿する時はプレタグを使って下さい。詳しくは規約をご覧下さい。
途中よくわからない部分はありますが、ファイルの読み込み、書き込みについてだけ言えば問題ありません。
後、
save_data.highscore = ("%d", score);
このように代入する理由はあるのでしょうか?
後、ソースコードを投稿する時はプレタグを使って下さい。詳しくは規約をご覧下さい。
途中よくわからない部分はありますが、ファイルの読み込み、書き込みについてだけ言えば問題ありません。
後、
save_data.highscore = ("%d", score);
このように代入する理由はあるのでしょうか?
Re:セーブデータの作り方
えっと、セーブデータの保存ができるようになったら、次にゲームをした時のスコアと比較させ、今回のスコアがそれまでのハイスコアを上回っていれば更新されるようと思いそのようにしました。
まだ比較まで手が届いていないのでアレなのですが・・・。
まだ比較まで手が届いていないのでアレなのですが・・・。
Re:セーブデータの作り方
>上記の用に記入してもスコアの得点がハイスコアに記録されないんです。
記録されないとは?ハイスコアが更新されず、前の値のままということでしょうか?
もし、そうなら、fwriteの場所にブレークポイントを設けて、save_data.highscoreの
値を確認して、正しい値か確認してみてください。
記録されないとは?ハイスコアが更新されず、前の値のままということでしょうか?
もし、そうなら、fwriteの場所にブレークポイントを設けて、save_data.highscoreの
値を確認して、正しい値か確認してみてください。
Re:セーブデータの作り方
save_data.highscore = ("%d", score);上記の部分はおかしなことをするので、間違いです。
save_data.highscore = ((save_data.highscore < score) ? score : save_data.highscore);こうではないですか?
# 確認ですが、保存するファイルはバイナリ形式ですよね?
# ファイル名の拡張子が"*.txt"になっていますが…。
Re:セーブデータの作り方
fwriteのときの、save_data.highscoreをデバッグしたら正しい値なのに、保存したファイルの中身を
バイナリエディタで確認したら、4698だったり0だったりというわけですね。
ファイルの中身の確認をテキストエディタでやってるなんていう、オチはないですよね。
バイナリエディタで確認したら、4698だったり0だったりというわけですね。
ファイルの中身の確認をテキストエディタでやってるなんていう、オチはないですよね。