C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   敵の描画について   
     ・[15717] SONY 
     ・[15722] 管理人 
     ・[15918] SONY 
     ・[15922] 管理人 
     ・[15930] SONY 
     ・[15937] 管理人 
     ・[15968] SONY 
     ・[16009] SONY 
   プログラミングの館2 ....   
     ・[15855] 管理人 
     ・[15857] ibis 
     ・[15858] 双嗣 
     ・[15859] 管理人 
     ・[15860] 双嗣 
     ・[15862] 双嗣 
     ・[15864] 管理人 
     ・[15866] 双嗣 
     ・[15917] 双嗣 
     ・[15923] 管理人 
     ・[15926] ibis 
     ・[15962] 双嗣 
     ・[15963] バグ 
     ・[15965] 管理人 
     ・[15989] 双嗣 
     ・[16001] 管理人 
   はじめまして   
     ・[15990] toyo 
     ・[15991] バグ 
     ・[15992] uniuni 
     ・[15993] toyo 
     ・[15994] uniuni 
     ・[15995] バグ 
     ・[15996] toyo 
   C言語〜ゲームプログラ ....   
     ・[15752] 水孤 
     ・[15753] 管理人 
     ・[15755] tkmakwins15 
     ・[15839] fffff 
     ・[15851] tkmakwins15 
     ・[15852] 管理人 
     ・[15873] fffff 
     ・[15876] 木霊 
     ・[15975] fffff 
   配列変数の使い方   
     ・[15972] フリオ 
     ・[15974] hxjk 
   はじめまして   
     ・[15954] 管理人 
     ・[15961] アブルイラリ 
   C言語でChat   
     ・[15958] 管理人 
     ・[15959] Ctan 
     ・[15960] バグ 
   音楽再生ソフトについ ....   
     ・[15945] 管理人 
     ・[15950] バグ 
     ・[15952] ki 
   STG:敵を倒しても弾が ....   
     ・[15921] 管理人 
     ・[15943] えんつく 
   ファイルパッキングに ....   
     ・[15914] toyo 
     ・[15925] 管理人 
     ・[15928] J 
     ・[15933] lbfuvab 
     ・[15941] J 
   無効な間接参照   
     ・[15927] ibis 
     ・[15929] J 
     ・[15940] J 
   シューティングの館で ....   
     ・[15920] 管理人 
     ・[15934] 流考 
     ・[15936] 管理人 
     ・[15939] 流考 
   アイテムの管理   
     ・[15865] 管理人 
     ・[15872] tkmakwins15 
     ・[15878] kazuoni 
     ・[15880] 管理人 
     ・[15881] kazuoni 
     ・[15882] やそ 
     ・[15883] バグ 
     ・[15885] kazuoni 
     ・[15897] やそ 
     ・[15898] 管理人 
     ・[15916] kazuoni 
   ゲームを公開するにあ ....   
     ・[15902] 管理人 
     ・[15904] 水孤 
     ・[15906] 管理人 
     ・[15907] 水孤 
     ・[15909] 管理人 
     ・[15910] 水孤 
   最初の文字が表示され ....   
     ・[15903] toyo 
     ・[15905] ボムボム 
   テンプレート仮引数を ....   
     ・[15824] YuO 
     ・[15838] ibis 
     ・[15843] 組木紙織 
     ・[15844] ibis 
     ・[15853] ibis 
     ・[15871] YuO 
     ・[15877] hoge 
     ・[15900] ibis 
   構造体変数の引数が引 ....   
     ・[15895] 組木紙織 
     ・[15896] kazuoni 
   コンパイルできなくな ....   
     ・[15887] toyo 
     ・[15893] 初心者 
   配列とfor文の組み合わ ....   
     ・[15889] バグ 
     ・[15890] 卵 
     ・[15891] kazuoni 
     ・[15892] 卵 
   著作権について   
     ・[15869] 通りすがった 
     ・[15870] 管理人 
     ・[15874] 水孤 
   VisualC++2008がダウ ....   
     ・[15821] そうし 
     ・[15856] さながや 
     ・[15861] 双嗣 
     ・[15868] tkmakwins15 
   ディレクトリのコピー   
     ・[15730] ま〜く 
     ・[15739] tkmakwins15 
     ・[15741] GPGA 
     ・[15743] tkmakwins15 
     ・[15751] ま〜く 
     ・[15759] tkmakwins15 
     ・[15760] ま〜く 
     ・[15762] tkmakwins15 
     ・[15763] GPGA 
     ・[15765] tkmakwins15 
     ・[15793] ま〜く 
     ・[15826] tkmakwins15 
     ・[15827] Justy 
     ・[15828] YuO 
     ・[15829] ま〜く 
     ・[15850] tkmakwins15 
   画像について   
     ・[15831] yos 
     ・[15833] 通りすがり 
     ・[15837] yos 
     ・[15840] 双嗣 
     ・[15841] 双嗣 
     ・[15842] yos 
     ・[15845] 双嗣 
     ・[15846] 通りすがり 
     ・[15847] 通りすがり 
     ・[15849] 双嗣 
   STGにおけるプログラム ....   
     ・[15772] 管理人 
     ・[15774] バグ 
     ・[15830] GPGA 
     ・[15848] 風宮翔 
   メモリについての質問   
     ・[15817] ibis 
     ・[15818] ibis 
     ・[15823] Justy 
     ・[15836] ギャラクシー 
   サンプルプログラムで ....   
     ・[15803] ランド 
     ・[15804] ランド 
     ・[15835] 管理人 
   敵の行動プログラムに ....   
     ・[15745] 管理人 
     ・[15758] そうし 
     ・[15767] 管理人 
     ・[15779] そうし 
     ・[15781] 雷 
     ・[15784] 管理人 
     ・[15789] 通りすがり 
     ・[15791] そうし 
     ・[15792] そうし 
     ・[15795] やそ 
     ・[15805] そうし 
     ・[15814] そうし 
     ・[15815] 組木紙織 
     ・[15819] そうし 
     ・[15834] 管理人 
   ポインタについて   
     ・[15710] 管理人 
     ・[15711] 管理人 
     ・[15714] tkmakwins15 
     ・[15729] J 
     ・[15731] 組木紙織 
     ・[15735] yos 
     ・[15736] 管理人 
     ・[15746] yos 
     ・[15747] 管理人 
     ・[15748] yos 
     ・[15749] tkmakwins15 
     ・[15766] yos 
     ・[15768] 管理人 
     ・[15800] abc 
     ・[15832] yos 
   ファイル名に変数   
     ・[15811] ibis 
     ・[15812] GPGA 
     ・[15813] ランド 
   わからん・・・   
     ・[15776] バグ 
     ・[15777] バグ 
     ・[15778] ibis 
     ・[15780] toki 
     ・[15782] 雷 
     ・[15783] YuO 
     ・[15785] toki 
     ・[15786] ibis 
     ・[15787] 管理人 
     ・[15788] toki 
     ・[15790] toki 
     ・[15794] toki 
     ・[15796] abc 
     ・[15797] toki 
     ・[15798] abc 
     ・[15802] ibis 
     ・[15806] GPGA 
     ・[15807] abc 
     ・[15808] バグ 
     ・[15809] ibis 
     ・[15810] abc 
   DirectX未使用のSTG ....   
     ・[15709] 風宮翔 
     ・[15712] GPGA 
     ・[15725] 管理人 
     ・[15726] 風宮翔 
     ・[15734] 風宮翔 
     ・[15764] GPGA 
     ・[15771] 管理人 
     ・[15773] 風宮翔 
   キース数に関して質問 ....   
     ・[15688] kz 
     ・[15754] Chaos 
     ・[15756] Chaos 
     ・[15769] 管理人 
   このHPについて   
     ・[15761] 管理人 
   ヒントをください。   
     ・[15439] やそ 
     ・[15440] J 
     ・[15441] バグ 
     ・[15442] やそ 
     ・[15443] 管理人 
     ・[15444] 管理人 
     ・[15446] J 
     ・[15447] バグ 
     ・[15449] J 
     ・[15453] バグ 
     ・[15454] バグ 
     ・[15459] J 
     ・[15464] バグ 
     ・[15537] カノン 
     ・[15538] バグ 
     ・[15559] J 
     ・[15573] バグ 
     ・[15613] J 
     ・[15737] J 
     ・[15742] tkmakwins15 
   参考書   
     ・[15704] たかぎ 
     ・[15705] DIL 
     ・[15713] SONY 
     ・[15718] DIL 
     ・[15721] 管理人 
     ・[15732] DIL 
     ・[15738] J 
     ・[15740] tkmakwins15 
   フラグの立て方   
     ・[15724] 管理人 
     ・[15728] kazuoni 
   透過処理について   
     ・[15698] RYU2 
     ・[15715] SONY 
     ・[15723] 管理人 
     ・[15727] J 
   シューティングゲーム   
     ・[15617] DIL 
     ・[15700] mura 
     ・[15701] mura 
   テンプレートと継承   
     ・[15682] 組木紙織 
     ・[15683] ibis 
     ・[15692] 組木紙織 
     ・[15693] hoge 
     ・[15696] ibis 
   C言語の館、26節に関す ....   
     ・[15586] 水孤 
     ・[15587] toyo 
     ・[15588] toyo 
     ・[15604] やそ 
     ・[15694] fffff 
   IMEの入力について   
     ・[15689] バグ 
     ・[15691] YuO 
   配列について   
     ・[15674] 組木紙織 
     ・[15677] DDSS 
     ・[15679] 組木紙織 
     ・[15685] Hermit 
     ・[15690] 組木紙織 
   C++の入門書を読み終え ....   
     ・[15647] バグ 
     ・[15651] YuO 
     ・[15658] バグ 
     ・[15664] たかぎ 
     ・[15666] kz 
     ・[15671] 組木紙織 
     ・[15687] kz 
   自機と敵弾との衝突判 ....   
     ・[15621] やそ 
     ・[15632] ジーコ 
     ・[15633] ジーコ 
     ・[15648] やそ 
     ・[15665] ジーコ 
     ・[15668] やそ 
     ・[15684] ジーコ 
   DWORDって何ですか?   
     ・[15641] 学食 
     ・[15642] 学食 
     ・[15643] Justy 
     ・[15649] やそ 
     ・[15654] toyo 
     ・[15656] 学食 
     ・[15659] やそ 
     ・[15660] 学食 
     ・[15661] Saizo 
     ・[15662] 学食 
     ・[15663] 学食 
     ・[15680] J 
   回転描画について質問 ....   
     ・[15669] やそ 
     ・[15672] ランド 
     ・[15673] GPGA 
     ・[15675] ランド 
     ・[15676] 組木紙織 
     ・[15678] ランド 
   なぜかprintfで表示さ ....   
     ・[15578] abc 
     ・[15579] abc 
     ・[15580] バグ 
     ・[15583] box 
     ・[15584] たかぎ 
     ・[15603] tkmakwins15 
     ・[15652] abc 
     ・[15653] toyo 
     ・[15655] abc 
     ・[15657] box 

