じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

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

じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#1

投稿記事 by エレジー » 13年前

開発環境
Windows 7
Visual C++2010

じゃんけんゲームなんですが、プレイヤーの手がぐー、ちょき、ぱー何を入力してもグーが描画されてしまいます。
ただ、裏で変数にどの手が出されたかの情報を代入して、計算するといった動作はできていると思います。
CPUの手の画像はしっかり変わりますし、勝ち、負け、あいこの判定などプレイヤーの手がすべてグーで描画されてしまうこと以外は目指している仕様通りにいっているはずです。

問題点の指摘お願いします。
添付ファイル
添付用.zip
(36.67 KiB) ダウンロード数: 190 回

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#2

投稿記事 by h2so5 » 13年前

JankenProc.cpp と DrawObject.cpp の
static int PlayerHand, CPUHand; はそれぞれ独立していることを分かっていますか?

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#3

投稿記事 by エレジー » 13年前

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

DrawObject.ccpにvoid DrawObject_PlayerHand( int PlyerHand )と書いて
main.ccpでDrawObject_PlayerHand( PlayerHand )と書くことで、main.ccpのPlayerHandの値がDrawObjectのPlayerHandに代入されると思っていました。
詳しく言うと呼び出し側の()内に書いた変数の値が呼び出される側の()内の変数に、呼び出された時代入されるのだと思っていました。
この考え方が違っていたということですか?

それぞれの変数の名前が同じだったのもだめですかね?
main_PlayerHandやJankenProc_PlayerHand、DrawObject_PlayerHandという名前にしたほうがいいですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#4

投稿記事 by h2so5 » 13年前

エレジー さんが書きました: DrawObject.ccpにvoid DrawObject_PlayerHand( int PlyerHand )と書いて
main.ccpでDrawObject_PlayerHand( PlayerHand )と書くことで、main.ccpのPlayerHandの値がDrawObjectのPlayerHandに代入されると思っていました。
詳しく言うと呼び出し側の()内に書いた変数の値が呼び出される側の()内の変数に、呼び出された時代入されるのだと思っていました。
この考え方が違っていたということですか?
これは正しいですよ。
でも、main.cpp と JankenProc.cpp の static int PlayerHand, CPUHand;
は別のものなのでJankenProc.cppでPlayerHandに代入してもmain.cppのPlayerHandは0のままです。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#5

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

