現在ゲームプログラミングの練習でじゃんけんゲームを作っております。
自分で一応組んでみたんですが、実行自体は出来ても思い通りに動いてくれないので、アドバイスお願いします。
多分めちゃくちゃなコードになっていると思いますが、少しずつ直していきたいのでよろしくお願いします。
やりたいこと
1、初期化する
2、プレイヤーからのキー入力を受け付ける。(じゃんけんの手を受ける)
3、CPUの手をランダムに取得する。
4、プレイヤーとCPUの手を描画する。
5、プレイヤーとCPUの手から結果を描画する。(ここであいこだったら6に行かずに2に戻る)
6、エンターを押したら(押されるまでそのまま待つ)全て初期化して2に戻るようにする。(これはやり方がよくわからなかったので、やってありません)
環境
Visual C++ 2008
Windows Vista
よろしくお願いします。
ソースコードの添削をお願いします
ソースコードの添削をお願いします
- 添付ファイル
-
- practice Gameprog.zip
- (17.35 MiB) ダウンロード数: 113 回
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: ソースコードの添削をお願いします
少なくとも前回にじゃんけんの手の表示と結果の表示はファイルを分けましょうと書いたアドバイスは生かされていませんよ。
あとstateなのか戻り値なのか意味の曖昧な使い方をしていますのでバグになっています。
一種の自爆パターンなのですが何でも安易に兼用にするとろくな事にはなりません。
変数も戻り値も目的にしっかりした使い方をしてそれ以外の値を入れてはいけません。
戻り値を安易にstateに代入するのが悪い行為です。戻り値を元にstateを変化させるなら、そういうロジックを書き加えて下さい。
もし、戻り値自体をstateにするのがわかりやすければ、stateにしても良いですがstateにするならstateの値が取りうる処理を全てmainに書きましょう。
1.デバッガで変数や戻り値の値をチェックする。
あるいはprintfDXでも可。
2.stateや戻り値に名前をつける。enumなどを使いましょう。
エラーなどの場合を除いて-1など分かりづらいマジックナンバーは使わない。
3.描画処理と判定処理が曖昧な区分けに成っている。
処理は処理、描画は描画で各々呼び出しましょう。
4.stateは分かりやすく機能を決めましょう。
5.JankenCalc_GetHandでキー入力で手を描画してますが、それだとその一瞬(1フレーム)だけしか表示されません。表示し続けるためのstateを管理して下さい。
JankenCalc_DrawResultで結果描画を制御しているのもダメです。stateで管理しましょう。
6.初期化はwhile前で良いのでは?
JankenHand_Initilize();
JankenCalc_Initilize();
画像初期化は2回初期化するのも行けませんので後々stateを0にする事自体禁止ですし。
7.勝敗の判定は2次元配列を使うとすごく幸せになれます。
これがうまく動いたら、ちゃんとじゃんけんの演出処理を入れたほうが良いでしょうね。ゲームの練習ですし。
あとstateなのか戻り値なのか意味の曖昧な使い方をしていますのでバグになっています。
一種の自爆パターンなのですが何でも安易に兼用にするとろくな事にはなりません。
変数も戻り値も目的にしっかりした使い方をしてそれ以外の値を入れてはいけません。
戻り値を安易にstateに代入するのが悪い行為です。戻り値を元にstateを変化させるなら、そういうロジックを書き加えて下さい。
もし、戻り値自体をstateにするのがわかりやすければ、stateにしても良いですがstateにするならstateの値が取りうる処理を全てmainに書きましょう。
1.デバッガで変数や戻り値の値をチェックする。
あるいはprintfDXでも可。
2.stateや戻り値に名前をつける。enumなどを使いましょう。
エラーなどの場合を除いて-1など分かりづらいマジックナンバーは使わない。
3.描画処理と判定処理が曖昧な区分けに成っている。
処理は処理、描画は描画で各々呼び出しましょう。
4.stateは分かりやすく機能を決めましょう。
5.JankenCalc_GetHandでキー入力で手を描画してますが、それだとその一瞬(1フレーム)だけしか表示されません。表示し続けるためのstateを管理して下さい。
JankenCalc_DrawResultで結果描画を制御しているのもダメです。stateで管理しましょう。
6.初期化はwhile前で良いのでは?
JankenHand_Initilize();
JankenCalc_Initilize();
画像初期化は2回初期化するのも行けませんので後々stateを0にする事自体禁止ですし。
7.勝敗の判定は2次元配列を使うとすごく幸せになれます。
これがうまく動いたら、ちゃんとじゃんけんの演出処理を入れたほうが良いでしょうね。ゲームの練習ですし。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ソースコードの添削をお願いします
回答ありがとうございます。
enumについて質問をしたいです。
結果の判定を2次元配列でやるようにしたいんですが
手をenumを使ってJANKENHAND_GUなどのように表している場合
このようにやりたいんですが、enumで名前を付けた場合それぞれ値が与えられていたりしますか?
それともconstでやった方が良いですか?
enumについて質問をしたいです。
結果の判定を2次元配列でやるようにしたいんですが
手をenumを使ってJANKENHAND_GUなどのように表している場合
int ResultTable [3] [3] {{ 0, 1, 2 }
{ 2, 0, 1 }
{ 1, 2, 0 }}
// 0=あいこ、1=勝ち、2=負け プレイヤーが縦、CPUが横で上(左)からぐー、ちょき、ぱー
// 結果もenumで名前を付けますが、取り合えず考え方を伝えたいので数字で
Result = ResultTable [PlayerHand] [CPUHand] // このPlayerHand,CPUHandにJANENHAND_GUなどが入っています
それともconstでやった方が良いですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: ソースコードの添削をお願いします
ResultTable の前にenumを定義すればResultTable の値として利用できます。
更にenumに名前をつけてResultTable の型もそのenum名にするのがお勧めです。
ミスで違う値(直値)を使うとコンパイラがエラーを出すのでミスを事前に防げますし文法的にこもこの書き方が正しいです。
(例)
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
更にenumに名前をつけてResultTable の型もそのenum名にするのがお勧めです。
ミスで違う値(直値)を使うとコンパイラがエラーを出すのでミスを事前に防げますし文法的にこもこの書き方が正しいです。
(例)
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: ソースコードの添削をお願いします
あくまで例です。ふらっと さんが書きました:2次元配列ではないんですか?
勘違いさせて申し訳ないですがResultTableは2次元が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ソースコードの添削をお願いします
質問です。
例のように
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
と続けて書くなら、じゃんけんの手を取得したり描画したりするJankenHand.cppのヘッダに書くのか、じゃんけんの結果を計算するJankenCalc.cppのヘッダに書くのかどちらが良いですか?
この時、上のenumの部分、じゃけんのぐーなどを表すもの(JANKENHAND_GUなど。どのヘッダに書くかで名前は変わりますが)はどちらでも使いますが、ResultTableはJankenCalcでしか使いません。
例のように
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
と続けて書くなら、じゃんけんの手を取得したり描画したりするJankenHand.cppのヘッダに書くのか、じゃんけんの結果を計算するJankenCalc.cppのヘッダに書くのかどちらが良いですか?
この時、上のenumの部分、じゃけんのぐーなどを表すもの(JANKENHAND_GUなど。どのヘッダに書くかで名前は変わりますが)はどちらでも使いますが、ResultTableはJankenCalcでしか使いません。
Re: ソースコードの添削をお願いします
僕なら、XX.hppというヘッダを作ってそのに書きますね。
enumはA, B, Cのような名前が外部に露出してしまいますので、実際には
enum XX { XX_A, XX_B, XX_C };
のような命名規則を用いるのが良いかと思います。
C++11を使っていいなら、もっと進化したenumを使うこともできますが。
enumはA, B, Cのような名前が外部に露出してしまいますので、実際には
enum XX { XX_A, XX_B, XX_C };
のような命名規則を用いるのが良いかと思います。
C++11を使っていいなら、もっと進化したenumを使うこともできますが。