獲得スコアと1位のスコアの表示

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

獲得スコアと1位のスコアの表示

#1

投稿記事 by royal » 6年前

この前クイズゲームについて質問した者です
現在「全ての問題が出題し終わったら、リザルト画面で自分の獲得スコアと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 のサイトを参考にしました

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 獲得スコアと1位のスコアの表示

#2

投稿記事 by みけCAT » 6年前

単純に、1位のスコアを更新していないから1位のスコアが更新されないのではないでしょうか?
1位のスコアを更新するようにプログラムを書けば、1位のスコアが更新されると思います。
1位のスコアを更新するつもりで書いたコードがあれば、それを提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

royal

Re: 獲得スコアと1位のスコアの表示

#3

投稿記事 by royal » 6年前

すいません、実行した結果を載せるのを忘れてました

1回目 獲得点数 500
獲得スコア 500
1位のスコア 500

タイトルに戻り全台出題し終えます

2回目 獲得点数 350
獲得スコア  350
1位のスコア 350

本来なら
獲得スコア  350
1位のスコア 500

と出ると思うんですが上記の結果の通り比較されていないということになっています
みけCAT さんが書きました:単純に、1位のスコアを更新していないから1位のスコアが更新されないのではないでしょうか?
1位のスコアを更新するようにプログラムを書けば、1位のスコアが更新されると思います。
1位のスコアを更新するつもりで書いたコードがあれば、それを提示してください。
それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 獲得スコアと1位のスコアの表示

#4

投稿記事 by みけCAT » 6年前

royal さんが書きました:それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです
更新したら、更新したデータを保持しないといけないですよね。
上のプログラムには、画像(文字を含む)以外を書き出して(保存して)いる様子がありません。
オフトピック
本題とは関係なさそうですが、この位置にLoadGraphの呼び出しがあるのは気になりますね。
毎フレーム呼び出されているならリークでやばいし、毎フレーム呼び出されているわけではないなら書いてはいけない処理の疑いがあってやばいので、
どっちにしろやばそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

royal

Re: 獲得スコアと1位のスコアの表示

#5

投稿記事 by royal » 6年前

みけCAT さんが書きました:
royal さんが書きました:それなのですが・・・更新しようとしたプログラムが上の提示したプログラムです
更新したら、更新したデータを保持しないといけないですよね。
上のプログラムには、画像(文字を含む)以外を書き出して(保存して)いる様子がありません。
自分の考えですが void ではなく int を使い値を返し次のスコアと比較という感じという
ことでしょうか

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 獲得スコアと1位のスコアの表示

#6

投稿記事 by みけCAT » 6年前

royal さんが書きました:自分の考えですが void ではなく int を使い値を返し次のスコアと比較という感じという
ことでしょうか
申し訳ないですが、意味がよくわかりません。
とりあえずそれを実装してみて、改善するかどうか試してみるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

royal

Re: 獲得スコアと1位のスコアの表示

#7

投稿記事 by royal » 6年前

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を足す

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 獲得スコアと1位のスコアの表示

#8

投稿記事 by みけCAT » 6年前

royal さんが書きました:intだと逆に難しくなったためvoidを使って組んでみましたがいかかでしょうか
ダメですね 自分でテスト しましたか? (川柳)

描画をしたり静的でないローカル変数を書き換えたりするだけで、更新された値を関数を抜けても残る形で保存していない、という問題は変わっていないように見えます。
実行していないので、誤解だったらすみません。
オフトピック
CreateFontToHandleもリソースを作成する関数なので、毎フレーム呼び出してかつ生成したものを削除しないのはまずそうな気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

royal

Re: 獲得スコアと1位のスコアの表示

#9

投稿記事 by royal » 6年前

みけ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については後に直しておきます

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 獲得スコアと1位のスコアの表示

#10

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

SetFontSizeも非常に重いので毎回呼んではいけない関数です。
フォントの大きさを指定したいのならそのサイズのフォントを作るべきでしょう。
maxkeepって何のためにある変数なのでしょうか。

個人的には更新処理と描画処理が混在していて気持ち悪いです。
以前お伝えしたプログラミングの設計の章はご覧になったでしょうか?

また、プログラムソースは全体が分かるように投稿してもらえたら回答しやすいです。
本サイトに登録してもらえたらzipや色んなファイルが添付可能になります。
不要ファイルを削除後プロジェクトをまるごとzipにして添付してもらっても構いません。

royal

Re: 獲得スコアと1位のスコアの表示

#11

投稿記事 by royal » 6年前

Dixq (管理人) さんが書きました:SetFontSizeも非常に重いので毎回呼んではいけない関数です。
フォントの大きさを指定したいのならそのサイズのフォントを作るべきでしょう。
maxkeepって何のためにある変数なのでしょうか。

個人的には更新処理と描画処理が混在していて気持ち悪いです。
以前お伝えしたプログラミングの設計の章はご覧になったでしょうか?
maxkeepは消すのを忘れていました、プログラミングの設計についてですがクイズゲームの
開発に夢中になりすぎてあまり読んでませんでした、せっかく教えてくれたのに申し訳ありません...
しっかりと読んでおきます

そして、回答してくれた方々、ありがとうございました。

返信

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