Name: SONY  ..ぴよぴよ(146ポイント)   Date: 2008/04/20(日) 09:32   No:15716       
Title: 敵の描画について    
 こんにちは。シューティングゲームの館で勉強している者です。今、敵の描画をアニメーションでやっているのですが、どういうわけか、敵が点滅しながら登場します。
 プログラム自体は館のものをパクリながら作っています。これは、デフォルトで点滅するものなのでしょうか?


67ポイント を手に入れた。


Name: SONY  ..ぴよぴよ(208ポイント)   Date: 2008/04/20(日) 09:43   No:15717     
Title: 追記:敵の描画について    
先ほどの質問の追加ですが、アニメーションにしなければ点滅は起こりませんでした。

2倍のポイントを手に入れた! 62ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(557,703ポイント)   Date: 2008/04/20(日) 11:59   No:15722     
Title: Re:追記:敵の描画について    
>敵の描画をアニメーションでやっている

というのはどういうことでしょうか?
また、何節の話ですか?
プロジェクトのダウンロードで全てダウンロードしても、不具合が起きますか?


58ポイント を手に入れた。

Name: SONY  ..ぴよぴよ(232ポイント)   Date: 2008/04/26(土) 14:46   No:15918     
Title: Re:追記:敵の描画について    
シューティングゲームの館 12節のところです。

24ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(567,062ポイント)   Date: 2008/04/26(土) 15:09   No:15922     
Title: Re:追記:敵の描画について    
プロジェクトのダウンロードで全てダウンロードしても、不具合が起きますか?

35ポイント を落としてしまった。

Name: SONY  ..ぴよぴよ(261ポイント)   Date: 2008/04/26(土) 16:07   No:15930     
Title: Re:追記:敵の描画について    
鈍くさい質問ですいません。プロジェクトのダンロードで全てダウンロードするとはどういう意味ですか?

29ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(567,860ポイント)   Date: 2008/04/26(土) 20:22   No:15937     
Title: Re:追記:敵の描画について    
シューティングゲームの館http://dixq.net/s/
ソースとプロジェクトのダウンロード(その1)

ソースとプロジェクトのダウンロード(その2)
がありますよね。プロジェクトが丸ごとダウンロード出来ますので、
ここから使用していただけるとコピーミスやコードのミスなどがありません。



17ポイント を手に入れた。

Name: SONY  ..ぴよぴよ(479ポイント)   Date: 2008/04/27(日) 20:52   No:15968     
Title: Re:追記:敵の描画について    
ありがとうございました。問題は解決しました。しかし、また新たな問題が発生しました。それは、シューティングゲームの館13節の敵を5枚の画像を時間差で表示して表現するというところです。
具体的にはプログラムを実行すると時が点滅します。
プログラム自体はサンプルをまねています。
開発環境はBCC Developerを使っています。
アドバイスよろしくお願いします。


2倍のポイントを手に入れた! 218ポイント を手に入れた。

Name: SONY  ..ぴよぴよ(533ポイント)   Date: 2008/04/29(火) 12:22   No:16009 解決!     
Title: Re:追記:敵の描画について    
計算の値を変更したらちゃんと動作しました。どうやら処理が間に合わなくて点滅していたようです。今まで私の質問に答えてくれた皆様、本当にありがとうございました。

54ポイント を手に入れた。



Name: 双嗣  ..入門者(4,046ポイント)   Date: 2008/04/23(水) 20:07   No:15854       
Title: プログラミングの館24章について    
24章を応用してパズルゲームを作ろうと思っているのですが
説明しづらいので、添付の絵を使いながら説明します。
赤い矢印がキャラクターが進む方向です。(キャラは自動に進むようにしたいのですが^^;)
そして、番号が各ブロックです。各ブロックを入れ替えてキャラクターの
進む方向を入れ替えたいのですが、ブロックの入れ替え方法とキャラクターの進む方向を
変える仕組みをどうやってプログラミングすればいいのかさっぱりわかりません><
添付で具体例を言うと、キャラクターが1→2→3と進むのを2と5を入れ替えて
1→5→4と進むようにしたいのですが・・・・・
ブロックの入れ替え方法とキャラクター移動のプログラミングをどのようにするか
アドバイスや提案だけでもいいので教えてください。よろしくお願いいたします。m(_ _)m


184ポイント を落としてしまった。


Name: 管理人 [URL]  ..伝説のハッカー(564,350ポイント)   Date: 2008/04/23(水) 20:27   No:15855     
Title: Re:プログラミングの館24章について    
これはコンピュータがパズルを解くんでしょうか?

それともプレイヤーが道を作ってやるとキャラが勝手にそちらに移動するのでしょうか。
もしそうなら、分岐点に差し掛かったらどうするのでしょう?

このパズルは取り外しとか出来ない仕様でしょうか?図の5が移動するにはまず3が左に移動しなければ5は左に移動できないとかそういう仕様でしょうか?

もし前者である場合。
パズル系は結構アルゴリズムが難しいですよ。
一番単純な方法は再帰関数とかを使って端から全てのパターンを調査していき、方法に各点数でも付けておき、一番いい方法を取る・・といった具合でしょうか。

調べたある方法で通れたら10点。行き止まりなら-10点、みたいな。ゴールできたら確定フラグをオン。
みたいにすれば、ゴールできなくても一番いい方法で近くまでいけると思います。

後者である場合、左、上、右、下の壁がどのようになっているか状態は16種類あると思いますので(違ったらすみません)それぞれの数字を壁の状態に対応させて格納してやればいいでしょう。
つまり0ならどこも壁無し、1なら左に壁アリ、など。
もしそれが難しいなら

typedef struct{
BOOL left,up,right,down;
}block_t;

 
などで構造体を作って、情報を入れ込んでやってもいいと思います。


306ポイント を手に入れた。

