質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

678閲覧

射的ゲーム 得点をランキング画面に反映させたい

kinakomoti-_-

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2023/01/17 05:03

前提

DXライブラリを使って射撃ゲームを作成しています。
C++初心者です。

実現したいこと

スコアをランキング画面に反映させたい

発生している問題・エラーメッセージ

配列の中の全部の要素にスコアが反映されてしまいます。

該当のソースコード(一部抜粋)

C++

1void Ranking_Draw() { 2 int rankX = 50, rankY = 150;  // 〇位の座標 3 int scoreX = 70, scoreY = 150; // スコアの座標 4 // スコアランキング 1位から5位まで表示 5 static int rank[5] = {}; 6 7 8 if (rank[0] < score) { 9 rank[0] = score; 10 } 11 else if (rank[1] < score) { 12 rank[1] = score; 13 } 14 else if (rank[2] < score) { 15 rank[2] = score; 16 } 17 else if (rank[3] < score) { 18 rank[3] = score; 19 } 20 else if (rank[4] < score) { 21 rank[4] = score; 22 } 23 24 // バブルソート(降順) 25 int i, j, buf; 26 27 for (i = 0; i < 5; i++) 28 { 29 for (j = 0; j < 4; j++) 30 { 31 if (rank[j] < rank[j + 1]) 32 { 33 buf = rank[j]; 34 rank[j] = rank[j + 1]; 35 rank[j + 1] = buf; 36 } 37 } 38 } 39 40 // ランキング表示 41 int x = 1; 42 SetFontSize(10); 43 DrawString(200, 110, "ランキング画面です。", GetColor(253, 222, 165)); 44 for (int i = 0; i < 5; i++) { 45 DrawFormatString(rankX, rankY, GetColor(253, 222, 165), "%d", x); 46 DrawFormatString(scoreX, scoreY, GetColor(255, 255, 255), "%d", rank[i]); 47 rankY += 30; 48 scoreY += 30; 49 x += 1; 50 } 51 52 DrawString(0, 450, "Bキーを押すとメニュー画面に戻ります。", GetColor(255, 255, 255)); 53 54 55}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Ranking_Draw() なる関数名から推測するに,この関数はランキングの描画が必要なときに毎度呼ばれるのではないでしょうか.

で,この関数には データ更新処理 と 描画処理 が混在している様子ですから,この関数を呼ぶたびにデータ更新処理も走ってしまうことになります.

配列の中の全部の要素にスコアが反映されてしまいます

というのは,そのような理由によって発生しているものと推測します.
この関数が繰り返し呼ばれた際にデータがどのように変わっていくことになるのか? を考えてみると良いでしょう.


「描画のための関数」であれば描画のみを行うべきであり,データの更新処理までをも行うべきではありません.
データ更新処理 と 描画処理 は個別の関数に分け,それぞれを必要なときにのみ呼ぶようにすると良いのではないでしょうか.

投稿2023/01/17 05:27

編集2023/01/17 06:07
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinakomoti-_-

2023/01/17 05:54

コメントありがとうございます。試みてみます
kinakomoti-_-

2023/01/18 00:58

データ更新処理と描画処理に分けてみたんですが、直りませんでした
fana

2023/01/18 01:20

実際に何をどうしたらどうなったのか,こちらには不明ですから,「頑張って原因究明作業とかをしてください」としか言えませんが… > 必要なときにのみ呼ぶようにする ということがしっかりとできているのですか? --- 質問文に提示されたコードの 8 行目からの if ~ else if ~ ... について言えば, 配列 rank[] の要素群のうち,ここを1度だけ実行した際に値が変化し得る要素というのは1個だけ(:複数個が変化することはない)ですよね. そしたら,rank[] の全要素の値が変化するためには,少なくともここの処理が5回は走る必要がある,ということ. なので,ここの処理を1回しか実施しない(=必要なときのみ実施する)ならば,「全要素に反映される」という現象は起こらないハズ. (この if~else if~... のところの実装が「ランキングデータの更新として意味的に正しいかどうか」というのは別の問題なので置いとくとして)
fana

2023/01/18 01:28

念のため明言しておくけど, > 「頑張って原因究明作業とかをしてください」 これはガチなアドバイスですぞ. 平たく言えば「デバッグしてください」とかになる. なにはともあれ,「実際に何がどう動いた結果として観測した状況になっているのか?」というところをあなた自身が掴まないと,「何をどうすれば良いのか?」といった方針等を考えることもできないよ.
kinakomoti-_-

2023/01/18 02:04

わかりました。ありがとうございます!頑張って原因究明作業します
kinakomoti-_-

2023/01/18 05:56

原因究明作業をした結果、ここの処理が終了するまで実施されていました。 一回だけ実施したいって時はフラグで制御した方がいいですかね?
fana

2023/01/18 06:03

どういう方法が良いのか? に関しては,あなたのプログラムの作り等々に依るでしょうから,そういう制御が適しているのか否かも他者には不明です. が,「スコアのランキング」という言葉から想像するに,更新すべきタイミングというのは「ある1回のゲームプレイの最終スコア値が定まった時点」なのではないかと推測しますので,そのようなタイミング(ゲームクリアしたときやゲームオーバーになったとき?)に実施すれば良いだけの話なのかもしれません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問