ページ 1 / 1
獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 21:29
by royal
この前クイズゲームについて質問した者です
現在「全ての問題が出題し終わったら、リザルト画面で自分の獲得スコアと1位のスコアを表示」ということをしたいのですが何回やってもリザルト画面で1位のスコアだけが更新されません、どのようにプログラムを組めば更新されますでしょうか
※Result.cppは分割コンパイルの中の一部のファイルです
Result.cpp
コード:
#include "DxLib.h"
#include "Result.h"
void Result(int ten[], int Color, int Black) {
// 画像の読み込み
int imag01 = LoadGraph("images/文字1.png");
int imag02 = LoadGraph("images/文字2.png");
int imag03 = LoadGraph("images/文字3.png");
int imag04 = LoadGraph("images/文字4.png");
int x =0;
int i=0;
int FontHandle3 = CreateFontToHandle(NULL, 45, -1, DX_FONTTYPE_ANTIALIASING);
int max = 0;
//画像の書き出し
DrawGraph(300, 30, imag01, TRUE);
DrawGraph(60, 300, imag02, TRUE);
DrawGraph(15, 570, imag03, TRUE);
DrawGraph(540, 960, imag04, TRUE);
x = ten[i];
SetFontSize(165);
if (x > max) {
max = x;
}
DrawFormatString(1300, 320, Color, "%d 点", x);
DrawFormatString(1300, 593, Color, "%d 点", max);
DrawFormatStringToHandle(300, 840, Black,FontHandle3,"5秒後にタイトルに戻ります");
i = i + 1;
}
ちなみにゲームの流れは
タイトル画面
↓
ゲーム画面
↓
リザルト画面
↓
タイトル画面
という流れです、
メニュー画面の作り方. 2 のサイトを参考にしました
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 21:51
by みけCAT
単純に、1位のスコアを更新していないから1位のスコアが更新されないのではないでしょうか?
1位のスコアを更新するようにプログラムを書けば、1位のスコアが更新されると思います。
1位のスコアを更新するつもりで書いたコードがあれば、それを提示してください。
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 22:05
by royal
すいません、実行した結果を載せるのを忘れてました
1回目 獲得点数 500
獲得スコア 500
1位のスコア 500
↓
タイトルに戻り全台出題し終えます
↓
2回目 獲得点数 350
獲得スコア 350
1位のスコア 350
本来なら
獲得スコア 350
1位のスコア 500
と出ると思うんですが上記の結果の通り比較されていないということになっています
みけCAT さんが書きました:単純に、1位のスコアを更新していないから1位のスコアが更新されないのではないでしょうか?
1位のスコアを更新するようにプログラムを書けば、1位のスコアが更新されると思います。
1位のスコアを更新するつもりで書いたコードがあれば、それを提示してください。
それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 22:13
by みけCAT
royal さんが書きました:それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです
更新したら、更新したデータを保持しないといけないですよね。
上のプログラムには、画像(文字を含む)以外を書き出して(保存して)いる様子がありません。
オフトピック
本題とは関係なさそうですが、この位置にLoadGraphの呼び出しがあるのは気になりますね。
毎フレーム呼び出されているならリークでやばいし、毎フレーム呼び出されているわけではないなら
書いてはいけない処理の疑いがあってやばいので、
どっちにしろやばそうですね。
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 22:45
by royal
みけCAT さんが書きました:royal さんが書きました:それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです
更新したら、更新したデータを保持しないといけないですよね。
上のプログラムには、画像(文字を含む)以外を書き出して(保存して)いる様子がありません。
自分の考えですが void ではなく int を使い値を返し次のスコアと比較という感じという
ことでしょうか
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 22:52
by みけCAT
royal さんが書きました:自分の考えですが void ではなく int を使い値を返し次のスコアと比較という感じという
ことでしょうか
申し訳ないですが、意味がよくわかりません。
とりあえずそれを実装してみて、改善するかどうか試してみるといいでしょう。
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 23:25
by royal
intだと逆に難しくなったためvoidを使って組んでみましたがいかかでしょうか
コード:
#include "DxLib.h"
#include "Result.h"
void Result(int ten[],int Color, int Black,int imag01,int imag02,int imag03, int imag04) {
int i = 0, maxkeep[599], max = 0; //変数の初期化,配列の設定
int FontHandle3 = CreateFontToHandle(NULL, 45, -1, DX_FONTTYPE_ANTIALIASING);
//画像の書き出し
DrawGraph(300, 30, imag01, TRUE);
DrawGraph(60, 300, imag02, TRUE);
DrawGraph(15, 570, imag03, TRUE);
DrawGraph(540, 960, imag04, TRUE);
SetFontSize(165);
if (ten[i] > max) {
max = ten[i];
}
DrawFormatString(1300, 320, Color, "%d 点", ten[i]);
DrawFormatString(1300, 593, Color, "%d 点", max);
DrawFormatStringToHandle(300, 840, Black,FontHandle3,"5秒後にタイトルに戻ります");
maxkeep[i] = ten[i]; // maxkeepにten[i]の数値を保存
i = i + 1; // iに1を足す
}
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 23:35
by みけCAT
royal さんが書きました:intだと逆に難しくなったためvoidを使って組んでみましたがいかかでしょうか
ダメですね 自分でテスト しましたか? (川柳)
描画をしたり静的でないローカル変数を書き換えたりするだけで、更新された値を関数を抜けても残る形で保存していない、という問題は変わっていないように見えます。
実行していないので、誤解だったらすみません。
オフトピック
CreateFontToHandleもリソースを作成する関数なので、毎フレーム呼び出してかつ生成したものを削除しないのはまずそうな気がします。
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月13日(木) 23:58
by royal
みけCAT さんが書きました:
描画をしたり静的でないローカル変数を書き換えたりするだけで、更新された値を関数を抜けても残る形で保存していない、という問題は変わっていないように見えます。
実行していないので、誤解だったらすみません。
静的という言葉を見るまで static のことを忘れていました
つまりこうことでしょうか
コード:
#include "DxLib.h"
#include "Result.h"
static int max;
int Result(int ten,int Color, int Black,int imag01,int imag02,int imag03, int imag04) {
int i = 0, maxkeep[599]; //変数の初期化,配列の設定
int FontHandle3 = CreateFontToHandle(NULL, 45, -1, DX_FONTTYPE_ANTIALIASING);
//画像の書き出し
DrawGraph(300, 30, imag01, TRUE);
DrawGraph(60, 300, imag02, TRUE);
DrawGraph(15, 570, imag03, TRUE);
DrawGraph(540, 960, imag04, TRUE);
SetFontSize(165);
if (ten > max) {
max = ten;
DrawFormatStringToHandle(15, 680, Color,FontHandle3, "現在あなたがトップです!");
}
DrawFormatString(1300, 320, Color, "%d 点", ten);
DrawFormatString(1300, 593, Color, "%d 点", max);
DrawFormatStringToHandle(300, 840, Black,FontHandle3,"5秒後にタイトルに戻ります");
return max;
}
CreateFontToHandleについては後に直しておきます
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月14日(金) 00:18
by Dixq (管理人)
SetFontSizeも非常に重いので毎回呼んではいけない関数です。
フォントの大きさを指定したいのならそのサイズのフォントを作るべきでしょう。
maxkeepって何のためにある変数なのでしょうか。
個人的には更新処理と描画処理が混在していて気持ち悪いです。
以前お伝えしたプログラミングの設計の章はご覧になったでしょうか?
また、プログラムソースは全体が分かるように投稿してもらえたら回答しやすいです。
本サイトに登録してもらえたらzipや色んなファイルが添付可能になります。
不要ファイルを削除後プロジェクトをまるごとzipにして添付してもらっても構いません。
Re: 獲得スコアと1位のスコアの表示
Posted: 2017年7月14日(金) 00:45
by royal
Dixq (管理人) さんが書きました:SetFontSizeも非常に重いので毎回呼んではいけない関数です。
フォントの大きさを指定したいのならそのサイズのフォントを作るべきでしょう。
maxkeepって何のためにある変数なのでしょうか。
個人的には更新処理と描画処理が混在していて気持ち悪いです。
以前お伝えしたプログラミングの設計の章はご覧になったでしょうか?
maxkeepは消すのを忘れていました、プログラミングの設計についてですがクイズゲームの
開発に夢中になりすぎてあまり読んでませんでした、せっかく教えてくれたのに申し訳ありません...
しっかりと読んでおきます
そして、回答してくれた方々、ありがとうございました。