Name: ibis  ..初心者(5,473ポイント)   Date: 2008/04/23(水) 21:22   No:15857     
Title: Re:プログラミングの館24章について    
//向きの定数
#define 0 UPPER //上
#define 1 RIGHT //右
#define 2 LOWER //下
#define 3 LEFT //左

//2を加算して4で剰余すると、逆向きになる。
inline int reverse(int direction){
 return (direction + 2) % 4;
}

typedef struct{
 int direction[2]; //向き
}block_t;

例えばこういうのとか。
直前に動いた方向の逆には多分動けないでしょうから、
向きを計算できると、次に進むべき方向が見つけやすいかな、と。


189ポイント を手に入れた。

Name: 双嗣  ..入門者(4,521ポイント)   Date: 2008/04/23(水) 21:37   No:15858     
Title: Re:プログラミングの館24章について    
ごめんなさい、言葉が足りませんでしたね^^;
プレイヤーはただ単にブロックを入れ替えるだけにしようと思っています。
ブロックを入れ替えて道を作りキャラクターはその上を1マスずつ進むと
いう風にしていこうと思っています。そして、ブロックはどんなに離れていても
入れ替えられるというようにしようかと・・・・・・

言われてみれば16の数字が必要ですね>< (24章を応用するなら)
ところで、数字を壁の状態に反応させるということはキャラクターは
4次方向のどれかいけるところに進むようにプログラムして、
壁は進めないところを作るということでしょうか?
それと、

typedef struct{
BOOL left,up,right,down;
}block_t;

というのはどこに使うということなのでしょうか?
たとえば添付の絵のブロックでキャラが1つ左に進むようにしたいと思ったら
typedef struct{
BOOL left;
}left_block_t;

というようにすればいいのでしょうか?

そういえば、一番肝心な事を聞くのを忘れてました><
ブロックを選択して移動させるようにするヒントを
いただけませんか?たぶん33章の選択画面の作り方を応用すればいいのかと思われますが
そうなると、元のブロック配列(数字)を入れ替える事になると思うので・・・・・・

ややこしい事いってごめんなさい><
同級生や周りの人はc言語スラ氏ら無い人ばかりなので・・・・・


475ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(564,801ポイント)   Date: 2008/04/23(水) 21:47   No:15859     
Title: Re:プログラミングの館24章について    
いや、変数が一つなのなら構造体にする意味がないでしょう。
もし、ブロック情報を

typedef struct{
BOOL left,up,right,down;
}block_t;

で定義したいのなら、10x10のブロックがある場合

block_t block[10][10];

とかで宣言しておき、初期化で、壁情報を代入していく必要があります。

一番左上のブロックが下側だけ通行可能なら

block[0][0].left=1;
block[0][0].up=1;
block[0][0].right=1;
block[0][0].down=0;

などと入れる必要があります。これをマップにあわせて100回やるわけです。
マップデータは外部データにしておいて、自動で読み込んで自動で格納するようにした方が拡張性が高いでしょう。
後、そこにブロックが無い場合もあるわけですから、

typedef struct{
BOOL flag;
BOOL left,up,right,down;
}block_t;

等として、そこにブロックがあるかどうかを示すフラグも用意したほうがいいかもしれません。

後、せっかくパズルにするなら、道はスライドさせて移動する方がパズルっぽくなりません??


451ポイント を手に入れた。

Name: 双嗣  ..入門者(4,805ポイント)   Date: 2008/04/23(水) 22:49   No:15860     
Title: Re:プログラミングの館24章について    
なるほど!
ブロックを定義しておいた後にブロックの座標を指定するわけですね。
これで、構造体の使い方がやっとわりました。

typedef struct{
BOOL left,up,right,down,img;
}block_t;

画像は最初の定義したとおりプラス
10x10マスの一番右上なら

block_t =[0][0]
LoadDivGraph( "char.png" , 16 , 1 , 1 , 32 , 32 , image );//画像を分割してimage配列に保存
DrawGraph( block_t.img , TRUE ) ;//[12]の画像を描画

であってってますよね?
的外れな事を言っていたらごめんなさい><

それと、道のスライドはキャラクターを単にゴールへ導くためにするなら
いいのですが、敵もメインと同じようにプログラミングしようと思っているので
スライドではなくて入れ替えのほうがいいのですが・・・・・
その方法を教えてください。
よろしくお願いいたします。


284ポイント を手に入れた。

Name: 双嗣  ..入門者(4,952ポイント)   Date: 2008/04/23(水) 23:09   No:15862     
Title: Re:プログラミングの館24章について    
それと、もうひとつ質問があるのですが
ibisさんの投稿で

>  //向きの定数
   #define 0 UPPER //上
   #define 1 RIGHT //右
   #define 2 LOWER //下
   #define 3 LEFT //左

   //2を加算して4で剰余すると、逆向きになる。
   inline int reverse(int direction){
   return (direction + 2) % 4;
   }

   typedef struct{
   int direction[2]; //向き
   }block_t;

   例えばこういうのとか。
   直前に動いた方向の逆には多分動けないでしょうから、
   向きを計算できると、次に進むべき方向が見つけやすいかな、と。


というのはキャラクターのプログラムということなのでしょうか?


60ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(565,698ポイント)   Date: 2008/04/23(水) 23:44   No:15864     
Title: Re:プログラミングの館24章について    
今一度、構造体を含め、C言語についておさらいされた方がいいと思います。
構造体の使い方と、関数の作り方位はしっかり身につけてからゲームを作ったほうが効率的に作れると思います。

また、DXライブラリの使い方についても、もう少しじっくりおさらいされた方がいいと思います。

構造体はタグ名が変数になるわけではないので、

typedef struct{
BOOL left,up,right,down,img;
}block_t;

と定義したのならblock_tは変数ではありません。
よって

block_t = [0][0]

という書き方は出来ません。配列の意味にもなりません。
[0][0]を代入・・というのは何を意味したかったのでしょうか?

構造体を使った配列の宣言の仕方は先ほど私がお話したとおりです。


そして

LoadDivGraph( "char.png" , 16 , 1 , 1 , 32 , 32 , image );//画像を分割してimage配列に保存

imageが何をさすのかわかりませんが、imageが何故

DrawGraph( block_t.img , TRUE ) ;//[12]の画像を描画

ここで[12]をさすのでしょう?そしてBOOL型はTRUEかFLASEを入れる変数ですので、画像の識別番号を入れるべきではありません。
そしてDrawGraphの第一引数はx座標、第二引数はy座標でなければなりません。

>スライドではなくて入れ替えのほうがいいのですが・・・・・
>その方法を教えてください。

と言う事ですが、基本的な部分をもう少し勉強されてからじゃないと、毎回質問して、あれでもない、これでもないというやり取りが続いてしまいかねないと思います。
きっと「こうして下さい」とアドバイスを受けても、結局コードを書いてくれないとわからないので、コードを書いて下さい。という事になると思います。
かわりにサンプルをお作りする事は簡単なのですが、人が作ったコードは理解しないと全く拡張が出来ないので、是非ご自分で作っていただきたいですし、そのほうが今後の為にもなると思いますので。

C言語については
http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%85%A5%E9%96%80&lr=

こちらで勉強できます。
DXライブラリについては館でもいいですし、リファレンスページやサンプルプログラムなどで勉強されるといいと思います。
秘訣はただ読むだけじゃなく、一つ一つ実行してみて内容が少しでも理解出来なければ次に進まず調べる事、そしてサンプルを自分でいじって自分が期待した動作になることを確認することです。


ゲームについて、パネルを交換するなら、選択したとき、そのパネル番号を保持しておき、
選択した交換先のパネルを決定した時点で交換するだけでいいと思います。
プレイヤーの状態が遷移する場合、状態を示す変数をキャラクタ情報の構造体の中にいれておけばいいでしょう。
0なら選択可能。
1なら選択中・・といった具合です。


897ポイント を手に入れた。

Name: 双嗣  ..初心者(5,120ポイント)   Date: 2008/04/23(水) 23:59   No:15866     
Title: Re:プログラミングの館24章について    
確かにおっしゃるとおりです。
あるサイトのc言語入門でほとんど理解できたつもりだったのですが、
まだまだだったようですね。言われてる事はわかっているのに変数や
構造体のつくりがいまいち理解できていなかったので意味不明の事を
いっていたようです。

1からc言語を勉強して出直したいと思います。
ある程度勉強して人のコードがある程度読めるようになったら
戻ってこようと思うのでそのときはよろしくお願いいたします。


