ゲームの状態管理についての質問

このQ&Aのポイント
  • C++で簡単なゲームプログラムを書いていますが、状態遷移の方法について質問です。
  • 現在の状態に応じてbool型の変数をif文でつなげているが、もっと分かりやすい書き方はあるか。
  • 前回の情報と現在の情報を比べるために多くの変数を使用しているが、もっとシンプルな方法はないか。
回答を見る
  • ベストアンサー

ゲームの状態管理

現在C++で簡単なゲームプログラムを書いていますが、いくつか質問です。 C++というよりはプログラムの組み方の質問です。 (1) 現在状態に応じてbool型のインスタンスで状態遷移をしているが大変 isClicked, isWebAccess, isGetX, isFastみたいな変数をひたすらif文でつなげています。 何となくプログラムも大きくなってきたので、もう少し分かりやすく書きたいのですが、どうすれば良いでしょうか。 やはりステートパターンの導入でしょうか。アドバイスをよければお願いします。 (2) onとoffの切り替えについて 前回の情報を保持し、現在の情報と比べる必要がある所が多々あるのですが、これはどうすればよいでしょうか。 old_x<=>current_x, old_clicked<=>current_clickedといった変数が現在大量にあり、書いている方も混乱してきました。 これも同様にif文で毎度whileループの中を比較しています。 何かもっとシンプルな方法があれば教えてください。 非常に簡単なゲームなんですが、今後も考えて有効なデザインパターンやプログラミング手法があれば参考程度に教えて頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

(1)も(2)も、データ構造を見直すのがいいのではないでしょうか。 コンパイルした最終的な動作は、(1)のような判定と分岐の塊になってしまいます。 でも、人間が読むソースの段階ではもう少しわかりやすくするのがよいでしょう。 C++を使っているということなので、classを活用するのが常套手段でしょう。 (どんなことをしたいかよくわからないので、具体的な例は思いつかないのですが) (2)の方も、各状態毎に変数を用意するなんてしないで、「『状態』オブジェクトの配列」にすればわかりやすいし、直前以外の状態へもアクセスできます。

