トランプゲームを作成しようと思い、ランダムにトランプを5枚表示させるプログラムを作ったのですが
失敗しました。
どう失敗したかというと、エラーはでないんですが、画像も表示されず、ESCキーを押しても終了せず、ウィンドウの閉じるをクリックしても反応がありません。終了させると「このプログラムは応答していません」と表示されます。
プログラム自体はトランプの構造体を宣言し、入門編13節の基本骨格の中に処理を書いています。
struct Poler_Cards{
int card[13][4]; //トランプの構造体
int state[13][4];
}trump ;
trump.cardには0~51を順に入れ、trump.stateには山札にある状態を示す0を入れるようfor文でプログラムしています。(初期化ではうまくいきませんでした)
while(n!=5){ //n=5で終了
if(n<5){ //場に出たカードが5枚未満だったら
n=0; //カードのカウンタを0に
r1=GetRand(12);r2=GetRand(3); //乱数を取得
trump.state[r1][r2]=1; //場に出たという処理をする
for(i=0;i<13;i++){
for(j=0;j<4;j++){
n+=trump.state[j]; //場に出たカードの枚数を数える
}
}
}
}
基本骨格のwhile文の中にこの処理を書いています
for(i=0;i<13;i++){
for(j=0;j<4;j++){
if(trump.state[j]==1){ //場に出たカードを
g[[/url]=trump.card[j];//配列gに格納
r++;
}
}
}
配列gにはランダムな0~51までの数字が5個入るようになっているはず
for(r=0;r<5;n++){
img=g[[/url];
DrawGraph( x,200,img,FALSE ) ;
x+=90;
}
0~51までの数がそのまま、グラフィックハンドルに対応しているのでこれで画像が表示されるはず
主な処理はこれぐらいです。ほかは変数の宣言ぐらいです
コンパイラはVisualC++2008 Express Editionです
長くなりましたが、回答よろしくお願いします
ランダムにトランプ画像を表示させるプログラムについて
Re:ランダムにトランプ画像を表示させるプログラムについて
for(r=0;r<5;n++){ img=g[[/url]; DrawGraph( x,200,img,FALSE ) ; x+=90; }繰り返し処理の中で変数rは5以上になる事がないようですが?
「n++」ではなく「r++」ではないでしょうか。
また画像ハンドルらしき変数imgに配列gの数値(0~51)を代入していますね。
img = LoadGraph("トランプ");
などの処理で画像を読み込んだ時、変数imgにはメモリ上に読み込まれた画像データの場所を示す値が入っています。画像を読み込んだ順番などではありません。
なので、この値を書き換えてしまうと画像データを見失い、描画する事が出来なくなります。
imgを配列にして、それぞれ順番にトランプ画像を読み込み、その上で
DrawGraph( x,200,img[g[[/url]],FALSE ) ;
のようにしてみてはどうでしょう。
しかしこれでは画像のロードだけで膨大なコード量になるでしょうから、トランプ画像を大きな一枚の画像にして、LoadDivGraph()で分割読み込みすると楽かもしれません。
Re:ランダムにトランプ画像を表示させるプログラムについて
丁寧な回答ありがとうございます
ご指摘のとおりfor文に誤りがありました
これによってプログラムが応答しないという件につきましては解決いたしました。
トランプの画像の件については説明が足りませんでした。
トランプ画像は1枚の大きな画像で扱っており、imag配列を宣言し(要素数は52です)LoadDivGraph関数で分割読み込みしています。
トランプの画像は横を4、縦を13で分割しています
LoadDivGraph("Cards.png",52,4,13,90,135,imag); //トランプ画像の読み込み
これでグラフィックハンドルは
0, 1, 2, 3
4, 5, 6, 7
8, 9,10,11
12,13,14,15
16,17,18,19
20,21,22,23
24,25,26,27
28,29,30,31
32,33,34,35
36,37,38,39
40,41,42,43
44,45,46,47
48,49,50,51
となると思い、それがtrump.cardがそのまま対応している形になっているのではないかと考え、
上記のようなプログラムを書きました。
for文のミスを修正し、いろいろやってみて、
imag配列に格納されたグラフィックハンドルが上記の値と全く対応していないことがわかりました
当初の質問とは異なりますが、trump.card配列とimag配列をうまく対応させる方法はないのでしょうか?
ご指摘のとおりfor文に誤りがありました
これによってプログラムが応答しないという件につきましては解決いたしました。
トランプの画像の件については説明が足りませんでした。
トランプ画像は1枚の大きな画像で扱っており、imag配列を宣言し(要素数は52です)LoadDivGraph関数で分割読み込みしています。
トランプの画像は横を4、縦を13で分割しています
LoadDivGraph("Cards.png",52,4,13,90,135,imag); //トランプ画像の読み込み
これでグラフィックハンドルは
0, 1, 2, 3
4, 5, 6, 7
8, 9,10,11
12,13,14,15
16,17,18,19
20,21,22,23
24,25,26,27
28,29,30,31
32,33,34,35
36,37,38,39
40,41,42,43
44,45,46,47
48,49,50,51
となると思い、それがtrump.cardがそのまま対応している形になっているのではないかと考え、
上記のようなプログラムを書きました。
for文のミスを修正し、いろいろやってみて、
imag配列に格納されたグラフィックハンドルが上記の値と全く対応していないことがわかりました
当初の質問とは異なりますが、trump.card配列とimag配列をうまく対応させる方法はないのでしょうか?