168ポイント を手に入れた。

Name: 双嗣  ..初心者(5,495ポイント)   Date: 2008/04/26(土) 13:14   No:15917     
Title: Re:プログラミングの館24章について    
C言語を改めて勉強し始めて、自分があまりにも的外れな事を言っていたのがよくわかりました。
例であげるなら、管理人様が例であげてくださった構造体の
typedef struct{
BOOL left,up,right,down;
}block_t;

のBOOL型のTRUEかFLASEを入れる変数、つまりleft,up,right,downが真か儀かを
判別するたと、またはTRUEは1.FLASEは0という変数を構造体(left,up,
right,downをまとめたもの)にしたものだったんですね。ほんとに今まで
無駄な時間をすごしてしまった。orz

それから、C言語の勉強をしている時に出てくる変数で、この変数はゲームだとどこに使われているんだろうと
思うことがあるのですが、フリーで配布されているゲームなどをソースに直して(戻して)見る事は
可能なのでしょうか?方法があるのであれば教えてください

後、管理人様の貴重なお時間を無駄にさせてしまって本当に申し訳ありませんでした。
ですが、c言語を勉強していると今まで教えていただいた事が反映されてより理解しやすく
覚えやすくなりました。
本当にありがとうございましたm(_ _)m


375ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(567,611ポイント)   Date: 2008/04/26(土) 15:21   No:15923     
Title: Re:プログラミングの館24章について    
いえいえ、私の言葉は冷たい言葉のようにお感じになったと思います。
ホントは一から手取り足取りアドバイスを差し上げたいところですが、
基本がわかって作り始めるのと基本がわからず作り始めるのでは、ご自分の後の苦労が
格段に違いますので、是非基礎を固めていただきたかったのです。

質問・回答もそのほうがスムーズに行えますしね。
例えば微分積分の質問をしているときに、A「2次関数が・・」B「2次関数って何?」A「方程式が・・」B「方程式って何?」A「掛け算が・・」B「掛け算って何?」
となってしまうと、回答が困難になってしまうという感じです。

BOOLはTRUEかFALSEを入れるものですが、実際この2つの値しか入らないわけではなく、
容量もBYTE型と同じなので、なじみにくければBYTE型でもいいと思います。
もっと言えば別にint型でも・・。

>この変数はゲームだとどこに使われているんだろうと 思うことがあるのですが、フリーで配布されているゲームなどをソースに直して(戻して)見る事は 可能なのでしょうか?

すみません、よく意味が把握出来ませんでした。
どこのソースの事ですか?
もしかして実行ファイルをプログラムソースコードに変換する事が出来るか、といった事でしょうか?
実行ファイルからプログラムコードに変換する事は出来ません。
実際には少し処理を追ってみる事は出来ますが、最初は出来ないという理解でいいと思います。
もしそれが出来るといくらでもゲームの改竄やプログラムの改竄が出来てしまうので・・。

>この変数はゲームだとどこに使われているんだろうと

もしも私の理解できる範囲内でしたらお答えします。


549ポイント を手に入れた。

Name: ibis  ..初心者(5,554ポイント)   Date: 2008/04/26(土) 15:46   No:15926     
Title: Re:プログラミングの館24章について    
遅くなりましたが、以前に私が挙げた方法は、ブロックの一例でした。
まぁキャラにも使えますがね。
ただ、この方法では行き止まりや分岐ができないです。


52ポイント を手に入れた。

Name: 双嗣  ..初心者(5,814ポイント)   Date: 2008/04/27(日) 18:07   No:15962     
Title: Re:プログラミングの館24章について    
いえいえ、管理人様が冷たいだなんて思っていませんよ^^
むしろ、管理人様がここまでサイトの利用者に一人ひとり丁寧に
教えているほうが珍しいし、やさしいと思いますと思います。

ところで、フリーゲームのプログラムの事なのですが実行ファイルを
プラグラムソースに直すというより何かソフトを使ってプログラムが
読めるようになればいいのですが・・・・・
誰かが作ったプログラムを少しだけ見る事は可能じゃないんでしょうか?
たとえば、RPGのキャラクターの壁の識別方法とか行動制御とかのプログラムの一部とか、
敵の攻撃ダメージの乱数とか・・・・・
上げたらきりが無いのですが^^;
プログラム解析ソフトみたいなのものがあれば一番いいのですが。
何かいい方法があれば教えてください。よろしくお願いいたします。


319ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(84,707ポイント)   Date: 2008/04/27(日) 18:38   No:15963     
Title: Re:プログラミングの館24章について    
実行ファイルからソースを完全に復元する事は不可能です。

16ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(569,003ポイント)   Date: 2008/04/27(日) 20:26   No:15965     
Title: Re:プログラミングの館24章について    
あ〜言っている意味がわかりました。
もしかしてプログラムソースファイルと実行ファイルが同じものだと思っていらっしゃいますか?

私達がプログラムコードを書くという作業は何をしているかわかりますか?
コンピュータは0か1の信号しか理解出来ません。
人間は0か1の信号では理解できません。

えーと、解りやすく言う為に、人間で例えてみると

ドイツ人
・日本人の言葉はわからない
・ドイツ人の言葉はわかる

日本人
・日本人の言葉はわかる
・ドイツ人の言葉はわからない

という二者間で意思疎通をするなら、その二者間で翻訳作業が必要ですね?
この事はコンピュータと人間の間にもいえます。

コンピュータ
・人間の言葉はわからない
・0か1の信号はわかる

人間
・人間の言葉はわかる
・0か1の信号はわからない

という二者を仲介する為に、コンパイルという翻訳作業が必要なわけです。
人間が書いた人間に理解する事の出来るプログラムコードを「翻訳(コンパイル)」して実行ファイルという0と1の信号で出来たファイル(厳密にはそうではないですが)を作ります。
すると人間がコンピュータにさせたい動作を書いたコードがコンピュータに理解出来る言葉に変換され、ファイルとなるわけです。
この実行ファイルを実行することでコンピュータに期待する動作をさせられるわけです。

ドイツ人と日本人間での翻訳はどちら方向にも可能ですが、
人間とコンピュータとの言葉で翻訳作業をする時は、もっぱら人間からコンピュータの方向にしか翻訳しません。
厳密には苦労すれば少々出来ますが、最初は出来ないと思っておいて差し支えないと思います。

つまりプログラムコードを実行ファイルにコンパイルする事はで来ますが、
一度ゲームとしてリリースされている実行ファイルからプログラムコードに逆変換する事は出来ないのです。

このような誤解をされているのではと思い、回答しましたが、もし私の誤解ならすみません。


620ポイント を手に入れた。

Name: 双嗣  ..初心者(6,160ポイント)   Date: 2008/04/28(月) 15:26   No:15989 解決!     
Title: Re:プログラミングの館24章について    
そうだったんですかwww
やっとコンバイルの意味がわかりました。
コンバイルというのは、たとえば、typedef struct{}aaa_t;という命令を
0と1に直してコンピューターに理解させなおかつ人間が理解できる表現に直す
(音楽や画像を映すなど)命令だったったのですね。
そして、コンピューターは人間のように思考が無いから人間の指示通りにしか動けない。
それと、

プログラムコード → 実行ファイル       ○
実行ファイル   → プログラムファイル    ×

になるのはプログラムコードは人間語、実行ファイルは機械語だから
機械語をプログラムコードに直せない(0と1を人間語に訳せないから)
であってますよね?

c言語って本当に奥が深いですね。
コンピューターは0と1でしか理解していないのに人間は
数百という言葉を使って示してやら無いといけない・・・・・・
c言語は自由度が高いけど、自由に扱えるようになるまでは時間がかかるんですね^^;

ひとつ質問なのですが、ほとんどのc言語入門サイトはDirectXを使ってないと思うのですが
管理人様はどのように関数や引数をゲームのプログラミングに関連つけたのでしょうか?
差し支えなければ教えてください。

後、管理人様、丁寧な説明をありがとうございました。とてもわかりやすかったです^^


346ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(569,914ポイント)   Date: 2008/04/28(月) 22:06   No:16001     
Title: Re:プログラミングの館24章について    
コンバイルではなく、コンパイルです。ハにマルです。

>0と1に直してコンピューターに理解させなおかつ人間が理解できる表現に直す

別に結果が人間に理解出来ないものである可能性もありますが、まぁそういう解釈でもいいかもしれません。