関連するQ&A

  • C言語でゲームを作りたいんですど・・・

    変数4つ、配列一つ 制御文はif文、switch文、繰り返し制御をそれぞれ1回以上使って、C言語のゲームを作りたいんですけど、まったくわかりません。 どんなソースを作ればいいでしょうか??

  • rubyの構文(&&を用いた条件分岐について)

    ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals  puts 'true' else  puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool  if vals   puts 'true'  else   puts 'false'  end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 適切な変換関数が存在しない???

    C++の構造体で困っています 印刷領域のカレントポジションを原点に戻すとともに、それ以前のカレントポジションを知ろうと思い以下のようなプログラムを書きました typedef struct {       int x;       int y; }POINT ; POINT MyPoint; MyPoint.x = 9999; MyPoint.y = 9999; bool rtn = MoveToEx(hdc, 0, 0, MyPoint);  ・・・・・(1) MyPoint.xとMyPoint.y には9999ではなく、現在のカレントポジションが入るという単純なものです ところが(1)のMyPointで以下のような文法エラーが発生します ERROR "POINT"から"LPPOINT"への適切な変換関数が存在しません 色々調べましたらC++のコンパイラの設定に関連するエラーらしいです この辺りのことは不勉強で困っております どのように対処すれば良いかご指導願います

  • BCB6でのエラー…

    BCB6のMEMOコンポーネントに、プログラムの実行結果を表示したく、ButtonClickイベントにプログラムを書き、実行すると 「テンプレート引数に、静的リンゲージまたはローカルリンゲージを入れることはできない」 というエラーが出てしまいます。プログラムを添付致しますのでよろしかったらご覧になって下さい。 struct State { // 状態を表すフラグ // false は、川の左岸、true は、川の右岸を表わす bool wolf; bool goat; bool cabbage; bool man; // この状態になるまでの道のり deque<State> path // -------- 初期化 -------- // 初期状態では、全て川の左岸 State() : wolf( false ), goat( false ), cabbage( false ), man( false ), path() { } // -------- 状態に対するオペレーター ------ // 狼を移動させる State move_wolf() const { State s = *this; s.path.push_back( *this ); if ( s.wolf == s.man ) { s.wolf = !s.wolf; s.man = !s.man; } return( s ); } のように続きます。 deque<State> pathの部分にエラーが表示されます。 初心者で全く分からないので、プログラム等、不明な点があればお答え致しますので、どうか分かる方いましたらお返事をよろしくお願いいたします。

  • javaのプログラムについての質問です。

    javaのプログラムについての質問です。 javaについて、あまり詳しくないので質問させていただきます。 ボタンを押して円などの色を変えるプログラムで、2色を変える(黄→赤)if文は public void actionPerformed(ActionEvent e) { if (bool) { setBackground(Color.yellow); this.bool = false; } else { setBackground(Color.red); this.bool = true; の様にfalseとtrueを使えばできるのですが、もし3、4色の場合はif文の中をどうしたら良いですか? できれば、ボタンを押すたびに黄→赤→黒→黄…など3~4色のループするようにしたいです。 いろいろ考えたのですが、うまくいきません。どなたか教えて下さい。

    • ベストアンサー
    • Java
  • C# こういう場合ってどうなるの?

    public void A(bool b) {   if(b ? B() : C())//分かると思いますが、三項演算子   {     //略   } } public bool B() {   return true; } public bool C() {   return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。

  • if等判定文での定数、変数の記述順序

    perlスクリプトなどで、判定文を記述する際の考え方について、 重箱の隅的な質問になりますが、よろしくお願いします。 (1)if等判定文での定数、変数の記述順序 例えば、ある変数が0であることを判定するのに、結果は同じなのですが、 [] if($a == 0) [] if(0 == $a) のどちらで書く方が良い(理にかなっている)のでしょうか? (文字列でも同じでしょうか) [] if("$a" eq "") [] if("" eq "$a") (2)私はよく上限、下限の判定を行う際に、 [] 0 < x < 10 ということを表現する際に、 数学的に見映え(並び順)が同じになるよう、 [] if((0 < $x) && ($x < 10)){ と書くのですが、(1)のことと照らし合わせると、 [] if(($x > 0) && ($x < 10)){ と書いたり、 [] if((0 < $x) && (10 > $x)){ と書くほうが良いでしょうか。 (3)以上の(1)(2)のことは、標準的なC言語でも同じでしょうか? (4)Perl独特の書き方ですが、1行で済む実行文の場合、 [] 実行文 if(条件文); と書く方が、 [] if(条件文) 実行文; と書くよりも変換効率(?)か何かが良いと聞いたのですが、 どういう理由でどちらが良いとかありますか? この辺の違いはコンパイラが吸収してくれるので、どちらでも良いとか、 何か参考になる文献などもありましたら、ご教示よろしくお願いします。

    • ベストアンサー
    • Perl
  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • WriteFileで送信できたかの確認方法は?

    シリアルポートで非同期でバイナリを送信するプログラムを作成しています。 以下のソースでバイナリを送信したつもりなのですが、本当に送信できているのか分りません。 送信が完了したのか確認するにはどうしたいいでしょうか? よろしくお願いします。 COMのオープン、DCBの設定は恐らく問題ないので、 WriteFileの周辺を抜粋します。 OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; char wbuf[7] = {0x02,0x0C,0x01,0x00,0x31,0x15,0x1A}; DWORD wbyte; if(!WriteFile(hCom,wbuf,(DWORD)sizeof(wbuf),&wbyte,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&wbyte,TRUE); } else MessageBox("エラー"); }

  • ifの条件式 Andを使用するものについて

    phpで、 $a="あいうえお"; $b="かきくけこ"; $c="かきくけこ"; と変数を三つ宣言しました。 上の変数三つを利用して、以下条件のif文を作りたいと思いました。  条件:$a変数 と $b変数が異なり、かつ $b変数 と $c変数の内容が同じとき「処理A」を実行させる。 ○作成したif文 if(($a <> $b) && ($b == $c)){  処理A } と記述したのですが、 ifブロック処理Aが実行されません。 なぜなのでしょうか…。 ご教授お願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう