龍神録を参考にしたC++プログラムの推敲

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Iseuma14
記事: 54
登録日時: 10年前

龍神録を参考にしたC++プログラムの推敲

#1

投稿記事 by Iseuma14 » 8年前

現在C++の練習のため、Dixq様の龍神録のプログラムをC++で書いています
現在11章の敵を呼び出すところまで実装したのですが、このような書き方でよいのか、おかしいところはないのか、もっとこうしたほうがいいというような組み方はないのか等、疑問がつきません

しかし、身近にはプログラムのわかる人がいないので推敲および訂正していただきたく投稿させていただきました
また、ファイルを添付するのが初めてなので、うまくいっていないかもしれません そのときは申し訳ございません 画像、csvファイルの二次配布はよくないと思ったので龍神録のサイトから引っ張ってきていただけるとうれしいです Dxライブラリは添付するとサイズが大きくなるので、添付しておりません

何卒よろしくお願いいたします
添付ファイル
danmaku.zip
(7.5 KiB) ダウンロード数: 127 回

hide

Re: 龍神録を参考にしたC++プログラムの推敲

#2

投稿記事 by hide » 8年前

ヘッダファイルを中心に見ましたが、

・変数名がわかりづらい
・変数の数に対してクラスが少ない

というのが第一印象です。
ヘッダファイルは名刺・自己紹介ですので、パッと見て理解できないようでは困ります。

例えば、Playerクラスの m_slow_flag ですが、
Playerクラスに新しくメンバ関数を追加して、 m_slow_flag を利用するとしましょう。
m_slow_flag が true のときに遅いのか逆なのか曖昧な感じです。
実装を見ないといけなくなるようだと、クラスが大きくなればなるほど労力が大きくなって辛いです。
なので、こういう場合は、 is_slow とかがオススメです。下記のように英語っぽく読めます。

コード:

if (this->is_slow)
{
  //スローのとき
}
それと、クラスが少ないですね。まとめられる物はまとめないと読みづらいです。
例えば、x,yの位置情報をまとめて、位置クラスにするとか。

それに、enemyの実装を見てみたのですが、enemyクラス1つで敵全員の情報を扱っているように見えました。
この推測が当たっているとしたら、オブジェクト指向的には間違ったやり方です。
基本的に、クラスを書いたらそれは1つの物として実装します。
今回で言えば Enemyクラスのインスタンスは1体の敵と対応しなければなりません。
例えばEnemyクラスのRunメソッドは1体の敵に動くように指示するメソッドとして実装します。
このEnemyクラスを配列やコレクションで扱うことによって、敵全体を扱うという方法に直すべきです。

Iseuma14
記事: 54
登録日時: 10年前

Re: 龍神録を参考にしたC++プログラムの推敲

#3

投稿記事 by Iseuma14 » 8年前

hide様、ご回答ありがとうございます
例えば、Playerクラスの m_slow_flag ですが、
Playerクラスに新しくメンバ関数を追加して、 m_slow_flag を利用するとしましょう。
m_slow_flag が true のときに遅いのか逆なのか曖昧な感じです。
実装を見ないといけなくなるようだと、クラスが大きくなればなるほど労力が大きくなって辛いです。
なので、こういう場合は、 is_slow とかがオススメです。下記のように英語っぽく読めます。
確かにその方が分かりやすいですね これからはそうするようにしようと思います
それと、クラスが少ないですね。まとめられる物はまとめないと読みづらいです。
例えば、x,yの位置情報をまとめて、位置クラスにするとか。
これは、プレイヤーや敵に座標を持たせず、別のクラスで管理した方がいいということでしょうか?
それとも、プレイヤーや敵の座標の値をそれぞれのクラスとは別に保存してあるクラスを作るということでしょうか?
確かにまとめた方が自機狙いを作るとき等、楽になりそうなので参考にさせていただきます
それに、enemyの実装を見てみたのですが、enemyクラス1つで敵全員の情報を扱っているように見えました。
この推測が当たっているとしたら、オブジェクト指向的には間違ったやり方です。
基本的に、クラスを書いたらそれは1つの物として実装します。
今回で言えば Enemyクラスのインスタンスは1体の敵と対応しなければなりません。
例えばEnemyクラスのRunメソッドは1体の敵に動くように指示するメソッドとして実装します。
このEnemyクラスを配列やコレクションで扱うことによって、敵全体を扱うという方法に直すべきです。
ということは、敵一体分の処理をする関数をRun関数というようにまとめ、それをforループなどで各敵分回すという考え方で良いのでしょうか?
初めはそうしていたのですが、書いていくうちにどちらが正しい書き方なのか分からなくなり、今回の書き方にしました 自分の今回の一番の疑問点だったので有難い限りです

上にあげた2点ほどまたお時間あれば教えていただけると非常に嬉しいです 何卒よろしくお願いいたします

また、その他気になる点をまた見つけたときは教えてもらえると非常に助かります

改めましてご回答ありがとうございました

hide

Re: 龍神録を参考にしたC++プログラムの推敲

#4

投稿記事 by hide » 8年前

これは、プレイヤーや敵に座標を持たせず、別のクラスで管理した方がいいということでしょうか?
それとも、プレイヤーや敵の座標の値をそれぞれのクラスとは別に保存してあるクラスを作るということでしょうか?
確かにまとめた方が自機狙いを作るとき等、楽になりそうなので参考にさせていただきます
直接int型のx,yで持たせずに、Pointクラスにしてプレイヤー、敵のpriavteなメンバにそれぞれ持たせましょう
という話ですね。
たとえばあとから、「キャラクターの座標をintではなくdoubleで管理したい」となったときに、
今のやり方だと全クラスを見て修正して回ることになります。
ですが、Pointクラスみたいな感じにしておけば、Pointクラスの実装を直せばそれだけで全キャラクター修正できることになるのです。
ということは、敵一体分の処理をする関数をRun関数というようにまとめ、それをforループなどで各敵分回すという考え方で良いのでしょうか?
それで間違いないです。
敵一体分を処理する、というよりかは自身の情報を更新する。というイメージで作ってください。
クラスは、自身の情報をメンバに持っておいて基本滝に自分の情報だけが参照できる状態にするのが良いです。(カプセル化)
このやり方にすると、一時的にマスゲーム的な集団行動動作を実装しづらく感じるかもしれませんがメリットも大きいはずです。

とりあえずのところクラスを書くならば目指すべきはこういう形です。
http://dixq.net/Android/s02_02.html

Iseuma14
記事: 54
登録日時: 10年前

Re: 龍神録を参考にしたC++プログラムの推敲

#5

投稿記事 by Iseuma14 » 8年前

hide様、再びご回答ありがとうございます
直接int型のx,yで持たせずに、Pointクラスにしてプレイヤー、敵のpriavteなメンバにそれぞれ持たせましょう
という話ですね。
なるほど理解しました 確かにその方が修正時等、楽そうです
クラスに出来そうなところを探して実践してみようと思います
それで間違いないです。
敵一体分を処理する、というよりかは自身の情報を更新する。というイメージで作ってください。
クラスは、自身の情報をメンバに持っておいて基本滝に自分の情報だけが参照できる状態にするのが良いです。
ありがとうございました今回一番の疑問が解決いたしました
おかげさまでこれからの章を作っていくとき正しい作り方で作っていくことが出来そうです

改めましてご回答ありがとうございました

閉鎖

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