まぁ厳密に話をしだすと矛盾が生まれてきますし、厳密に理解する必要も無いと思います。
最初は、基本的にプログラムコードから実行ファイルには変換出来ても、逆は出来ないと覚えておいていいと思います。
例えば
方法は数種類あっても、結果は1つしかない場合。
例えば原材料が中国製で、加工は台湾で、日本で完成された製品があったとしても、製品を見ただけではその元がどうなっているかはわからない。
加工がドイツであろうがアメリカであろうが、同じ製品になったのならその過程を正確に予測する事は不可能ですよね。
でもまぁ、ものすごい詳しい人がみたら若干の違いがわかるから、少しだけその過程を予測出来る人がいると・・。
それと同じだと思っていて差し支えないと思います。


別にプログラムの勉強はウェブでする事を前提とされているわけでもなく、ウェブでの勉強が十分出来るようになってきたのはごく最近の話ですよね。
今でもまだDirectXやOpenGLなどの参考サイトは少ないほうですし、本格的に勉強するなら本を購入するのが普通だと思います。

どうやって関数や引数をゲームに関連付けたのか・・という意味は
どうやってC言語をゲームに応用したのかということでしょうか。
別に描画を除けばC言語なんて基本的に何のライブラリを使わない状態と同じですし、
描画をさせたいならそのライブラリのリファレンスを見たら解るので、特に難しい事はないと思います。
3Dプログラムなどの複雑なものはそれなりに勉強する必要があると思いますが
DXライブラリに限ってはそんな必要もありませんし。
DXライブラリなら本を読むまでも無いですし、何も特に勉強することなく私は書き始めました。
全部我流なので非効率なプログラムを書いている可能性は十分にありますが、
私は本にしがみついて勉強するのが好きではなく、自分で色んなものを作りながら勉強するのが好きなので
リファレンスを見ながら色んなものを作って使い方を覚えました。
コレに限っては本や参考サイトが無いと勉強できないって事は無いと思います。


670ポイント を手に入れた。



Name: uniuni  ..ぴよぴよ(110ポイント)   Date: 2008/04/28(月) 11:35   No:15986       
Title: はじめまして    
自分で作った問題なんですけど、用意された配列の文字数を数えて、文字数の多い順に並べるPGを作ってるんですけど、なかなかうまくいきません。どうすればいいでしょうか?

いまは、こんな感じです。

#include <stdio.h>
#include <string.h>

int main(void)
{
//変数の宣言と初期化
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
char array[10];
int ii, jj, len;

for(ii=0; ii<5; ii++){
len = strlen(name[ii]);

if(len[ii+1] > len[ii]){
array[0] = len[ii];
len[ii] = len[ii+1];
len[ii+1] = array[0];
}
printf("%s %d文字\n", name, len);
}


return 0;
}


110ポイント を手に入れた。


Name: toyo  ..初心者(7,946ポイント)   Date: 2008/04/28(月) 15:55   No:15990     
Title: Re:はじめまして    
char* name[5] = {"arita", "simojo", "chatani", "saitou", "otaku"};
ソート後
name[0] = "chatani";
name[1] = "simojo";
name[2] = "saitou";
name[3] = "arita";
name[4] = "otaku";
としてname[ ] をソートするか

char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
int name_len[5];
int i;
for (i = 0; i < 5; i++) {
name_len[i] = i;
}
ソート後
name_len[0] = 2;
name_len[1] = 1;
name_len[2] = 3;
name_len[3] = 0;
name_len[4] = 5;

としてname_len[ ]をソートするようにしたらいいと思います。
ソートはバブルソートっぽいですが普通は2重ループになります。


258ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(85,232ポイント)   Date: 2008/04/28(月) 16:07   No:15991     
Title: Re:はじめまして    
こんな感じでしょうか?


#include <stdio.h>
#include <string.h>

int main(void)
{
// 変数の宣言と初期化
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
char array[10];
int i, j, len;

// ソート用ループ
for (i = 0; i < 5; i++)
{
len = strlen(name[i]);

for (j = 0; j < 5; j++)
{
if (len > (int)strlen(name[j]))
{
strcpy(array, name[j]);
strcpy(name[j], name[i]);
strcpy(name[i], array);
}
}
}

// ソート結果表示用ループ
for (i = 0; i < 5; i++)
{
printf("%s %d文字\n", name[i], (int)strlen(name[i]));
}

return 0;
}


203ポイント を手に入れた。

Name: uniuni  ..ぴよぴよ(121ポイント)   Date: 2008/04/28(月) 16:22   No:15992 解決!     
Title: Re:はじめまして    
ありがとうございました。

11ポイント を手に入れた。

Name: toyo  ..初心者(8,233ポイント)   Date: 2008/04/28(月) 16:24   No:15993     
Title: Re:はじめまして    
連続で失礼します
なぜarray[10]と配列を10個も用意してarray[0]しか使ってないのかと考えてたらひょっとして

#include <stdio.h>
#include <string.h>

int main(void)
{
//変数の宣言と初期化
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
char array[10];
int ii, jj, len;
for(ii=0; ii<4; ii++){
for(jj=ii; jj<5; jj++){
if(strlen(name[jj]) > strlen(name[ii])){
strcpy(array, name[ii]);
strcpy(name[ii], name[jj]);
strcpy(name[jj], array);
}
}
}
for(ii=0; ii<5; ii++){
printf("%s %d文字\n", name[ii], strlen(name[ii]));
}
return 0;
}

というようなことがしたかったのでしょうか。
文字列の代入にはstrcpy( )を使います。


287ポイント を手に入れた。

Name: uniuni  ..ぴよぴよ(160ポイント)   Date: 2008/04/28(月) 17:10   No:15994     
Title: Re:はじめまして    
これを文字数が同じなら名前順に並び替えるときはどうすればいいのでしょうか?

39ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(85,240ポイント)   Date: 2008/04/28(月) 17:53   No:15995     
Title: Re:はじめまして    
strcmp関数を調べてみましょう。

8ポイント を手に入れた。

Name: toyo  ..初心者(8,474ポイント)   Date: 2008/04/28(月) 18:03   No:15996     
Title: Re:はじめまして    
文字列の比較はstrcmp( )を使います

#include <stdio.h>
#include <string.h>

int main(void)
{
//変数の宣言と初期化
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
char array[10];
int ii, jj;
for(ii=0; ii<4; ii++){
for(jj=ii; jj<5; jj++){
if(strlen(name[jj]) > strlen(name[ii])){
strcpy(array, name[ii]);
strcpy(name[ii], name[jj]);
strcpy(name[jj], array);
}
else if(strlen(name[jj]) == strlen(name[ii]) && strcmp(name[ii], name[jj]) > 0){
strcpy(array, name[ii]);
strcpy(name[ii], name[jj]);
strcpy(name[jj], array);
}
}
}
for(ii=0; ii<5; ii++){
printf("%s %d文字\n", name[ii], strlen(name[ii]));
}
return 0;
}



241ポイント を手に入れた。



Name: fffff  ..かけだし(2,372ポイント)   Date: 2008/04/20(日) 22:36   No:15750       
Title: C言語〜ゲームプログラミングの館・32節に関する質問    
 こんばんわ。
 32節(初期化の箇所)でちょっと分からないところがあったので、質問に来てみました。

 ――――――――――――――――――――――――――――――――――――――――――――――

SRand(10); //乱数の初期値を10で設定。
printfDx("%d\n",GetRand(10000)); //0〜10000までの乱数を生成
printfDx("%d\n",GetRand(10000));
printfDx("%d\n",GetRand(10000));
printfDx("%d\n",GetRand(10000));
ScreenFlip();

 ――――――――――――――――――――――――――――――――――――――――――――――

 この SRand という関数は、一体何を意味しているのかがイマイチ分かりにくくて……
 ランダムで数値を入力したいのであれば、()内の GetRand で既に入力できてるというか、
 ここだけでも良いような気がしてきます。

 プログラム全体を見てみると、
 「一度ランダムに入力(出力)された値を、もう一度繰り返して表示する」
 みたいな感じになっているのだと思うのですが、確実にそうだと言い切れる自信がちょっと無くて……

 そもそも、ここの解説で指している『乱数の初期値』というのは、一体どういうものなんでしょうか?


394ポイント を手に入れた。


