ソースコードの添削をお願いします

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

ソースコードの添削をお願いします

#1

投稿記事 by ふらっと » 13年前

現在ゲームプログラミングの練習でじゃんけんゲームを作っております。
自分で一応組んでみたんですが、実行自体は出来ても思い通りに動いてくれないので、アドバイスお願いします。
多分めちゃくちゃなコードになっていると思いますが、少しずつ直していきたいのでよろしくお願いします。

やりたいこと
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: ソースコードの添削をお願いします

#2

投稿記事 by softya(ソフト屋) » 13年前

少なくとも前回にじゃんけんの手の表示と結果の表示はファイルを分けましょうと書いたアドバイスは生かされていませんよ。
あと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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: ソースコードの添削をお願いします

#3

投稿記事 by ふらっと » 13年前

回答ありがとうございます。

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などが入っています
このようにやりたいんですが、enumで名前を付けた場合それぞれ値が与えられていたりしますか?
それともconstでやった方が良いですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ソースコードの添削をお願いします

#4

投稿記事 by softya(ソフト屋) » 13年前

ResultTable の前にenumを定義すればResultTable の値として利用できます。
更にenumに名前をつけてResultTable の型もそのenum名にするのがお勧めです。
ミスで違う値(直値)を使うとコンパイラがエラーを出すのでミスを事前に防げますし文法的にこもこの書き方が正しいです。

(例)
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: ソースコードの添削をお願いします

#5

投稿記事 by ふらっと » 13年前

2次元配列ではないんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ソースコードの添削をお願いします

#6

投稿記事 by softya(ソフト屋) » 13年前

ふらっと さんが書きました:2次元配列ではないんですか?
あくまで例です。
勘違いさせて申し訳ないですがResultTableは2次元が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: ソースコードの添削をお願いします

#7

投稿記事 by ふらっと » 13年前

例でしたか。
ありがとうございます。
上手く動くように頑張ります。

ふらっと
記事: 13
登録日時: 13年前

Re: ソースコードの添削をお願いします

#8

投稿記事 by ふらっと » 13年前

質問です。

例のように
enum XX { A,B,C };
enum XX ResultTable[3] = { B,B,C };
と続けて書くなら、じゃんけんの手を取得したり描画したりするJankenHand.cppのヘッダに書くのか、じゃんけんの結果を計算するJankenCalc.cppのヘッダに書くのかどちらが良いですか?
この時、上のenumの部分、じゃけんのぐーなどを表すもの(JANKENHAND_GUなど。どのヘッダに書くかで名前は変わりますが)はどちらでも使いますが、ResultTableはJankenCalcでしか使いません。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: ソースコードの添削をお願いします

#9

投稿記事 by beatle » 13年前

僕なら、XX.hppというヘッダを作ってそのに書きますね。

enumはA, B, Cのような名前が外部に露出してしまいますので、実際には
enum XX { XX_A, XX_B, XX_C };
のような命名規則を用いるのが良いかと思います。

C++11を使っていいなら、もっと進化したenumを使うこともできますが。

閉鎖

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