トップページ > 過去ログ > 記事閲覧
スコアの記録
名前:sk 日時: 2009/11/07 22:49

dxライブラリで簡単なゲームを作っているのですが、それにスコアを記録する機能をつけたいのですがやり方がわかりません。 具体的に言うと、ゲームオーバー時にスコアが一番高かったら今のスコアを上書きして保存されるようにしたいです。 どうやれば良いですか?

Page: 1 |

Re: スコアの記録 ( No.1 )
名前:けいし 日時:2009/11/09 13:11

アトリエミュート開発担当、けいしと申します。 以下の関数をプログラムに追加し、 RefreshScore(スコア); のように呼び出すと、スコアがハイスコアとして更新されます。 もちろん、今までのハイスコアより低ければ、更新はされません。 どうでしょうか。 #include <stdio.h> void RefreshScore(int score) { FILE* fp; int hiscore; fp = fopen("score.txt", "r"); if(fp != NULL) { fscanf(fp, "%d", &hiscore); fclose(fp); } if(fp == NULL || hiscore < score) { fp = fopen("score.txt", "w"); fprintf(fp, "%d", score); fclose(fp); } }
Re: スコアの記録 ( No.2 )
名前:けいし 日時:2009/11/09 13:15

追加。 以下は、今までのハイスコアを取得する関数です。 int hiscore = GetHiScore(); のように呼び出すと、hiscoreにハイスコアが代入されます。 #include <stdio.h> int GetHiScore(void) { FILE* fp = fopen("score.txt", "r"); int hiscore; if(fp == NULL) return 0; fscanf(fp, "%d", &hiscore); fclose(fp); return hiscore; }
Re: スコアの記録 ( No.3 )
名前:sk 日時:2009/11/11 00:04

>けいしさん 丁寧にありがとうございます。 えっと、上記ふたつのプログラムをゲームオーバー時の処理のときに続けて書けば良いんですか? 普通に続けて書いたらエラーが出てしまってよくわかりません。。
Re: スコアの記録 ( No.4 )
名前:ゆう 日時:2009/11/11 07:35

横槍すみませんが、 けいしさんの書いているプログラムは 解りやすい簡単なものなので、 どういう処理を行っているか自分で考えてみると 勉強になって良いと思いますよ。
Re: スコアの記録 ( No.5 )
名前:けいし 日時:2009/11/11 23:28

>どういう処理を行っているか自分で考えてみると >勉強になって良いと思いますよ。 余力があれば、ゆうさんの仰るように、 自分で消化してみると良いと思います。 ですが、まずは動かしたいですよね。 ということで、少し説明を。 skさんがどこまで解っているのか判らないので、 一応基礎的なところから全部書きます。 ポイントは、3つです。 1.C言語のプログラムは、「関数」というものが集まって出来ている。 2.「関数」は、処理をひとまとめにしたもので、必要に応じて「呼び出す」ことができる。 3.「呼び出す」命令は、呼び出す関数よりも後に書かなければならない。 skさんのプログラムを探すと、 「WinMain」か「main」のどちらかがあると思います。 これはメイン関数と呼ばれ、一番最初に呼び出される「関数」です。 そして、メイン関数の処理を終えると、プログラムは終了してしまいます。 なので、メイン関数の中にゲーム全体の処理を書くか、必要に応じて別の関数を呼び出すかする必要があります。 ちなみに、メイン関数内で「DxLib_Init()」とも書いていると思いますが、 これが「別の関数の呼び出し」になります。 補足すると、 関数自体を作るときは、 int 関数名(...) { ここに中身; } のように長ったらしく書き、 呼び出すときは 関数名(...); のように書きます。 さて、ここからがいよいよ質問の答えとなるわけですが、 僕が書いた2つの関数 void RefreshScore(int score) { 略 } int GetHiScore(void) { 略 } は、関数自体の記述なので、 メイン関数と同列に書く必要があります。 そして、ポイント3で言った通り、 呼び出す命令よりも前に中身を書く必要があるので、 void RefreshScore(int score) { 略 } int GetHiScore(void) { 略 } int WINAPI WinMain(略) { この辺にゲームのプログラムを書いてる? ゲームオーバー処理もこの辺? ← ここでハイスコア処理を呼び出したい! } こんな感じに書けば良いと思います。 #include <stdio.h> は、 #include "DxLib.h" の辺りに1つだけ追加すればOKです。 で、肝心のハイスコア処理をしたいなら、 1つ目の僕の書き込みで書いたように、 RefreshScore(スコア); をプログラムに書けば良いです。つまり、 int WINAPI WinMain(略) { この辺にゲームのプログラムを書いてる? ゲームオーバー処理もこの辺? RefreshScore(スコア); } という感じ。 「スコア」の部分には、スコアを入れている変数 とかを入れて下さい。 RefreshScore(score); のように。 以上、非常に長くなってしまいましたが、 この通り書けば動くと思います。 「関数」の概念は非常に重要ですので、 暇があれば解説サイト等を見てみるのも良いと思いますよ><
Re: スコアの記録 ( No.6 )
名前:sk 日時:2009/11/12 00:02

>けいしさん すごく詳しい解説ありがとうございます。 おかげでちゃんとハイスコアを実装することができました。 でも、エラーではないのですが警告が5つでてきてしまうようになってしまいました。 fopenやfscanfの宣言を確認してください、みたいな警告が5つほどです。
Re: スコアの記録 ( No.7 )
名前:けいし 日時:2009/11/12 00:07

忘れていました>< fopen、fscanf のように警告の出た関数は、 fopen_s、fscanf_s のように、「_s」を付けて書き換えてみて下さい。 もしかしたら引数も変わってるかもしれませんが>< まあ警告は出ても、実害は無いので、 気にならなければ放置しても大丈夫です。

Page: 1 |