Name: 水孤  ..かけだし(1,667ポイント)   Date: 2008/04/20(日) 23:18   No:15752     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
DXライブラリ置き場 リファレンスページのSRandより引用
コンピューター上の乱数というものはすべて疑似的なものであり、 結果的には計算で算出するので初期値が同じであれば初期値を 設定した後に取得できる乱数は常に同じものとなります。
(中略)
普通ゲームソフトなどでは毎回違う結果が出るように ソフトの起動時にその時のパソコンが保持している日時データなどを 元に初期値を設定したりします。
 DXライブラリでは標準でこの処理を行うのですが、時に自分で 初期値を明示的に設定したい時などがあります。

上に書いてあるように、乱数をといっても完全なランダムではなく、初期値が一緒なら出てくる数字は常に一緒です。そのときの初期値は様々です。しかし、時には乱数を決まった数で出したいときがあり、その時にSRandを使い決まった初期値を設定します。
もし、そのプログラムでもしSRandをなくせば数値は同じ数字は出なくなってしまいます。


269ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(560,344ポイント)   Date: 2008/04/20(日) 23:20   No:15753     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    


まず、乱数ってなんでしょう?
ランダムな数?
いえ、そうではないんです。
「ランダムなように見える数」です。
randという乱数を生成する関数をご存知ですよね?
以下のプログラムを実行してみましょう。


#include <stdio.h>
#include <stdlib.h>

int main(){

printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());

return 0;
}

実行結果1回目

41
18467
6334
26500

ランダムっぽく見えますね。じゃもう一度実行してみましょう。

実行結果2回目

41
18467
6334
26500

念のためもう一度実行してみましょう。

実行結果3回目

41
18467
6334
26500

よく見て下さい。ランダムな数を生成したはずなのに、プログラムを実行させるたびに同じ数が出ています。
そう、コンピュータは
「適当に作ってくれ」「だいたいでいいから作ってくれ」「いい加減な数を作ってくれ」
という指示が本当に苦手です。
指示したことしかしませんから、乱数も予め用意された値が出ているだけなのです。
これでは使い物になりません。
これでゲームを作ったのでは毎回同じゲーム結果になってしまいます。
ジャンケンを乱数を利用して作ったらいつも同じものしか出さないでしょう。

そこで「初期値」を設定しようとするわけです。
今41が1回目に出ていますが、この最初に出る数を自分で指定してみます。
ためしに1326で設定してみましょう。
初期値を設定する関数はsrand()です。


#include <stdio.h>
#include <stdlib.h>

int main(){
srand(1326);
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());

return 0;
}

実行結果

4368
6026
17865
27127

結果が変わりましたね。初期値を設定すると、その初期値に依存した乱数が出続けます。
逆に言えば、同じ乱数の初期値を設定すれば、同じ結果にする事が出来るわけです。

#include <stdio.h>
#include <stdlib.h>

int main(){
srand(111);
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
srand(111);
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
return 0;
}

実行結果

401
21144
5313
401
21144
5313

初期値を設定し、3回乱数を呼び出してその後で、同じ初期値でまた3回呼び出しています。
すると乱数は同じ乱数が出せています。
これはゲームリプレイを作るときなどによく利用されるものですが、
ゲーム中そこまで利用する機会が無いものなので、
「以前と同じ乱数を出せるもの」とだけ覚えておけばいいでしょう。

DXライブラリでの乱数はいつも適切に適当に初期化してくれているのでいつも違う値が出ますが、
randなどの標準関数はいつも同じ値が出てしまうので、「今の秒数」などで初期化するのが一般的です。


1,234ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..比類無きプログラマー(70,002ポイント)   Date: 2008/04/20(日) 23:22   No:15755     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
コンピューターによる乱数列というのは、完全にでたらめな数ではなくて、コンピューターが順番に計算して出している数の並びなのです。
そこには、ある規則に従われた計算方法が存在し、人間がぱっと見ただけでは計算方法が分からないような数列を成しています。(実は、乱数列から乱数の計算方法を知る事は可能なのです。)

んで、「一度ランダムに出力された値を、もう一度繰り返して表示する」というのは、さっき説明したように、「ある規則に従われた計算方法」で構成された乱数列は、たいていがその乱数列の、「X回前に出力された値とY回目に出力された値を取り出して、これこれこんな計算をして…」といった計算方法が取られています。
つまり、出力された乱数列から計算/出力するわけですから、その計算には、必ず初期値なるモノが必要になります。(要は、出力された乱数列が無いので、最初だけはそれを決める必要があるって事)

なので、初期値を同じにした場合、その後出力された値はずっと一緒ってことになります。
まぁ分かりにくければ、エクセルでちょっと作ってみましたので、初期値のところをいろいろいじくってみてください。(初期値の概念がよく分かるはずです。)


406ポイント を手に入れた。

Name: fffff  ..入門者(2,734ポイント)   Date: 2008/04/22(火) 19:34   No:15839 解決!     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
>解釈
 ランダムの関数は、ある法則性にのっとって、用意されている一定の値を返す。
 そのため、関数で設定した初期値が同じである以上、同じ値しか返ってこない。
 しかし、初期値を与えてやれば返される数値に変化が起こる。

 Srand は、一度出した値を出したいときに用いる関数である。
 Rand に至っては、常に同じ数値しか返らない。

 ただ、このままでも一定の値しか返らないため、初期値を変更するなりの処置を行い、
 プログラム中で意図的に、数値をいじる必要がある。

 ……と、こんな感じの解釈でよろしかったでしょうか?
 ちょっと回答に自信がないので、どなたかの意見を伺いたいところなのですが……



 それと、少々タイミングが早いのですが、この場を借りてお礼を。

>水狐様
 確か、前回の質問でも助けていただきましたね。お陰で勉強がはかどります。
 いつもありがとうございます。(^^)

>管理人様
 毎度ながらお世話になります。やはり、実例を交えて解説をいただけると非常に分かり易くて助かります……
 今後ともよろしくお願いいたします。それと、今回もありがとうございました。 (_ _)

>tkmakwins15 様
 解説だけでなく、エクセルのファイルまで用意してくださって……(驚愕)
 どうもありがとうございました〜。(_ _)
 
 


362ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..比類無きプログラマー(70,857ポイント)   Date: 2008/04/23(水) 00:30   No:15851     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
乱数の概念については、大まか合ってます。たいていの場合、毎回違う乱数列が出て欲しいわけですから、初期値には現在時刻などを設定したりします。

ただ、DxライブラリのGetRand()関数は、初期値を設定せずとも、ただ呼び出すだけで、毎回違う乱数が出ます。

SRand()関数の使い方も、大体そうなります。

標準関数のrand()の場合、初期値が毎回同じなので、srand()関数で毎回違う値を指定するわけです。毎回違う値の典型的な例として、現在時刻があるわけです(一度過ぎ去った時は二度と戻ってこないですよね?)


193ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(564,044ポイント)   Date: 2008/04/23(水) 11:26   No:15852     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    

少し混合されていらっしゃるといけないので改めて説明しますと、
私は先ほど4種類の関数を示しました。

rand()
 ‥stdlibの標準関数で、乱数を生成する関数。初期値を与えないと毎回同じパターンの乱数になる

srand()
 ‥これも標準関数で、rand()関数の初期値を設定する関数。現在の時刻などで初期化するとgood

GetRand()
 ‥DXライブラリの関数で、乱数を生成する関数。初期値を与えなくても毎回違う乱数が出る。

SRand()
 ‥DXライブラリの関数で、乱数の初期値を設定する関数。GetRandは毎回違う乱数が生成されるので
  以前と同じパターンで乱数を生成したい時以外に用いる必要の無い関数

の4つです。
私は上で「予め用意されている値が出ているだけ」と言いましたが、少しニュアンスが正確ではなく
「予め用意された計算式にのっとった値が出ているだけ」が正確です。
実際に見たほうがわかりやすいと思いますので、似たようなことが出来る関数を作ってみました。
以下ご覧下さい。


#include <stdio.h>

int val=32172;

int rand_2(){
val= val+12345;
val= val%6827;
return val;
}

int main(){

printf("%d\n",rand_2());
printf("%d\n",rand_2());
printf("%d\n",rand_2());

return 0;
}

実行結果

3555
2246
937

 
これの意味がお解かりいただけるでしょうか。
前回の計算結果に依存した、適当に計算した結果を返しています。

※わかりやすいように実際とは異なる仕様にしてあります。

では初期化できる関数を追加してみます。


#include <stdio.h>

int val=32172;

//乱数の計算種を初期化
void srand_2(int seed){
val=seed;
}

//乱数を生成
int rand_2(){
val= val+12345;
val= val%6827;
return val;
}