エレジー さんが書きました: それぞれの変数の名前が同じだったのもだめですかね?
main_PlayerHandやJankenProc_PlayerHand、DrawObject_PlayerHandという名前にしたほうがいいですか?
別のスコープを持つ変数は例え名前が一緒でも別の変数です。
関数外でstaticにした変数はファイルスコープなのでファイル内で参照可能な変数となり、JankenProc.cpp と DrawObject.cpp で別の変数として扱われます。
エレジー さんが書きました: DrawObject.ccpにvoid DrawObject_PlayerHand( int PlyerHand )と書いて
main.ccpでDrawObject_PlayerHand( PlayerHand )と書くことで、main.ccpのPlayerHandの値がDrawObjectのPlayerHandに代入されると思っていました。
詳しく言うと呼び出し側の()内に書いた変数の値が呼び出される側の()内の変数に、呼び出された時代入されるのだと思っていました。
この考え方が違っていたということですか?
上と同様に
DrawObject_PlayerHand( int PlyerHand ){
のPlyerHand と
static int PlayerHand, CPUHand; // プレイヤーとCPUの手の状態格納用 0=ぐー 1=ちょき 2=ぱー
のPlyerHand も別のスコープを持つので別の変数です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#6

投稿記事 by エレジー » 13年前

main.ccpの
PlayerHand = JankenProc_GetPlayerHand();の部分で
「main.ccpのPlayerHand」に返り値である「DrawObject.ccpのPlayerHand」が代入されると思っていたんですが
間違いでしたか?

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#7

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

エレジー さんが書きました:main.ccpの
PlayerHand = JankenProc_GetPlayerHand();の部分で
「main.ccpのPlayerHand」に返り値である「DrawObject.ccpのPlayerHand」が代入されると思っていたんですが
間違いでしたか?
失礼しました。確かにそれは合っています。
なので、DrawObject.ccpのstatic int PlayerHand, CPUHand;は存在する必要はありませんね。常に引数で受け取るわけですから。ややこしいので消してしまって下さい。
ただ、そうするとエラーが出ると思います。それは何故でしょうか?考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#8

投稿記事 by エレジー » 13年前

あぁぁぁ
aが足りない・・・
void DrawObject_PlayerHand( int PlayerHand )
こんなことだったんですね。
作るときに注意しないと後でこんなに悩むことになるんですね。


やっとじゃんけんゲームの基本が完成できました。
ここで質問したこと以外にもいろいろと悩んで悩んでやっとここまで来たのでとても嬉しいです。
この後は勉強のために勝った時のエフェクトなど付けて行きたいと思っています。
ただ、正直何をどうしたらいいのかよく分からないので、またここで質問させていただくことになると思います。

この掲示板では解決したときにそのソースコードを載せることになっているようですが、今回のようにゲーム自体が完成という形で解決した場合どうしたらいいですか?

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#9

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

エレジー さんが書きました:あぁぁぁ
aが足りない・・・
void DrawObject_PlayerHand( int PlayerHand )
こんなことだったんですね。
作るときに注意しないと後でこんなに悩むことになるんですね。


やっとじゃんけんゲームの基本が完成できました。
ここで質問したこと以外にもいろいろと悩んで悩んでやっとここまで来たのでとても嬉しいです。
この後は勉強のために勝った時のエフェクトなど付けて行きたいと思っています。
ただ、正直何をどうしたらいいのかよく分からないので、またここで質問させていただくことになると思います。

この掲示板では解決したときにそのソースコードを載せることになっているようですが、今回のようにゲーム自体が完成という形で解決した場合どうしたらいいですか?
このエラーはバグの少ないプログラム作るための重要なヒントが隠されています。
つまり、変数のスコープは出来るだけ限定的にしないと同名の変数を間違って使ってしまう恐れがあると言うことです。
(1)グローバル → (2)ファイル → (3)関数ローカル → (4)関数の中の{}内に限定。
(4)が一番安全で(1)が一番危険です。今回は(2)と(3)が間違って使われてしまった良くない書き方だったと言うことは分かりますね。
こういうミスした場合コンパイルエラーに成る書き方を常に考えるようにして下さい。なので、ファイルスコープの変数の多用は危険なのです。

ソースコードということであれば、ここで一区切りで良いと思います。
ところで、あいこの時にちゃんと動くかは確認されましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#10

投稿記事 by エレジー » 13年前

簡単そうに思えるじゃんけんゲームでも作ってみると難しくて、たくさん勉強になる事がありました。
ありがとうございました。

あいこのときはそのままもう一度キー入力すればしっかり動いてくれます。
ただ、エンターキーでリッセットということを表示させるのを忘れていたりと、まだ少し直すところがありました。

今度もここで質問させていただくと思うので、これからもよろしくお願いします。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#11

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

エレジー さんが書きました:簡単そうに思えるじゃんけんゲームでも作ってみると難しくて、たくさん勉強になる事がありました。
ありがとうございました。

あいこのときはそのままもう一度キー入力すればしっかり動いてくれます。
ただ、エンターキーでリッセットということを表示させるのを忘れていたりと、まだ少し直すところがありました。

今度もここで質問させていただくと思うので、これからもよろしくお願いします。
少し直す程度なら直した後でOKですのでソースコードは載せてくださいね。
大きく改造してエフェクトとか入れるなら、それはまた別って事でお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#12

投稿記事 by エレジー » 13年前

わかりました。
明日になってしまいますが、またソースコードを載せておきます。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#13

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

エレジー さんが書きました:わかりました。
明日になってしまいますが、またソースコードを載せておきます。
もし直せるなら気をつけたほうが良いかもしれない点を書いておきますね。

・定数はenum などで名前をつけると良いです。0,1,2など直接の数値は視認性・メンテナンス性が下がります。

・PlayerHand, CPUHandのstatic変数が2つのソースファイルにありますが、main.cppかJankenProc.cppのどちらにしないと同じ物を2カ所で同時保持している風に読み取れます。
主体とする方は残して、もう片方はスコープや寿命を限定した方が良いでしょう。
「変数の記憶寿命とスコープ」
http://www2.ee.knct.ac.jp/el/E3/E305/lifeandscope.html

・エフェクトのためには手を出していない状態がないので、それを増やしたほうが良いかもしれません。次回で良いかな?

・共通化出来る関数は共通化すると不具合が出る確率が減ります。何処が出来るか考えてみてください。
ただし、シンプルに出来るものを選択すべきで無理をすると返ってバグが増えます。

・グー、チョキ、パーのイメージを配列にすると楽に表示できます。どうすれば良いかは考えて見下さい。

無理に全部対応しなくて良いので常に考えてもらうだけでも良い結果につながります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#14

投稿記事 by エレジー » 13年前

わかりました。
もう少し直してみます。

そこで、enumについてなんですが、説明が難しく伝わるかわかりませんが質問したいです。
enumで名前を付けるために新しくJanken_e.hというヘッダーファイルを作って

コード:

#ifndef DEF_JANKEN_E_H //二重include防止

#define DEF_JANKEN_E_H

enum JankenHand_e {
    JANKEN_HAND_NO,
 
    JANKEN_HAND_GU,
    JANKEN_HAND_TYOKI,
    JANKEN_HAND_PA,
};

enum JankenResult_e{
	JANKEN_RESULT_NO,
	
	JANKEN_RESULT_AIKO,
	JANKEN_RESULT_KATI,
	JANKEN_RESULT_MAKE,
};

#endif
こう書いたとします。
すると、JankenProcの

コード:

int JankenProc_Calc(){
	int ResultTable [3] [3] = {{ 1, 2, 3 },
				         { 3, 1, 2 },
					      { 2, 3, 1 }};
	int JankenResult; // 1=あいこ 2= 勝ち 3=負け

	// プレイヤー上からぐー、ちょき、ぱー CPU左からぐー,ちょき,ぱー
	JankenResult = ResultTable [PlayerHand] [CPUHand];

	return JankenResult;
}
この関数の、JankenResult = ResultTable [PlayerHand] [CPUHand];
の部分でPlayerHand、CPUHandには、JANKEN_HAND_GUやJANKEN_HAND_TYOKIが入るということになりますよね?
ここの値が0,1,2ならResultTableの上(左)から0番目、1番目、2番目と分かるので,ResultTableから結果が返ってきますが
JANKEN_HAND_GU番目、JANKEN_HAND_TYOKI番目、JANKEN_HAND_PA番目といっても分からないと思うのですが、どうなりますか?
enumで宣言したときに、宣言した順に値が割り振られていたりするんですか?(この場合だとJANKEN_HAND_NO = 0,JANKEN_HAND_GU= 1・・・)

そのあたりを理解できていないのでよろしくお願いします。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#15

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

Janken_e.hはJankenProc.hがあるのなら兼用すべきです。無闇にヘッダを増やすのは混乱を招きます。

ちなみに番号は、

コード:

enum JankenHand_e {
    JANKEN_HAND_NO, //0
 
    JANKEN_HAND_GU, //1
    JANKEN_HAND_TYOKI, //2
    JANKEN_HAND_PA, //3
};
となります。

あとenumを代入する時の型ですがintではなく次のように利用して下さい。
関係ないものを代入するとエラーにすることが出来ます。

コード:

//	enum定義
enum hoge_e {
	HOGE_A,
	HOGE_B,
};

//	enumの変数
enum hoge_e hoge = HOGE_A;
実の所DXライブラリではC++なので、
enum hoge_e hoge = HOGE_A;

hoge_e hoge = HOGE_A;
と書いても大丈夫です。C言語はダメですけどね。

それともう一つstateのenumが無いようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#16

投稿記事 by エレジー » 13年前

softya(ソフト屋)さん
ありがとうございます。

main.ccpで使うPlayerHandやStateの値にenumで名前を付ける場合、どのヘッダーファイルに書けばいいんですか?

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#17

投稿記事 by エレジー » 13年前

それともう一つ質問したいです。
CPUHandの値をenumで名前を付けた場合、JENKEN_HAND_GU、JANKEN_HAND_TYOKI、JANKEN_HAND_PAの3つからランダムで取得したいときにGetRandでできますか?
できる場合やり方を教えて下さい。


それと、今行っている手直しの際に質問したい場合、新しくトピックをたてて質問したほうがいいですか?

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#18

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

エレジー さんが書きました:main.ccpで使うPlayerHandやStateの値にenumで名前を付ける場合、どのヘッダーファイルに書けばいいんですか?
結局はどのソースファイルと関係が深いかって話になるのですが、Stateはmain.hを作るべきでしょうしPlayerHandはJankenProc.hに属するべきだと思います。
エレジー さんが書きました:それともう一つ質問したいです。
CPUHandの値をenumで名前を付けた場合、JENKEN_HAND_GU、JANKEN_HAND_TYOKI、JANKEN_HAND_PAの3つからランダムで取得したいときにGetRandでできますか?
できる場合やり方を教えて下さい。
そのまま数値として足してしまうって手もあるのですがキャストとか必要になるのでenumの配列にするのがキレイだと思います。
※ コンパイル確認していません。

コード:

JankenHand_e JankenProc_GetCPUHand(){
	JankenHand_e CPUHandTable[] = { JANKEN_HAND_GU,JANKEN_HAND_TYOKI,JANKEN_HAND_PA };
	CPUHand = CPUHandTable[ GetRand(2) ]; // CPUの手を取得
	return CPUHand;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#19

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

エレジー さんが書きました: それと、今行っている手直しの際に質問したい場合、新しくトピックをたてて質問したほうがいいですか?
回答忘れてました。
とりあえず解決チェック外しておいたので、このまま続けて下さい。
エフェクトの機能追加のところからは新トピックで。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#20

投稿記事 by エレジー » 13年前

質問です。

main.hを作って

コード:

#ifndef DEF_MAIN_H //二重include防止

#define DEF_MAIN_H

enum MainState_e {
	MAIN_STATE_UNINP, // 未入力
	MAIN_STATE_AIKO,
	MAIN_STATE_KATI,
	MAIN_STATE_MAKE,
};

#endif
としました。

main.ccpの
State = JankenProc_Calc(); // じゃんけん結果を計算して状態を取得
の部分ですが、変数StateはMainState_e型ですが、JankenProc_Calc()関数の返り値はJankenResult_e型です。
そもそも、Stateは上にあるようにMAIN_STATE_UNINPなどを代入する用で、JankenProc_Calc()関数はJankenResult_AIKOなどを返すので、無理だと思います。
何かうまくやる方法はありませんか?

enumを使うのが思っているより難しくて
質問ばかりで申し訳ないです。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#21

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

これをちゃんとすれば、意味の仕分けが整然と行われてプログラムがすっきり分かりやすくなるので頑張りましょう。
値の意味を適当に兼用すると多くのプログラムはバグを内包させます。

戻り値が違うとのことですが、JankenProc_Calc()の戻り値をswitch~caseで分岐して戻り値に合わせてStateに代入することで解決できます。
こうすれば、JankenProc_Calc()の戻り値とStateが別のものであると言うことも明確になります。
※ 将来のエフェクトのためにもJankenResult_eと MainState_eは明確に分けておくのが正しいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#22

投稿記事 by エレジー » 13年前

コード:

MainState_e JankenProc_Calc(){
	int ResultTable [3] [3] = {{ JANKEN_RESULT_AIKO, JANKEN_RESULT_KATI, JANKEN_RESULT_MAKE },
							   { JANKEN_RESULT_MAKE, JANKEN_RESULT_AIKO, JANKEN_RESULT_KATI },
							   { JANKEN_RESULT_KATI, JANKEN_RESULT_MAKE, JANKEN_RESULT_AIKO }};
	MainState_e MainState; // main.ccpにMainState_e型で返すための変数

	// プレイヤー上からぐー、ちょき、ぱー CPU左からぐー,ちょき,ぱー
	JankenResult_e JankenResult = ResultTable [PlayerHand] [CPUHand];

	switch( JankenResult ){ // Jankenresult_eをMainState_eに変換
				case JANKEN_RESULT_AIKO:
					MainState = MAIN_STATE_AIKO;
					break;
				case JANKEN_RESULT_KATI:
					MainState = MAIN_STATE_KATI;
					break;
				case JANKEN_RESULT_MAKE:
					MainState = MAIN_STATE_MAKE;
					break;
				default:
					break;
				}

	return MainState;
}
こういうことですか?

一度デバックしたところ、大量にエラーが出て泣けました。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#23

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

JankenProc_Calc()の戻り値JankenResult_eをmain.cpp側で処理するってことですよ。
main.hとJankenProc.hはmain.cppにインクルードされているのでJankenResult_eもMainState_eも参照できるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#24

投稿記事 by エレジー » 13年前

一度デバックをしてみたら大量にエラーが出てしまいました。
ある程度は減らすことができたんですが、いくらか解消するとができませんでした。
どうやらすべてDrawObject_PlayerHand関数とDrawObject_CPUHand関数関連でエラーが出ているようなんですが、解決方法も原因も分からずお手上げ状態です。

答えを教えてくださいとは言わないので、解決のためのヒントをお願いします。
添付ファイル
投稿用.zip
(36.83 KiB) ダウンロード数: 110 回

box
記事: 2002
登録日時: 14年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#25

投稿記事 by box » 13年前

エレジー さんが書きました:一度デバックをしてみたら大量にエラーが出てしまいました。
大量のエラー、というのは、どういう内容のエラーのことでしょうか。

その内容によっては、質問者さんのプログラムは、まだデバッグ(デバックではなく)の状態に至っていない、
ということが考えられます。

デバッグ、というのは、「コンパイル・リンク」とか「ビルド」とかいう工程を正しく通過して、
実行ファイルは正しくできあがっているが、「その実行ファイルが自分の思ったとおりに動いてくれない」という状況下で、
その「思ったとおりに動いてくれない」原因を除去する工程を指します。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#26

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

私のところではコンパイル・リンクエラーも出ません。
どういうエラーが出るんのでしょうか?
※ VisualStudio2008で確認しています。

あと
JankenProc.h
JankenResult_e.h
の2つが無駄に分かれているので1つに統合してしてくださいね。
1つの方が後々楽です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#27

投稿記事 by エレジー » 13年前

すみません。
そちらではエラーが出ないということと、JankenResult_e.hは消してあるはずなので
前の違うものを添付してしまったかもしれません。

もう一度張りなおします
添付ファイル
投稿用.zip
(36.83 KiB) ダウンロード数: 105 回

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#28

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

どうやら前のは違ったようですね。今度はコンパイルエラーしました。

DrawObject.hにはおまじないを追加して下さい。
enum JankenHand_e;//前方宣言
ヘッダが相互参照に成るの避けるためのテクニックです。

とりあえず、これを直してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#29

投稿記事 by エレジー » 13年前

他のヘッダファイルで宣言したenumをほかのソースファイルで使う場合、そのヘッダファイルに
enum JankenHand_e;//前方宣言
のように書くということですか?


やってみました。エラーは減りましたがまだ出ます。
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(56): error C2275: 'JankenHand_e' : この型は演算子として使用できません
1> c:\users\rous\documents\visual studio 2010\projects\test\jankenproc.h(5) : 'JankenHand_e' の宣言を確認してください。
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(56): error C2146: 構文エラー : ')' が、識別子 'PlayerHand' の前に必要です。
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(56): error C2059: 構文エラー : ')'
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(57): error C2275: 'JankenHand_e' : この型は演算子として使用できません
1> c:\users\rous\documents\visual studio 2010\projects\test\jankenproc.h(5) : 'JankenHand_e' の宣言を確認してください。
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(57): error C2146: 構文エラー : ')' が、識別子 'CPUHand' の前に必要です。
1>c:\users\rous\documents\visual studio 2010\projects\test\main.cpp(57): error C2059: 構文エラー : ')'
よろしくお願いします。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#30

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

そっちのエラーは、すごく基本的なミスです。
引数をよく見てみてください。
エレジー さんが書きました:他のヘッダファイルで宣言したenumをほかのソースファイルで使う場合、そのヘッダファイルに
enum JankenHand_e;//前方宣言
のように書くということですか?
そういうことです。
※ 誤解を招きそうなので補足。これは、ヘッダファイルだけですよ。cppはちゃんとインクルードして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#31

投稿記事 by エレジー » 13年前

無事できました。
関数を呼び出すときは型名は必要ないんでしたっけ;?


とりあえずまたしっかり動くようになりました。
次はイメージを配列にするというのをやろうと思いますが、そのほかにまだ直しておいた方がいいところはありますか?

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#32

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

エレジー さんが書きました:無事できました。
関数を呼び出すときは型名は必要ないんでしたっけ;?
C/C++では無いですね。
エレジー さんが書きました: とりあえずまたしっかり動くようになりました。
次はイメージを配列にするというのをやろうと思いますが、そのほかにまだ直しておいた方がいいところはありますか?
気になるところですか?
(1)インデントが一部乱れています。

(2)関数名は動詞+名詞で統一したほうが良いでしょう。現状は混ざっています。

(3)Mainのループをもっとシンプルにしたほうが良いでしょう。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] d.6章 管理部の作り方」
http://dixq.net/g/d_06.html

(4)JankenProcの
JankenHand_e PlayerHand, CPUHand; // プレイヤー、CPUの手格納用
はstaticが無いので外部公開のグローバル変数です。staticを付けましょう。

(5)Mainにある
static JankenHand_e PlayerHand, CPUHand; // プレイヤー、CPUの手情報格納用
は変数で常時保持せず必要に応じてJankenProcから取得したほうが良いでしょう(新たな関数の追加)。情報の主体はJankenProcと言うことを明確に。

JankenResultもstaticである必要がないのでローカル変数にして下さい。できるだけ変数のスコープは小さくしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#33

投稿記事 by エレジー » 13年前

しっかり動くようにました。
ありがとうございました。

それと、次にイメージを配列にするというのをやろうと思うんですが、それ以外に将来的もっと大規模なゲームを開発をするようになった時のことも考えて、これは絶対こうしておいた方がいいという部分はありますか?
よろしくお願いします。

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#34

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

エレジー さんが書きました:しっかり動くようにました。
ありがとうございました。

それと、次にイメージを配列にするというのをやろうと思うんですが、それ以外に将来的もっと大規模なゲームを開発をするようになった時のことも考えて、これは絶対こうしておいた方がいいという部分はありますか?
よろしくお願いします。
これ以上はエフェクト作成時に考えたほうが良いと思います。
あと大規模な組み方はステップアップしながら覚えるべきでしょう。
実際組んでみて、それお再分解しながらシェイプアップして良い物していくことで覚えられることは多いです。
面倒がらずプログラムを再構築したり、一から作りなおしたりすると更に良いです。
最初から最適解を求める必要はないと言うか今の自分できる最適は何か常に考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#35

投稿記事 by エレジー » 13年前

すみません。
2ページ目に気づかなくて、投稿に失敗したと思って同じような質問をしてしまいました。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#36

投稿記事 by エレジー » 13年前

指摘されたところを直してみました。
自分でもだいぶ良くなった気がしますが、まだ直しておいた方がいいところがあったら教えてください。

よろしくおねがいします。
添付ファイル
添付用.zip
(35.85 KiB) ダウンロード数: 104 回

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#37

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

あんまり、しつこく直すポイントを指摘すると力尽きる人が多いのですが一応お答えします。
※ ストレスを感じるようなら程々で次の段階に移っても構いませんよ。
大丈夫大丈夫とか言いながら気力を無くす人が多いので適当さも時にはモチベーション維持のためには必要です。
まぁ、その為にバグで無駄に手間がかかるとかであれば指摘しますけど。

>(1)インデントが一部乱れています。
StateInitilizeだけインデントが変ですね。

>(2)関数名は動詞+名詞で統一したほうが良いでしょう。現状は混ざっています。
大分と分かりやすくなりました。

ただ、慣れないことですので知らないことだと思いますが慣習として知っておいてもらいたい事があります。
例として上げるとJankenProc_GetPlayerHand()は慣習から外れていると思います。
慣習として取得(Get)/設定(Set)が良く使われるのでJankenProc_ReceivePlayerHand()はJankenProc_GetPlayerHand()の名前が良いと思われます。
手の入力処理なのでJankenProc_UpdatePlayerHand()やJankenProc_InputPlayerHand()などはどうでしょうか?
他も同様となります。

>(3)Mainのループをもっとシンプルにしたほうが良いでしょう。
もっとコントール側に移したほうが良いと思います
今のままだとControl_UpdateMainState()とでやりとされる状態の変化が分かりづらいです。これらもControl_UpdateMainState内へ移すべきでしょうね。

コード:

					JankenProc_GetPlayerHand();  // プレイヤーの手を取得
					JankenProc_GetCPUHand(); // CPUの手を取得
					JankenResult = JankenProc_Calc(); // じゃんけん結果を計算して状態を取得
mainが持つJankenResultもControl_UpdateMainStateは移すべきでしょう。となるとControl_UpdateMainStateの名前も変えたほうが良いでしょう。
Control_DrawResultも同様に手の表示を吸収します。
この場合、mainが持つstateはもっと単純なもので良いはずでcotrol側でAIKOとかのstateを持ちましょう。

>(4)JankenProcの
>JankenHand_e PlayerHand, CPUHand; // プレイヤー、CPUの手格納用
>はstaticが無いので外部公開のグローバル変数です。staticを付けましょう。

OKです。

(5)JankenResultもstaticである必要がないのでローカル変数にして下さい。できるだけ変数のスコープは小さくしましょう。
こっちがNGでした。

最後にバグを見つけました。
static int HandImage[2];
と宣言されていますがC言語の場合はHandImage[0];とHandImage[1];しかメモリが確保されます。配列の宣言の説明を再確認してみてください。
※現状はたまたま動いています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#38

投稿記事 by エレジー » 13年前

(3)Mainのループをもっとシンプルにしたほうが良いでしょう。
以外をとりあえず直してみました。

(3)についてですが、具体的にどの部分をControlに移行すればいいですか?

コード:

if( Keyboard_Get( KEY_INPUT_Z ) == 2 || Keyboard_Get( KEY_INPUT_X ) == 2 || Keyboard_Get( KEY_INPUT_C ) == 2 ){ //入力があったら

				if( State == MAIN_STATE_UNINP || State == MAIN_STATE_AIKO ){ // 入力待ちかあいこなら

コード:

			if( State != MAIN_STATE_UNINP ){

の部分のようにメインでifをつかって条件分岐させている部分はそのままでいいんですか?
添付ファイル
添付用.zip
(35.85 KiB) ダウンロード数: 116 回

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#39

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

>>(1)インデントが一部乱れています。
>StateInitilizeだけインデントが変ですね。

関数は行先頭からが慣習ルールですので、まだ問題があります。

>(2)関数名は動詞+名詞で統一したほうが良いでしょう。現状は混ざっています。
>大分と分かりやすくなりました。

OKだと思います。

>static int HandImage[2];
OKです。

>>(3)Mainのループをもっとシンプルにしたほうが良いでしょう。
>もっとコントール側に移したほうが良いと思います
>今のままだとControl_UpdateMainState()とでやりとされる状態の変化が分かりづらいです。これらもControl_UpdateMainState内へ移すべきでしょうね。
>(5)JankenResultもstaticである必要がないのでローカル変数にして下さい。できるだけ変数のスコープは小さくしましょう。
>こっちがNGでした。

ここに関してはmain側のstateをシンプルになるように再考してみましょう。controlとmainの両方で同じstateを扱うのは修正漏れ等を考えるとバグの温床となりかねません。
main側としては入力待ち(あいこ含む)か、していないかの2択で良いと思いますのでBOOLで良いと思います。
つまり、Control_UpdateMainStateではなく、stateはControl_UpdateMain()と言う存在に変わるわけです。
それとともにControl_Draw()表示は何らかの表示を常に行うので呼び出しは条件なしで良いんじゃないでしょうか? そのかわりcontrol.cpp側で条件判断します。
あとmainで保持していた情報はcontorl.h側で保持しますので、StateInitilize()もcontrol.cppに移動します。
となると Keyboard_Get()も全てcontrol.cpp側に有ったほうが分かりやすいでしょうね。

殆どもmainからなくなると思いますが、そのぐらいの方が後々良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#40

投稿記事 by エレジー » 13年前

直してみました。

とりあえず動くには動きますが、おかしいところがあったら教えてください。
結構切り取り、貼り付けでやってしまったので、余分なところなどあるかもしれないです。

よろしくお願いします。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#41

投稿記事 by エレジー » 13年前

添付し忘れました。
添付ファイル
添付用.zip
(35.6 KiB) ダウンロード数: 72 回

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#42

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

mainはすっきりしましたね。
今後改造してタイトルとか付けるとまたmainに増えてくると思いますが、今はこれで良いと思います。

さてcontrol.cppですが気になるところがあります。
(1)staticである必然性が全くありません。
static JankenResult_e JankenResult;
なぜstaticにする必要があるのか、良く考えてみましょう。

(2)インデントの統一性がありません。
1段下げているところと2段下げているところがあり統一性がありません。
バグのもとですので、ここはきっちりとお願いします。

(3)Control_Draw();がmainとControl_UpdateMain()から呼ばれてます。Control_UpdateMain()からは無くせるはずです。
ゲームプログラミングの館等でも記載されていますが、処理と描画は分離するのがバグの少ないプログラムを作るコツです。

ソースコード面倒に成っているのか、訳がわからなく成っているのかも知れませんね。
何故ここまでするのか分からなくて嫌気が差してきていませんか?
嫌なら、ここらで止めておきましょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#43

投稿記事 by エレジー » 13年前

インデントのことですが、自分では、関数は先頭から、その中身は一段下げる、if,switch,case,defaultの中はさらにもう一段下げる。という感じでやっています。
どういうように直したら見やすいですか?

とりあえず、Control_Draw()を呼び出しているところと、staticの必要がない(Control_UpdateMainが呼ばれるたびにJankenResultに代入される値は新しい情報になっていて、その関数内で使った後、次に呼び出されるまで情報を取っておく必要がないから、staticの必要がないと考えました。)というところは直してみました。
ただ、ビルドしてZ,X,Cを押すと
test.exe の 0x778f15de でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
と出て、止まってしまいます。
普通のエラーと違って、何を直したらいいのかわかりません。



正直なところ、細かく直していくのがめんどくさいなぁとも思いました。
ただ、自分には作ってみたいゲームがあり、クオリティーも素人なりに高いものにしたいと考えています。
そのためには、今の段階から細かいところにも手を抜かずにやっていくことが重要だと思っています。
大丈夫大丈夫と言っていても、いつ挫折してしまうか自分でもわかりませんが、その時は自分にはゲームプログラミングの才能がなかったと思って諦めます。
いつも丁寧に指摘してくださるsoftya(ソフト屋)さんには感謝してますし、これからも同じように教えていただけたら嬉しいです。
添付ファイル
添付用.zip
(35.59 KiB) ダウンロード数: 107 回

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

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#44

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

エレジー さんが書きました:インデントのことですが、自分では、関数は先頭から、その中身は一段下げる、if,switch,case,defaultの中はさらにもう一段下げる。という感じでやっています。
どういうように直したら見やすいですか?
実は、そのルールがControl_UpdateMain()やControl_Draw()で守られていないところが有るのです。よく見てみてください。
あと楽する方法として全選択(CTRL+A)しておいて編集→詳細→選択範囲のフォーマットでマイクロソフト推奨のインデントに整形できます。
これに頼りすぎるもの何なのですが自分がちゃんとインデントしているかの確認にも使えます。
エレジー さんが書きました: とりあえず、Control_Draw()を呼び出しているところと、staticの必要がない(Control_UpdateMainが呼ばれるたびにJankenResultに代入される値は新しい情報になっていて、その関数内で使った後、次に呼び出されるまで情報を取っておく必要がないから、staticの必要がないと考えました。)というところは直してみました。
ただ、ビルドしてZ,X,Cを押すと
test.exe の 0x778f15de でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
と出て、止まってしまいます。
普通のエラーと違って、何を直したらいいのかわかりません。
staticはなくしてOKです。エラーはControl_Draw()内でControl_Draw()を再帰的に無限ループで呼び出しています。これが原因だと思いますよ。
エレジー さんが書きました: 正直なところ、細かく直していくのがめんどくさいなぁとも思いました。
ただ、自分には作ってみたいゲームがあり、クオリティーも素人なりに高いものにしたいと考えています。
そのためには、今の段階から細かいところにも手を抜かずにやっていくことが重要だと思っています。
大丈夫大丈夫と言っていても、いつ挫折してしまうか自分でもわかりませんが、その時は自分にはゲームプログラミングの才能がなかったと思って諦めます。
上のミスを見ても限界と思いますので最低限のところを直したら次に行きましょう。
次はエフェクトの導入ですね。効果音とかもあったほうが良いと思います。

効果音で、こんなソフトもあるので遊んでみてください。
「KanaWaveの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/win95/art/se232653.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: じゃんけんゲームでプレーヤーの手の画像がすべてグーになってしまいます

#45

投稿記事 by エレジー » 13年前

確かに進めていったほうがモチベーションは保てますね。
とりあえず解決にします。
添付ファイル
添付用.zip
(35.59 KiB) ダウンロード数: 98 回

閉鎖

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