int main(){

srand_2(111);
printf("%d\n",rand_2());
printf("%d\n",rand_2());
printf("%d\n",rand_2());
srand_2(111);
printf("%d\n",rand_2());
printf("%d\n",rand_2());
printf("%d\n",rand_2());

return 0;
}

実行結果

5629
4320
3011
5629
4320
3011


いかがでしょうか。
このプログラムを理解されれば乱数について少し解ると思います。


772ポイント を手に入れた。

Name: fffff  ..入門者(3,015ポイント)   Date: 2008/04/24(木) 00:33   No:15873     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
 rand と srand 、そして Getrand と SRand はそれぞれ違う効果を持つ関数だったのですね……
 文字の大小で区別されてる関数があったとは、調査不足でした。
 tkmakwins15様,管理人様、どうもありがとうございます。



>管理人様
 度々申し訳ありません、質問があります。
 レスで頂いた前半部分の乱数のプログラムは大丈夫なのですが、
 後半のプログラムに関してうまく理解できず、解説をお伺いしたい箇所があります。

――――――――――――――――――――――――――――――――――――――――――――――
//乱数の計算種を初期化

void srand_2(int seed){

val=seed;
――――――――――――――――――――――――――――――――――――――――――――――

 この部分なのですが、void という宣言は、
 これまでのサンプルではあまり見かけなかった宣言のように思います。
 お恥ずかしい限りなのですが、正直に言うと、私はこの void という関数が何を意味しているのかも理解できていません。
 ネット上で検索してみても、どうにもいまいちピンと来るもの(解説)が得られず……

 申し訳ないのですが、この部分の解説をお願いしてもよろしいでしょうか?


281ポイント を手に入れた。

Name: 木霊  ..初心者(7,882ポイント)   Date: 2008/04/24(木) 01:33   No:15876     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
 その部分は「関数が返す値の型」です。


 voidだとその関数は値を返さない、ということです。
 intやdoubleだと値を返す関数ということになるので「return ○○;」(○○のところは数値あるいは変数)
で関数を終わらせる必要があります


116ポイント を手に入れた。

Name: fffff  ..入門者(2,978ポイント)   Date: 2008/04/27(日) 22:33   No:15975     
Title: Re:C言語〜ゲームプログラミングの館・32節に関する質問    
>木霊様
 ありがとうございます。
 返信が遅くなってしまって申し訳ありませんでした……


37ポイント を落としてしまった。



Name: hxjk  ..ぴよぴよ(29ポイント)   Date: 2008/04/27(日) 20:57   No:15969       
Title: 配列変数の使い方    
はじめまして。
Cで↓のような配列変数(文字)を作りたいのですが、どうすれば作れますか?

str[0][0] = "abc"
str[0][1] = "def"
str[0][2] = "ghi"
str[1][0] = "123"
str[1][1] = "456"
str[1][2] = "789"

ほんとに初歩的なこととは思いますが、どうかご教授ください。


29ポイント を手に入れた。


Name: フリオ  ..上級者(22,903ポイント)   Date: 2008/04/27(日) 21:40   No:15972     
Title: Re:配列変数の使い方    
 こういうことでしょうか。

#include <stdio.h>

int main(void)
{
char *str[2][3] = {{"abc", "def", "ghi"}, {"123", "456", "789"}};
int i, j;

for(i = 0; i < 2; i ++){
for(j = 0; j < 3; j ++){
printf("str[%d][%d] = \"%s\"\n", i, j, str[i][j]);
}
}
return 0;
}

 


156ポイント を手に入れた。

Name: hxjk  ..ぴよぴよ(66ポイント)   Date: 2008/04/27(日) 21:56   No:15974 解決!     
Title: Re:配列変数の使い方    
なんか char *str のとこの書き方がでつまずいてました。
フリオさん本当にありがとうございました。


37ポイント を手に入れた。



Name: アブルイラリ  ..ぴよぴよ(13ポイント)   Date: 2008/04/27(日) 11:25   No:15953       
Title: はじめまして    
すいません

C語ではないのですが・・・
管理人様にメールをしたのですが
返事が来てません

もしかして不快な思いをさせたのでしょうか?
それとも、とどいてないのでしょうか?

よろしければ返事が欲しいです

失礼しました


13ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(568,297ポイント)   Date: 2008/04/27(日) 14:55   No:15954     
Title: Re:はじめまして    
こんにちは。Pさんではないですよね?
メール届いていないようです。
すみませんが、もう一度ここに書いていただくか、ここにかけない内容でしたら

dixqhp@gmail.com

までお願いします。


35ポイント を手に入れた。

Name: アブルイラリ  ..ぴよぴよ(29ポイント)   Date: 2008/04/27(日) 17:17   No:15961     
Title: Re:はじめまして    
メール送りました

返事楽しみに待ってます


16ポイント を手に入れた。



Name: Ctan  ..ぴよぴよ(315ポイント)   Date: 2008/04/27(日) 15:05   No:15956       
Title: C言語でChat    
どうもはじめまして、Ctanです。
こちらのサイトで勉強させて頂いています。

管理人さんも作られたことのある、チャットを作りたいと思うのですが、
イマイチどういうシステム構造かイメージがつかめていません。
サーバー側とクライアント側とプログラムを作り、インストールしてサーバーに集まって使用するタイプの物を、
作成しようと思うのですが、通信システムについても、C言語についても大した知識があるわけではないけど、
色々なサイトを見て回ればできると思っていました。(他の言語の経験があるので)
ですが、チャットシステムについては探してもサンプルソースとかが見つからなかったので質問させて頂きました。

単純に考えると、自分の入力したデータを暗号化するorしないで送り表示するといった感じでしょうか?
部屋に何人いるか確認でき、部屋のタイトルも決めれて、8〜10人が各自好みの画像を表示できるといった、
システムを作りたいと思っています。
なかなか上手くまとまっていませんが、通信システムについてアドバイス頂けたらと思います。
よろしくお願いします><


315ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(568,383ポイント)   Date: 2008/04/27(日) 15:23   No:15958     
Title: Re:C言語でChat    
チャットといっても、常時起動してIPアドレスが固定であるようなサーバーが無いときちんとしたものは作れません。

私が作ったものは相手のIPアドレスを事前に確認しておき、セーノで立ち上げてIPアドレスを入力して接続するという、つまり事前にMSNチャットとかでIPアドレスとかを伝えてもらってから使うので全く実用性の無い物です。

プログラムについては本家にサンプルがありますので参考にどうぞ。

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N21


68ポイント を手に入れた。

Name: Ctan  ..ぴよぴよ(607ポイント)   Date: 2008/04/27(日) 16:08   No:15959     
Title: Re:C言語でChat    
管理人さんお返事ありがとうございます。
サーバーに関しては、ノートPCで代用しようと思っています。

教えて頂いたサンプルを見ながら、とりあえず出来る所までやってみようと思います。
ただ、1:1を対象としている為、処理は簡潔にまとまっているように感じましたが、
複数の場合でも、同じような処理でできると思うので、その辺は試行錯誤しながら進めてみます。

アドバイスありがとうございます!またわからないことがありましたら、
是非質問させて頂きます。


2倍のポイントを手に入れた! 292ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(84,691ポイント)   Date: 2008/04/27(日) 16:10   No:15960     
Title: Re:C言語でChat    
私も小規模ではありますが似たようなことをやっているので、参考になった資料を載せておきますね。

http://www.amazon.co.jp/Visual-C-net%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3-1-%E8%B6%99/dp/4877831827/ref=pd_sim_b_img_3


107ポイント を手に入れた。



Name: ki  ..ぴよぴよ(47ポイント)   Date: 2008/04/26(土) 22:14   No:15944       
Title: 音楽再生ソフトについて    
こんにちは
自分はDXライブラリを使い音楽再生ソフトを作っているのですが、Aと言う曲を再生が終ったらBと言う曲を再生してBが終ったらCを....
のように再生できるようにしたのですが、なにか他の作業をしながらこのexeを使っているとAからBへといけません
どうすればいいのでしょうか教えて下さい


47ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(568,096ポイント)   Date: 2008/04/27(日) 01:57   No:15945     
Title: Re:音楽再生ソフトについて    
私は使用したことがありませんが
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R15N22
この関数を使うと可能ではないでしょうか。
DXライブラリは非アクティブウィンドウの時は処理をしないようになっていますが、
これを設定することで処理は続行されるものと思います。


136ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(84,584ポイント)   Date: 2008/04/27(日) 09:27   No:15950     
Title: Re:音楽再生ソフトについて    
別スレッドで常に再生状況を監視するという方法もあります。

18ポイント を手に入れた。

Name: ki  ..ぴよぴよ(26ポイント)   Date: 2008/04/27(日) 10:36   No:15952 解決!     
Title: Re:音楽再生ソフトについて    
管理人さん、バクさんありがとうございました早速試してみます

26ポイント を手に入れた。



Name: えんつく  ..ぴよぴよ(101ポイント)   Date: 2008/04/26(土) 02:57   No:15913       
Title: STG:敵を倒しても弾が出続けるのですが・・・    
はじめまして、えんつくと申します。
こちらのサイトはしょっちゅう利用させていただいているのですが何度やってもうまくいかないところがあります

シューティングの館の今あるところまでやったのですが
敵が弾を撃っている最中に倒すと敵がいないのにもかかわらず弾が出続けてしまいます。

これはなぜなのでしょうか?

わかる方是非教えてください!


101ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(567,097ポイント)   Date: 2008/04/26(土) 15:07   No:15921     
Title: Re:STG:敵を倒しても弾が出続けるのですが・・・    
これは敵の情報と弾幕の情報を全く別に切り離して作っており、そこの関連を作っていないからです。
敵が倒されるとその敵のフラグを他のフラグに変更するなどして、弾幕情報に伝えてやり、ストップするなどしてみて下さい。


96ポイント を手に入れた。

Name: えんつく  ..ぴよぴよ(147ポイント)   Date: 2008/04/26(土) 22:13   No:15943     
Title: Re:STG:敵を倒しても弾が出続けるのですが・・・    
了解しました!
それでは色々と試してまいります!


2倍のポイントを手に入れた! 46ポイント を手に入れた。



Name: J  ..かけだし(2,017ポイント)   Date: 2008/04/25(金) 22:39   No:15911       
Title: ファイルパッキングについて    
ゲームを製作しているのですが、画像や音楽をまとめておきたいのですが、
何か良い方法はありませんでしょうか?
なるべく早くパッキングしておきたいので・・・
フリーソフトなんかがあって、こっちでは読み込むだけ!みたいなのがあればいいのですが(汗

コンパイラはBorlandです


90ポイント を手に入れた。


Name: toyo  ..初心者(7,688ポイント)   Date: 2008/04/26(土) 06:28   No:15914     
Title: Re:ファイルパッキングについて    
私はリソースとして本体に埋め込んでいます
hoge.rc
MIDI_BGM1 MIDI DISCARDABLE "bgm1.mid"
WAVE_CLICK1 WAVE DISCARDABLE "click1.wav"


64ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(567,782ポイント)   Date: 2008/04/26(土) 15:25   No:15925     
Title: Re:ファイルパッキングについて    
沢山あるデータファイルはアーカイブを使って一つにするのがいいでしょう。

http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#T11

デコーダが存在するので、データの改竄やコピー対策などの面ではあまりあてになりませんが、
そうではない場合は、普通に便利です。
今まで例えばdatフォルダを使っていたとすると、このアーカイブを使ってできたdat.dxaはdatフォルダと全く同じ役割をします。
詳しくはリンク先をご参照下さい。


117ポイント を手に入れた。

Name: J  ..かけだし(2,225ポイント)   Date: 2008/04/26(土) 16:01   No:15928 解決!     
Title: Re:ファイルパッキングについて    
管理人さん、toyoさん回答ありがとうございます。
DXライブラリの機能を使うことにしました。機密性はしょうがないので、コチラでどうにかすることにします。


42ポイント を手に入れた。

Name: lbfuvab  ..ぴよぴよ(251ポイント)   Date: 2008/04/26(土) 17:04   No:15933     
Title: Re:ファイルパッキングについて    
拡張子を変えればバレにくさはあがりますよ。

14ポイント を手に入れた。

Name: J  ..かけだし(2,265ポイント)   Date: 2008/04/26(土) 21:14   No:15941     
Title: Re:ファイルパッキングについて    
はい、拡張子を変えて、バイナリも弄ってみようかと思っています。

28ポイント を手に入れた。



Name: J  ..かけだし(2,183ポイント)   Date: 2008/04/26(土) 14:50   No:15919       
Title: 無効な間接参照    
int CopyField(int *field,int *copy_field)
{
int x,y;
for(x=0;x<=7;x++){
for(y=0;y<=13;y++){
*copy_field[y][x] = *field[y][x];
}
}
return 1;
}

エラー E2062 c:\myc\drop\Field.h 33: 無効な間接参照(関数 CopyField(int *,int *) )
エラー E2062 c:\myc\drop\Field.h 33: 無効な間接参照(関数 CopyField(int *,int *) )
と出てしまいます。
どこが間違っているのでしょうか。。


166ポイント を手に入れた。


Name: ibis  ..初心者(5,604ポイント)   Date: 2008/04/26(土) 15:55   No:15927     
Title: Re:無効な間接参照    
fieldとcopy_fieldは2次元配列へのポインタですよね。
int *field ではなく int *field[][] と宣言すべきです。
copy_fieldも同様に int *copy_field[][] と。


50ポイント を手に入れた。

Name: J  ..かけだし(2,264ポイント)   Date: 2008/04/26(土) 16:03   No:15929     
Title: Re:無効な間接参照    
なるほど!そうするのですか!
回答ありがとうございます!
試しにやってみます。


39ポイント を手に入れた。

Name: J  ..かけだし(2,237ポイント)   Date: 2008/04/26(土) 21:13   No:15940 解決!     
Title: Re:無効な間接参照    
なんとか解決しました!
ibisさん、ありがとうございました!


27ポイント を落としてしまった。



Name: 流考  ..ぴよぴよ(119ポイント)   Date: 2008/04/25(金) 22:07   No:15908       
Title: シューティングの館で勉強中なのですが。。    
はじめまして。C言語でシューティングを作ろうと勉強中です。
なのですが、サンプルプログラムでの2章のFPSを表示するプログラムでなぜか40~50FPSになってしまい、
処理を加えると平気で20〜30FPSになってしまう始末です。
プログラムはまずコピーして確認してるのですが、これでは使い物にならないので。。

環境はMicrosoft Visual C++ 2005です。
もし同様の例を体験した方などおられましたら、ご教授願います。


119ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(567,001ポイント)   Date: 2008/04/26(土) 15:06   No:15920     
Title: Re:シューティングの館で勉強中なのですが。。    
PCのスペックはどの程度でしょうか?
極端に古いPCだったりすると処理に時間がかかる可能性もあります。
しかし、そうではない場合は、本家の掲示板で聞いてみて下さい。


77ポイント を手に入れた。

Name: 流考  ..ぴよぴよ(239ポイント)   Date: 2008/04/26(土) 17:47   No:15934     
Title: Re:シューティングの館で勉強中なのですが。。    
情報不足ですみません。
スペックはSempron 3200+で、一般的なシューティングをやる分には問題が全くないスペックです。
四聖龍神録も正常に動いてますので。。

すいません、本家とはどこの掲示板でしょうか?
そちらでも聞いてみようと思います。


120ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(567,843ポイント)   Date: 2008/04/26(土) 20:20   No:15936     
Title: Re:シューティングの館で勉強中なのですが。。    
本家とはDXライブラリ製作者様のHPです。
私はただの愛用者ですので、すみませんがプログラムコードに問題が無い場合の不具合はわからないのです。

本家はこちらです。

http://homepage2.nifty.com/natupaji/DxLib/


61ポイント を手に入れた。

Name: 流考  ..ぴよぴよ(269ポイント)   Date: 2008/04/26(土) 21:06   No:15939     
Title: Re:シューティングの館で勉強中なのですが。。    
ありがとうございます。
そちらでも質問することにします。


30ポイント を手に入れた。



Name: kazuoni  ..中級者(11,450ポイント)   Date: 2008/04/23(水) 23:38   No:15863       
Title: アイテムの管理    
お邪魔します。
ゲームでは欠かせない(?)アイテムの管理について聞きたいんですが・・・どう管理するが一番効率がよいでしょうか?
おおまかに回復などに使うアイテム、武器、防具、ゲーム中に出てくるアイテムで、大まかに4つに分けたり、アイテム使用画面での表示(アイテムの移動や整頓)や、アイテムの簡単な詳細表示など・・・アイテム一個に持たせる情報をどうしていったらいいのか・・・

少々漠然とした内容で申し訳ありません。。よろしくお願いします。