C言語何でも質問掲示板


必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   構造体の知識について   
     ・[34184] MNS 
     ・[34185] 256bit 
     ・[34186] 256bit 
     ・[34187] 紅葉 
     ・[34188] 256bit 
   どなたかお願いします ....   
     ・[34144] kazuoni 
     ・[34145] boko 
     ・[34146] やそ 
     ・[34167] boko 
     ・[34179] Kubou 
   住所録のプログラム   
     ・[34121] non 
     ・[34122] non 
     ・[34123] ほのか 
     ・[34124] non 
     ・[34125] ほのか 
     ・[34126] pooka 
     ・[34127] non 
     ・[34128] non 
     ・[34129] 雷 
     ・[34130] ほのか 
     ・[34131] pooka 
     ・[34132] non 
     ・[34134] ほのか 
     ・[34141] pooka 
     ・[34158] ほのか 
     ・[34163] pooka 
     ・[34175] ほのか 
     ・[34177] ほのか 
     ・[34178] ほのか 
   エクセルを閉じないと   
     ・[34161] Mikan 
     ・[34162] すずめ 
     ・[34164] バグ 
     ・[34166] すずめ 
     ・[34168] Justy 
     ・[34176] すずめ 
   どこがおかしやら・・ ....   
     ・[34172] フリオ 
     ・[34173] kazuoni 
   プロジェクトを普通の ....   
     ・[34151] 芽衣子 
     ・[34152] yu 
     ・[34153] junta 
     ・[34169] lbfuvab 
   無題   
     ・[34115] たいちう 
     ・[34116] Hermit 
     ・[34119] kazuoni 
     ・[34165] Hermit 
   正規表現   
     ・[34140] 御津凪 
     ・[34156] ウズ 
   CreateWindow関数につ ....   
     ・[34154] dic 
     ・[34155] 西村 
   画面のちらつき   
     ・[33654] 天使 
     ・[33955] 素人PG 
     ・[33958] Justy 
     ・[34068] 素人PG  
     ・[34078] Justy 
     ・[34148] 素人PG 
   C++のヘッダ記述のもの ....   
     ・[34143] Blue 
   無題   
     ・[34100] lbfuvab 
     ・[34101] Blue 
     ・[34102] 御津凪 
     ・[34103] Blue 
     ・[34104] Mist 
     ・[34105] ウズ 
     ・[34108] たかぎ 
     ・[34133] ウズ 
   三角型の弾幕について ....   
     ・[33079] situmon 
     ・[33143] チルチル 
     ・[33164] situmon 
     ・[33172] チルチル 
     ・[33182] めいらる 
     ・[33183] Dixq (管理人) 
     ・[33221] チルチル 
     ・[33236] Dixq (管理人) 
     ・[33253] situmon 
     ・[33256] 通りすがり 
     ・[33261] situmon 
     ・[33332] チルチル 
     ・[33463] チルチル 
     ・[33493] situmon 
     ・[33494] チルチル 
     ・[33529] チルチル 
     ・[33533] situmon 
     ・[33535] チルチル 
     ・[33545] situmon 
     ・[33546] チルチル 
     ・[33548] situmon 
     ・[33698] situmon 
     ・[33701] チルチル 
     ・[33703] situmon 
     ・[33704] チルチル 
     ・[33878] チルチル 
     ・[33896] Ma 
     ・[33944] チルチル 
     ・[33960] Ma 
     ・[33963] Justy 
     ・[33965] Ma 
     ・[33986] チルチル 
     ・[33993] Dixq (管理人) 
     ・[34012] Ma 
     ・[34031] situmon 
     ・[34112] チルチル 
     ・[34118] Ma 
   メニュー画面について ....   
     ・[33962] BEMANI 
     ・[34029] 蒼 
     ・[34033] Justy 
     ・[34117] 蒼 
   DxLib_VC2008_and_200 ....   
     ・[34067] non 
     ・[34111] 霧島 
   無題   
     ・[34061] 御津凪 
     ・[34062] 研修生 
     ・[34063] 御津凪 
     ・[34065] 研修生 
     ・[34066] 御津凪 
     ・[34085] 研修生 
     ・[34086] 御津凪 
     ・[34087] Mist 
     ・[34088] non 
     ・[34089] toyo 
     ・[34090] 研修生 
     ・[34091] non 
     ・[34092] 研修生 
     ・[34093] Mist 
     ・[34094] 研修生 
     ・[34095] 研修生 
     ・[34096] Mist 
     ・[34097] 研修生 
     ・[34098] Mist 
     ・[34106] 研修生 
     ・[34110] たいちう 
   よろしければ教えてく ....   
     ・[34074] kazuoni 
     ・[34075] BEMANI 
     ・[34076] BEMANI 
     ・[34077] ユーリ 
     ・[34080] kazuoni 
     ・[34081] ユーリ 
     ・[34083] non 
     ・[34109] ユーリ 
   アクセス領域外へアク ....   
     ・[34073] BEMANI 
     ・[34079] 迷走のギュス 
     ・[34082] toyo 
     ・[34107] 迷走のギュス 
   ソース内のコメントに ....   
     ・[34057] pooka 
     ・[34058] たかぎ 
     ・[34069] たいちう 
     ・[34084] ほのか 
   タメショットについて   
     ・[34046] Huzzy 
     ・[34049] さが 
     ・[34051] さが 
     ・[34070] Tatu 
   ゲームのネットワーク ....   
   Cについて   
     ・[34056] 御津凪 
   お世話になっておりま ....   
     ・[34014] BEMANI 
     ・[34054] クロマ 
   変数の数について   
     ・[34040] Dixq (管理人) 
     ・[34041] 山崎 
     ・[34042] チルチル 
     ・[34048] Mist 
     ・[34053] はいかぜ 
   関数   
     ・[34022] Blue 
     ・[34023] Mist 
     ・[34025] 研修生 
     ・[34050] 研修生 
   自作用の3D関数ライ ....   
     ・[34037] 迷走のギュス 
     ・[34038] 迷走のギュス 
     ・[34043] toyo 
     ・[34044] 迷走のギュス 
   画像処理について   
     ・[33995] Dixq (管理人) 
     ・[34035] クロウ 
   質問ではありません  ....   
     ・[34008] Justy 
     ・[34034] a 
   反転ゲームの最小回数 ....   
     ・[33915] box 
     ・[33918] box 
     ・[33920] さが 
     ・[33924] さが 
     ・[33940] mats 
     ・[33945] スー 
     ・[33988] さが 
     ・[34030] スー 
   双方向リストについて   
     ・[34027] non 
     ・[34028] 山崎 
   ドット絵の作り方につ ....   
     ・[34004] 紅葉 
     ・[34010] 256bit 
     ・[34011] BEMANI 
     ・[34024] 256bit 
     ・[34026] 256bit 
   ゲーム作りの講座   
     ・[33990] たいちう 
     ・[33991] Dixq (管理人) 
     ・[34018] やそ 
     ・[34020] lbfuvab 
   空白   
     ・[34016] 研修生 
     ・[34017] Mist 
   3Dポリゴンの無限遠 ....   
     ・[33801] Justy 
     ・[33805] チルチル 
     ・[33807] Justy 
     ・[33821] チルチル 
     ・[33831] Justy 
     ・[33868] チルチル 
     ・[33882] Justy 
     ・[33883] チルチル 
     ・[33888] Justy 
     ・[33889] チルチル 
     ・[33890] Justy 
     ・[33894] チルチル 
     ・[33906] Justy 
     ・[33910] チルチル 
     ・[33911] Justy 
     ・[33914] チルチル 
     ・[33932] Justy 
     ・[33937] チルチル 
     ・[33938] Justy 
     ・[33942] チルチル 
     ・[33948] Justy 
     ・[33950] チルチル 
     ・[33957] Justy 
     ・[33987] チルチル 
     ・[34009] Justy 
   レーザーの画像が残る   
     ・[33968] yu 
     ・[33970] すずめ 
     ・[33971] pooka 
     ・[33973] すずめ 
     ・[33976] すずめ 
     ・[33997] Dixq (管理人) 
     ・[34007] すずめ 
   複数面のつなげ方   
     ・[33861] ひよこ 
     ・[33865] yu 
     ・[33866] ひよこ 
     ・[33867] ひよこ 
     ・[33870] yu 
     ・[33871] ひよこ 
     ・[33875] yu 
     ・[33881] yu 
     ・[33887] BEMANI 
     ・[33893] yu 
     ・[33985] yrao 
     ・[33994] Dixq (管理人) 
     ・[33999] yrao 
     ・[34000] Dixq (管理人) 
     ・[34003] yrao 
     ・[34006] yrao 
   製作後の配布した場合 ....   
     ・[33927] たかぎ 
     ・[33946] チルチル 
     ・[34005] Acodic 
   文字間隔をあまり取ら ....   
     ・[33992] Dixq (管理人) 
     ・[33998] 山崎 
   2Dのよこ   
     ・[33954] チルチル 
     ・[33967] pic 
     ・[33996] Dixq (管理人) 
   虹の表現をするには?   
     ・[33947] チルチル 
     ・[33972] MOT 
     ・[33984] チルチル 
   二次元配列の0での初期 ....   
     ・[33852] こめかみ 
     ・[33854] こめかみ 
     ・[33855] 初級者 
     ・[33857] こめかみ 
     ・[33977] 餅 
     ・[33979] pooka 
   JAVAについてなんです ....   
     ・[33951] たいちう 
     ・[33952] たかぎ 
     ・[33959] null 
   DXライブラリの整理   
   初代マリオカート、も ....   
     ・[33449] Justy 
     ・[33469] TKOZ 
     ・[33496] TKOZ 
     ・[33500] TKOZ 
     ・[33503] Justy 
     ・[33536] TKOZ 
     ・[33595] Justy 
     ・[33702] TKOZ 
     ・[33706] バグ 
     ・[33709] Justy 
     ・[33756] TKOZ 
     ・[33757] Justy 
     ・[33785] TKOZ 
     ・[33800] Justy 
     ・[33802] TKOZ 
     ・[33815] Justy 
     ・[33816] Justy 
     ・[33897] TKOZ 
     ・[33912] Justy 
     ・[33935] TKOZ 
     ・[33943] Justy 
   DirectXでの描画範囲指 ....   
     ・[33933] Justy 
     ・[33939] nayo 
   無題   
     ・[33919] box 
     ・[33921] tieria 
     ・[33922] tieria 
     ・[33923] box 
     ・[33925] tieria 
     ・[33926] tieria 
     ・[33928] box 
     ・[33929] box 
     ・[33930] tieria 
     ・[33931] tieria 
   無題   
     ・[33905] やっくん 
     ・[33907] Justy 
     ・[33908] やっくん 
   タイトル画面を表示す ....   
     ・[33899] ひよこ 
     ・[33900] kazuoni 
     ・[33902] yu 
   照合   
     ・[33818] kazuoni 
     ・[33876] Luck 
     ・[33877] kazuoni 
     ・[33880] Luck 
     ・[33886] kazuoni 
     ・[33895] たいちう 
   会話画面を作りたいん ....   
     ・[33892] Ma 
   printf   
     ・[33837] non 
     ・[33845] Kana 
     ・[33848] 御津凪 
     ・[33849] toyo 
     ・[33879] Kana 
   5の倍数の和について教 ....   
     ・[33811] box 
     ・[33812] pu 
     ・[33813] box 
     ・[33814] ビギナー 
     ・[33817] pu 
     ・[33819] pu 
     ・[33820] kazuoni 
     ・[33822] pu 
     ・[33823] pu 
     ・[33824] kazuoni 
     ・[33825] pu 
     ・[33826] pu 
     ・[33827] kazuoni 
     ・[33828] pu 
     ・[33850] lbfuvab 
     ・[33874] やそ 
   遊びで   
     ・[33872] kazuoni 
     ・[33873] ひよこ 
   文字列を配列に   
     ・[33765] non 
     ・[33768] Blue 
     ・[33772] ウズ 
     ・[33777] non 
     ・[33779] non 
     ・[33780] YuO 
     ・[33782] ウズ 
     ・[33783] toyo 
     ・[33784] 初級者 
     ・[33839] ウズ 
     ・[33841] toyo 
     ・[33843] ウズ 
     ・[33844] non 
     ・[33846] ウズ 
     ・[33847] 初級者 
     ・[33858] ウズ 
     ・[33862] toyo 
     ・[33864] ウズ 
   ハンドルされていない ....   
     ・[33789] TMS 
     ・[33790] kazuoni 
     ・[33791] Mist 
     ・[33792] Mist 
     ・[33793] TMS 
     ・[33795] MNS 
     ・[33796] Mist 
     ・[33835] TMS 
     ・[33836] バグ 
     ・[33840] toyo 
     ・[33863] TMS 

Name: 256bit  ..ぴよぴよ(601ポイント)   Date: 2009/05/29(金) 20:47   No:34183       
Title: 構造体の知識について    
 現在、構造体を利用したキャラクター分割を行っています。構造体の知識は中級ほどの知識が無いと難しいですか?

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


Name: MNS  ..初心者(8,447ポイント)   Date: 2009/05/29(金) 21:00   No:34184     
Title: Re:構造体の知識について    
中級ほどの知識、というものがどれ程なのかが分からないので、回答しようが無いのですが、
構造体自体はそれほど難しいものではありません。
そもそもC言語は典型的な構造化プログラミング言語なので、
基本といっても過言ではないと思います。


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

Name: 256bit  ..ぴよぴよ(606ポイント)   Date: 2009/05/29(金) 21:56   No:34185 解決!     
Title: Re:構造体の知識について    


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

Name: 256bit  ..ぴよぴよ(658ポイント)   Date: 2009/05/29(金) 22:04   No:34186     
Title: Re:構造体の知識について    
 ↑すみません。またやってしまいました。(--;)
 
 >>MNSさん

 どうも、ありがとうございます。
 構造体の勉強頑張ります。(^_^)/~


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

Name: 紅葉  ..中級者(10,951ポイント)   Date: 2009/05/29(金) 22:08   No:34187     
Title: Re:構造体の知識について    
構造体は変数をまとめたものですので理解はすぐにできるかと思います。

例えば下記の場合(書き方が何種類かあります)


typedef struct{
   float x,y;
   int type;
}CHR;

CHR Play;
CHR Enm;



のように書いて同じような変数を使うものをまとめるだけなんです。
float Play_x,Play_y;
float Enm_x,Enm_y;
のように分けて書く必要がありません。

例の通り書けばPlay.xのように変数を定義できます。

ご存知の事でしたら申し訳ないです。


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

Name: 256bit  ..ぴよぴよ(705ポイント)   Date: 2009/05/29(金) 22:29   No:34188     
Title: Re:構造体の知識について    
 >>紅葉さん

 ありがとうございます。
 構造体勉強への参考にしたいと思います。 


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



Name: boko  ..ぴよぴよ(57ポイント)   Date: 2009/05/28(木) 16:56   No:34139       
Title: どなたかお願いします。    
ノベル風のクイズゲームを作ろうとしています。
クイズ画面を作っていてどうしてもわからない部分があったので質問させていただきます。
ちなみに英語の並び替えクイズです。
クイズ画面は次のように展開させようとしています。
問題文出力→選択肢出力→選択肢選択→正誤判定

プログラムを添付します。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9285.cpp
初心者なりに作ったものです。
長くて申し訳ありません。

それで、問題なのは「クイズ画面 talk.cpp」の部分です。
@問題文→選択肢の順番で出力したいのですが、どうすればいいでしょうか?
A並び替え問題なので、選択肢を選択するという処理を4回繰り返したいのですが、うまくいかない。
 1回選択肢を選んだ後であと3回同じことを繰り返させるために、goto文でlabel1というところまで飛ばしてい ます。どうすればいいでしょう?

長々とすみません。
ここ何日もずっと考えているんですが、まったくわかりません。
ちょっとしたアドバイスでもいいので、よろしくお願いします。



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


Name: kazuoni [URL]  ..比類無きプログラマー(88,270ポイント)   Date: 2009/05/28(木) 18:01   No:34144     
Title: Re:どなたかお願いします。    
>問題文→選択肢の順番で出力したいのですが、どうすればいいでしょうか

その順番で出力してくださいっとしかいいようがない気がするのですが・・・
もっと具体的に今どういう状況で、どういう風にうまくいっていないのか
と書いたほうが良い回答が得られるかと思います。

>並び替え問題なので、選択肢を選択するという処理を4回繰り返したいのですが、うまくいかない。
>1回選択肢を選んだ後であと3回同じことを繰り返させるために、goto文でlabel1というところまで飛ばしています。

これもどのようにうまくいかないか記述するべきだと思います。
なぜgoto文を使用しているかはこの際置いておきます。


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

Name: boko  ..ぴよぴよ(104ポイント)   Date: 2009/05/28(木) 18:54   No:34145     
Title: Re:どなたかお願いします。    
@のほうは実行してみると、問題文と選択肢が同時に出てきている状態です。

Aのほうは、自分でもどう説明したらいいのかわからないのですが・・・
選択肢を↓↑で選んでエンターを押す、そしてもう一度↓↑で選ぼうとして↓↑を押す、あるいはもう一度エンターを押すと、正解かどうかが表示されてしまう。
ためしに、解答(answer[0][5])のほうをすべて同じ選択肢(AAAA)という風にすると、Aを1回えらんでエンターを押すと正解という風に表示されました。
おそらく、処理が行われていないか、1回の処理で4回分ということになっているのかもしれません。


URLを添付しましたが、クリックしてもうまく表示されない時はURLを貼り付けてやってみてください。


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

Name: やそ  ..比類無きプログラマー(88,701ポイント)   Date: 2009/05/28(木) 20:13   No:34146     
Title: Re:どなたかお願いします。    
プログラムは読んでませんが、あて推量で・・・

>問題文と選択肢が同時に出てきている状態です。
ある程度のウェイトをはさむなり、キー入力待ちにして、エンター押したら選択肢が出るようにしたり
で良いのではないでしょうか。

(2)のほうはキー入力判定ルーチンで特定のキー(エンター)を押さないと抜けないようにすればいいだけではないでしょうか?


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

Name: boko  ..ぴよぴよ(301ポイント)   Date: 2009/05/29(金) 01:18   No:34167     
Title: Re:どなたかお願いします。    
@に関して質問です。
自分の作ったプログラムでは

for(){
問題文出力
}
for(){
選択肢出力
}

という風になっています。

for(){
問題文出力
}
WaitTimer(20);
for(){
選択肢出力
}

としても、問題文と選択肢が同時に表示されます。
あと、for文のそれぞれ前にif(CheckHitKey(KEY_INPUT_RETURN)){をおくと、問題文と選択肢が表示されなくなりました。

どこを直せばよいでしょうか?


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

Name: Kubou  ..ぴよぴよ(12ポイント)   Date: 2009/05/29(金) 15:34   No:34179     
Title: Re:どなたかお願いします。    
初投稿になります。Kubouといいます。

> WaitTimer(20);
ですが、当該関数は引数がミリ秒単位です。
20ミリ秒waitを入れても侮ヲ上は一瞬となるため同時に侮ヲされるように見えるのだと思います。
1000で1秒なのでそれなりに大きい数字を入れるとwaitがかかるように見えると思います。


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



Name: ほのか  ..入門者(2,755ポイント)   Date: 2009/05/28(木) 09:43   No:34120       
Title: 住所録のプログラム    
いつもお世話になっております。
ソースは添付ファイルをご覧いただきたいのですが、今回多々修正しなくてはならない部分があり、わからないところがいくつかあるので質問させていただきます;


1.最初の処理区分入力や削除・照会・変更でのNo入力で、数字以外の文字列を入力すると無限ループしてしまう。

2.変更関数内で、goto文を使用しないで変更する項目番号入力のところに戻るには…?

3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?


他にも細かい部分でわからないところはありますが、なんとか自分でやってみようと思うのでどうしてもわからない部分だけ質問させていただきました…;

以前こちらでwhile(1)の使用は良くないと言われたのですが、課題では終了関数を作成しなくてはならないですし、担当の方には使用しても良いと言われたので、そちらは変えさせていただきました。


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


Name: non  ..熟練のプログラマー(43,661ポイント)   Date: 2009/05/28(木) 10:21   No:34121     
Title: Re:住所録のプログラム    
>3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?
>以前こちらでwhile(1)の使用は良くないと言われたのですが、

正確には、終了関数でexitして終わるのがよくないと言ったのです。
したがって、この3の処理をするように言ったのです。
すると、while(1)にしなくていいでしょってね。



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

Name: non  ..熟練のプログラマー(43,758ポイント)   Date: 2009/05/28(木) 10:41   No:34122     
Title: Re:住所録のプログラム    
1の原因は
scanf("%d",&kubun);にあります。
文字が入力されることを想定していないからです。
ですから、文字で入力するように変更します。

方法1
scanf("%s" に変更する。

方法2
getcharなどを使う

私なら方法2で しかもgetcheを使うでしょうね。
fflushも使わなくてはいけなくなるかも。


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

Name: ほのか  ..入門者(2,856ポイント)   Date: 2009/05/28(木) 10:59   No:34123     
Title: Re:住所録のプログラム    
回答ありがとうございます。

以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?
また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??
「End_flg = 1;」の意味がよくわからないのですが…;
上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??


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

Name: non  ..熟練のプログラマー(43,840ポイント)   Date: 2009/05/28(木) 11:08   No:34124     
Title: Re:住所録のプログラム    
> 以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?

いいですよ。っていうより、そうしてください。

> また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??

前のプログラムはそうしてましたね。

> 「End_flg = 1;」の意味がよくわからないのですが…;

フラグって言葉わかります?状態を示すための1ビットのデータです。(1ビットでなくてもいいのですが)
今回は、0ならまだ続ける。1なら終了するという状態を示すために使います。


> 上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??

もちろん、なくしましょう。



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

Name: ほのか  ..入門者(2,978ポイント)   Date: 2009/05/28(木) 11:19   No:34125     
Title: Re:住所録のプログラム    
回答ありがとうございます。

上記の要領でソースを修正したのですが、最初にファイル名を入力した後その次の処理が行われずプログラムが終了されてしまいます;


新しくファイルを添付させていただきました。


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

Name: pooka [URL]  ..入門者(3,664ポイント)   Date: 2009/05/28(木) 11:37   No:34126     
Title: Re:住所録のプログラム    
>while(end_flg)
今の状態だとend_flgは0なのでwhile文は実行されません。
以前のようにwhile(!end_flg)とする、while(end_flg == 0)とする、
あるいは初めに1で初期化してwhile(end_flg)とし、終了するときにend_flgを0にするなど変更してみてください。


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

Name: non  ..熟練のプログラマー(43,896ポイント)   Date: 2009/05/28(木) 11:39   No:34127     
Title: Re:住所録のプログラム    
while(end_flg){
の意味はわかりますか?
これはwhile(0)ってことですよ。
今まではwhile(1)だったでしょ。



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

Name: non  ..熟練のプログラマー(43,939ポイント)   Date: 2009/05/28(木) 11:41   No:34128     
Title: Re:住所録のプログラム    
かぶりましたか。

char kubun;
これで、
scanf("%s",kubun);
これは、まずいですね。




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

Name:  ..プログラマー(35,885ポイント)   Date: 2009/05/28(木) 11:45   No:34129     
Title: Re:住所録のプログラム    
scanf("%s",kubun);
のkubunはいくつまでの文字列を入れるつもりなのでしょうか?
数字だけを扱いたいのか、文字も扱いたいのかで使うものが違うと思います。

見ていて思ったのですが、
case では1〜9までしかないのに、文字列を扱う必要があるのでしょうか?
kubunを入力した際に、1〜9の範囲でなければ、再入力を求めるようにしてはどうでしょうか?
※int kubun として


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

Name: ほのか  ..入門者(3,120ポイント)   Date: 2009/05/28(木) 11:53   No:34130     
Title: Re:住所録のプログラム    
回答ありがとうございます。
whileの部分は解決いたしました。ありがとうございました^^

scanfの部分なのですが、%sではなく%cに変えてみたのですが、それでも大丈夫でしょうか?
それから、処理区分の部分は%cで問題なかったのですが、削除関数等では入力文字を文字列にしてしまうとそれ以降の処理が型が違うため上手くいきません…;


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

Name: pooka [URL]  ..入門者(3,716ポイント)   Date: 2009/05/28(木) 12:13   No:34131     
Title: Re:住所録のプログラム    
>scanf("%s",kubun);
scanf("%c",&kubun);ですかね。(確認のため)

>削除関数等では入力文字を文字列にしてしまうと・・・
atoi関数なんかを使えばできそうですね。


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

Name: non  ..熟練のプログラマー(43,955ポイント)   Date: 2009/05/28(木) 12:16   No:34132     
Title: Re:住所録のプログラム    
%cにするなら、getcharにしようよ。


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

Name: ほのか  ..入門者(3,154ポイント)   Date: 2009/05/28(木) 13:15   No:34134     
Title: Re:住所録のプログラム    
回答ありがとうございます。

scanf("%c",&kubun);です。
atoi関数を使用してみたのですが、エラーが出てしまいました;


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

Name: pooka  ..入門者(3,649ポイント)   Date: 2009/05/28(木) 17:21   No:34141     
Title: Re:住所録のプログラム    
>atoi関数を使用してみたのですが、エラーが出てしまいました;
どのようなエラーが出ましたか?
また、どんなかんじで書きましたか?


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

Name: ほのか  ..入門者(3,316ポイント)   Date: 2009/05/28(木) 22:21   No:34158     
Title: Re:住所録のプログラム    
int no,i;
char *num;
char ans;
char dansei[2]= DANSEI;
char jyosei[2]= JYOSEI;
Jusyoroku *temp;

do{
puts("");
printf("削除するNoを入力してください>>>");

/* 削除するNoの入力 */
scanf(" %c",&num);

no = atoi(num);

if(no>0 && no<=cnt){
temp = &data[no-1];




上記のように書きましたが、入力したNoが不適切だと表示され、削除処理ができませんでした;


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

Name: pooka [URL]  ..入門者(3,882ポイント)   Date: 2009/05/28(木) 23:55   No:34163     
Title: Re:住所録のプログラム    
char num;
//省略
no = atoi(&num);
使い方としてはこうですかね。

ただこのままだと削除するNoの入力のときに、例えばabcと入力するとbcがバッファ上に残るので(改行文字も?)
期待した通りの動作をしないと思います。

/* 削除するNoの入力 */
scanf("%c",&num);
fflush(stdin);
no = atoi(&num);

これで期待した動作になると思います。

getcharを使うならscanfの代わりに
num = getchar();
にすればいいと思います。


ちなみに雷さんの書いてある方法でやってみてもいいと思います。

例えば
while(1){
if(scanf("%d",&kubun) != 1){
scanf("%*s");
printf("入力エラー\n");
continue;
}
break;
}
これはmain関数の処理区分の入力の所です。(kubunはint型なのでcase 1:のように変えないといけませんが)



これでいいのかな?fflushとか使ったことないんで違ってたらごめんなさいm(_ _)m


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

Name: ほのか  ..入門者(3,393ポイント)   Date: 2009/05/29(金) 09:11   No:34175     
Title: Re:住所録のプログラム    
回答ありがとうございます!
無事修正できました^^他の関数の部分も同じように修正したいと思います^^

2つ目の質問については自己解決しました。


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

Name: ほのか  ..入門者(3,543ポイント)   Date: 2009/05/29(金) 10:04   No:34177     
Title: Re:住所録のプログラム    
1つ目の質問についてほとんど修正できたのですが、1箇所だけ修正できなかったところがあります;
添付ファイルにてソースを貼らせていただきましたが、変更関数内の項目番号を入力する部分で文字を入力すると、何を入力しても「番号が不適切です」と表示されてしまいます;
他の文字入力のところと同じような処理ではいけないのでしょうか??


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

Name: ほのか  ..入門者(3,567ポイント)   Date: 2009/05/29(金) 10:07   No:34178 解決!     
Title: Re:住所録のプログラム    
すみません;
自己解決いたしました。


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



Name: すずめ  ..かけだし(1,976ポイント)   Date: 2009/05/28(木) 20:40   No:34150       
Title: エクセルを閉じないと    
read errorが表示されenemyが出てきません。
こんばんは、いつもお世話になっています。

エクセルをタクスバーに置いたまま変更をしたいんですが、
read errorになってしまいます。
enemyだけ出てきません。
エクセルを使うようになってからずっとそうでした。

また、実行ボタンを押すとフレッツウイルスクリアが起動して
”不審な変更を拒否しました。MT013.exeがプログラム起動時に
DLL(プログラムライブラリ)が自動的にロードされるように、
Windowsを変更しようとしています。”小ウインドウが出てきます。
ウインドウを閉じれば普通にゲーム画面が実行されます。
これも毎回出てきます。

どちらもDxLibを使ったプロジェクトだけの症状です。
WindowsXp VisualC++6.0を使っています。

どなたかアドバイスをお願いします。


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


Name: Mikan [URL]  ..中級者(9,517ポイント)   Date: 2009/05/28(木) 23:23   No:34161     
Title: Re:エクセルを閉じないと    
私も同じような現象になりましたが、
エクセルでデータを開いたままだと、排他ロックがかかって読み取れないのではないのかと思っています。
デバックするたびにエクセルを閉じて動かせばいいだけなので、私は閉じてデバックしていました。

>また、実行ボタンを押すとフレッツウイルスクリアが起動して
実行ボタンというのはビルドの開始ボタンでしょうか?
私はESETのウィルス対策ソフトを使っていますが、この現象は発生していません。
サブマシンのウィルス対策ソフトはavast!ですが、こちらでもこのような現象はみられていません。

もしフレッツウィルスクリアを乗り換えたいのいうのならavast!は無料でオススメです。


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

Name: すずめ  ..かけだし(2,127ポイント)   Date: 2009/05/28(木) 23:38   No:34162     
Title: Re:エクセルを閉じないと    
Mikanさん、こんばんは。
ソースを書いて、ビルドして、
その次にプログラムの実行のボタンを押します。
その後にゲームの画面が出てくるんですが、
フレッツの画面が出てそれを閉じないと
ゲームが動き出さないんです。
その間わずか10秒ほどですが、
けっこういらつきます。

どちらも全くゲーム作りには問題は無いんですが、
解決法があるかもしれないと思って投稿しました。


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

Name: バグ  ..ハッカー(159,682ポイント)   Date: 2009/05/28(木) 23:58   No:34164     
Title: Re:エクセルを閉じないと    
もし、そのファイルがCSV形式のファイルならば、エクセルではなく、テキストエディタで開けば良いだけなのではないかと…?

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

Name: すずめ  ..かけだし(2,343ポイント)   Date: 2009/05/29(金) 00:39   No:34166     
Title: Re:エクセルを閉じないと    
バグさん、こんばんは。
龍神録のプログラムをDxlibを使わないプロジェクトに
Draw関数などを変えて移植した場合は、
エクセルをタクスバーに置いても普通に
実行できます。
フレッツウイルスクリアも起動しません。
なにか設定を変えればうまくいくんじゃないかと
思ったんですが。
私の感じでは、テキストエディタよりエクセルで
敵の設定をしたほうがやりやすいです。
解説でもエクセルを使っているので
なにか方法があるのじゃないかと思ったわけです。


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

Name: Justy  ..伝説なるハッカー(365,663ポイント)   Date: 2009/05/29(金) 01:19   No:34168     
Title: Re:エクセルを閉じないと    
 手元に Excelがないので確認ができないのですが、
今現在どの関数でファイルを読み込もうとしていますか?

 DXライブラリの FileRead_openを使っているのならダメもとで
試しに fopenで開いてみてはどうでしょうか。


 あるいは WinAPIの

CreateFile(_T( "ファイル名" ), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)

 ではどうでしょう?


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

Name: すずめ  ..かけだし(2,468ポイント)   Date: 2009/05/29(金) 09:41   No:34176     
Title: Re:エクセルを閉じないと    
FILE *fp
fp = fopen("dat/csv/storyA0.csv","r");

FileRead_open -> fopen
FileRead_getc(fp) -> getc(fp)
FileRead_close(fp) -> fclose(fp)
に変えて試したところ、無事にエクセルを
タクスバーに置いたままでも実行できました。

龍神録のサンプルをそのまま写したので、
ほかの人もそうなのかと思ってたのですが.......。

justyさん、ありがとうございました。



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



Name: たけし  ..ぴよぴよ(201ポイント)   Date: 2009/05/29(金) 01:57   No:34171       
Title: どこがおかしやら・・・・    
int main(void)
{
float weight, kei=0, n=0, heikin, max, min;
while(1){
printf("体重データを入力して下さい:");
scanf("%f",&weight);
if(weight==0)break;
kei = kei + weight;
n++;
if(n == 1){
kei = kei + 2;
n++;
}
if(max<weight)
max=weight;
if(min>weight)
min=weight;
}
heikin=kei/n;
printf("合計:%6.1f\n人数:%6.0f\n平均:%6.1f\n最大:%6.1f\n最小:%6.1f\n",
kei,n,heikin,max,min);
return 0;
}
というプログラムでデータがなくなった場合0を入力すれば終了するようにしたいのですが
0を押すと0もデータ扱いになりminが0とでてしまいますどこが悪いのでしょうか?ご指摘お願いします。
あともうひとつなのですが。
int main(void)
{
int kaijo=(@), i=1, n;
printf("n!を求めます.nを入力して下さい:");
scanf("%d", &n);
while(A)
(B);
printf("%d! = %d\n" ,i, kaijo);
(C);
}
return 0;
}
で階乗を作るプログラムなのですが@〜Cはどうすればいいんでしょうか?


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


Name: フリオ  ..プログラマー(29,484ポイント)   Date: 2009/05/29(金) 03:29   No:34172     
Title: Re:どこがおかしやら・・・・    
 
タイトルは、内容がわかるようにしてほしい。
ソースは、読みやすいように、pre タグで字下げしてほしい。


 一つ目は、

#include <stdio.h> がない。(これは、コピーミスかな。)

"max"、"min"が、値が不定のまま"weight"と比較されている。

"n"(人数)は、整数なので"int"でいい。


if(n == 1){
kei = kei + 2;
n ++;
}

が、意味不明。

いきなり 0 で終了すると、0除算エラーになる。


 二つ目は、

間違っていてもいいので、まず自分で考えてみてください。
 


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,528ポイント)   Date: 2009/05/29(金) 03:36   No:34173     
Title: Re:どこがおかしやら・・・・    
規約をきちんと読んでください。
コードを載せる際には、プレタグを使用し、見やすくしてください。

>0を押すと0もデータ扱いになりminが0とでてしまいますどこが悪いのでしょうか?
0の時、「終了します」みたいなメッセージを出力した後に、
return 0;
で終了すればよいと思います。
が、どのように終わり方を実装したいかがわからないので、
一概には言えないですが・・・。

#自分の回答を考える前に、フリオさんの御回答を先に解決してください。

>@〜Cはどうすればいいんでしょうか?
とりあえずヒントを。一応丸投げは禁止ですので^^;

1、階乗の答えを代入するものなので、初期化をしておく
2、階乗を求めるのに同じ動作を何回か行って求めたい。終わる条件は?
3、n=k(n>=k)の時の階乗の値を求める式
4、n=k+1を求めるためにしなければいけない式

一度考えてみてください。


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



Name: junta  ..ぴよぴよ(346ポイント)   Date: 2009/05/28(木) 20:37   No:34149       
Title: プロジェクトを普通のソフトみたいに変換したい    
いつもお世話になっています!
前にも同じようなことを質問してたのですが、よくわかりませんでした・・・というのは、
やっとこさゲームが出来たので、とにかく友人にプレイさせたいのですが、
自分が今持っているファイルは、「DATA(絵とか色々),Debug,XX.sln等」で、友人に渡すために、よくゲームとかでも在る、「XX.exe(実行ファイル),BGMフォルダー等色々・・・」にしたいのですが、ツールとかでやるんですか?初歩的な質問?ですみません。宜しくお願いします!

※Debugの中のXX.exeを実行しても真っ黒のままで何も起こりません。


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


Name: 芽衣子  ..かけだし(1,006ポイント)   Date: 2009/05/28(木) 20:44   No:34151     
Title: Re:プロジェクトを普通のソフトみたいに変換したい    
>>Debugの中のXX.exeを実行しても真っ黒のままで何も起こりません
実行ファイル(xx.exe)と同じ階層に素材を置いてみる等してください。
xx.slnとxx.exeではフォルダが違うために素材を呼び出すことができないのです。


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

Name: yu  ..プログラマー(28,035ポイント)   Date: 2009/05/28(木) 20:45   No:34152     
Title: Re:プロジェクトを普通のソフトみたいに変換したい    
XX.exeの場所が違うのではないでしょうか?
(一つ奥の階層に入っていませんか?)

Debugフォルダから出して適切な場所で実行してみてください。


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

Name: junta  ..ぴよぴよ(410ポイント)   Date: 2009/05/28(木) 20:52   No:34153 解決!     
Title: 無題    
おおおおおおお!!!という驚愕の言葉しか出ません(笑)
2週間なやんでも分からなかったので、質問してよかったです!無事実行からなにまで出来ましたので、これで友人に渡せます!!!
どうもありがとうございました!!!


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

Name: lbfuvab  ..上級者(20,758ポイント)   Date: 2009/05/29(金) 01:50   No:34169     
Title: Re:無題    
解決おめでとうございます。
後、配るなら
DebugモードとReleaseモードの違いについても調べてみると良いでしょう。


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



Name: 素人  ..初心者(8,741ポイント)   Date: 2009/05/27(水) 23:41   No:34114       
Title: 無題    
問. 文字列sの各文字を右に1文字ずつ移動させる.末尾の文字は先頭へ移す.関数の戻り値は文字列s(の先頭を指すポインタ値).

これを実行するプログラムが掲載されているURLを教えてください。


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


Name: たいちう  ..プログラマー(29,365ポイント)   Date: 2009/05/28(木) 00:08   No:34115     
Title: Re:無題    
自作してこの掲示板に投稿したらいかがですか。

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

Name: Hermit  ..上級者(22,728ポイント)   Date: 2009/05/28(木) 00:49   No:34116     
Title: Re:無題    
こんな感じでしょうか?
#include <stdio.h>

#include <string.h>

int main() {
char str[] = "abcdefg";
size_t llen = strlen(str) - 1;
char endc = str[llen];
printf("%s\n",str);
memmove(&str[1],str,llen);
*str = endc;
printf("%s\n",str);
return 0;
}
URL でしたね(^^;
今私が書いたので、
http://dixq.net/board/
です。


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,042ポイント)   Date: 2009/05/28(木) 09:01   No:34119     
Title: Re:無題    
質問内容がいまいちわからない気がするのですが・・・

>文字列sの各文字を右に1文字ずつ移動させる

関数で実装しているってことですかね?

>関数の戻り値は文字列s(の先頭を指すポインタ値).

ということは、Hermitさんの例でいくと、
"abcdefg"の"a"のアドレスってことになりますが・・・?

とにかく、ずっと探しまわるよりは、
たいちうさんのおっしゃるとおり、自分で考えたほうが早いと思います。


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

Name: Hermit  ..上級者(22,739ポイント)   Date: 2009/05/29(金) 00:04   No:34165     
Title: Re:無題    
関数だったか
読解力が甘いな・・俺(^^;


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



Name: ウズ  ..かけだし(2,280ポイント)   Date: 2009/05/28(木) 15:31   No:34136       
Title: 正規表現    
いつもお世話になっています。

C言語で正規表現を使いたいのです。

regex.hのregexecを使えばできるのはわかったのですが、

肝心の正規表現がよくわかりません。

使用可能文字が0-9 a-z ! ? [ ] _ で、

条件として「_」が2個連続(1個or3個以上はok)は×
[]でかこまれたものは×

というものなのですが、

一度で表現してみるもうまくいかず、

わけて表現してみようとしても、ちゃんと判断できず、

困っております。。

以下、試してみた表現です。。



使用可能文字をチェック
"[0-9a-zA-z!\?\[\]_]+"
→コンパイル時点でwarningがでました

[]で囲まれるをチェック
"^[.*$]"
→コンパイルはとおりましたが、引数に入力した値をチェックにかけているのですが、
 引数に [任意の文字] と指定するとうまく動きませんでした。。

「_」で2連続をチェック
"^_{2}"
→「_」3以上の連続でもひっかかりました。


正しい表現を、どなたか教えてください。



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


Name: 御津凪 [URL]  ..比類無きプログラマー(89,710ポイント)   Date: 2009/05/28(木) 17:05   No:34140     
Title: Re:正規表現    
> 使用可能文字をチェック
> "[0-9a-zA-z!\?\[\]_]+"
> →コンパイル時点でwarningがでました

A-z になってますが、それが原因ではないでしょうか。

> []で囲まれるをチェック
> "^[.*$]"
> →コンパイルはとおりましたが、引数に入力した値をチェックにかけているのですが、
>  引数に [任意の文字] と指定するとうまく動きませんでした。。

"\[.*\]" で、いいのではないでしょうか?

> 「_」で2連続をチェック
> "^_{2}"
> →「_」3以上の連続でもひっかかりました。

"(?<!_)__(?!_)" で、出来ると思います。
(regex でうまくいくかどうかわかりませんが、鬼車で確認しました)


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

Name: ウズ  ..かけだし(2,431ポイント)   Date: 2009/05/28(木) 21:32   No:34156 解決!     
Title: Re:正規表現    
> 御津凪様
返答ありがとうございます。
regexのせいなのか、ネットで調べたりした内容でも
書いてあるとおりに動かない場合もありました。
私の環境の場合、メタ文字の取り消しは「\\」のようですが、
それでも打ち消せない文字もあったり…。
教えていただいた表現でも試してみます。
ありがとうございました。


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



Name: 西村  ..中級者(9,312ポイント)   Date: 2009/05/28(木) 20:31   No:34147       
Title: CreateWindow関数について    
CreateWindow関数のウィンドウズスタイルを決める場所で
WS_VISIBLE | WS_POPUPのように2つ指定することがありますよね?

これを変数に入れたいのですが、どのように入れればいいのでしょうか?

やりたいこととしては

#define SWITCH 1 ・・// 1ならフルスクリーン 2なら普通のウインドウ

って感じでウインドウのサイズを変えようとしていて
フルスクリーンの時はウインドウ枠を消したいです。

どなたか教えてはくれないでしょうか?


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


Name: dic  ..上級者(22,213ポイント)   Date: 2009/05/28(木) 20:52   No:34154     
Title: Re:CreateWindow関数について    
#define マクロで切り替えたいなら
以下のように


#include <stdio.h>
#define SWITCH 1

void main()
{
if( SWITCH == 1 )
{
// フルスクリーンの処理
printf( "フルスクリーン\n" );
}
else
{
// ウィンドウの処理
printf( "ウィンドウモード\n" );
}
}


ウィンドウのスタイルを変更するなら
SetWindowLong関数を使えばいいでしょう


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

Name: 西村  ..中級者(9,400ポイント)   Date: 2009/05/28(木) 21:10   No:34155     
Title: Re:CreateWindow関数について    
そんな関数があるんですか><

SetWindowLong関数を調べてみたところSetWindowLongPtr関数があったので
そちらを使わせていただきましたw

うまくスタイルの変更もできました。

ありがとうございます。


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



Name: 素人PG  ..ぴよぴよ(47ポイント)   Date: 2009/05/17(日) 18:29   No:33603       
Title: 画面のちらつき    
現在ライブラリを作っていまして
いくつか問題があるので質問させてください。

名前が毎回かわるのでこれからは素人PGでいきます

・デバック文字が点滅してしまう
・FPS等の値が変わると前の値が残って文字が重なってします。
・DebTextXY関数でデバックするときちんと変数名が表示されるのですが
 DebText関数だと全てdeb=になってしまう
・ウインドウをクリックしたり移動したりすると処理が止まってしまう

質問が多くてすいません><




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


Name: 天使  ..ぴよぴよ(495ポイント)   Date: 2009/05/18(月) 23:04   No:33654     
Title: Re:画面のちらつき    
このソースだとBitBitで表示したものも点滅しませんか?

横からで申しわけないのですが
以前、私も同じ所で挫折したので何方か教えてほしいです。


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

Name: 素人PG  ..ぴよぴよ(229ポイント)   Date: 2009/05/24(日) 01:21   No:33955     
Title: Re:画面のちらつき    
ちらつく現象だけでも解消する方法を教えてはいただけないでしょうか?

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

Name: Justy  ..伝説なるハッカー(364,595ポイント)   Date: 2009/05/24(日) 01:31   No:33958     
Title: Re:画面のちらつき    
 画面への描画は GameMain()では行わず、WM_PAINTのメッセージがきたときだけ
行うようにすればいいのではないでしょうか。


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

Name: 素人PG  ..ぴよぴよ(16ポイント)   Date: 2009/05/26(火) 20:07   No:34068     
Title: Re:画面のちらつき    
Justy さん
レスありがとうございます。

自分なりに改編してPAINのときに描画してるのですが
まだカクカクしてしまいます。
マウスの位置の取得のものもカクカクです・・・

どこを修正すればよいのかわからないです・・・
いろいろとすいません・・・


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

Name: Justy  ..伝説なるハッカー(365,526ポイント)   Date: 2009/05/27(水) 01:57   No:34078     
Title: Re:画面のちらつき    
 なるほど。
 だとしたらダブルバッファリングを試してみてはどうでしょうか……って、
もうやろうとした形跡がありますね。

 マウスの方は根本的に1フレームに PeekMessageが1つしかメッセージを処理しない為、
マウスを動かしたことによるメッセージがいろいろ大量にたまっており、その為 WM_MOUSEMOVEに
到達するまでフレーム数が結構かかってしまっていたのでしょう。


 かなりやっつけですが、書き直してみました。
 多分これでちらつきは軽減されたと思う……のですがどうでしょう?


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

Name: 素人PG  ..ぴよぴよ(291ポイント)   Date: 2009/05/28(木) 20:35   No:34148     
Title: Re:画面のちらつき    
Justy様

ありがとうございます!!軽減されたというより
なくなっていますw

自分なりに解析します。
ありがとうございます><


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



Name: バラック  ..ぴよぴよ(64ポイント)   Date: 2009/05/28(木) 17:48   No:34142       
Title: C++のヘッダ記述のものをC#で使いたい。    
C++のヘッダ記述のものをC#で使いたいと思っていますが上手く行きません。
それは、libtiffのヘッダファイル tiff.h tiffio.h tiffconf.h tiffvers.h です。
その中で TIFF* をC#でどう記述してやれば良いのかが分かりません。
どなたか、お分かりの方、お教え下さい。


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


Name: Blue  ..中級者(10,739ポイント)   Date: 2009/05/28(木) 17:58   No:34143     
Title: Re:C++のヘッダ記述のものをC#で使いたい。    
IntPtr?

アンマネージ DLL 関数の処理
http://msdn.microsoft.com/ja-jp/library/26thfadc(VS.80).aspx
を読んでおいた方が良さそう。


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



Name: ウズ  ..かけだし(1,260ポイント)   Date: 2009/05/27(水) 15:31   No:34099       
Title: 無題    
またお世話になります。

C言語で、カレントディレクトリをファイルに出力したいのですが、
うまくいきません。

fprintf(fp, " DIRECTORY: %s\n", system("pwd > /dev/null 2>&1"));

と書いたのですが、(fpはファイルポインタです)

コンパイルでwarningがでてしまいます。
warning: format argument is not a pointer (arg 3)

どうすればちゃんと出力できますか??


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


Name: lbfuvab  ..上級者(20,654ポイント)   Date: 2009/05/27(水) 15:46   No:34100     
Title: Re:無題    
う〜ん、GetCurrentDirectory関数を使った方が楽な気がしますが……

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

Name: Blue  ..中級者(10,605ポイント)   Date: 2009/05/27(水) 15:47   No:34101     
Title: Re:無題    
system関数の戻り値はintです。
printfの%sはint型の書式文字ではありません。


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

Name: 御津凪 [URL]  ..比類無きプログラマー(89,286ポイント)   Date: 2009/05/27(水) 15:50   No:34102     
Title: Re:無題    
getcwd が使えればそれで取得できますよ。
確かC標準ライブラリに入っています。


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

Name: Blue  ..中級者(10,667ポイント)   Date: 2009/05/27(水) 15:54   No:34103     
Title: Re:無題    
>getcwd が使えればそれで取得できますよ。
ですね。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getcwd.3.html


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

Name: Mist  ..熟練のプログラマー(62,568ポイント)   Date: 2009/05/27(水) 15:58   No:34104     
Title: Re:無題    
ネットで調べても分からなかったのですが、pwdの戻り値はディレクトリ文字列のアドレスなのでしょうか??
もし、そうであれば

(char*)system("pwd > /dev/null 2>&1")

で出来るとは思いますが・・・


> lbfuvabさん

pwdはUNIXコマンドなので質問者さんの開発環境はUNIX系ではないでしょうか。


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

Name: ウズ  ..かけだし(1,356ポイント)   Date: 2009/05/27(水) 16:11   No:34105     
Title: Re:無題    
>lbfuvab様
>Blue様
>御津凪様
>Mist様
皆様、返信ありがとうございます。
getcwdが使えそうとのことですので、それでやってみます。
おっしゃるとおり開発環境はSolarisなのでUNIX系です。。


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

Name: たかぎ [URL]  ..ハッカー(102,024ポイント)   Date: 2009/05/27(水) 16:35   No:34108     
Title: Re:無題    
getcwdを使えば解決しますが、外部コマンドのpwdを使うのであれば、systemではなくpopenを使った方がよいかと思います。


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

Name: ウズ  ..かけだし(1,382ポイント)   Date: 2009/05/28(木) 13:14   No:34133 解決!     
Title: Re:無題    
皆様ありがとうございました。
おかげさまで解決しました!


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



Name: situmon  ..プログラマー(28,667ポイント)   Date: 2009/05/05(火) 16:30   No:33078       
Title: 三角型の弾幕について・・・    
チェンやチルノ、龍神録の2面でも使われる、
2つ(ひとつはたぶん応用)のつくりはどうなっているのですか?
使いたいのですが、考えても計算式が思いつきません。


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


Name: situmon  ..プログラマー(28,684ポイント)   Date: 2009/05/05(火) 16:31   No:33079     
Title: Re:三角型の弾幕について・・・    
これは星蓮船でもつかわれていました。

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

Name: チルチル  ..中級者(12,916ポイント)   Date: 2009/05/06(水) 13:22   No:33143     
Title: Re:三角型の弾幕について・・・    
私も三角型の弾幕は作った事が無かったので効率悪いですが・・


V字型

float Angle=atan2( Player.y-Boss.y , Player.x-Boss.x );//とりあえず自機を狙う

for( j=-3;j<4;j++ ){//ショットfor文

for( i=0;i<MAX;i++ ){//ショットfor文
if( EnemyShot[i].flag==0 )break;
}

EnemyShot[i].flag=1;//フラグ
EnemyShot[i].x=Boss.x+cos(Angle-PI/2)*(j*15)+cos(Angle)*((3-fabs(j))*15);//X座標
EnemyShot[i].y=Boss.y+sin(Angle-PI/2)*(j*15)+sin(Angle)*((3-fabs(j))*15);//Y座標
EnemyShot[i].Angle=Angle;//角度
EnemyShot[i].Speed=3;//スピード

}//ショットfor文



ピラミット型

float Angle=atan2( Player.y-Boss.y , Player.x-Boss.x );//とりあえず自機を狙う

for( t=0;t<7;t++ ){//ショットfor文

for( j=-6+t;j<7-t;j+=2 ){//ショットfor文

for( i=0;i<MAX;i++ ){//ショットfor文
if( EnemyShot[i].flag==0 )break;
}

EnemyShot[i].flag=1;//フラグ
EnemyShot[i].x=Boss.x;//X座標
EnemyShot[i].y=Boss.y;//Y座標
EnemyShot[i].Angle=Angle+(float)j/20;//角度
EnemyShot[i].Speed=2+(float)t/2;//スピード

}//ショットfor文

}//ショットfor文



ちなみにfabsは絶対値関数です。


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

Name: situmon  ..プログラマー(28,745ポイント)   Date: 2009/05/06(水) 22:32   No:33164     
Title: Re:三角型の弾幕について・・・    
すいません、できませんでした。
fabsがつかえないのと
あとなぜこうすると三角弾幕ができるのかを教えてくださるとうれしいです。


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

Name: チルチル  ..中級者(11,751ポイント)   Date: 2009/05/07(木) 01:08   No:33172     
Title: Re:三角型の弾幕について・・・    
私の作るコードはわかりにくいですからね・・


fabsを使うには<math.h>ヘッダをインクルードする必要がありますが
シューティングだとサインとかコサインとかを使いますから、おそらくインクルードしてますよね。
とりあえずfabsがなぜ使えないのかを教えて下さい、
でもよく考えたらfabsは実数型ですが、今回は整数を使っているのでabs関数でよかったですね・・
abs関数もfabsと使い方は同じです、abs関数を使う場合は<stdlib.h>または<math.h>ヘッダをインクルードして下さい。



なぜ三角弾幕になるかと言うと、V字型の場合はカウンタの値を使って弾をV字型に配置して
Angleの方向に同じ速度で飛ばしています。

EnemyShot[i].x=Boss.x+cos(Angle-PI/2)*(j*15)+cos(Angle)*((3-fabs(j))*15);//X座標
EnemyShot[i].y=Boss.y+sin(Angle-PI/2)*(j*15)+sin(Angle)*((3-fabs(j))*15);//Y座標

のBoss.x+はボスの座標なので発射点です、

cos(Angle-PI/2)*(j*15)は弾をAngleと直角に動かす式です、
Angle-PI/2でAngleと直角の角度にしています。
(j*15)は移動距離でもあり移動方向でもあります、
jはマイナスからプラスになるので0の時は発射点から動きません。

cos(Angle)*((3-fabs(j))*15)は弾をAngleの方向に動かす式です、
jは-3,-2,-1,0,+1,+2,+3と変化するので、
fabs関数で絶対値を求めると+3,+2,+1,0,+1,+2,+3になります、
この値を3から引いて反比例させると0,+1,+2,+3,+2,+1,0になるので、
これを移動距離にすれば真ん中に近いほど前に進み、端に行くほど動かないようになります。

この二つの動きを組み合わせるとV字型になります。



ピラミット型は最初は弾が全部発射点に重なっているんですが、
角度とスピードに差を付けることで進んでいくうちにピラミット型になります。

EnemyShot[i].Angle=Angle+(float)j/20;//角度
EnemyShot[i].Speed=2+(float)t/2;//スピード

のスピードの方はtが0〜6まで変化するので
tが大きくなるほど弾のスピードが速くなるようになっています、
そのままだと差が大きすぎるしtが0の時はスピードも0になってしまうので、
2+(float)t/2としています、

角度の方なんですが、
-6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 +6
と言う数値の並びを想像して下さい、
jはこの範囲で変化します、
そしてこの数値を使って角度をAngleからずらしていきます、
j+=2としているので二個置きに変化します、
tが増えるごとにjの最小値と最大値が減っていきます、
tが0の時はjが-6 -4 -2 0 +2 +4 +6と変化して、
tが6の時はjは0で一回実行されて終わりです、

この二つを組み合わせることで上の段に行くと弾が一つ減りスピードが上がると言う変化を作ります。



私は説明も下手なので多分この説明じゃ不十分だと思うので、遠慮せずに聞いて下さい。


1,220ポイント を落としてしまった。

Name: めいらる  ..入門者(3,843ポイント)   Date: 2009/05/07(木) 08:28   No:33182     
Title: Re:三角型の弾幕について・・・    
人によって全く違うコードで実装されてて面白いですね〜。勉強になります!

私のシューティングにもショットガン(ピラミッド型の速度差の付いた弾のことをそう呼んでます;)は実装されていて画像のような感じで弾を並べられます。

やっていることはチルチルさんとほとんど同じだと思いますが、私のシューティングでは一体の敵は一種類のnwayショットしか撃てない仕様のため、1フレームの間に一時的にway数と速度をいじくって複数回発射することによりムリヤリ三角に配置してます 


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

Name: Dixq (管理人)  ..ウィザード(1,022,487ポイント)   Date: 2009/05/07(木) 12:36   No:33183     
Title: Re:三角型の弾幕について・・・    
三角に発射する方法は大体3種類かなと思います。

・1点から同時に三角の向きに発射する
これは時間と共に大きくなります。

・最初から三角の形をつくり、等速、等角で飛ばす
これは大きさ固定ですが、突然でかい三角形が出てくるので演出が少し安っぽくなるかも

・上と同じ物を時間差で発射して同じ形になるようにする


ん〜なかなか携帯で説明するのは難しい‥。

作りたい三角形は進行方向と垂直の向きに裾が広がるわけですから広がりを進行方向+90度で計算すればどうでしょう。


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

Name: チルチル  ..中級者(11,851ポイント)   Date: 2009/05/08(金) 20:31   No:33221     
Title: Re:三角型の弾幕について・・・    
あ〜確かに、
>>上と同じ物を時間差で発射して同じ形になるようにする
って言うのは良いかもしれませんね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,023,725ポイント)   Date: 2009/05/09(土) 09:00   No:33236     
Title: Re:三角型の弾幕について・・・    
作ってみました。これでどうでしょう?

WIDE010の値で弾の行の間隔を決められます。
発射時間を変更する事で弾の列の間隔を決められます(但しこの場合計算式も少々弄る必要あり)

上でも述べたとおり「進行方向と90度異なった方向に行が伸びる」考え方で作っています。
まず、同時に発射するのは進行方向と垂直な行成分ですよね。
ですから画像のsub1分だけまず一番端に座標をずらしてやり、
そこからsub2分(弾1つ分)だけずらしながら弾を置いていけばいいと思います。



//ただの円形発射
void boss_shot_bulletH010(){
#define TM010 180
#define WIDE010 20

int i,k,t=boss_shot.cnt%TM010,t2=boss_shot.cnt;
static double RemAngle;

if(t==0){//最初の角度を記憶
RemAngle = bossatan2();
}

//60カウント以下で10カウントに1回
if(t<60 && t%10==0){
for(i=0; i<t/10+1; i++){
if((k=search_boss_shot())!=-1){
double x_sub1 = cos(RemAngle+PI/2)*(WIDE010/2) * (t/10);
double y_sub1 = sin(RemAngle+PI/2)*(WIDE010/2) * (t/10);
double x_sub2 = cos(RemAngle+PI/2)*(WIDE010/2) * (i*2);
double y_sub2 = sin(RemAngle+PI/2)*(WIDE010/2) * (i*2);

boss_shot.bullet[k].col = 0;//弾の色
boss_shot.bullet[k].x = boss.x - x_sub1 + x_sub2;//座標
boss_shot.bullet[k].y = boss.y - y_sub1 + y_sub2;
boss_shot.bullet[k].knd = 8;//弾の種類
boss_shot.bullet[k].angle = RemAngle;//角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 2;//スピード
se_flag[0]=1;
}
}
}
}
 


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

Name: situmon  ..プログラマー(28,806ポイント)   Date: 2009/05/09(土) 22:14   No:33253     
Title: Re:三角型の弾幕について・・・    
みなさんありがとうございます。
しかしシューティングの館と構造が違うので、
上記のコードをなおしてるのですが・・・
シューティングの館の構造でできる方法はないものでしょうか?


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

Name: 通りすがり  ..上級者(16,776ポイント)   Date: 2009/05/09(土) 22:25   No:33256     
Title: Re:三角型の弾幕について・・・    
理論もサンプルも示されているのに実現出来ないということは、
完全に答えを貰わないと実現出来ないということになりますね。
それでは上達しませんよ。



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

Name: situmon  ..プログラマー(30,002ポイント)   Date: 2009/05/09(土) 22:46   No:33261     
Title: Re:三角型の弾幕について・・・    

void enemy_shot_pat7(int i){

#define WIDE010 20

int h,t2=e_shot[i].count;
int t = e_shot[i].count;
int j = e_shot[i].count;
static double RemAngle;

if(t==0){//最初の角度を記憶
RemAngle = atan2(enemy[i].x-player.x,enemy[i].y-player.y);
}

//60カウント以下で10カウントに1回
if(t<60 && t%10==0){
for(h=0; h<t/10+1; h++){
double x_sub1 = cos(RemAngle+PI/2)*(WIDE010/2) * (t/10);
double y_sub1 = sin(RemAngle+PI/2)*(WIDE010/2) * (t/10);
double x_sub2 = cos(RemAngle+PI/2)*(WIDE010/2) * (h*2);
double y_sub2 = sin(RemAngle+PI/2)*(WIDE010/2) * (h*2);

e_shot[i].bullet[j].flag=1;
e_shot[i].bullet[j].x=enemy[i].x - x_sub1 + x_sub2;
e_shot[i].bullet[j].y=enemy[i].y - y_sub1 + y_sub2;
e_shot[i].bullet[j].img=5;
e_shot[i].bullet[j].col=3;
e_shot[i].bullet[j].spd=3.0f;
e_shot[i].bullet[j].angle=RemAngle;//角度
}
}
for(int j=0;j<200;j++){
e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
}
}


としたのですが・・・


2倍のポイントを手に入れた! 1,196ポイント を手に入れた。

Name: チルチル  ..中級者(12,231ポイント)   Date: 2009/05/12(火) 00:56   No:33332     
Title: Re:三角型の弾幕について・・・    
う〜ん、私はシューティングの館のコードも龍神録のコードも理解できなかったので、
的確には答えられませんが、とりあえずどこがうまくいかないのか教えてくれれば、
わかる範囲で手伝いますが・・


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

Name: チルチル  ..中級者(12,267ポイント)   Date: 2009/05/15(金) 01:04   No:33463     
Title: Re:三角型の弾幕について・・・    
他のショットは撃てるんですよね?

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

Name: situmon  ..プログラマー(30,144ポイント)   Date: 2009/05/15(金) 18:37   No:33493     
Title: Re:三角型の弾幕について・・・    
返事が遅くなってすいません。
他のショットはばっちりです。


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

Name: チルチル  ..中級者(12,311ポイント)   Date: 2009/05/15(金) 18:45   No:33494     
Title: Re:三角型の弾幕について・・・    
ではとりあえず弾を一発だけ登録するコードを教えて下さい
できる限り理解して発展させてみます

あと変数名には何の変数か注釈をお願いします・・


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

Name: チルチル  ..中級者(12,360ポイント)   Date: 2009/05/16(土) 16:12   No:33529     
Title: Re:三角型の弾幕について・・・    
ところでシューティングの館の構造になおすのが失敗した原因は何ですか?

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

Name: situmon  ..プログラマー(29,781ポイント)   Date: 2009/05/16(土) 18:19   No:33533     
Title: Re:三角型の弾幕について・・・    
返事遅くてすいません。
失敗した原因・・・

boss_shotではないため
たくさんの配列を用意している。
・・・e_shot[i]

#define TM010 180
#define WIDE010 20
などをつかっていない。

このコードを入れないければいけない・・・

for(int j=0;j<200;j++){
e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
}


どれがどの文字にあてはまるのかが複雑でわからなかった。

ことです。

あとひとつうつショットのコードは

void enemy_shot_pat1_e(int i){

for(int j=0;j<1;j++){
if(e_shot[i].count==0){
e_shot[i].bullet[j].flag=1;
e_shot[i].bullet[j].x=e_shot[i].ex;
e_shot[i].bullet[j].y=e_shot[i].ey;
e_shot[i].bullet[j].img=5;
e_shot[i].bullet[j].col=j%6;
e_shot[i].bullet[j].spd=1.0f;
e_shot[i].bullet[j].angle=PI2/100*j+atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);

PlaySoundMem( sound_effect[4] , DX_PLAYTYPE_BACK ) ;
}
}
for(int j=0;j<1;j++){
e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
}

}

です。


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

Name: チルチル  ..中級者(13,038ポイント)   Date: 2009/05/16(土) 19:28   No:33535     
Title: Re:三角型の弾幕について・・・    

void enemy_shot_pat1_e(int i){

static float Angle;

if( e_shot[i].count==0 )Angle=atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);

static int j,t;

if( e_shot[i].count==0 )j=0;

if(e_shot[i].count<=20 && e_shot[i].count%5==0){

t=j+e_shot[i].count/5;

float p=(float)(t-j)/2;

for(;j<=t;j++){

e_shot[i].bullet[j].flag=1;
e_shot[i].bullet[j].x=e_shot[i].ex+cos(Angle+PI/2)*(float)(10*(t-j)-5*p);
e_shot[i].bullet[j].y=e_shot[i].ey+sin(Angle+PI/2)*(float)(10*(t-j)-5*p);
e_shot[i].bullet[j].img=5;
e_shot[i].bullet[j].col=j%6;
e_shot[i].bullet[j].spd=1.0f;
e_shot[i].bullet[j].angle=Angle;

}

PlaySoundMem( sound_effect[4] , DX_PLAYTYPE_BACK ) ;

}

for(int j=0;j<15;j++){
e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
}

}


こんな感じでしょうかね?
私の所ではシューティングの館のコードは実行できないので
多分ちゃんと動かないでしょうね・・

アルゴリズムの設計を手伝うので
それを基にコードを作ってみてはどうですか?

すみません、頼りなくて・・


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

Name: situmon  ..プログラマー(30,473ポイント)   Date: 2009/05/16(土) 23:02   No:33545     
Title: Re:三角型の弾幕について・・・    
やってみましたが・・・
自機を向いてくれないのと


if( e_shot[i].count==0 )Angle=atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);


でjが定義されていないのでエラーが出ました。
static int j,t;を先においたらなんとかできましたが・・・
やはり自機を向いてくれないです・・・


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

Name: チルチル  ..中級者(13,481ポイント)   Date: 2009/05/16(土) 23:14   No:33546     
Title: Re:三角型の弾幕について・・・    
自機を向いてくれないのは多分

e_shot[i].bullet[j].angle=PI2/100*j+atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);



Angle=atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);

にしたからですね

改良すると

void enemy_shot_pat1_e(int i){

static float Angle;

static int j,t;

if( e_shot[i].count==0 ){

j=0;

Angle=PI2/100*j+atan2(player.y-e_shot[i].bullet[j].y,player.x-e_shot[i].bullet[j].x);

}

if(e_shot[i].count<=20 && e_shot[i].count%5==0){

t=j+e_shot[i].count/5;

float p=(float)(t-j)/2;

for(;j<=t;j++){

e_shot[i].bullet[j].flag=1;
e_shot[i].bullet[j].x=e_shot[i].ex+cos(Angle+PI/2)*(float)(10*(t-j)-5*p);
e_shot[i].bullet[j].y=e_shot[i].ey+sin(Angle+PI/2)*(float)(10*(t-j)-5*p);
e_shot[i].bullet[j].img=5;
e_shot[i].bullet[j].col=j%6;
e_shot[i].bullet[j].spd=1.0f;
e_shot[i].bullet[j].angle=Angle;

}

PlaySoundMem( sound_effect[4] , DX_PLAYTYPE_BACK ) ;

}

for(int j=0;j<15;j++){
e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
}

}


でしょうかね、

しかし自機を向いてくれないって事は
一応三角にはなったんでしょうか?


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

Name: situmon  ..プログラマー(30,459ポイント)   Date: 2009/05/16(土) 23:32   No:33548     
Title: Re:三角型の弾幕について・・・    
やはりなおりません・・・が考えて見ます。

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

Name: situmon  ..プログラマー(31,207ポイント)   Date: 2009/05/19(火) 20:29   No:33698     
Title: Re:三角型の弾幕について・・・    
あとなぜこんな弾ができるのかの原理を教えていただけると助かります。

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

Name: チルチル  ..中級者(14,085ポイント)   Date: 2009/05/19(火) 20:58   No:33701     
Title: Re:三角型の弾幕について・・・    
すいません、役に立たなくて・・

原理はそんなに難しくありません

弾を横に並べて行って、一番端までの長さの半分だけ逆方向にずらしています

つまり・・

△△△△△


こう並べて

△△△△△
__○

逆方向にずらす

実際は一個ごとにずらしています

(自機の方向に直角な角度)×(カウンタ×弾の間隔-(弾の間隔の半分×(弾の数-1)))

みたいな感じかな・・

弾を五個並べる場合
自機の方向に直角な方向にfor文で 角度×カウンタ×弾の間隔
みたいな感じで配置します

自機が前にいるなら、どちらでもいいですが、とりあえず右に伸ばすとして・・
弾の間隔が10として

発射点との距離が 0 10 20 30 40
最大値は40なので半分の20だけ左に戻すと・・

-20 -10 0 +10 +20

となります

これを数カウントごとに弾の数を増やしながら
やると三角になります

for文の式が浮かばなかったら
とりあえず呼ばれた回数でスイッチ文とかを
作って
一回目は0で一回
二回目は-5 +5で二回
三回目は-10 0 +10で三回
みたいに条件分岐してもいいかも・・


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

Name: situmon  ..プログラマー(31,277ポイント)   Date: 2009/05/19(火) 21:55   No:33703     
Title: Re:三角型の弾幕について・・・    
>すいません、役に立たなくて・・
すごく手伝ってくれて本当に助かります。
原理も時間があるときゆっくりよみます。


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

Name: チルチル  ..中級者(14,114ポイント)   Date: 2009/05/19(火) 22:08   No:33704     
Title: Re:三角型の弾幕について・・・    
はい、どうぞゆっくりとやって下さい。
これができたら次はV字型を・・


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

Name: チルチル  ..上級者(15,205ポイント)   Date: 2009/05/22(金) 20:40   No:33878     
Title: Re:三角型の弾幕について・・・    
よく考えたらV字型の方が簡単かも・・

アルゴリズムは・・

一回目は自機の方向を記録して
その角度に一発だけ発射

二回目以降は
-1→+1みたいなfor文で
記録した角度と直角な方向に
弾幕のカウンタ×for文のカウンタ
だけ進めた位置に
記録した角度を弾の角度にして登録

みたいな感じかな・・


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

Name: Ma  ..初心者(8,618ポイント)   Date: 2009/05/23(土) 09:22   No:33896     
Title: Re:三角型の弾幕について・・・    
質問者ではないのですが、私も三角形弾幕を導入しようとして、上手くいっていないので質問させてください。
(新しく投稿したほうが良かったら教えてください。出直します。)

私は龍神録のプログラムではない独自の物を作っているため、
事情が変わり勝手に勘違いをしているかもしれませんが
できるかぎり私が考えている事を伝えられるよう努力します。

私の疑問としては、静的変数がどうして維持できるか という点にあります。

みなさんのコードを見ていると、
>static float Angle;
>static double RemAngle;
のように、角度を保存するために静的変数が使われていますが、
いくつかの敵がこの同じショットを同時に行った場合、
すなわちこの関数が複数の敵に同時に呼ばれた場合、静的変数 がふたつ以上の敵によって操作されるので
変数の中身が変わってしまうのではないのですか?


龍神録のプログラムを一部しか見ていないので、勝手な勘違いをしているのかもしれませんが
私の想像では、どこかの cpp ファイル(shotH.cpかな?)にこの関数が宣言されていて、
その関数をどの敵でも呼び出せるようにしているのですよね?

ならば、「static が書き換えられてしまうのではないか?」と思ったのです。

よろしくお願いします。<(_ _)>


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

Name: チルチル  ..上級者(15,922ポイント)   Date: 2009/05/24(日) 00:37   No:33944     
Title: Re:三角型の弾幕について・・・    
そういえばそうですよね・・

私も龍神録のプログラムが理解できなかったので
独自の処理を行っています

なのでよくわかりませんが

そのうち誰かが来て答えてくれるんじゃないでしょうか・・

ちなみにMaさんの作っているゲームはどんな感じですか?


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

Name: Ma  ..初心者(8,712ポイント)   Date: 2009/05/24(日) 02:00   No:33960     
Title: Re:三角型の弾幕について・・・    
>チルチル 様
宣伝になってしまわないか心配ですが^^;
トップビューの2Dシューティングを製作しています。

公式:
http://cielsorciere.web.fc2.com/index.html


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

Name: Justy  ..伝説なるハッカー(364,754ポイント)   Date: 2009/05/24(日) 03:07   No:33963     
Title: Re:三角型の弾幕について・・・    

>ならば、「static が書き換えられてしまうのではないか?」と思ったのです。

 このスレの頭から読んでちゃんと理解しているわけではないので推測ですが、
いくつかの敵がこの同じショットを同時に行った場合は書き換えられてしまうので、
誤動作するでしょう。


 最初にこのスレで staticが出てきたのは No:33236の Dixqさんのコードですが
こちらはボスのショットを前提としているように見えます。

 龍神録のプログラムではボスは同時には1体しか出ませんし、
そのボスがこのショットを同時に使わなければ問題は出ない、ということで
staticにしたのでしょう。


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

Name: Ma  ..初心者(8,731ポイント)   Date: 2009/05/24(日) 04:31   No:33965     
Title: Re:三角型の弾幕について・・・    
>Justy 様
やはりそうでしたか。
回答ありがとうございました。


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

Name: チルチル  ..上級者(16,619ポイント)   Date: 2009/05/24(日) 15:54   No:33986     
Title: Re:三角型の弾幕について・・・    
Maさんはかなり本格的にゲームを製作しているようですね
これは私も負けていられませんね

そういえば上に書いたコードがうまく動かないのって
staticが変更されてたからなのかな?

見るからに複数の敵に呼ばれてるし・・
でもそれならもっとぐちゃぐちゃになるかな?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,024,163ポイント)   Date: 2009/05/24(日) 19:59   No:33993     
Title: Re:三角型の弾幕について・・・    
Justyさんの仰るとおり、ボスが一体しかいないので、staticを使いました。
このstatic変数はini関数で変数諸々初期化する時に一緒に初期化されないので、少々危険ではありますが、
(途中でゲームをやめて再スタートした時などに再度呼ばれるとバグが出る可能性がある)
必ずこの関数が初めて呼ばれる時は初期化されるように気をつけて使っていました。

雑魚的などでこれと同じ事をする時は、雑魚的の変数構造体の中に入れてやるようにしています。
統一した方がよかったですね、すみません。
初期化漏れの可能性もあり、うまく動いているように見えるのにリプレイを動かしてみるとうまくいかないといった原因解明の難しいバグが生まれる可能性があるので、
static変数の乱用はしない方がいいかもしれません。


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

Name: Ma  ..初心者(8,771ポイント)   Date: 2009/05/25(月) 01:52   No:34012     
Title: Re:三角型の弾幕について・・・    
>チルチル 様
初心者には違いありませんので、がんばりたいと思います^^;

管理人様、返信ありがとうございます。
そうですね、やはり構造体の中でデータを保存した方が良いのでしょう。
△弾幕が上手くできないのはこの方法で解決しました。
static の使用はできるだけ避けた方がよさそうですね。
ありがとうございました。


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

Name: situmon  ..プログラマー(31,416ポイント)   Date: 2009/05/25(月) 20:41   No:34031     
Title: Re:三角型の弾幕について・・・    
staticをbossではなく普通の敵につかうとあまりよくないのですね・・・


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

Name: チルチル  ..上級者(17,056ポイント)   Date: 2009/05/27(水) 23:13   No:34112     
Title: Re:三角型の弾幕について・・・    
いや〜しかしMaさんのゲームは普通のオンラインゲームと同じぐらいの存在感がありますね、
完成したらぜひやらせていただきます。

それにしても、皆さんかなり真剣にゲームを製作しているようですね、
何か真面目に作ってても無意識のうちに手を抜いちゃう自分が恥ずかしい・・


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

Name: Ma  ..初心者(8,849ポイント)   Date: 2009/05/28(木) 05:52   No:34118     
Title: Re:三角型の弾幕について・・・    
>チルチル 様
ありがとうございます。期待にこたえられるように、がんばりたいと思います。
それでは、これ以上トピックに関連のないことであげてしまうのは申し訳ないので、
もう書き込まないようにします。


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



Name:  ..ぴよぴよ(192ポイント)   Date: 2009/05/24(日) 02:05   No:33961       
Title: メニュー画面について…    
今メニュー画面作成で頭を悩ませているので教えてください。
簡潔に言うと四聖龍神録Plusのメニューのような感じのメニューにしたいです。
上、下キーで選択できるようにするということです。
しかし、どのようにすればいいのか分からず、困っているのでどのようにすればよいのかアドバイスお願いします。

ソースは基本的に今のところ龍神録プログラミングの館のとだいたい一緒と思って下されば結構です。
コンパイラはVisual C++ 2008 、知識は最近始めたばかりでなんとなくC/C++が理解できる程度です。


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


Name: BEMANI  ..プログラマー(30,211ポイント)   Date: 2009/05/24(日) 03:05   No:33962     
Title: Re:メニュー画面について…    
>>蒼さん

if文や、switch〜case で分けるのが一般的?でいいのかなぁ〜と思います。
下に switch〜case で分けるサンプルを書いておきます。

このサンプルは、一番下の項目(終了)にカーソルがある時、下を押しても上に戻らないようにしています。
逆も同じで、一番上の項目(イージー)にカーソルがある時、上を押しても一番下に移動しません。

状態を分ける変数をここでは OPState とします。
更に、メニューの数は下のように5つにしました。

→ イージー
ノーマル
ハード
オプション
終了




// このように記述すると、EASY=0, NOMAL=1, HARD=2・・・GAME_END=4となっています
enum
{
EASY, NOMAL, HARD, OPTION, GAME_END
};

// ステータスの初期化
OPState = EASY;

// カーソル処理
if( 下キーを押した && (OPState < GAME_END) )
{
OPState++;
カーソルのY座標 += ???;
// ??? に任意の値を入れてカーソルを移動させて下さい
}

if( 上キーを押した && (OPState > EASY) )
{
OPState--;
カーソルのY座標 -= ???;
// ??? に任意の値を入れてカーソルを移動させて下さい
}

// カーソルの値で処理を分岐
if(決定キーを押した)
{
switch(OPState)
{
case EASY: GameEasy(); break;
case NOMAL: GameNomal(); break;
case HARD: GameHard(); break;
case OPTION: Option(); break;
case GAME_END: GameEnd(); break;
}
}



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

Name:  ..かけだし(1,054ポイント)   Date: 2009/05/25(月) 20:00   No:34029     
Title: Re:メニュー画面について…    
メニューで選択している画像を変えようとサンプルに工夫を加えて






int i[5];
i[0] = 0, i[1] = 0, i[2] = 0, i[3] = 0, i[4] = 0;

// このように記述すると、EASY=0, NOMAL=1, HARD=2・・・GAME_END=4となっています
enum
{
EASY, NOMAL, HARD, OPTION, GAME_END
};

// ステータスの初期化
OPState = EASY;

// ループ処理
while(ProcessMessage() = 0)
{
ClearDrawScreen();

//タイトルのバック画面描画(省略)
graph_title();

// カーソル処理
if( CheckHitKey(KEY_INPUT_DOWN) && (OPState < GAME_END) )
{
OPState++;
}

if( CheckHitKey(KEY_INPUT_UP) && (OPState > EASY) )
{
OPState--;
}

//描画の分岐
switch(OPState)
{
case EASY:
i[0] = 1;
i[1] = 0;
i[2] = 0;
i[3] = 0;
i[4] = 0;

case NOMAL:
i[0] = 0;
i[1] = 1;
i[2] = 0;
i[3] = 0;
i[4] = 0;
case HARD:
i[0] = 0;
i[1] = 0;
i[2] = 1;
i[3] = 0;
i[4] = 0;
case OPTION:
i[0] = 0;
i[1] = 0;
i[2] = 0;
i[3] = 1;
i[4] = 0;
case GAME_END:
i[0] = 0;
i[1] = 0;
i[2] = 0;
i[3] = 0;
i[4] = 1;
}

// カーソルの値で処理を分岐
if(CheckHitKey(KEY_INPUT_Z)
{
switch(OPState)
{
case EASY: GameEasy(); break;
case NOMAL: GameNomal(); break;
case HARD: GameHard(); break;
case OPTION: Option(); break;
case GAME_END: GameEnd(); break;
}
}

//描画処理
DrawGraph(x座標,y座標,img_easy[i[0]],TRUE);
DrawGraph(x座標,y座標,img_nomal[i[1]],TRUE);
DrawGraph(x座標,y座標,img_hard[i[2]],TRUE);
DrawGraph(x座標,y座標,img_option[i[3]],TRUE);
DrawGraph(x座標,y座標,img_game_end[i[4]],TRUE);


ScreenFlip();
}





注意で実際にはx座標,y座標には数値があります。
画像描画の[]の中が[0]なら非選択の画像、[1]なら選択している画像、です。

あとタイトル画像描画と画像の読み込みは文が長くなるので省きました。

こんな感じ(実際は少し違ったりしますが、だいたい同じです)にしてみたんですが、うまくできません。
変な感じに描画されます。

おかしい点がわからないのでアドバイスお願いします。


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

Name: Justy  ..伝説なるハッカー(365,304ポイント)   Date: 2009/05/25(月) 20:46   No:34033     
Title: Re:メニュー画面について…    

>変な感じに描画されます

 この説明では結果から原因を推測することは出来ません。
 何がどう変なのか具体的に説明をしてください。

 とりあえず、コード上でおかしそうなところといえば
switch(OPState) {} の各 caseの中で breakがどこにも無いこと、
KEY_INPUT_Zの押下チェックの if文の()が合わないことでしょうか。


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

Name:  ..かけだし(1,112ポイント)   Date: 2009/05/28(木) 02:14   No:34117 解決!     
Title: Re:メニュー画面について…    
指摘された通り直したら無事できました!
BEMANI さん、Justy さんアドバイスありがとうございました。


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



Name: 霧島ロック  ..ぴよぴよ(4ポイント)   Date: 2009/05/26(火) 19:11   No:34064       
Title: DxLib_VC2008_and_2005用について    
お忙しいところ、申し訳ございません。

本日より、プログラミングの館を参考にしてゲームを制作しようと思ったのですが、
DxLib_VCから、サンプルプログラム実行用フォルダに入るのですがDxLib_VC2008_and_2005用.slnが
見当たらず、slnのないDxLib_VC2008_and_2005用というフォルダがあります。これをダブルクリックしても
何もおこらないのですがどうすればよいでしょうか?
インストール方法が間違っているのでしょうか?

お教えいただければと思います。
よろしくお願いいたします。


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


Name: non  ..熟練のプログラマー(42,729ポイント)   Date: 2009/05/26(火) 19:44   No:34067     
Title: Re:DxLib_VC2008_and_2005用について    
たったいまダウンロードしてみましたが、DxLib_VC2008_and_2005用というフォルダなんて
できませんし、DxLib_VC2008_and_2005用.slnはちゃんとあります。
再度、ダウンロードして展開してみてください。


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

Name: 霧島  ..ぴよぴよ(36ポイント)   Date: 2009/05/27(水) 21:39   No:34111 解決!     
Title: Re:DxLib_VC2008_and_2005用について    
回答いただき有難うございます。

どうにか解決することができました。

また分からないことがありましたら、質問させていただきますので
宜しくお願いいたします。


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



Name: 研修生  ..初心者(7,244ポイント)   Date: 2009/05/26(火) 18:33   No:34059       
Title: 無題    
空白の列を同じスペーシングを行なう最少の数のタブおよびブランクで置き換えるプログラム
を作成していまして、下記のように完成しました。

#include "stdafx.h"

#define TABSTOP 4

void put_tab_and_space(int num_tab, int num_blank);

int main(int argc, char* argv[])
{
int c, ntab, nblank, pos;
nblank = 0;
ntab = 0;
pos = 0;

while((c = getchar()) != EOF){
if(c == ' '){
pos++;
if(pos % TABSTOP != 0){
nblank++;
}
else{
nblank = 0;
ntab++;
}
}


else{
put_tab_and_space(ntab, nblank);
ntab = 0;
nblank = 0;
putchar(c);

if(c == '\n'){
pos = 0;
}
else{
pos++;
}
}
}

put_tab_and_space(ntab, nblank);
return 0;
}

void put_tab_and_space(int num_tab, int num_blank)
{
int i;
for(i = 0; i < num_tab; i++){
putchar('\t');
}

for(i = 0; i < num_blank; i++){
putchar(' ');
}
}



これをCのソースファイルに適用すると(上記のプログラムではタブを考慮していないのでファイル内にあるタブは空白で置き換えます)

変換前のソースコードと変換後では見た目上は瓜二つですが
文字列や文字定数を特別処理しないとソースコードとしては同じものにならないとか言われたのですが
まるで同じにしか見えません。これについてわかる方いませんか?


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


Name: 御津凪 [URL]  ..比類無きプログラマー(88,810ポイント)   Date: 2009/05/26(火) 18:39   No:34061     
Title: Re:無題    
文字列・文字定数の中にも空白がある場合、そこを置き換えられてしまったらコードは違うものになります。

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

Name: 研修生  ..初心者(7,272ポイント)   Date: 2009/05/26(火) 18:43   No:34062     
Title: Re:無題    
それはどうしてです? その理由が知りたいのです。

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

Name: 御津凪 [URL]  ..比類無きプログラマー(89,141ポイント)   Date: 2009/05/26(火) 19:02   No:34063     
Title: Re:無題    
int main(){

printf( " 1\n" );
printf( " 2\n" );
printf( " 3\n" );
printf( " 4\n" );
return 0;
}


というようなソース上でインデント整形済みの文字列があるコードがあったとします。
(文字列の空白は半角スペース)
これを研修生さんのコードで適用すると、適用後のコンパイル・実行結果は、
崩れた形で出力されてしまいます。
(適用元のタブの長さが4で指定されていて、出力先が4以外の場合、さらにずれます)

また、
putchar ( ' ' );



と、半角含みのコードなどの原因で ' ' がタブ文字に置き換えられてしまったら
半角スペースの出力ではなく、タブ文字の出力になってしまいます。

条件式でこのような影響のある置き換えが起これば、
もちろん正しい(同じ)プログラムコードではなくなります。


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

Name: 研修生  ..初心者(7,391ポイント)   Date: 2009/05/26(火) 19:19   No:34065     
Title: Re:無題    

int main(){
printf( " 1\n" );
printf( " 2\n" );
printf( " 3\n" );
printf( " 4\n" );
return 0;
}


を適用してもまるで同じになります。
おそらくファイル内のタブを空白に変換してないのでは?
このプログラムではタブが認識できないので・・
変換せずに適用するとインデントが崩れます。



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

Name: 御津凪 [URL]  ..比類無きプログラマー(89,080ポイント)   Date: 2009/05/26(火) 19:38   No:34066     
Title: Re:無題    
上に書いたことは
"変換を適用したソースコードをコンパイルして実行した時のコンソールの出力"
についてです。

変換の適用前と適用後のソースコードを実行して比べてみましたか?



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

Name: 研修生  ..初心者(7,463ポイント)   Date: 2009/05/27(水) 09:33   No:34085     
Title: Re:無題    
うーんわからないですね。実行してみましたが確かにずれますがインデントがずれるのはやはりタブ関係が原因にしか見えない。文字定数と文字列が問題とのことですから・・

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

Name: 御津凪 [URL]  ..比類無きプログラマー(89,263ポイント)   Date: 2009/05/27(水) 10:27   No:34086     
Title: Re:無題    
> 文字定数と文字列が問題とのことですから・・

これは、

> 実行してみましたが確かにずれますが…

ということです。

ただし、変換時にタブを考慮していないのが原因ではなく、プログラムで使う文字列・文字定数自体に
置き換え処理が行われる可能性があるからです。
"    "



↑は空白4文字(+終端文字)の5バイトの文字列を示していますが、
この空白4文字がタブ文字に置き換えられてしまったら、
タブ1文字の(+終端文字)の2バイトの文字列に変わってしまいます。

よって、文字列・文字定数の中身の文字は変換しないように特別処理しないといけないという意味です。


もしこれでもわからなかったら、
(こちらからは散々似た様な回答をしているので)

> 文字列や文字定数を特別処理しないとソースコードとしては同じものにならない

といわれた方にもう少し詳しい意味(ソースコードとしては同じものにならないのはなぜか)を聞いてください。
というより聞いたほうが早かったかもしれませんが…


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

Name: Mist  ..熟練のプログラマー(62,107ポイント)   Date: 2009/05/27(水) 10:31   No:34087     
Title: Re:無題    
こういう例だとわかるでしょうか。
strcmpでstrという文字配列に空白4個が入っているかをチェックしているプログラムがあったとしましょう。


strcmp(str, " ");


このプログラムを置き換えプログラムで変換した場合、(タブ表示してくれない)エディタでの見た目は同じになりますが、プログラム自体は「文字配列に空白4個が入っているかをチェック」が「文字配列にタブが入っているかをチェック」に変化してしまいますので同じ動作をするプログラムではなくなってしまいます。


strcmp(str, "\t");


つまり、コンパイル時に無視される関数の前や後ろの空白はタブに変換するが、コンパイルに影響する文字定数に含まれる含まれる空白は変換しないようにしなければならないということです。


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

Name: non  ..熟練のプログラマー(43,328ポイント)   Date: 2009/05/27(水) 10:51   No:34088     
Title: Re:無題    
御津凪さんの言われていることは・・・

#include <stdio.h>
int main(void){
printf( " 1\n" );
printf( " 2\n" );
printf( " 3\n" );
printf( " 4\n" );
return 0;
}

をデータとして入力したとする。もちろんTABは使っていない。
これをバイナリエディタで確認すると・・

printf( " 3\n" );

は、元のデータでは
20 20 20 20 70 72 69 6E 74 66 28 20 22 20 20 20 20 20 20 33 5C 6E 22 20 29 3B 0D 0A
ですが、
あなたのプログラムの出力は
09 70 72 69 6E 74 66 28 09 22 09 20 20 20 33 5C 6E 22 09 29 3B 0D 0A
となります。
で、元のプログラムを実行するとこの行は(3の前にスペース6文字)

3

TABに置き換えられたプログラムを実行すると、(TAB=4で確認できるとしたら)

3

になって位置がずれます。(3の前にスペース7文字)
ですから" "や' 'で囲まれた部分はTABに変換しないようにしなければいけないということです。




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

Name: toyo  ..プログラマー(35,654ポイント)   Date: 2009/05/27(水) 10:53   No:34089     
Title: Re:無題    
文字列の長さも変わりますね

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

int main(void)
{
char* space = " ";
if (strlen(space) == 8)
{
printf("Hello World");
}
else
{
printf("Error");
}
return 0;
}

これを変換すると実行結果が変わってしまいます


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

Name: 研修生  ..初心者(7,561ポイント)   Date: 2009/05/27(水) 11:36   No:34090     
Title: Re:無題    
文字のサイズや長さってのは当たり前すぎる解答とか意味不明なこといわれたんで
nonさんの仰っているズレる理由をもう少し詳しくお聞きしたい。
それが御津凪さんが仰っている
プログラムで使う文字列・文字定数自体に
置き換え処理が行われる可能性があるからです。

ですか?


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

Name: non  ..熟練のプログラマー(43,512ポイント)   Date: 2009/05/27(水) 12:08   No:34091     
Title: Re:無題    
何がわからないのかわからないので、どこをどう詳しく説明すればいいのかわからない。
>元のデータでは
>20 20 20 20 70 72 69 6E 74 66 28 20 22 20 20 20 20 20 20 33 5C 6E 22 20 29 3B 0D 0A
>ですが、
>あなたのプログラムの出力は
>09 70 72 69 6E 74 66 28 09 22 09 20 20 20 33 5C 6E 22 09 29 3B 0D 0A
>となります。

この部分は理解できますか?



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

Name: 研修生  ..初心者(7,666ポイント)   Date: 2009/05/27(水) 13:01   No:34092     
Title: Re:無題    
バイナリエディタに関しては無知識なのでかなり曖昧ですが・・
元ソースと変換後のソースが要は別物ってのはわかりました。
それはそのバイナリエディタ?ですか、それを見ればわかるのでしょう。しかし
私が教えていただきたいのは結果ではなくて原因の方です。
何故そのようなズレが起こるのか、がさっぱりでして。


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

Name: Mist  ..熟練のプログラマー(62,450ポイント)   Date: 2009/05/27(水) 13:17   No:34093     
Title: Re:無題    
原因?
タブというのは必ず同じ幅になるわけではない。
この辺を勘違いしていませんか?

タブは桁をそろえるためのものであり、タブ幅が4の環境ではタブの次が文字が4の倍数+1の位置にくるようにそろえるために適切な幅に変換されます。

abc (空白4個の後ろに3文字)

を変換した場合は、空白4個とタブ1個は同等ですので同じ表示になりますが

abc abc (3文字の後ろに空白4個の後ろに3文字)

というような場合、空白4個をタブ1個に変換するとタブは後ろのaを5文字目にくるようにするために1文字の幅だけになってしまいます。
「abc\tabc」は「abc abc」にしかなりません。

ですので、「空白が4個連続した→タブ一個に変換」という設計がそもそも間違っています。



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

Name: 研修生  ..初心者(7,804ポイント)   Date: 2009/05/27(水) 14:32   No:34094     
Title: Re:無題    
#include


int main(int argc, char* argv[])
{
printf("%c\n", ' ');
printf( " A\n");

return 1;
}


これをやるとどうなりますか?
下の方は元ソースだと4つめの所にAがあります
変換後ソースだと9つめの所にAがあります。コンパイラのタブストップとVisualStudioのタブストップが違うので
ですが少し混乱してきたので説明してもらえませんか


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

Name: 研修生  ..初心者(7,821ポイント)   Date: 2009/05/27(水) 14:59   No:34095     
Title: Re:無題    
下の方はズレてますね。上の方もか

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

Name: Mist  ..熟練のプログラマー(62,581ポイント)   Date: 2009/05/27(水) 15:02   No:34096     
Title: Re:無題    
VisualStudioのタブ幅が8に設定されているのじゃないですか?

タブ幅はそれを表示する実行環境の設定に依存します。
プログラム側でこれを操作することはできません。

つまり、空白4個を1個のタブに変換した場合、変換後のソースをタブ幅が8に設定されている環境で見れば必ずずれます。
VSのタブ設定を変更すれば同じに見えるでしょう。

というか、タブ幅の設定よる見え方のずれは「文字列や文字定数を特別処理しないとソースコードとしては同じものにならないとか言われた」とは何の関係もないですけど、こっちはもういいのでしょうか?


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

Name: 研修生  ..初心者(7,985ポイント)   Date: 2009/05/27(水) 15:18   No:34097     
Title: Re:無題    
ズレて文字列や文字定数の値がかわっていしまってると思ったのですが違うのですか?
対処はそこだけ変換しないようにすればいいだけだから気にしなくて構いませんが、
どこが違ってるのかわからないと質問したらさきほど示したソースを
変換前と変換後のソースで実行してみなさいと言われたのでタブ幅の設定による見え方のずれ
以外にもどこかしら違う所があるはずですが。


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

Name: Mist  ..熟練のプログラマー(62,483ポイント)   Date: 2009/05/27(水) 15:25   No:34098     
Title: Re:無題    
> ズレて文字列や文字定数の値がかわっていしまってると思ったのですが違うのですか?
違います。
他の人も指摘していますが、研修生さんが作られたプログラムでは変換してはいけない空白まで変換してしまっています。
これは設定の違いによる見え方以前の問題です。

どう直すべきかはnonさんが答えておられますが・・・
> ですから" "や' 'で囲まれた部分はTABに変換しないようにしなければいけないということです。


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

Name: 研修生  ..初心者(8,067ポイント)   Date: 2009/05/27(水) 16:27   No:34106     
Title: Re:無題    
その変換してはいけない理由は文字定数内の値がかわるからですよね?
他にもあるのかな


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

Name: たいちう  ..プログラマー(29,346ポイント)   Date: 2009/05/27(水) 21:04   No:34110     
Title: Re:無題    
研修生さんはそのハンドルネームや質問の内容・時期から、
研修中の新入社員なのでしょうか。

掲示板に質問を繰り返すよりも教官役の人に聞いたほうが効率が良いのでは?
もしもリアルに質問するのが苦手だとすると、
これは絶対治さないといけないことですよ。
そうだとしても何か事情があるのかもしれないし、あくまでも一般論です。
自分が該当しないならば気を悪くしないでくださいね。

いずれにしても掲示板は質問を歓迎しています。


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



Name: ユーリ  ..ぴよぴよ(374ポイント)   Date: 2009/05/27(水) 01:07   No:34072       
Title: よろしければ教えてください    
sacanf関数を用いて計算方法(+、−、*、/)と二個の整数をキーボードから入力し、計算方法よって、二個
の整数の計算を行なうものです。
これをswitch文で行いたいのですが
割り算と指定したとき0で割り算しないようにするにはどうしたらいいのでしょうか?
そこだけがわかりません。
よろしければお教えください。


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


Name: kazuoni [URL]  ..比類無きプログラマー(87,780ポイント)   Date: 2009/05/27(水) 01:16   No:34074     
Title: Re:よろしければ教えてください    
scanfの打ち間違えですかね?^^;

以下はC言語かつ
命題において、分母に0が来たら計算終了を想定しています。

scanf("%d,%d",&a1,%a2);

のように読み取り、a1/a2を想定するなら、
a2が0ならば演算処理をしない(if文)
でよいのではないでしょうか?


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

Name: BEMANI  ..プログラマー(31,857ポイント)   Date: 2009/05/27(水) 01:20   No:34075     
Title: Re:よろしければ教えてください    
>>ユーリさん
割り算の時、除数が0であるかどうかを判定すればいいと思います。
(a/bという割り算で、bに0が入力されたとすると if(b == 0){ もう一度入力等 })


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

Name: BEMANI  ..プログラマー(31,929ポイント)   Date: 2009/05/27(水) 01:23   No:34076     
Title: Re:よろしければ教えてください    
>>kazuoniさん
scanfの第三引数が %a2になってますよ;
しかも思いっきりかぶってしまい申し訳ございませんでした;


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

Name: ユーリ  ..ぴよぴよ(563ポイント)   Date: 2009/05/27(水) 01:28   No:34077     
Title: Re:よろしければ教えてください    
#include <stdio.h>

main()

{
int a,b;
char c;

printf("+,-,*,/の何れかを入力してください\n");
scanf("%c", &c);
printf("数字を入力してください\n");
scanf("%d", &a);
scanf("%d", &b);



switch (c){
case '+':

printf("a+b=%d\n",a+b);
break;

case '-':

printf("a-b=%d\n",a-b);
break;

case '*':

printf("a*b=%d\n",a*b);
break;

case '/':

printf("a/b=%d\n",a/b);
break;



}
return 0;

}
ここまでできたのですがこれにif文を加えればよろしいのですか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,873ポイント)   Date: 2009/05/27(水) 02:40   No:34080     
Title: Re:よろしければ教えてください    
>scanf("%d,%d",&a1,%a2);

間違えました。。
scanf("%d,%d",&a1,&a2);
が正しかったです。。

>ここまでできたのですがこれにif文を加えればよろしいのですか?
はい。


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

Name: ユーリ  ..ぴよぴよ(602ポイント)   Date: 2009/05/27(水) 07:38   No:34081     
Title: Re:よろしければ教えてください    
質問なんですがさっきのプログラムにif(b==0)をいれたら/だけじゃなく*などの時も
0では割れないと表示されてしまうんですけど
/だけ表示するにはどうしたらいいのでしょうか?


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

Name: non  ..熟練のプログラマー(42,815ポイント)   Date: 2009/05/27(水) 08:41   No:34083     
Title: Re:よろしければ教えてください    

case '/':
ここにif文を書く
  printf("a/b=%d\n",a/b);
break;


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

Name: ユーリ  ..ぴよぴよ(614ポイント)   Date: 2009/05/27(水) 17:50   No:34109 解決!     
Title: Re:よろしければ教えてください    
ありがとうございました。
助かりました。


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



Name: 迷走のギュス  ..かけだし(1,085ポイント)   Date: 2009/05/27(水) 00:30   No:34071       
Title: アクセス領域外へアクセスする原因不明    
デバッグや本など参照してやってみましたが、どうしても原因がわかりません。
先日お世話になったときに、すぐに解決させていただいたのでまた書き込ませていただきました。
ソースの参照をお願いします。
情報関係の先生に教えを乞っても管轄外なので教えられないと一蹴されて
このサイトだけが頼りです。
どなたかよろしくお願いします!


□質問内容□
アクセス領域外にアクセスしてしまう原因
どのポインタを修正すれば良いのか。

□実行結果□
ファイルの読み込みには成功するが、ファイルのポリゴンは正常な表示ではない

□環境□
OS:Windows XP コンパイラ名:visual studio 2008 PE
DX:Microsoft DirectX SDK (November 2008)
リンカ入力の依存ファイル:d3d9.lib d3dx9.lib winmm.lib

□エラーの内容□
0x4b6e799b で初回の例外が発生しました: 0xC0000005: 場所 0xcdcdcd7d に書き込み中にアクセス違反が発生しました。
0x4b6e799b でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcd7d に書き込み中にアクセス違反が発生しました。
ネイティブ' はコード 0 (0x0) で終了しました。



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


Name: BEMANI  ..プログラマー(31,806ポイント)   Date: 2009/05/27(水) 01:10   No:34073     
Title: Re:アクセス領域外へアクセスする原因不明    
>>迷走のギュスさん
既に他の方が解析に入っているかもしれませんが、
そのプロジェクトを実行する時にデバッグ実行(F5)するとどこかで止まったりしませんか?
もし止まったのならどの関数のここで止まりましたという情報があると解析する側としては助かるのではないかなぁ〜と思います。

あわせて、ファイルのポリゴンは正常な表示ではないとありますが
単にエラーが出ているから正常に映らないかもしれませんが、映った画面を載せておくとさらに良いかもしれません。


上にも書いてますが、アクセス違反が出ているならデバッグ実行すると恐らくどこかで止まるはずです。
その止まった場所の変数をトレスしてみて下さい。
例えば、既にないものにアクセスしていたり、配列の要素数を超えてアクセスしていたりと
止まった部分(変数)が解れば原因が追求しやすいのではないかなぁ〜と思います。


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

Name: 迷走のギュス  ..かけだし(1,561ポイント)   Date: 2009/05/27(水) 01:59   No:34079     
Title: Re:アクセス領域外へアクセスする原因不明    
ご指摘ありがとうございます!
デッバグ実行の際に止まる部分は→→→の箇所です!


//-----------------------------------------------------------------------------
//レンダーモデル関数
//-----------------------------------------------------------------------------
VOID RenderModel(int idx)
{
if(g_models[idx].used == FALSE)
return ;

for( DWORD i=0; i<g_models[idx].nummaterials; i=i+1 )
{
g_pd3dDevice->SetMaterial( &g_models[idx].pmaterials[i] );
→→→g_pd3dDevice->SetTexture( 0,g_models[idx].ptextures[i] ); 
g_models[idx].pmesh->DrawSubset(i);
}
}


デバッグ実行したときに表示される
問題のありそうな呼び出し履歴は以下の4行です。
d3d9.dll!4b6e799b()
[下のフレームは間違っているか、または見つかりません。d3d9.dll に対して読み込まれたシンボルはありません。]
d3d9.dll!4b6f5a49()
my3dlib.exe!RenderModel(int idx=0) 行 117 + 0x2d バイト C++

ポリゴンに関してはサンプルを使わせていただいているので
画像をのせたいのですが著作権に影響があるかもしれないので
具体的に説明を加えておきます、すみません!

ポリゴンの状態は欠けたり黒くなるみたいです、
環境光とワールド変換行列が未設定だからだそうです!



よろしくお願いします!


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

Name: toyo  ..プログラマー(35,503ポイント)   Date: 2009/05/27(水) 08:30   No:34082     
Title: Re:アクセス領域外へアクセスする原因不明    

int LoadModel(LPCTSTR filename)関数で
for( int i=1; i<num; i=i+1 )
{
//マテリアルのコピー
g_models[idx].pmaterials[i] = d3dxMaterials[i].MatD3D;

//アンビエント色の設定
g_models[idx].pmaterials[i].Ambient = g_models[idx].pmaterials[i].Diffuse;

//テクスチャの読み込み
g_models[idx].ptextures[i] = NULL;
if( d3dxMaterials[i].pTextureFilename != NULL &&
lstrlenA( d3dxMaterials[i].pTextureFilename ) > 0 )
{
if( FAILED( D3DXCreateTextureFromFileA( g_pd3dDevice,
d3dxMaterials[i].pTextureFilename,
&g_models[idx].ptextures[i] ) ) )
{
MessageBox( NULL, _T("テクスチャが見つかりません"), _T("3D Lib"), MB_OK );
return -1;
}
}
}
iが1から始まっているためg_models[0].ptextures[0]の初期化が出来ていないようです



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

Name: 迷走のギュス  ..かけだし(1,594ポイント)   Date: 2009/05/27(水) 16:31   No:34107 解決!     
Title: Re:アクセス領域外へアクセスする原因不明    
おかげさまで解決することができました、
いつもありがとうございます!



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



Name: ほのか  ..入門者(2,617ポイント)   Date: 2009/05/26(火) 09:32   No:34047       
Title: ソース内のコメントについて    
お世話になっております。
添付ファイルをご覧いただきたいのですが、他の関数内のようにファイル読み込み関数内にもコメントを付けたいのですが、どのように付けたら良いのかいまいちわかりません…;
while文以降、どのような処理を行っているのか教えていただきたいです;
他の関数内のコメントもおかしな部分がありましたら教えていただけると幸いです…


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


Name: pooka [URL]  ..入門者(3,448ポイント)   Date: 2009/05/26(火) 18:15   No:34057     
Title: Re:ソース内のコメントについて    

if(strcmp(tmp,"\n")==0){
continue;
}

これは読み込んだデータが改行文字だったら次の行を読み込むようにするためです。
(write関数にfprintf(fp,"\n");とあるので)

s = strchr(tmp,'\n');
if(s != NULL){
tmp[s-tmp]='\0';
}

これはtmpには改行文字が含まれているので、'\n'が見つかったら'\0'に置き換えるということをしています。

switch(cnt%5){
case 0:
strcpy(data[i].name,tmp);
break;
case 1:
strcpy(data[i].yubin,tmp);
break;
case 2:
strcpy(data[i].add,tmp);
break;
case 3:
strcpy(data[i].tel,tmp);
break;
case 4:
if(strcmp(tmp,man)==0){
strcpy(data[i].sei,"1");
}else{
strcpy(data[i].sei,"2");
}
break;
}

if(++cnt%5==0){
++i;
}

switch文はcnt%5の値によって読み込んだデータを入れる変数を変えています。
(名前から性別まで読み込んだら、また名前から始まる)
if(++cnt%5 == 0)は、cntの値を増やして5で割った余りが0のとき
つまりcnt%5の値が0から4まで変化し、名前から性別まで読み込んだら、
一人分のデータが読み込めたということなので、++iによってiの値を増やしています。(iは人数に対応しています)
最後まで読み込んだらreturn i;によって読み込んだ人数の値を返してます。

説明力不足ですがこんな感じでわかりますかね・・・^^;


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

Name: たかぎ [URL]  ..ハッカー(101,982ポイント)   Date: 2009/05/26(火) 18:24   No:34058     
Title: Re:ソース内のコメントについて    
コメントというものは、プログラミング言語や標準ライブラリの知識を補完するためのものではありません。
このソースの場合、read関数が何をやっているのかはコードを見れば分かりますから、何をやっているかについては、せいぜい関数ヘッダがあれば十分かと思います(それさえも必須ではありません)。

では、どんなコメントが必要かというと、コードを見て疑問に思う箇所に関して、そのような仕様または実装にした理由です。

・例えば、引数pathはconst char*ではなくchar*になっていますが、その理由は何なのか?
・while文の中でstrcpyを使って入力内容を構造体に格納していますが、(バッファオーバーランのリスク等を回避し)安全性を担保するための根拠は何か?
・cntとiを分けている理由は何か?

といったことをコメントにするとよいでしょう。
また、

・fopenの失敗はファイルが存在しない場合だけなのか?
・fcloseに対して、/* ファイルを閉じる */といった自明なコメント付けているのはなぜか?

といったことについてもコメントがあった方がよいかもしれません。


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

Name: たいちう  ..プログラマー(29,230ポイント)   Date: 2009/05/26(火) 21:07   No:34069     
Title: Re:ソース内のコメントについて    
質問とは関係ないけど気付いた点、、、
終端文字の分の確保を忘れています。
↓のようにしましょう。

#define NAME 17 /* 氏名の最大文字数 */
(略)
typedef struct jusyoroku {
  char name[NAME + 1];
(略)
}Jusyoroku;


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

Name: ほのか  ..入門者(2,675ポイント)   Date: 2009/05/27(水) 09:07   No:34084 解決!     
Title: Re:ソース内のコメントについて    
皆様、回答ありがとうございます^^
皆様の回答を参考にしてこれからソースにコメントの追加や修正等していきたいと思います!

ありがとうございました^^


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



Name: Huzzy  ..入門者(3,552ポイント)   Date: 2009/05/26(火) 09:04   No:34045       
Title: タメショットについて    
お世話になっております;
横STGの製作をしており8割方完成して
もうゴールが見えている状況なのですが・・・;

自機の攻撃パターンにタメ技を加えようと考え
龍神録様のcshot.cppを改良し考えていたのですが
添付ファイルのような波を画くような動きを
してくれません。

自分としては下記の通常ショットもしくは、
ショットの移動計算を変更すればうまく行きそうな
気がしなくもありません。
tshot[k].angleのPIの値を弄ってみましたが
あまり変化が見られませんでした;;

誰かお分かりになる方が居られましたら
ご教授ください;;

後、これをタメショット(5秒間ボタンを押す→離すと発射!の様な)
にするにはどのような
手順を踏めばよいのでしょうか?

質問ばかりで恐縮なのですが、
教えていただけると幸いです。


//通常ショット登録
void ch0_tshot_pattern(){
int k,d,c1;
int n=tshot0num[ch.power<30?0:1];
for(int i=0;i<n;i++){
if((k=search_tshot())!=-1){
tshot[k].flag=1;
tshot[k].cnt=0;
tshot[k].angle=PI/2;
// tshot[k].vx=3;
// tshot[k].vy=0.5+cos(PI*(tshot[i].cnt+60.0f)/80.0f)*2.0f;
tshot[k].spd=10;
tshot[k].y=ch.y+tshot0pos_y[i];
tshot[k].x=ch.x+tshot0pos_x[i];
tshot[k].power= (n<2 ? 200 : 120) +ch.power/100;//2筋なら20,4筋なら12(50)
tshot[k].knd=0;
tshot[k].img=img_tshot[0];//画像番号代入(49)
}
}
}

//ショットの移動計算
void calc_tshot(){
for(int i=0;i<TSHOT_MAX;i++){
if(tshot[i].flag==1){
int dranx=tshot[i].spd+11/2,drany=tshot[i].spd+55/2;
if(tshot[i].knd==1)
tshot[i].y+=cos(tshot[i].angle)*tshot[i].spd;
tshot[i].x+=sin(tshot[i].angle)*tshot[i].spd;
tshot[i].cnt++;
if(tshot[i].y<-dranx || tshot[i].y>FMY+drany ||
tshot[i].x<-drany || tshot[i].x>FMX+dranx)//画面から外れたら
tshot[i].flag=0;
}
}
}


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


Name: Huzzy  ..入門者(3,570ポイント)   Date: 2009/05/26(火) 09:12   No:34046     
Title: Re:タメショットについて    
すいません;
添付ファイルを載せるの忘れてました;;


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

Name: さが  ..初心者(6,199ポイント)   Date: 2009/05/26(火) 10:27   No:34049     
Title: Re:タメショットについて    
コードを記入するときは、< pre >< / pre >で囲ってください

とりあえず、波の部分のみ答えます。
まず、sin波の出し方ですが、中心が分かっていないと求め方が面倒なので
y座標の計算用として tshot に dy要素でも構造体に追加しておいてください。
そして、描画部分において
draw(tshot[].x,tshot[].y …)
となっているかと思われますが次のようにしてください。
draw(tshot[].x,tshot[].y + tshot[].dy …)

しかしこの場合、すべての弾においてdyをクリアしないといけないので、注意が必要です。
弾の初期値を記憶しておいて、tshot[].yに代入した方が良いかも知れません。


//通常ショット登録
void ch0_tshot_pattern(){
int k,d,c1;
int n=tshot0num[ch.power<30?0:1];
for(int i=0;i<n;i++){
if((k=search_tshot())!=-1){
tshot[k].flag=1;
tshot[k].cnt=0;
tshot[k].angle=0; /****/
tshot[k].spd=2; /****/
tshot[k].y=ch.y+tshot0pos_y[i];
tshot[k].x=ch.x+tshot0pos_x[i];
tshot[k].dy=0; /****/
tshot[k].power= (n<2 ? 200 : 120) +ch.power/100;//2筋なら20,4筋なら12(50)
tshot[k].knd=1; /****/
tshot[k].img=img_tshot[0];//画像番号代入(49)
}
}
}

//ショットの移動計算
void calc_tshot(){
for(int i=0;i<TSHOT_MAX;i++){
if(tshot[i].flag==1){
int dranx=tshot[i].spd+11/2,drany=tshot[i].spd+55/2;
tshot[i].angle += tshot[i].spd; /****/
if(tshot[i].knd==1)
tshot[i].y+=cos(tshot[i].angle) * 10; /****/
tshot[i].x++; /****/
tshot[i].cnt++;
if(tshot[i].y<-dranx || tshot[i].y>FMY+drany ||
tshot[i].x<-drany || tshot[i].x>FMX+dranx)//画面から外れたら
tshot[i].flag=0;
}
}
}


/****/が主な変更点です。試してないので正確に動作しない可能性もあります。


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

Name: さが  ..初心者(6,229ポイント)   Date: 2009/05/26(火) 10:51   No:34051     
Title: Re:タメショットについて    
色々間違ってましたが、携帯からだと編集出来ないので連投になってしまいます。すいません。


//*訂正*//
ショット移動計算の
tshot[i].angle += 0.01

tshot[i].y = sin(tshot[i].angle) * 10

tshot[i].x = tshot[i].spd


またdranyの値も異なって来ますが、携帯からだと限界なので、ここまで。


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

Name: Tatu  ..ぴよぴよ(24ポイント)   Date: 2009/05/26(火) 21:48   No:34070     
Title: Re:タメショットについて    
龍神録プログラミングのコードを改変して
作っているということなので、60章のコードをどう変えたら
チャージショットを撃てるようになるか考えて、
テキストファイルにまとめてみました。


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



Name: さが  ..初心者(5,706ポイント)   Date: 2009/05/26(火) 18:35   No:34060       
Title: ゲームのネットワーク化    
お世話になります。さがです。
今回は前製作したものにネットワークを組み込もうと思ったのですが、うまく動作しなく困ってしまったので質問させてください。

コードは添付のtxtに入ってます。

やろうとしていることは
キー入力情報の受け渡しです。

また DataSend() DataRecv()へのアクセスはSERVERとCLIENTで交互にしようと思ってます。

if(SERVER_FLAG){
DataSend(&buf[0]);
DataRecv(&pad[1]);
}else{
DataRecv(&pad[1]);
DataSend(&buf[0]);
}


今のところ実行すると、
・受け取る char の値が不定。
・ゲームのプレイ中にラグ(1秒程度)が発生する。
となっています。

自分なりに考えて見たところ、 本家リファレンス GetNetWorkSendDataLength()項の

NetWorkSend 関数で送信をしたデータはすぐに 送信されるわけではない場合があり、
その場合はライブラリ内部のメモリ領域に 一時的に保存されます。

というところが原因では無いかと考えていますが、なにぶん経験が浅いので原因を特定することが出来ません。
どなたか御教示いただけないでしょうか。


環境
Windows XP
visual studio 2005 EE Dxlib


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




Name: お茶  ..ぴよぴよ(98ポイント)   Date: 2009/05/26(火) 17:19   No:34055       
Title: Cについて    
初心者で申し訳ありません。
ゲームなどで、
IDとパスワードを入力すると始まるみたいな方法があるじゃないですか。
あれは、プログラムを書くときにどのようにすればよろしんでしょうか。
ちなみに、固定の数値をプログラム内に決めておくのでわなく、
実行したゲーム内で入力で設定しその後そのIDとパスワードを使用するという仕様です。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(88,803ポイント)   Date: 2009/05/26(火) 17:32   No:34056     
Title: Re:Cについて    
登録時は ID とパスワードをユーザー側に入力させて、それらをリスト形式でファイルなどに保存(追加)し、
認証時は ID とパスワードの入力を促し、保存されたリストから両方とも一致する項目があればOK、

といった感じで、容易にできます。

暗号化などによるパスワードデータの保護は、リストデータの読み書き時に行えば良いでしょう。


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



Name: クロマ  ..ぴよぴよ(44ポイント)   Date: 2009/05/25(月) 02:36   No:34013       
Title: お世話になっておりますクロまです。    
toyoさん、いつぞやは優しい回答ありがとうございました!! 気づいておらず、御礼の言葉が遅れてしまい
すみませんでした、(>_<)!! 本当に感謝してるです。

新しく質問させていただきたいのですが、「2つのデータを引数として、割り算の結果が割り切れる場合は0、
割り切れない場合は-1を戻す関数を記述しなさい、ただしメイン関数は省略するものとする。」

という課題なのですが、メイン関数を省略するという意味が解りません。  どなたか、馬鹿でも解るよう
説明していただけますでしょうか? よろしくお願いします!!


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


Name: BEMANI  ..プログラマー(31,551ポイント)   Date: 2009/05/25(月) 03:00   No:34014     
Title: Re:お世話になっておりますクロまです。    
>>クロマさん
コンソールアプリだと仮定して、
main関数(プログラム実行時はじめに呼ばれる関数)を書かなくても良いという意味ではないでしょうか。
int main(void)等と記述されている関数がmain関数です。
つまり、「2つのデータを引数として割り算の結果・・・」という関数だけを作ればいいのだと思います。


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

Name: クロマ  ..ぴよぴよ(78ポイント)   Date: 2009/05/26(火) 16:14   No:34054     
Title: 遅れてすみません    
BEMANIさん、回答ありがとうございます!
意味がわかれば全く問題のない事でした。
もう少し冷静に日本語を勉強しようと思いました…


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



Name: はいかぜ  ..かけだし(1,972ポイント)   Date: 2009/05/26(火) 02:35   No:34039       
Title: 変数の数について    
こんばんは。
久々の質問になるのですが、どうしても分からないことがあるのできました。

こちらの環境は、
OS:WinXP SP3
コンパイラ:VisualC++2008
ライブラリ:DXライブラリ
です。

質問内容は、
「上記のような環境で変数の数に制限があるのかどうか」です。

現在、試しにプログラムを作っていて新しく変数を追加したのですが…
その変数を追加したら全ての動作がおかしくなってしまう(画像の表示や変数の値が主)という状況に陥っています。
試してみたことが、
1.変数の名前を変える。
2.今ある変数をひとつ消して、新たにひとつ追加する。
です。

1のほうだと症状は変わらないのですが、2のほうだとちゃんと動作しました。
このようなことから、数の制限があるのかどうかという疑問に至りました。

変数に数の制限はあるのでしょうか?
変数の型は「int」です。
また、このような症状の解決策はあるのでしょうか?

説明に曖昧な部分があって申し訳ないのですが、
どうかよろしくお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,025,488ポイント)   Date: 2009/05/26(火) 06:35   No:34040     
Title: Re:変数の数について    
ローカル変数において、制限はありますが、そのような動作にはならないと思います。
どこかでオーバーフローとかおこして他の変数の値までかわってしまっているのでは無いでしょうか?
その変数の宣言はただの引き金になっているだけで、バグの正体はそこではないという可能性もあるかもしれません。
具体的にどのような宣言をしたのか詳しく教えてもらえると何かわかるかもしれません。

とりあえず、他の配列やポインタ関係でおかしな場所を指していないか、代入していないかザッと調べてみてはいかがでしょうか。


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

Name: 山崎  ..初心者(8,587ポイント)   Date: 2009/05/26(火) 06:37   No:34041     
Title: Re:変数の数について    
おはようございます。

確か、「変数の数に制限があるかどうか」と聞かれたら、それは「YES」のはずですね。
当然ですが、パソコンのメモリの量には限界がありますので、
ひとつのプログラムが使用できるメモリにも限界があります。
でも、その変数の限界まで使い切る、ってのはかなり大変なのでは思いますね。
intは大抵4バイトですから、intだけでメモリを使い切るとなると相当大量に宣言しなければなりません。

お話を伺った感じですと、おそらく自動変数という形で変数を宣言しておられますよね。
もし非常に大量に変数が必要なら、newやallocを使って動的に変数の領域を確保したほうがいいと思います。
(私はまだC++上級者じゃないので詳しいことを説明するのは遠慮しておきます)

エラーのほうですが、私には何となく変数の数以外の原因があるように思えます・・・。
もしエラーを取り除きたいのであれば、とりあえず、
そのエラーが起こるコードを載せてみてはいかがでしょうか?


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

Name: チルチル  ..上級者(16,974ポイント)   Date: 2009/05/26(火) 06:42   No:34042     
Title: Re:変数の数について    
私は弾の構造体を百万個宣言したことがありますが少し重くなっただけで
ちゃんと動作しました、まあ構造体配列の話ですが
変数はメモリの容量が許す限り数に制限はないと思います

ちなみに
>>1.変数の名前を変える。
これは特定の変数の場合ですか?
それともどの変数でも同じ結果になりますか?

>>2.今ある変数をひとつ消して、新たにひとつ追加する。
変数をひとつ消して、新たにふたつ追加したらどうなりますか?

このような症状が出る原因としては
グローバル変数とローカル変数で同じ名前が使われている
ことぐらいしか思い浮かびませんが
どうしてもダメだったら変数名を変えて続けてみてはどうですか?

って言うかキーを打っている間に先に投稿されていましたね
すいません聞き流して下さい・・


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

Name: Mist  ..熟練のプログラマー(61,894ポイント)   Date: 2009/05/26(火) 09:51   No:34048     
Title: Re:変数の数について    
他の方がおっしゃられているように今回の原因はプログラムのどこかでメモリ破壊を起こしている事が原因と思います。
一応、ローカル変数(スタック変数)は特に何も設定していなければ最大1MB(だったと思う)という制限はありますが、スタックオーバーフローを起こした場合はWindowsがメッセージボックスで通知してくれるのですぐにわかります。



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

Name: はいかぜ  ..かけだし(1,532ポイント)   Date: 2009/05/26(火) 16:08   No:34053 解決!     
Title: Re:変数の数について    
Dixq (管理人)さん
こんにちは。
ご回答ありがとうございます。
オーバーフローという単語が出てきて少し調べてみたら、
別な変数でいじっていないはずなのに変更されている部分があったのでこれではないかと思い、
ご指摘のとおり少し調べてみました。

そしたら、fwriteの書き込みデータの数の項を変更してみるとちゃんと動いてくれました。
fwiteのこのような部分も影響を及ぼすものがあるのですか…

山崎さん
こんにちは。
ご回答ありがとうございます。

なるほど、制限はあるだろうけれどもその制限にはまず引っかからないということですか…
コードについてはエラーコードはなく動いてくれるのですが、その動作がおかしくなるというものでした。
今回のことに関しては、とりあえず解決することはできました。
これから先また起こるかもしれないとなると少々不安ですが^^;

チルチルさん
こんにちは。
ご回答ありがとうございます。

なんと100万・・・
少々数が増えてきたとは思っていましたがそこまでいって大丈夫なら杞憂に過ぎないということですね^^;
ご指摘の変数が同じ名前というのは見当たらなかったです。
また、intではなくchar型の変数を追加した場合でも同じ症状が出ました。

Mistさん
こんにちは。
ご回答ありがとうございます。

なるほど…
やはり、メモリのことも考えないといけないのですね^^;
そういった部分にあまり気を遣ってはいなかったのでこれからは気をつけます。
皆さんのご指摘を受けてメッセージボックスが出たのですが、その意味がわからず。
けれどもそれを基にして、なんとなく数字をいじってみたら解決されたという状況でした。
ちなみに、エラーボックスはこのようなものでした。


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



Name: 研修生  ..初心者(6,855ポイント)   Date: 2009/05/25(月) 14:33   No:34021       
Title: 関数    

int main(int argc, char* argv[])
{
int c, nb, nt, pos;
nb = 0;
nt = 0;

for(pos = 1;(c = getchar()) != EOF; ++pos){
if(c == ' '){
if((pos % TABSTOP) != 0){
nb++;
}

else{
nb = 0;
nt++;
}
}

else{
tabspace(nt, nb);
putchar(c);

if(c == '\n'){
pos = 0;
}
}
}

return 0;
}

void tabspace(int nt, int nb)
{
for(; nt > 0; --nt){
putchar('\t');
}

for(; nb > 0; --nb){
putchar(' ');
}
}


で先程ご質問した際に載せたソースとの違いは
関数を使っているだけなんですが
このときtabspace関数内で
--ntや--nbとしているんですが
今みたらデクリメントされていない感じです。
原因だけ教えて下さい。



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


Name: Blue  ..中級者(10,546ポイント)   Date: 2009/05/25(月) 14:40   No:34022     
Title: Re:関数    
ポインタってわかりますか?

参考)
引数による情報の受け渡し
http://homepage3.nifty.com/mmgames/c_guide/15-06.html


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

Name: Mist  ..熟練のプログラマー(61,864ポイント)   Date: 2009/05/25(月) 14:41   No:34023     
Title: Re:関数    
関数に渡される引数の性質を理解できていないことが原因です。
値渡しの場合、値のコピーがtabspace関数に渡されるので、tabspace関数内でnt,nbをいくら変化させてもmain関数内のnt,nbには反映されません。


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

Name: 研修生  ..初心者(6,878ポイント)   Date: 2009/05/25(月) 14:52   No:34025     
Title: Re:関数    
そうか・・値のコピーが渡されているんですね。

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

Name: 研修生  ..初心者(6,880ポイント)   Date: 2009/05/26(火) 10:29   No:34050 解決!     
Title: Re:関数    
理解できました。ありがとうございました。

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



Name: 迷走のギュス  ..ぴよぴよ(232ポイント)   Date: 2009/05/26(火) 01:35   No:34036       
Title: 自作用の3D関数ライブラリ作る途中段階のエラー    
C++を勉強し始めて2ヶ月の素人です、見よう見まねでいくつか簡単なゲーム
を作ったりしかしてないので、基礎をもっとしっかりしてから
取り組んだ方が良いと考えてたのですが、どうしても3Dゲームを作ってみたい
という一心でダイレクトXの参考書を買って自分用の3D関数ライブラリを作ろう
まで進んだのですが、途中で詰んでしまい困っています!
初めて質問するので、至らない点があるかもしれませんが、どなたかご教授願いします!

□質問内容□
関数ポインタ?msg という識別子を取り込めない原因

□実行結果□
ウィンドウの枠だけが表示される

□環境□
OS:Windows XP コンパイラ名:visual studio 2008 PE Microsoft DirectX SDK (November 2008)
リンカ入力の依存ファイル:d3d9.lib d3dx9.lib winmm.lib

□エラーの内容□
error C2065: 'msg' : 定義されていない識別子です。
error C2228: '.message' の左側はクラス、構造体、共用体でなければなりません。
型は ''unknown-type'' です。
fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
□プログラムコード□
main.cpp

#include "my3dlib.h"

//-----------------------------------------------------------------------------
//WinMain関数
//-----------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
if( SUCCEEDED( InitD3DWindow(_T("My3DLibTest"), 640, 480) ) )




// メッセージループ
MSG msg = {0};

while( msg.message != WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

}
}
}

UnregisterClass( _T("D3D Window Class"), wc.hInstance );
return 0;
}

my3dlib.cpp


#include "my3dlib.h"

//グローバル変数
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
float g_aspect = 1.0f;

//リソースの解放
VOID Cleanup()
{
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();

if( g_pD3D != NULL )
g_pD3D->Release();
}

//ウィンドウプロシージャ
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}

return DefWindowProc( hWnd, msg, wParam, lParam );
}


//ウィンドウモードでD3D初期化
HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h){
//ウィンドウクラス作成
WNDCLASSEX wc =
{
sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
_T("D3D Window Class"), NULL
};
RegisterClassEx( &wc );

//ウィンドウ作成
HWND hWnd = CreateWindow( _T("D3D Window Class"), wintitle,
WS_OVERLAPPED | WS_SYSMENU, 100, 100, w, h,
NULL, NULL, wc.hInstance, NULL );
//ビューポートアスペクトの記録
g_aspect = (float)w / (float)h;

//D3D9の作成
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;

//D3Dデバイスの作成(可能ならハードウェアT&Lを使用)
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) ) {
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) ) {

return E_FAIL;
}
}
//Zバッファをオン
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
ShowWindow( hWnd, SW_SHOWDEFAULT );

return S_OK;
}


my3dlib.h

#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <tchar.h>

//グローバル変数
extern LPDIRECT3D9 g_pD3D;
extern LPDIRECT3DDEVICE9 g_pd3dDevice;
extern float g_aspect;

//関数プロトタイプ宣言
HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h);


長くなって申し訳ありませんが、よろしくお願いします!





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


Name: 迷走のギュス  ..ぴよぴよ(301ポイント)   Date: 2009/05/26(火) 01:42   No:34037     
Title: Re:自作用の3D関数ライブラリ作る途中段階のエラー    
プログラムのミスに気がついたので編集させていただきました。

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

Name: 迷走のギュス  ..ぴよぴよ(627ポイント)   Date: 2009/05/26(火) 02:11   No:34038     
Title: Re:自作用の3D関数ライブラリ作る途中段階のエラー    
2つめの間違いに気がついたので再び編集させていただきました。
申し訳ございません!


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

Name: toyo  ..プログラマー(34,981ポイント)   Date: 2009/05/26(火) 07:53   No:34043     
Title: Re:自作用の3D関数ライブラリ作る途中段階のエラー    
wWinMainで { が2個足りませんよ
プログラムは手を加えずにそのままコピーするのがいいです(手を加えた部分に原因があることが多いですし)
MSG msg = {0};
が別ブロックで宣言されてるような気がします


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

Name: 迷走のギュス  ..ぴよぴよ(777ポイント)   Date: 2009/05/26(火) 08:53   No:34044 解決!     
Title: Re:自作用の3D関数ライブラリ作る途中段階のエラー    
単純なミスに気がつかず
今まで四苦八苦していたのが嘘のように簡単に
ビルドが成功しました!
複雑になると単純なところのミスに気がつないもの
だと痛感しました…。
もう一度しっかりコードを見直すことで
他のミスにも気がつくことができました!

プログラムは手を加えないようにします、
アドバイスとご指摘
本当にありがとうございました!


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



Name: クロウ  ..初心者(5,550ポイント)   Date: 2009/05/23(土) 00:09   No:33884       
Title: 画像処理について    
大学の画像処理の授業で出たこの課題に躓いています。
「画像中のランダムに選んだ画素に対し、その画素を中心にエッジの方向と大きさに比例した傾きと大きさの楕円で塗りつぶすプログラムを作成せよ」

現在のところ、「ランダムに選んだ画素を中心に決められた半径の円で塗りつぶす」ところまでは出来ましたが、その先にあるであろう「エッジの方向と大きさに比例した傾きと大きさの楕円」を実装することができません。

「エッジの方向と大きさに比例した傾きと大きさの楕円」について、どうすれば実装できるか丸一日考えてみましたが、結局上手くいかなかったのでここでアドバイスをいただくべく、質問させていただきます。



とりあえず、今現在の「ランダムに選んだ画素を中心に決められた半径の円で塗りつぶす」ところまでのソースコードを挙げておきます。


PImage src;

void setup(){
size(200, 150);
src = loadImage("picture.jpg");
}


int r1 = 7;
int r2 = 7;
void draw(){
int i = int(random(src.width));
int j = int(random(src.height));
color c = src.get(i, j); // 画素(i, j)の画素値の取得
noStroke();
fill(c);
ellipse(i, j,r1,r2);
}


コンパイラはprocessingで言語はjavaです。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,024,746ポイント)   Date: 2009/05/24(日) 20:18   No:33995     
Title: Re:画像処理について    
回答でなくてごめんなさい。

「エッジの方向と大きさに比例した傾き」という事がよくわからないので、
その辺の説明を詳しくしていただけると回答が集まるかもしれませんm(_ _;)m


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

Name: クロウ  ..初心者(6,294ポイント)   Date: 2009/05/25(月) 23:11   No:34035     
Title: Re:画像処理について    
どうやら、わかりにくかったようです。すみません。
つまり、
「明暗の差を楕円の大きさで表わし、明暗の向きを楕円の傾きで表わす。」
ということです。

例として、ある部分の画素をランダムに選びます。

///////////////////////////////////////////////
// // // //
//(128,128,128)// (0,0,0) //(128,128,128)//
// // // //
///////////////////////////////////////////////
// // // //
//(128,128,128)//(255,255,255)// (0,0,0) //
// // // //
///////////////////////////////////////////////
// // // //
//(128,128,128)//(255,255,255)//(128,128,128)//
// // // //
///////////////////////////////////////////////


ある画素のRGB値は(255,255,255)となっていたとき、周辺の画素を調べると次のようになっていた場合、

楕円の向きは
(255,255,255)→(0,0,0)、(255,255,255)→(128,128,128)、(255,255,255)→(255,255,255)
となり、(255,255,255)→(0,0,0)の方向には(255,255,255)の大きな楕円
(255,255,255)→(128,128,128)の方向には(255,255,255)の小さな楕円で表わします。
また、(255,255,255)→(255,255,255)の場合は明暗の変化がないので楕円は描かれません。


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



Name: 紅葉  ..中級者(10,764ポイント)   Date: 2009/05/24(日) 21:13   No:34001       
Title: 質問ではありません Justyさんへ    
以前貴方に助けていただいたので・・・
了解しました。
わざわざこの場を借りてすいませんでした。


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


Name: Justy  ..伝説なるハッカー(364,941ポイント)   Date: 2009/05/25(月) 00:05   No:34008     
Title: Re:質問ではありません Justyさんへ    
 この掲示板で名指しで仕事依頼することの是非はこの際おいておくとして。

 なぜ私限定なのか理解に苦しむところですが、結論から申しますと
お引き受けすることはできません。

 理由はいろいろありますが、一応サラリーマンなんで副業は服務規程違反に
なりますし、仕事以外でも今アプリを作るプロジェクトをやっているので
まとまった時間をとることは難しいからです。


 私一人に限定せず、他の方にも声をかけてみてはいかがですか?


 ところで、2Dなら(3Dであっても)既に多数の優れたライブラリが
世の中にはあります。

 それではだめなのでしょうか?


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

Name: a  ..ぴよぴよ(595ポイント)   Date: 2009/05/25(月) 21:26   No:34034     
Title: Re:質問ではありません Justyさんへ    
a

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



Name: スー  ..初心者(6,824ポイント)   Date: 2009/05/23(土) 16:30   No:33913       
Title: 反転ゲームの最小回数の求め方    
こんにちはスーです。

早速ですが質問があります。
反転ゲーム(正式名称がわからないです)のクリアまでの最小回数を求めるプログラムを作っています。

反転ゲーム
@
 □□□□
 □□□□
 □□□□
 □□□□
@の状態で左上を押したら、Aの状態になります。

A
 ■■□□
 ■□□□
 □□□□
 □□□□
Aの状態で[0][2]を押したら、Bの状態になります。

B
 ■□■■
 ■□■□
 □□□□
 □□□□

これを繰り返して、すべて■にしたらゲームクリアです。

今できているプログラムが
@ランダムな所を指定し、反転させる。
Aゲームクリアまで繰り返します。
Bゲームクリアまでの回数をカウントします。
Cカウントが一番小さい数を記憶し、@に戻ります。

このやり方ですと、確実な最小回数がでない可能性があります。
もっと効率の良い方法はないでしょうか?
どうぞよろしくお願いします。

環境
CPad for Borland C++ Compiler
C言語
WindowsXP
です。


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

#define BLUE -1
#define RED 1
#define MASS 4

#define KAISUU 1000

void flip(int [][MASS],int ,int );
void draw(int [][MASS]);
int judge(int [][MASS]);


int main(){
srand((unsigned)time(NULL));
int b[MASS][MASS];
//配列の初期化
for(int i=0;i<MASS;i++){
for(int j=0;j<MASS;j++){
b[i][j] = BLUE;
}
}
//最小値の初期化 これ以上大きい数はないはず…
//いままでやった中の最小回数を記録
int min = 2147483647;

for(int k=0;k<KAISUU;k++){
//全部REDになるまでの回数を記録
int count = 0;

while(1){
//反転している数を記録
int sum = 0;

//draw(b);
//適当な所していして、反転させる
flip(b, rand()%MASS, rand()%MASS);

sum = judge(b);
count++;

if(sum == MASS*MASS)break;
//getch();
}

//minの記録
if(count < min){
min = count;
}
printf("%d回でできました。 現在の最小回数は%dです。\n",count,min);

//getch();

//初期化
count = 0;
for(int i=0;i<MASS;i++){
for(int j=0;j<MASS;j++){
b[i][j] = BLUE;
}
}
}
printf("最小回数は%dです。\n",min);
getch();
return 0;
}


//[i][j]の数を判定させる
void flip(int ary[][MASS],int i,int j){
ary[i][j] *= -1;
if(i-1 >= 0)
ary[i-1][j] *= -1;
if(i+1 <= MASS-1)
ary[i+1][j] *= -1;
if(j-1 >= 0)
ary[i][j-1] *= -1;
if(j+1 <= MASS-1)
ary[i][j+1] *= -1;
}

//現在の状態を表示する
void draw(int ary[][MASS]){
for(int i=0;i<MASS;i++){
for(int j=0;j<MASS;j++){
if(ary[i][j] == BLUE)
printf("□");
if(ary[i][j] == RED)
printf("■");
}
printf("\n");
}
printf("\n");
}

//反転している物の数を返す
int judge(int ary[][MASS]){
int count = 0;
for(int i=0;i<MASS;i++){
for(int j=0;j<MASS;j++){
if(ary[i][j] == RED){
count++;
}
}
}
return (count);
}



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


Name: box  ..ハッカー(140,471ポイント)   Date: 2009/05/23(土) 17:08   No:33915     
Title: Re:反転ゲームの最小回数の求め方    
盤面の初期状態は、2の16乗(=65536)とおりあります。
初期状態のそれぞれについて、1手目をどこから始めるかは16とおりあります。
よって、65536*16=1048576とおりのすべてについて調べれば、
どの初期状態のときに1手目をどこから始めれば最小手数で反転するかが求まります。


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

Name: box  ..ハッカー(140,358ポイント)   Date: 2009/05/23(土) 17:26   No:33918     
Title: Re:反転ゲームの最小回数の求め方    
>65536*16=1048576とおり

盤面を90度の整数倍だけ回転させたり、
裏表を反転させたりすることで、
同一盤面とみなせるケースがありますね。

よって、実際に調べるのは1048576とおりよりも少なくてすみます。


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

Name: さが  ..入門者(4,836ポイント)   Date: 2009/05/23(土) 17:30   No:33920     
Title: Re:反転ゲームの最小回数の求め方    
>boxさん
このゲームは
1 同じ場所で、二度反転すると意味が無い
2 順番に依存しない
ので2の16乗で大丈夫だと思います。


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

Name: さが  ..初心者(5,009ポイント)   Date: 2009/05/23(土) 17:59   No:33924     
Title: Re:反転ゲームの最小回数の求め方    

int min = 65536;
for(int i=0;i<65536;i++){
//配列初期化
int count = 0;
for(int j=0;j<16;j++){
if( i & (1 << j) == 1){
flip(b,j%4,j/4);
count++;
}
}
if(judge(b) == MASS*MASS)
if(count < min)
min = count;
}
printf("min = %d",min);


卓上で考えたので、激しく間違ってるかも知れません。


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

Name: mats  ..かけだし(1,122ポイント)   Date: 2009/05/23(土) 23:55   No:33940     
Title: Re:反転ゲームの最小回数の求め方    
これは「ライツアウト」というパズルです.

Nマスのとき,単純にはO(2^N)の計算時間で解けますが,工夫をすることでO( 2^sqrt(N) )まで落とせます.
問題の16マスならば2^4=16通りを調べれば解けるらしいです.
(自分ではまだ実装していないので,プログラムは無いです.すいません・・・)

他にも,連立方程式を解くことでいきなり解を求める方法もあるそうです.

参考URL:
http://www.ic-net.or.jp/home/takaken/nt/light/light2.html


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

Name: スー  ..初心者(6,828ポイント)   Date: 2009/05/24(日) 00:39   No:33945     
Title: Re:反転ゲームの最小回数の求め方    
boxさん、さがさんありがとうございます。

2^16通りの判定をすればいいことがわかりました。ありがとうございます。
すべてのパターンをするという理屈はわかるのですが、実際するとなるとイメージが掴めないです。

さがさんすみませんが、
if( i & (1 << j) == 1){
ココの意味を教えて頂けないでしょうか?
特に <<の左シフトが理解できないです。

どうぞよろしくお願いします。







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

Name: さが  ..初心者(5,309ポイント)   Date: 2009/05/24(日) 16:07   No:33988     
Title: Re:反転ゲームの最小回数の求め方    
自分も最近知ったばかりなのであんまりえらい事いえないんですが

(1<<j) これは 1を左にj回シフトするという意味で
左上から順にボタンを押すか押さないかの判定をしてます。

表の16個のボタンを下の様に表したとします。

1(0) 2(1) 4(2) 8(3)
16(4) 32(5) 64(6) 128(7)
・・・・

*()内は ボタンの名前とします。
そして
3なら 0 と 1
7なら 0 と 1 と 2
を同時に押すことで表すとします。これを65536までやると押し全てのパターンを作ることが出来ます。

次に3という物を2進数で考えると

i 2進数表示
3 ---> 11
7 ---> 111

なります。そして (1 << j) は

j=0 ---> 1
j=1 ---> 10
j=2 ---> 100

となり、これと i でand をとってやれば、 for で変化する 変数 i において、押されているボタンが分かるというわけです。


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

Name: スー  ..初心者(7,021ポイント)   Date: 2009/05/25(月) 20:37   No:34030 解決!     
Title: Re:反転ゲームの最小回数の求め方    
matsさん、さがさんレスありがとうございます。

matsさん
書き込み時間の関係で無視したみたいになってすみませんでした。
ライツアウトというゲーム名なので始めて知りました。
参考URLやライツアウトで検索したサイトを見たら解をだすまでの高速化と安定化することができました。
ありがとうございます。

さがさん
詳しく書いていただきありがとうございます。
おかげで総当りの方法ができそうです。
他のゲームとかにも応用できそうですね。使わせてもらいます。

boxさん、さがさん、matsさん
ありがとうございました。



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



Name: suwacchi  ..ぴよぴよ(19ポイント)   Date: 2009/05/25(月) 12:38   No:34019       
Title: 双方向リストについて    
現在、visual C++ 環境でシューティングゲームを製作しています。

少しわけがありまして、ゲーム中にどこでつかっても構わないから、双方向リストを使う必要があります。
自機のショットや移動、敵のボスのショットや移動などは完成していて、拙いながらも一応ゲームとして動いている状態です。

そこで、いわゆる雑魚敵で双方向リストを使おうと思っているのですが、可能でしょうか?
目的が双方向リストを使うことなので、無駄があっても構いません。

よろしくお願いします。


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


Name: non  ..熟練のプログラマー(42,654ポイント)   Date: 2009/05/25(月) 16:20   No:34027     
Title: Re:双方向リストについて    
双方向リストにすることは可能かといわれれば、可能でしょう。
龍神録プログラムならenemy_orderやenemyなどの配列を双方向リストにすればいいわけですから。
何の役にたつの?っていうのが一番問題ですけど。


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

Name: 山崎  ..初心者(8,349ポイント)   Date: 2009/05/25(月) 19:16   No:34028     
Title: Re:双方向リストについて    
こんばんは。

実際、私は今作っているアクションRPGで双方向リストを使っています。
フィールドにいる木や障害物、敵キャラ、プレイヤーキャラなどのオブジェクトを
双方向リストにして管理しています。
高さ、横幅、奥行きがある3次元的なアクションにしているので、
より奥側にあるオブジェクトから描画する必要があります。
そのため、オブジェクトが手前や奥に動く度に双方向リストをソートし、
常にリストが最も奥にあるものから順番に並ぶようにしています。
あとは、リストの先頭から描画していけば、オブジェクトが重なって描画されても
ちゃんと奥のものは後ろに、手前にあるものは手前に表示されます。

もちろんこれは双方向リストじゃなくても、リストを奥にあるものから順番にソートしておくことはできます。
しかし双方向リストにすれば、オブジェクトが奥に動いたか手前に動いたかを覚えていれば
そのオブジェクトからリストの前方へ向かってソートすればいいとか、
後方へ向かってソートすればいいとかがわかるので、
ソートの時間が短縮されるのではと考えました。

もしかしたら、というか多分この程度の機能なら既にSTLコンテナで実現できると思うのですが、
一応プログラミングの経験を積むため、あえて常にソートされている双方向リストを自分で作りました。

私も双方向リストを使うことが効率のいい方法かはわからないのですが、
とりあえず、今のところ私は双方向リストを愛用しております。


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



Name: 256bit  ..ぴよぴよ(472ポイント)   Date: 2009/05/24(日) 21:24   No:34002       
Title: ドット絵の作り方について    
 char.pngみたいにドット絵を作ってみたいのですが、使用したソフトや作り方などを教えてください。

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


Name: 紅葉  ..中級者(10,788ポイント)   Date: 2009/05/24(日) 21:27   No:34004     
Title: Re:ドット絵の作り方について    
ドット絵を描くならフリーのエッジがお勧めですよ。
作り方は・・・なれてくださいw


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

Name: 256bit  ..ぴよぴよ(512ポイント)   Date: 2009/05/25(月) 00:08   No:34010     
Title: Re:ドット絵の作り方について    
調べてみました。ここでよかったですか?
http://www.tkb-soft.hmcbest.com/program/win/edge/index.htm


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

Name: BEMANI  ..プログラマー(31,450ポイント)   Date: 2009/05/25(月) 00:30   No:34011     
Title: Re:ドット絵の作り方について    
>>256bitさん
そこで大丈夫です。
使い方は検索をかければ沢山出てくると思います。
ドットを打つにはちょっと辛いかもしれませんが、ペイントでも十分描けると思います。


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

Name: 256bit  ..ぴよぴよ(585ポイント)   Date: 2009/05/25(月) 14:50   No:34024 解決!     
Title: Re:ドット絵の作り方について    
↑すみません。間違えて投稿しました。(^^;)

 どうも、ありがとうございます。
 早速ダウンロードしてドット絵を作成したいと思います。
 


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

Name: 256bit  ..ぴよぴよ(644ポイント)   Date: 2009/05/25(月) 14:54   No:34026     
Title: Re:ドット絵の作り方について    
 ↑送る前に空で送信してしまい、空のコメントがあると思ってました。上記のコメントはお詫びを入れて投稿したものです。

 大変ご迷惑おかけしましたm(__)m


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



Name: 山口  ..ぴよぴよ(109ポイント)   Date: 2009/05/24(日) 14:36   No:33980       
Title: ゲーム作りの講座    
よくPC教室などでエクセルなどの講座をやっているところがあると思います。
これのゲーム製作版などはないでしょうか?

さすがにこれだけの為に専門学校などには通ってられないので
どこかありましたら紹介してください。


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


Name: たいちう  ..プログラマー(29,000ポイント)   Date: 2009/05/24(日) 19:13   No:33990     
Title: Re:ゲーム作りの講座    
Excelを使えるようになるまでの労力と、
ゲームを作れるようになるまでの労力を想像してみてください。
週に一時間ほどの授業を何回受けたら作れるようになると思いますか?
どの位の需要があると思いますか?

専門学校に行けないのならば、サイトや本で勉強するしかないでしょう。
(専門学校に行くのが常にベストとは限りません)
例えば、C言語で、DXライブラリを使って、シューティングゲームを作りたいのならば、
このサイトが最善の選択肢の1つでしょう。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,023,751ポイント)   Date: 2009/05/24(日) 19:45   No:33991     
Title: Re:ゲーム作りの講座    
あまり聞いた事はないですね。ただ、

「興味無いけどやらなきゃいけないこと」

は受身じゃなければなかなか難しいということはありますが、ゲームのように

「別にやらないといけないことじゃないけど興味あるからやる」

ということは自分からドンドン意欲的に調べて勉強できると思います。
ですから、受身で授業を受けるような形式ではなくても自分で調べたりプログラムを組んだりして
スキルアップさせる事は出来ると思います。

また、きっと授業があれば最初から「最善」の方法を教えてくれるでしょうが、
それは必ずしもその勉強スタイル自体が最善であるかどうかはわかりません。
最善のプログラムを探しながら「試行錯誤」することも非常に重要だと思います。

それに、何か人命に関わるプログラムを組むわけではないのですから、
無駄があったり、強引なプログラムの寄せ集めてもいいと思います。
2回目、3回目と経験を積むうちにより効率的な書き方がわかっていくと思いますし、
自分で見つけ出すことで人に聞く100倍身に付くと思います。

で、勉強方法ですが、DXライブラリについては、本家リファレンスがしっかりしていますから、
特に参考サイトなど必要ないと思います。
もし必要ならばここでよければ参考にしていただけるとありがたいです。
何か解らない事があればここで質問していただければと思いますし、いかがでしょうか?


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

Name: やそ  ..比類無きプログラマー(88,535ポイント)   Date: 2009/05/25(月) 12:02   No:34018     
Title: Re:ゲーム作りの講座    
山口さんへ

ちょっと質問の仕方が(印象)良くない気がします。

漠然と「ゲーム製作講座」といっても

・どんなジャンル
・開発環境
・使用する言語

など、いろいろな前提条件がおありだと思います。
まずはグーグル先生などで調べてみましょう。
私がYAHOOで検索しただけで

ttp://tanktown.web.infoseek.co.jp/tt/g_creat_infor.htm

ttp://hakuhin.hp.infoseek.co.jp/

ttp://www.tees.ne.jp/~itagaki/vb/kouza.htm

ttp://bshadow.gozaru.jp/game/comicmaker/kouza_1.html

ttp://kuongames.net/howtomakegame.html

ttp://d.hatena.ne.jp/seikenn/20080506/1210088946

ttp://hp.vector.co.jp/authors/VA027342/top.htm

ttp://www11.ocn.ne.jp/~fregenan/seisaku.html

ttp://search.chiebukuro.yahoo.co.jp/search/search.php?flg=3&p=%E3%82%B2%E3%83%BC%E3%83%A0%E8%A3%BD%E4%BD%9C%20%E8%AC%9B%E5%BA%A7&sort=0&fr=chie-websearch-9999&k=h6ckWOb.70dfb9vHDPkTvBDYT4ctZE0HhuPkrFbU3948l0uxeHUyTPiSFF9UgoCHDmSOAZk2YBz8z_VL4X.XQL9NkYui5BpyRBJO8E_dDlWEgCZ5so6Vs8paty9S._7SsPs7YTkGF3McZFN1GK3TdVwVMdyWZK2JcwmsMgC0hBpcuk7MPAZzcl9a_fCsLTVYwg9eIaLF3Wsrz4jhpydWb0OlnWAplQwXWBWfwqPjgWFN7AnjbrHWChbSDdthH5yN1Q7WHqWh6DENxl6PImnsYW4nu.b8jBghFT9atTU-

ttp://www.clks.jp/project.html

など、たくさん出てきましたよ。
まあ、頑張って下さい。


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

Name: lbfuvab  ..上級者(20,631ポイント)   Date: 2009/05/25(月) 13:49   No:34020     
Title: Re:ゲーム作りの講座    
ゲームが作りたいならツクールシリーズの体験版なんかどうでしょうか?

東方風STGなら東方弾幕風とか。


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



Name: 研修生  ..初心者(7,135ポイント)   Date: 2009/05/25(月) 09:47   No:34015       
Title: 空白    
#define TABSTOP 4

int main(int argc, char* argv[])
{
int c, nb, nt, pos;
nb = 0;
nt = 0;

for(pos = 1;(c = getchar()) != EOF; ++pos){
if(c == ' '){
if((pos % TABSTOP) != 0){
nb++;
}

else{
nb = 0;
nt++;
}
}

else{
for(; nt > 0; --nt){
putchar('\t');
}

for(; nb > 0; --nb){
putchar(' ');
}

putchar(c);

if(c == '\n'){
pos = 0;
}
}
}

return 0;
}


タブストップに関する問題なのですが、
これだと最後の行がもし空白の列で
一番最後に改行を入れない場合空白が吐き出されないのですが
何故かわかる方いますか? 原因と対策を教えて下さい。


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


Name: 研修生  ..初心者(7,117ポイント)   Date: 2009/05/25(月) 09:57   No:34016 解決!     
Title: Re:空白    
原因わかりましたのでかんがえみます。

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

Name: Mist  ..熟練のプログラマー(61,806ポイント)   Date: 2009/05/25(月) 09:57   No:34017     
Title: Re:空白    
> 原因と対策を教えて下さい。

原因:出力されるためには空白以外の文字が読み込まれてelse側を実行する必要があるから。

> 一番最後に改行を入れない場合空白が吐き出されないのですが

この場合、EOFでforが終わるから一度もelse側が実行されないからです。

対策まで書くと丸投げに回答しているようなものなのでご自分で考えてください。


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



Name: チルチル  ..中級者(14,369ポイント)   Date: 2009/05/21(木) 19:42   No:33798       
Title: 3Dポリゴンの無限遠点について    
この前のトビで知ったんですが
3Dポリゴンには無限遠点と言う物が
画面の中心にあるようなんです

でも実際はスコアボードが右の方にあるので
背景の中心は画面の中心からずれてるんです
これだと3D背景を描画した時に左右対称にならないので
無限遠点の位置を変更する方法はないでしょうか?

環境はDXライブラリです


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


Name: Justy  ..伝説なるハッカー(358,843ポイント)   Date: 2009/05/21(木) 20:23   No:33801     
Title: Re:3Dポリゴンの無限遠点について    

>無限遠点の位置を変更する方法はないでしょうか?

 CreateViewportMatrix() / SetTransformToViewport()。


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

Name: チルチル  ..中級者(14,453ポイント)   Date: 2009/05/21(木) 21:46   No:33805     
Title: Re:3Dポリゴンの無限遠点について    
すみません、検索してみましたが使いかたが書いてあるサイトがありませんでした・・
CreateViewportMatrix()とSetTransformToViewport()の引数と使い方を教えていただけないでしょうか・・


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

Name: Justy  ..伝説なるハッカー(358,949ポイント)   Date: 2009/05/21(木) 22:54   No:33807     
Title: Re:3Dポリゴンの無限遠点について    
 いいサンプルが過去ログにありました。

C言語何でも質問掲示板 - DrawPolygon3D関数について
ttp://www.play21.jp/board/formz.cgi?action=res&resno=26917&page=&lognum=85&id=dixq&rln=26993

 あとは実際にいろいろ試してみてください。


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

Name: チルチル  ..中級者(14,856ポイント)   Date: 2009/05/22(金) 00:38   No:33821     
Title: Re:3Dポリゴンの無限遠点について    
これはいいサンプルですね、
どうもありがとうございます

ところで他のトビを見て思ったんですが
DXライブラリで3Dポリゴンを使う時は
3D世界みたいな物が作られているのでしょうか?
そうだとすると極端な話、画面を裏側から見たような処理ができたりしますか?


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

Name: Justy  ..伝説なるハッカー(360,763ポイント)   Date: 2009/05/22(金) 03:25   No:33831     
Title: Re:3Dポリゴンの無限遠点について    

>3D世界みたいな物が作られているのでしょうか?

 最終レンダリング結果こそ(ウインドウの中なので)2Dですが、計算は3Dで行われるので、
3D世界は作られています。



>そうだとすると極端な話、画面を裏側から見たような処理ができたりしますか?

 画面の裏側、というのはカメラを通して見ている対象の側からこちらを見た絵、
ということでしたら、DXライブラリでも可能です。

 カメラの位置と向きを変えれば複数のオブジェクトのどこでも好きなところを
見ることができます。


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

Name: チルチル  ..上級者(15,123ポイント)   Date: 2009/05/22(金) 17:30   No:33868     
Title: Re:3Dポリゴンの無限遠点について    
DXライブラリは3D機能は多くないと思っていましたが、
意外と色々できるんですね。

と言う事は画面に立体的な迷路を描画した後に、
カメラを動かして進んで行ったりとかもできるんでしょうか。

廊下を曲がる所などはそうでもしないと難しいし・・

普通の3Dゲームみたいに視点を回転させたり近づけたりとかもできますか?

仮にできるとしても、立体的なフィールドを一つ一つ構造体で宣言したり
視点を変えるたびにソートしたり座標をいじるのは大変ですよね・・

何か最初にフィールドの立体的な地図みたいな物を設定できないでしょうか?


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

Name: Justy  ..伝説なるハッカー(361,166ポイント)   Date: 2009/05/22(金) 23:28   No:33882     
Title: Re:3Dポリゴンの無限遠点について    

>DXライブラリは3D機能は多くないと思っていましたが、
>意外と色々できるんですね。

 元が DirectXですからね。



>と言う事は画面に立体的な迷路を描画した後に、
>カメラを動かして進んで行ったりとかもできるんでしょうか。
>普通の3Dゲームみたいに視点を回転させたり近づけたりとかもできますか?

 それくらいなら問題なく出来ます。



>仮にできるとしても、立体的なフィールドを一つ一つ構造体で宣言したり
>視点を変えるたびにソートしたり座標をいじるのは大変ですよね・・

 大変、といえば大変ですが慣れでしょう。

 フィールドのデータは大抵は3Dのモデラーツールを使ってデータを作るので、
手打ちすることは希です。

 視点の変更に伴う処理も確かにソートはなんだかんだで必要ですが
一度システム化してしまえばあとは自動ですし、座標をいじる云々も
大抵はオブジェクト毎の行列計算だけなので、慣れればどうということはないかと。



>何か最初にフィールドの立体的な地図みたいな物を設定できないでしょうか?

 ちょっとよく意味がわからないのですが……?


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

Name: チルチル  ..上級者(15,309ポイント)   Date: 2009/05/23(土) 00:07   No:33883     
Title: Re:3Dポリゴンの無限遠点について    
となりのトビに「ワールド行列」という言葉が出てきました
意味は分かりませんが、そんな感じじゃないでしょうか・・

つまり初期座標を最初に設定して
以降はカメラの位置を変更するたびに
カメラとの位置関係とかから
自動的にソートとかをしてくれる
機能はないかな〜
って事です・・

ちなみにカメラの位置とか向きはどうやって変えればいいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(361,548ポイント)   Date: 2009/05/23(土) 01:52   No:33888     
Title: Re:3Dポリゴンの無限遠点について    

>以降はカメラの位置を変更するたびに カメラとの位置関係とかから
>自動的にソートとかをしてくれる機能はないかな〜

 まぁ、ないですねぇ。
 
 不透明ものならZバッファを使って(ソートをしなくても)
きちんと正しく前後の重なり表現することができますが、透明ものは自分でソートして
描画する機能を作ることになりますね。

 一口にソートと言ってもどういうデータ構造でどういう判断基準でソートしてどう描画するのかが
状況によって変わるので、万人が使えるような汎用化はちょっと難しいですから。



>ちなみにカメラの位置とか向きはどうやって変えればいいのでしょうか

 DXライブラリで、ということであれば SetTransformToView()がそうです。
 この関数にカメラ行列を入れればそれで視点と向きを変えられます。
 
 先の「となりのトピ」でサンプルを出してます。
 あちらは、操作対象であるオブジェクトを後ろから追跡するようなカメラになっていますので、
それを参考にして頂ければと思います。


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

Name: チルチル  ..上級者(15,342ポイント)   Date: 2009/05/23(土) 02:14   No:33889     
Title: Re:3Dポリゴンの無限遠点について    
う〜ん、難しそうですね・・

ちなみに「Zバッファ」と「カメラ行列」とは何でしょうか?


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

Name: Justy  ..伝説なるハッカー(361,898ポイント)   Date: 2009/05/23(土) 02:39   No:33890     
Title: Re:3Dポリゴンの無限遠点について    

>Zバッファ

Zバッファ - ゲームプログラミングWiki
ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?Z%A5%D0%A5%C3%A5%D5%A5%A1

 一口でいえば、今書かれている絵のZ情報を覚えておいて、これから描こうとしている
絵のZ情報と比較して手前にある部分だけ描こうとする機能です。

 これを使えば不透明なものに関してはソートしなくても、自動的に手前にあるものだけが
上書きされていくので、正しい前後関係が表現できます。

 DXライブラリでは SetUseZBufferFlag() / SetWriteZBufferFlag()の2つで設定できます。



>カメラ行列

 ビュー行列ともいいますが、カメラの位置、視線の方向などを行列で表したものです。
 もし行列、という言葉を聞いたことない場合はちょっと難しいかもしれません。

3D座標変換 - ゲームプログラミングWiki
ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?3D%BA%C2%C9%B8%CA%D1%B4%B9

3Dプログラミングの前提知識
ttp://toshi104.odap.jp/cgi-bin/3Dprogram/


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

Name: チルチル  ..上級者(15,623ポイント)   Date: 2009/05/23(土) 09:07   No:33894     
Title: Re:3Dポリゴンの無限遠点について    
「Zバッファ」は 自分で何かするのかと思いましたが
設定しておけるんですね

ところで描画する画像が一部でも手前に来るべき画像に重なっていたら描画されないのでしょうか?
それだと背景が欠けてしまいますよね・・

それとも重なっている部分にはマスクのような物が働くのでしょうか?

サイトを見る限りポリゴン以外にも使えるようですが
「Zバッファ」は何に対して設定しておくものなんですか?

SetUseZBufferFlag()とSetWriteZBufferFlag()の引数と戻り値と使い方を教えて下さい

行列は知らなかったですが、この場合は係数を決まった順番で並べた物・・かな?

よく考えたらブロックを描画する時なんかはポリゴン12枚必要って事ですよね・・


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

Name: Justy  ..伝説なるハッカー(362,316ポイント)   Date: 2009/05/23(土) 14:22   No:33906     
Title: Re:3Dポリゴンの無限遠点について    

>それだと背景が欠けてしまいますよね
>それとも重なっている部分にはマスクのような物が働くのでしょうか?

 判定はピクセル単位で行われますので、後から描こうとしたものが
奥にあると判定されたら(※)その部分は描き込まれません。

 なので、結果的にマスクのようになると考えていいと思います。

※手前だったら等判定方法は変更可能
 


>サイトを見る限りポリゴン以外にも使えるようですが
>「Zバッファ」は何に対して設定しておくものなんですか?

 ポリゴン、というかプリミティブ描画(点、ライン、トラアングルなど)全般に使えます。
 設定は・・・・・・ライブラリと GPUに対してですね。



>SetUseZBufferFlag()とSetWriteZBufferFlag()の引数と戻り値と使い方を教えて下さい

 TRUEで有効、FALSEで無効です。


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

Name: チルチル  ..上級者(15,788ポイント)   Date: 2009/05/23(土) 15:49   No:33910     
Title: Re:3Dポリゴンの無限遠点について    
あ、以外に引数一つなんですね
ではSetUseZBufferFlag()とSetWriteZBufferFlag()の違いはなんでしょうか?

プリミティブ描画全般に使えるって事は
特に設定が必要ってわけではないんですか?

と言う事は3Dポリゴンは構造体にZ座標が入っていますから
それで勝手にマスク的なものをかけてくれるのでしょうか?

それなら3D背景を描画する時に遠い方から順番に描画する必要も無いんでしょうか?

ピクセル単位って事は今まで無理だと思っていた
クラッカーの中身が出る所みたいな物が描画できるんですか?
全方位に円弾幕を撃つと最後に登録した弾だけ目立っちゃうじゃないですか・・


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

Name: Justy  ..伝説なるハッカー(362,983ポイント)   Date: 2009/05/23(土) 16:11   No:33911     
Title: Re:3Dポリゴンの無限遠点について    

>ではSetUseZBufferFlag()とSetWriteZBufferFlag()の違いはなんでしょうか?

 前者はZバッファを使用して比較を行うかどうかの設定で、後者は判定が合格した場合、
Zバッファを更新するかどうかの設定です。

 概念的には DirextXや OpenGLと同じなので、詳しくは 3Dプログラミング系の
書籍なり Webなりを調べてみてください。
 


>それで勝手にマスク的なものをかけてくれるのでしょうか?

 その時点で設定されていたワールド行列やカメラ行列にもよるので、
指定したZ値そのもので比較が行われるわけではないですが、そうです。



>それなら3D背景を描画する時に遠い方から順番に描画する必要も無いんでしょうか?

 不透明ものならそうです。

 逆に言えば、透明ものは必要があります。

Zバッファと半透明の相性問題 - Selene
ttp://selene-lue.halfmoon.jp/index.php?%EF%BC%BA%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%A8%E5%8D%8A%E9%80%8F%E6%98%8E%E3%81%AE%E7%9B%B8%E6%80%A7%E5%95%8F%E9%A1%8C



>クラッカーの中身が出る所みたいな物が描画できるんですか?
>全方位に円弾幕を撃つと最後に登録した弾だけ目立っちゃうじゃないですか・

 今ひとつニュアンスが読み取れないのですが、前者は可能でしょう。
 後者は最後に描画したものが目立つのはまだ別問題だと思いますが・・・。


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

Name: チルチル  ..上級者(15,720ポイント)   Date: 2009/05/23(土) 16:53   No:33914     
Title: Re:3Dポリゴンの無限遠点について    
Zバッファを更新ってどういうことでしょうか?

まあ、別問題ですができない事もないでしょうね・・
うまく交差するか分かりませんが・・


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

Name: Justy  ..伝説なるハッカー(362,992ポイント)   Date: 2009/05/23(土) 19:43   No:33932     
Title: Re:3Dポリゴンの無限遠点について    

>Zバッファを更新ってどういうことでしょうか?

 Zバッファを使って手前にあるか奥にあるかを判定して、手前にあるなら
そのピクセルを描画するわけですが、その際新しく上書きするピクセルのZ情報を更新しないと、
次に描画するときに古いZ情報を元に判定・描画することになってしまいます。

 その更新処理をするかどうか、です。


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

Name: チルチル  ..上級者(15,725ポイント)   Date: 2009/05/23(土) 22:28   No:33937     
Title: Re:3Dポリゴンの無限遠点について    
Z座標が変化していく場合とかですか?

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

Name: Justy  ..伝説なるハッカー(363,431ポイント)   Date: 2009/05/23(土) 23:13   No:33938     
Title: Re:3Dポリゴンの無限遠点について    

> Z座標が変化していく場合とかですか?

 たとえばZバッファが奥行き10(数字が大きいほど奥にあるとして)だったときに、
奥行き5で絵を描いたらZバッファを更新しなかった場合10のままとなり、
次に奥行き7の絵を描いたら5の時の絵が消えてしまうのを防ぐために、
5を描いたらZバッファも5に更新する、為のものですね。


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

Name: チルチル  ..上級者(15,809ポイント)   Date: 2009/05/24(日) 00:33   No:33942     
Title: Re:3Dポリゴンの無限遠点について    
あ〜なるほど

ところで更新はいつやればいいのでしょうか?
フラグを立てておけば何か描画するたびに更新されるんですか?

ちなみに更新しても7の絵で10の絵は消えてくれるのでしょうか


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

Name: Justy  ..伝説なるハッカー(364,355ポイント)   Date: 2009/05/24(日) 00:51   No:33948     
Title: Re:3Dポリゴンの無限遠点について    

>フラグを立てておけば何か描画するたびに更新されるんですか?

 ええ、設定しておけば勝手に更新されます。


>更新しても7の絵で10の絵は消えてくれるのでしょうか

 10の上に7で描けば10の絵は上書きされて消えます。
 5で更新されたところに、7で描こうとしても描かれないので5の絵は消えません。


 なお蛇足ですが、DXライブラリのヘッダを「比較モード」検索すると幾つか定義があります。
 この定義と SetZBufferCmpType関数を使って比較の方法を決めることができますので、
反対に奥にあったときだけ描く、といった使い方もできます。


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

Name: チルチル  ..上級者(16,506ポイント)   Date: 2009/05/24(日) 01:03   No:33950     
Title: Re:3Dポリゴンの無限遠点について    
なるほどそういう使い方もあるんですね

SetTransformToView()はこの前のサンプルでも使われていた気がしますが
カメラ行列はどういう内容でしょうか?
ちなみにどこが原点でどこが初期位置ですか?

あとやっぱりブロックを描画する時なんかはポリゴン12枚必要ですよね?


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

Name: Justy  ..伝説なるハッカー(364,585ポイント)   Date: 2009/05/24(日) 01:23   No:33957     
Title: Re:3Dポリゴンの無限遠点について    

>カメラ行列はどういう内容でしょうか?

 カメラの位置と姿勢(向き)を表す4X4の行列になっています。



>ちなみにどこが原点でどこが初期位置ですか?

 原点は [X, Y, Z] = [0, 0, 0]でしょう。
 ただ、DXライブラリのカメラの初期位置は2D座標系に合わせて
z = 0.0 の時に画面全体が写る位置と方向を持つカメラになるように
なっていたと思うので、原点とは少しずれた位置にあったはずです。



>あとやっぱりブロックを描画する時なんかはポリゴン12枚必要ですよね?

 ブロックというのは四角柱のことですか?
 三角形ポリゴンなら2×6ですので、12で合ってます。


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

Name: チルチル  ..上級者(16,666ポイント)   Date: 2009/05/24(日) 15:57   No:33987     
Title: Re:3Dポリゴンの無限遠点について    
4X4と言う事は16個の数値を引数にすると言う事ですか?

ちなみに16個の数値の内容はどうなっていますか?


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

Name: Justy  ..伝説なるハッカー(365,191ポイント)   Date: 2009/05/25(月) 00:06   No:34009     
Title: Re:3Dポリゴンの無限遠点について    

>4X4と言う事は16個の数値を引数にすると言う事ですか?

 そうなのですが、これはヘッダを見ればすぐに解決する問題ですよね。



>ちなみに16個の数値の内容はどうなっていますか?

2.ビュー変換
ttp://homepage2.nifty.com/skimp-studio/htm/crawl/1_9_transform4.htm#1-9.2
 こういう内容になっています。


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



Name: すずめ  ..かけだし(1,191ポイント)   Date: 2009/05/24(日) 09:04   No:33966       
Title: レーザーの画像が残る    
こんにちは、いつもお世話になっています。
龍神録プログラミングの館の35章以降なんですが、
bossの弾幕でレーザーが発射されている時のことです。
レーザーが発射された状態でbossのhp(体力)がゼロになるとき、
つまり画面上のメーターがゼロになる時、次の弾幕に
移ってもレーザーの画像が残ったままになります。

レーザーを売っていない状態で次の弾幕に移るときは
大丈夫です。

まだ初心者なものですから、この章あたりまでくると
何度読み直しても分かりません。

ためしに、lazer[0].cntを表示したところ、
lazerは320カウントで繰り返しています。
lazerが発射されていない時にメーターがゼロになると
カウントは320で止まったままで次の弾幕に移ります。
lazerが発射された状態でメーターがゼロになると
カウントはカウントしつづけ、lazerの画像が残ったまま
次の弾幕に移ります。

lazer[i].cnt++;が記述されているところも見つけられませんでした。

アドバイスをお願いします。


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


Name: yu  ..プログラマー(27,963ポイント)   Date: 2009/05/24(日) 09:17   No:33968     
Title: Re:レーザーの画像が残る    
レーザーが初期化されていないのではないでしょうか?

memset(lazer,0,sizeof(lazer_t)*LAZER_MAX);

を適当な場所に書いてやるといいと思います

#追記
#35章だとboss_shot.cpp内の167行当たりに挿入してやればよいと思います。


後、レーザーをカウントしている場所は
shot.cpp 内の lazer_calc() の中 です


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

Name: すずめ  ..かけだし(1,286ポイント)   Date: 2009/05/24(日) 11:40   No:33970     
Title: Re:レーザーの画像が残る    
返信ありがとうございます。

何箇所か入れてみたんですが、だめでした。

//ボスの弾幕メイン

void boss_shot_main(){
if(stage_count==boss.appear_count[0] && boss.flag==0){//開始時間なら
enter_boss(0);//開始
//反魂蝶のBGMを流す場合はload.cppを変更後、ここの注釈を外してください。
// PlaySoundMem(sound_se[99],DX_PLAYTYPE_BACK);
}
if(boss.flag==0)//ボスが登録されて無ければ戻る
return;
calc_boss();
if(boss.phy.flag==1)//物理演算移動オンなら
calc_phy();//物理計算を

if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
se_flag[1]=1;//敵のピチュリ音
se_flag[11]=1;
// ここに入れてもだめでした。
enter_boss(1);//次の弾幕を登録
// ここに入れてもだめでした。
}
if(boss.state==1){//弾幕間の待機時間

waitandenter();
// ここに入れてもだめでした
}
if(boss.state==2){//弾幕中なら
boss_shot_bullet[boss.knd]();//弾幕関数へ
boss_shot_calc();//弾幕計算
}
boss.cnt++;
}

入れた場所が悪かったのかもしれません。
なお、35章のサンプルをそっくりそのまま使用したので
memset(lazer,0,sizeof(lazer_t)*LAZER_MAX);は
ini.cppのini()に記述されています。
ここの製作者には大変お世話になっているので失礼なんですが、
バグということはないんでしょうか。
この章を勉強されたほかの人には、この症状が
でないんでしょうか。

lazer[i].cnt++は、boss_shot.cppとboss_shotH.cppばかり
探していたのできずきませんでした。
ありがとうございました。


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

Name: pooka  ..入門者(3,887ポイント)   Date: 2009/05/24(日) 11:57   No:33971     
Title: Re:レーザーの画像が残る    
ttp://www.play21.jp/board/formz.cgi?action=res&resno=33007&page=&lognum=101&id=dixq&rln=33065
ここの最後の当たりは参考になりませんか?

#追記
yuさんの書かれているあたり(enter_boss(1);の前)に書いてみたら消えたのですが、すずめさんは消えてないみたいですね・・・


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

Name: すずめ  ..かけだし(1,405ポイント)   Date: 2009/05/24(日) 12:33   No:33973     
Title: Re:レーザーの画像が残る    
同じ質問があったんですね。
たいへん失礼しました。
実はその質問も途中まで読んでいたんですが、
別の問題だと思って最後まで読みませんでした。
最後のほうに、私と同じトラブルが書かれていたとは
きずきませんでした。
参考にさせていただきます。


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

Name: すずめ  ..かけだし(1,562ポイント)   Date: 2009/05/24(日) 13:14   No:33976 解決!     
Title: Re:レーザーの画像が残る    
新しく35章をすべてサンプルを使用して
作り直して試してみました。

yuさん、pookaさんの言うとおり
enter_boss(1)の前に書いたら
見事に消えました。

いままでは簡単なシューティングゲームなどを
作っていたので、memsetなど使ったことがなく
たいへん勉強させていただいています。

これからもよろしくお願いします。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,025,072ポイント)   Date: 2009/05/24(日) 20:29   No:33997     
Title: Re:レーザーの画像が残る    
すみません、初期化漏れですorz
配布用のコード全部修正しておきます^^;

いやはや何か間違いがあると直すのにスーパー苦労するので大変です(汗
一括置換は他のトラブルを招きそうで怖いし・・。


これからも何か間違いなどありましたがご指摘お願いしますm(_ _;)m


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

Name: すずめ  ..かけだし(1,629ポイント)   Date: 2009/05/24(日) 23:49   No:34007     
Title: Re:レーザーの画像が残る    
管理人さん、いつもお世話になっています。
いままでやりたくでもできなかったことも
100倍くらいのことが分かりやすく解説されて
いるので、ここ数ヶ月毎日勉強させてもらっています。
ほんとにありがとうございます。


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



Name: yu  ..プログラマー(27,252ポイント)   Date: 2009/05/22(金) 12:58   No:33853       
Title: 複数面のつなげ方    
ここのサイトのプロジェクトを参考にしてシューティングゲームを作っています。
複数ステージを作り、ステージ1をクリアしたらステージ2へ…というようにステージを繋げて遊べるようにしたいです。
どのようにすればできるでしょうか。

アドバイスお願いします。


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


Name: ひよこ  ..プログラマー(32,289ポイント)   Date: 2009/05/22(金) 14:34   No:33861     
Title: Re:複数面のつなげ方    
かんたんな考え方ですけど
参考になるでしょうか・・・・

まずステージを表す数を作り
スイッチ文で
stage[]

ケース0
初期化

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

ケース2 1面
ラスボスが倒されたら
stage[]の中身を増やしケース1へ
って感じでいいんでしょうかね。


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

Name: yu  ..プログラマー(27,316ポイント)   Date: 2009/05/22(金) 16:12   No:33865     
Title: Re:複数面のつなげ方1    
アドバイスありがとうございますm(__)m
その方法でやってみようと思います。

この場合、各ステージの道中やボスの分岐はどのようにすればいいのでしょうか?


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

Name: ひよこ  ..プログラマー(32,445ポイント)   Date: 2009/05/22(金) 17:21   No:33866     
Title: Re:複数面のつなげ方1    
こういうのでよろしいのでしょうかね・・・
ケース0
最低限の初期化

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

ケース2 
1面の内容(敵のデータ、音楽など)をロード
ケース3
1面
ラスボスが倒されたら
ケース2のデータを削除
stage[]の中身を増やしケース1へ

ケース4 
2面の内容(敵のデータ、音楽など)をロード
ケース5
2面
ラスボスが倒されたら
ケース2のデータを削除
stage[]の中身を増やしケース1へ

繰り返し

自分にはこれしか思いつきませんね。


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

Name: ひよこ  ..プログラマー(32,516ポイント)   Date: 2009/05/22(金) 17:23   No:33867     
Title: Re:複数面のつなげ方1    
なんかプログラムが変でした。
まちがい

ケース1
stage[0]だったら1面へ
stage[2]だったら2面へ

修正後

ケース1
stage[0]だったら1面へ
stage[1]だったら2面へ

あくまで参考に・・・してください。


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

Name: yu  ..プログラマー(27,339ポイント)   Date: 2009/05/22(金) 17:46   No:33870     
Title: Re:複数面のつなげ方1    
実装してみたいと思います。

ありがとうございました!


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

Name: ひよこ  ..プログラマー(32,638ポイント)   Date: 2009/05/22(金) 18:05   No:33871     
Title: Re:複数面のつなげ方1    
シューティングゲームができるの楽しみに待ってます。

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

Name: yu  ..プログラマー(27,445ポイント)   Date: 2009/05/22(金) 20:10   No:33875     
Title: Re:複数面のつなげ方1    
同じ名前の方がw

自分は一つ一つケースで分けるのではなくて
ステージに番号を付けて処理しました。
後はその番号に合わせて画像や敵情報をロードしました。

しかし、自分のやりやすい方法で良いと思います。


後、ひよこさんに対してですが、
stageは配列じゃなくてもいいんじゃないでしょうか?

stage++;

で大丈夫だと思います。

ステージを 0→1→4→2
のように繋げるのならそちらのほうで良いと思いますが

#追記
#配列なんてどこにも書いてありませんでした・・・
#勝手なこと言ってすみません;


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

Name: yu  ..プログラマー(27,666ポイント)   Date: 2009/05/22(金) 23:18   No:33881     
Title: Re:複数面のつなげ方11    
質問させていただいた方のyuです。
名前同じでしたね(笑

獲得ポイントや精進状態が共有されてしまっているようなのですが、名前を変えた方がいいでしょうかf^_^;


さて
回答ありがとうございます。
ステージ自体の分岐のさせかたは分かりましたが、具体的なステージの内容の分岐について分からない所が出てしまったので質問させてください。
データを読み込む系(BGMや道中のcsvデータ)の分岐は、多分、ステージごとに、読み込むファイルの種類を変えてやればいいのかなと思います。
しかし、ボス関連のデータの分岐がわかりません。
(一面ではこのボスがでてきてこんな攻撃をしてくる。二面ではこのボスが出てきてこんな攻撃をしてくる。…というような分岐です)
boss_shot.cppで処理をすればいいのでしょうか。


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

Name: BEMANI  ..プログラマー(30,417ポイント)   Date: 2009/05/23(土) 01:35   No:33887     
Title: Re:複数面のつなげ方1    
>>親記事のyuさん

>ボス関連のデータの分岐がわかりません
BGM等のデータが分岐できるのであれば考え方は同じだと思います。
例えば・・・

1面:1面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・
2面:2面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・
3面:3面ボスの情報、攻撃パターン関数1, 2, 3, 4・・・

このようにステージ毎に完全に分けて実装するという手段があります。
似たような攻撃で関数を二つ作るのはどうかな〜と感じた時は
引数で変えれるように実装したりするといいと思います。

>boss_shot.cppで処理をすればいいのでしょうか
boss_shot.cppで全て処理する必要はないです。
必要であれば、yuさんがファイルを追加しても構いません。(Stage1_Boss.cpp・Stage2_Boss.cpp等)


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

Name: yu  ..プログラマー(27,686ポイント)   Date: 2009/05/23(土) 07:28   No:33893     
Title: Re:複数面のつなげ方1    
回答ありがとうございます。
ファイルを増やす方法でいってみようと思います。


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

Name: yrao [URL]  ..ぴよぴよ(368ポイント)   Date: 2009/05/24(日) 15:48   No:33985     
Title: Re:複数面のつなげ方1    
質問者の方のyuです
名前が被ってしまっていたので変えました。



データの読み込みについて質問です。

例えば、load.cpp内に
load.cpp()
…ゲームボードや弾画像など、全ステージ共通のデータの読み込み
load_stage_1()
…一面で使うBGMや敵のドット絵の読み込み
load_stage_2()
…二面で使うBGMなどの読み込み

を作り、main.cppで

case0 :
load();



case99 ://一面初期化
load_stage_1();


case100 ://一面開始




case199 ://二面初期化
load_stage_2();


case200 ://二面開始




…としていく場合に、一面が終わった時、load()はそのままにしてload_stage_1()の読み込みを消し、load_stage_2を読み込みたいのですがどうすればよいでしょうか。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,024,586ポイント)   Date: 2009/05/24(日) 20:13   No:33994     
Title: Re:複数面のつなげ方1    
私もyuさんと同じく、caseで分けるのではなく、ステージに番号を付けて、その番号に合わせてデータをロードするようにしています。

龍神録は通常5面+EXステージ+ファンタズムステージなんですが、
計算上EXは6面、ファンタズムは7面という考え方でした。

敵の出現データやHP、その他諸々の情報が書かれている
1面の情報を持った
1.dat
というファイル、
2面の情報を持った
2.dat
というファイル、、、
このように作っておけば現在のステージ数を表すStageという変数があったならば

sprintf(FileName, "%d.dat", Stage);
fopen(FileName, "rb");
fread....

といった処理が出来て便利では無いかと思います。

基本的に「何か特別な変数を沢山用意する」とか「様々な新しい考え方を取り入れないと
複数ステージが作れない」とかってことは無いと思います。
データのロードが個別に行えたのなら、今まで使っていた
敵の出現情報であったりする部分に今まで通り代入すればいいだけです。

ただ、ゲームに関わるデータを変数宣言と同時に格納している部分があればそれを
ファイルからロード出来るように変更して下さい。
そうすることで、色々な変数が使いまわせます。

後、違うとするならば、ini関数で初期化する時に全部初期化しないように気をつけること位でしょうか。
例えば、ゲームの仕様にもよりますが、自機の残機数データやスコアデータ、現在のステージ数のデータなんかまで一緒に
初期化してしまうと最初の状態戻ってしまいます。

その辺気をつけたら大丈夫だと思います。


>>一面が終わった時、load()はそのままにしてload_stage_1()の読み込みを消し、load_stage_2を読み込みたいのですがどうすればよいでしょうか。

load_stage_1で読み込んだデータを消去する関数
delete_stage_1なるものを用意し、load_stage_2が呼ばれる前に呼んでやればいかがでしょうか?


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

Name: yrao  ..ぴよぴよ(477ポイント)   Date: 2009/05/24(日) 21:01   No:33999     
Title: Re:複数面のつなげ方111    
ありがとうございますm(__)m

難しいですね…
このサイトで初めてプログラミングに触れたもので、基本的な所が分からなかったりするんです;

最後の、『読み込んだデータを削除する関数』について詳しく教えていただけませんでしょうか。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,025,266ポイント)   Date: 2009/05/24(日) 21:09   No:34000     
Title: Re:複数面のつなげ方11    
難しいことではないですよ。

例えばImageAという名前の変数にAという画像をロードしたとしましょう。
ロード関数では

ImageA = LoadGraph(A);

とロードしているかもしれません。ならば消去する時は

DeleteGraph(ImageA);

で消せますよね。
ですからもし仮にload_stage_1で

ImageA = LoadGraph(A);
ImageB = LoadGraph(B);
ImageC = LoadGraph(C);

してるならdelete_stage_1内で

DeleteGraph(ImageA);
DeleteGraph(ImageB);
DeleteGraph(ImageC);

すればいいというただそれだけのことです。


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

Name: yrao  ..ぴよぴよ(393ポイント)   Date: 2009/05/24(日) 21:27   No:34003     
Title: Re:複数面のつなげ方1    
ありがとうございます、助かりました<(__)>

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

Name: yrao  ..ぴよぴよ(543ポイント)   Date: 2009/05/24(日) 23:05   No:34006     
Title: Re:複数面のつなげ方1    
先程教えてもらったデータの削除ですが、csvデータの読み込みをしているload_story()の場合はどのようにすればいいでしょうか。画像の読み込み、削除と同じようにできますか?

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



Name: Acodic  ..ぴよぴよ(39ポイント)   Date: 2009/05/23(土) 17:13   No:33917       
Title: 製作後の配布した場合について    
はじめましてAcodicです。

あるゲームを作ったとき、sln,vcproj,ncb,h,cpp,exe,pdb等色々な拡張子のファイルが作られますよね。
そのゲームをCD配布するときに、CDに入れなければならないファイルはどのファイルですか?

Cを最近始めて、知識が薄いので分かりづらい所もあると思いますが
よろしくおねがいします。


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


Name: たかぎ [URL]  ..ハッカー(101,603ポイント)   Date: 2009/05/23(土) 18:50   No:33927     
Title: Re:製作後の配布した場合について    
> あるゲームを作ったとき、sln,vcproj,ncb,h,cpp,exe,pdb等色々な拡張子のファイルが作られますよね。

環境次第です。

> そのゲームをCD配布するときに、CDに入れなければならないファイルはどのファイルですか?

ソースで配布するのか、バイナリだけなのかにもよりますし、どんなプラットフォームに対応するのか、使用したライブラリは何か、データファイル等はどんなものを使うのか等々に依存します。


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

Name: チルチル  ..上級者(16,002ポイント)   Date: 2009/05/24(日) 00:41   No:33946     
Title: Re:製作後の配布した場合について    
まあ環境次第だと思いますが

DXライブラリの場合はexeファイルと
使用している画像データとか音楽データを
入れたファイルをアーカイブした物だけ
入れておけばいいんじゃないでしょうか


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

Name: Acodic  ..ぴよぴよ(85ポイント)   Date: 2009/05/24(日) 23:03   No:34005 解決!     
Title: Re:製作後の配布した場合について    
ご丁寧なご説明ありがとうございます。
環境次第ですか。
色々と知人と交換してみてみます。


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



Name: 山崎  ..初心者(7,878ポイント)   Date: 2009/05/24(日) 17:46   No:33989       
Title: 文字間隔をあまり取らないフォントについて    
お世話になっております、山崎です。
今回は、ゲームに使用するフォントについてお伺いに参りました。

ただいま、RPG風のアイテムウィンドウやメッセージウィンドウを作成しております。
文字列を描画する際、文字の間隔が広すぎて、1行にせいぜい20〜30文字程度しか書くことができません。
1行に複数のアイテム名やその所持数を描画したいので、文字の左右の間隔をもう少し詰めて、
1行あたりの文字数をもう少し増やしたいと思っています。
フォントサイズ15でアイテム名を描画できる幅を250ピクセル程度にすると、
長いアイテム名だと全て書ききることができません。

いくつかスーパーファミコンのゲームの文字列などを参考にしているのですが、
ほとんどは文字の間隔はごくわずかか、端がくっつくくらいの間隔になっていました。
そのくらいの文字の間隔を実現できれば、と思っています。

各ウィンドウに描画するフォントサイズは15〜22程度、太さは0にしております。
フォントハンドルを作成する際、フォントはNULLを指定しています。
文字が小さくなって読みづらくなるのを避けるため、
且つウィンドウのサイズとの兼ね合いのため、フォントサイズの変更は難しいです。
また、どのパソコンにもあらかじめ用意されているフォントを使用したいと思っています。

どんなフォントを使用すれば、あるいはどのような手法を用いれば、
描画する文字の間隔を詰めることができるでしょうか。
皆様の愛用のフォントがあれば教えて頂きたいと思います。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,023,938ポイント)   Date: 2009/05/24(日) 19:49   No:33992     
Title: Re:文字間隔をあまり取らないフォントについて    
ワードで範囲指定して、色んなフォントにしたりして、自分の気に入ったフォントを見つけてみてはどうでしょう?
一緒に同梱可能なフォントで、ということなら、素材屋さんを回るのがいいかと思います。

後、間隔が広いフォントだとしても、強引に自分で詰めて表示するという手もあるかもしれません。
例えば

「今日はいい天気」

という文章なら「今」を0ピクセル目に表示し、「日」を12ピクセル目に表示し、「は」を12*2ピクセル目に表示し・・・「気」を12*6ピクセル目に表示するといった具合です。
効率的な方法かどうかはわかりませんが・・。


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

Name: 山崎  ..初心者(7,993ポイント)   Date: 2009/05/24(日) 20:41   No:33998 解決!     
Title: Re:文字間隔をあまり取らないフォントについて    
管理人様
なるほど、ワードで見てみるという手があるのですね・・・。
簡単にできる方法だけに、恥ずかしながら思いつきませんでした。
やはり自分で実際に見て決めるのが一番いいのですね。

1文字ずつ描画するという手法も是非参考にしたいと思います。

ありがとうございました。


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



Name: pic  ..ぴよぴよ(421ポイント)   Date: 2009/05/23(土) 21:40   No:33934       
Title: 2Dのよこ    
こんばんわ。
初歩的な質問ですいませんが、スーパーマリオブラザーズみたいな横スクロールアクションでのマップは
ゲームプログラミングの館[24. 行けない所を作る。〜2D〜]のように0と1で作成するのが基本なんでしょうか?


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


Name: チルチル  ..上級者(16,571ポイント)   Date: 2009/05/24(日) 01:09   No:33954     
Title: Re:2Dのよこ    
基本かどうかはわかりませんが
単に行けるかどうかだけを格納するなら
0と1で良いと思います
でも何があるかも同じ配列に格納するなら
当然0と1ではダメですね
マリオ系なら水中とかもあると思うし
あまり固定観念を持たない方が良いんじゃないでしょうか


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

Name: pic  ..ぴよぴよ(440ポイント)   Date: 2009/05/24(日) 09:13   No:33967 解決!     
Title: Re:2Dのよこ    
回答ありがとうございます。
頑張ってみます


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,024,852ポイント)   Date: 2009/05/24(日) 20:22   No:33996     
Title: Re:2Dのよこ    
基本なのかこれが正当な方法なのかわかりませんし、これは単に私の我流なので、全くあてになりませんが、
私はそのようなアクションゲームを作るときはマップ情報にいける場所かどうかという情報をいれてやり、判定させています。
仰るとおり、0か1でもいいと思いますし、マップチップを使うなら、そのマップチップ自体に進入可能かどうかという情報を持たせてやってもいいかもしれません。


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



Name: MOT  ..ぴよぴよ(34ポイント)   Date: 2009/05/23(土) 22:24   No:33936       
Title: 虹の表現をするには?    
今、ゲームをDXライブラリで作っているのですが 
敵を倒したり弾にカスったりしたらケージが溜まるようなシステムを作っていて、
そのケージがマックスになったら、そのケージを虹色で流れるように描画したいのですが、
アルゴリズムが思いつきません。

どのようなアルゴリズムでプログラムすると綺麗に流れるでしょうか?

過去ログは探しましたが見落としているかもしれません
もし過去ログがあればそちらに誘導していただきたいと思います。

開発環境
OS:Windows Vista 32bit
コンパイラ:Microsoft Visual C++ 2008
使用ライブラリ:Dxライブラリ


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


Name: チルチル  ..上級者(16,228ポイント)   Date: 2009/05/24(日) 00:48   No:33947     
Title: Re:虹の表現をするには?    
私の知る限りグラデーションを変化させるには
3D、2Dポリゴンですが
グラデーションを作るためだけに
ポリゴンを使うのは面倒なので

DrawRectGraph関数を使ってみてはどうでしょうか?

DXライブラリ置き場に載っている関数ですが
グラフィックの指定矩形部分のみを描画できます
私は使ったことないですが、虹色の画像を用意しておいて
使用する領域をスクロールさせればグラデーションが変化するんじゃないでしょうか


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

Name: MOT  ..ぴよぴよ(114ポイント)   Date: 2009/05/24(日) 12:26   No:33972 解決!     
Title: Re:虹の表現をするには?    
チルチルさんありがとうございます。
DrawRectGraphっていう関数があったのは知りませんでした。
おかげで、綺麗にスクロールが出来ました。
本当にありがとうございます。


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

Name: チルチル  ..上級者(16,605ポイント)   Date: 2009/05/24(日) 15:44   No:33984     
Title: Re:虹の表現をするには?    
>>DrawRectGraph関数を使ってみてはどうでしょうか?
だけでは説明不十分かもしれないと思っていましたが
うまくスクロールできたようなので安心しました


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



Name: こめかみ  ..熟練のプログラマー(47,861ポイント)   Date: 2009/05/22(金) 12:41   No:33851       
Title: 二次元配列の0での初期化について    
環境VC++2008EEと最新版のDXライブラリの中のサンプルプログラムを改造し、
ライフゲームを作ろうと思って

640×480の画面に64×48のマス目を描画しようと


#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63
int field[FIELD_Y][FIELD_X] = {0};

このように初期化したのですが下段二行がチラホラとゼロクリアされていないようです。
FIELD_Yの値を49にすることで問題は回避できますが、
気になったので調べてみてもわかりませんでした。

初期化の仕方が間違っているのでしょうか。
ソースコードを載せますのでアドバイスいただけたら幸いです。ソースファイル名はtest.cppです。


#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE); // ウィンドウモードに指定
if( DxLib_Init() == -1 ){return (-1);} // DXライブラリ初期化処理、 エラーが起きたら直ちに終了

int field[FIELD_Y][FIELD_X] = {0};

/*
for(int j=1; j < FIELD_Y; ++j)
{
for(int i=1; i < FIELD_X; ++i)
{
field[j][i] = 1;
}
}
*/
SetDrawScreen(DX_SCREEN_BACK); //描画対象画面の指定


// メインループ
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)
{

ClsDrawScreen(); //画面の消去

int x=0,y=0;
int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);

/*
if(key & PAD_INPUT_UP ) y-=8;
if(key & PAD_INPUT_DOWN ) y+=8;
if(key & PAD_INPUT_LEFT ) x-=8;
if(key & PAD_INPUT_RIGHT) x+=8;
*/

for(int j=0; j <= FIELD_Y; ++j)
{
for(int i=0; i <= FIELD_X; ++i)
{
int x = i*10;
int y = j*10;

if(field[j][i] == 1)
{
DrawBox( x, y, x+9, y+9, GetColor(255,0,0) , TRUE ) ; // 赤い箱の描画
}
else
if(field[j][i] == 0)
{
DrawBox( x, y, x+9, y+9, GetColor(255,0,0) , FALSE ) ; // 赤い枠の描画
}
else
{
DrawBox( x, y, x+9, y+9, GetColor(255,255,255) , FALSE ) ; // 白い箱の描画
}

}
}

ScreenFlip(); //画面の切り替え

}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // 終了
}




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


Name: こめかみ  ..熟練のプログラマー(47,896ポイント)   Date: 2009/05/22(金) 12:47   No:33852     
Title: Re:二次元配列の0での初期化について    
あれ、投稿するソースにしてはちょっとゴチャゴチャしてると後から気づきました。

直してきます。


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

Name: こめかみ  ..熟練のプログラマー(48,431ポイント)   Date: 2009/05/22(金) 13:06   No:33854     
Title: Re:二次元配列の0での初期化について    
直してきました。

症状の画像も添付します。


#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63

#include "DxLib.h"

int x,y;
//描画用の座標変数

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE); // ウィンドウモードに指定
if( DxLib_Init() == -1 ){return (-1);} // DXライブラリ初期化処理、 エラーが起きたら直ちに終了

int field[FIELD_Y][FIELD_X] = {0};

SetDrawScreen(DX_SCREEN_BACK); //描画対象画面の指定


// メインループ
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)
{

ClsDrawScreen(); //画面の消去

for(int j=0; j <= FIELD_Y; ++j)
{
for(int i=0; i <= FIELD_X; ++i)
{
x = i*10;
y = j*10;
//行と列のナンバー×10でマスの座標をつくる

if(field[j][i] == 1)
{
DrawBox( x, y, x+9, y+9, GetColor(255, 0, 0) , TRUE ) ; // 赤い箱の描画
}
else
if(field[j][i] == 0)
{
DrawBox( x, y, x+9, y+9, GetColor(255, 0, 0) , FALSE ) ; // 赤い枠の描画
}
else
{
DrawBox( x, y, x+9, y+9, GetColor(255,255,255) , FALSE ) ; // 白い箱の描画
}

}
}

ScreenFlip(); //画面の切り替え

}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // 終了
}



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

Name: 初級者  ..初心者(6,225ポイント)   Date: 2009/05/22(金) 13:22   No:33855     
Title: Re:二次元配列の0での初期化について    
[0]〜[47]
の添字にアクセスしたければ、
配列の定義は[48]です。
基本中の基本です。


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

Name: こめかみ  ..熟練のプログラマー(48,458ポイント)   Date: 2009/05/22(金) 13:39   No:33857 解決!     
Title: Re:二次元配列の0での初期化について    
あれ、そうですね。
加えて、MAPのマスの数え方で何か勘違いしてたみたいです。

おかげさまで先に進めますありがとうございました。


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

Name:  ..ぴよぴよ(210ポイント)   Date: 2009/05/24(日) 13:23   No:33977     
Title: Re:二次元配列の0での初期化について    
int field[FIELD_Y][FIELD_X] = {0};
なのですが最後の配列しか0で初期化してないでしょうか?
すべての配列を初期化ししたいのでしたらZeroMemory関数を使うか


for(int i=0; i<FIELD_Y; i++){
for(int j=0; j<FIELD_X; j++){
field[i][j] = 0;
}
}

かかないとだめかもしれません


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

Name: pooka  ..入門者(3,981ポイント)   Date: 2009/05/24(日) 14:20   No:33979     
Title: Re:二次元配列の0での初期化について    
>int field[FIELD_Y][FIELD_X] = {0};
>なのですが最後の配列しか0で初期化してないでしょうか?
初期化子の数が要素数より少ない場合、残りは0で初期化されたと思うのでこれでいいと思います。

過去ログですが
ttp://www.play21.jp/board/formz.cgi?action=res&resno=21471&page=&lognum=68&id=dixq&rln=214711223279778


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



Name: null  ..かけだし(1,415ポイント)   Date: 2009/05/24(日) 00:28   No:33941       
Title: JAVAについてなんですが・・・    
ここでJAVAについての質問をするのはダメでしょうか?
詰まっているのですが、ここのような掲示板を見つけきれなくて・・・


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


Name: たいちう  ..プログラマー(28,917ポイント)   Date: 2009/05/24(日) 01:05   No:33951     
Title: Re:JAVAについてなんですが・・・    
ここの規約に、

> ●投稿する内容について
> 「C言語で何かわからない事についての質問」を、主としていますが、規制はありません。
> C言語関連以外でも自由に何でも質問してください。

とあるので、OKでしょう。
Javaでは↓が活発なようですが、よく知りません。

http://www.javaroad.jp/bbs/bbsindex.jsp


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

Name: たかぎ [URL]  ..ハッカー(101,649ポイント)   Date: 2009/05/24(日) 01:05   No:33952     
Title: Re:JAVAについてなんですが・・・    
> ここでJAVAについての質問をするのはダメでしょうか?

質問すること自体は問題ないと思いますよ。
ただ、回答できる人の絶対数が限られていますので、期待した結果になるかどうかはわかりません。


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

Name: null  ..かけだし(1,451ポイント)   Date: 2009/05/24(日) 01:35   No:33959 解決!     
Title: Re:JAVAについてなんですが・・・    
回答ありがとうございます。
教えて頂いたサイトで質問してみようと思います。
お手数かけました。


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



Name:  ..ぴよぴよ(174ポイント)   Date: 2009/05/24(日) 01:23   No:33956       
Title: DXライブラリの整理    
DXライブラリを使ってゲームを作っています。
ちょうど2作目を作ろうと思い新規にDLしたものを解凍しました。

毎回、気になっていたのですが解凍した時にできる
object file 〜を別のフォルダに入れてソースの整理をすることはできないのでしょうか?

よろしくおねがいします。


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




Name: TKOZ  ..上級者(22,593ポイント)   Date: 2009/05/14(木) 21:26   No:33443       
Title: 初代マリオカート、もしくは初代F-ZEROの処理をするには?    
こんばんは、TKOZです。
スーパーマリオカート、もしくは初代F-ZEROの様な画面処理を行う
アルゴリズムを考えていたのですが、なかなか思いつかず、
困っています。
そこで、googleで検索してみました。
すると、
ttp://hakuhin.hp.infoseek.co.jp/main/as/raster_efc.html#RASTER_EFC_04

上記のURLでは、Flash8を使って、F-ZERO風の画面処理を行っているのですが、
ソースを見ても、DXライブラリに移植する方法が思いつきません。

点を描画する関数は、作りました。実際に動きますが、
sin,cos関数などを使う場合、ループの中に使わずに、
事前にテーブル処理しないと、30FPSは出ない気がします。

void PSet(int x,int y,int r,int g,int b)
{
DrawPixelSoftImage( handle, x, y, r, g, b, 0 ) ;
}

どうすればいいのでしょうか?
お願いします。


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


Name: Justy  ..伝説なるハッカー(354,615ポイント)   Date: 2009/05/14(木) 22:20   No:33449     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>DXライブラリに移植する方法が思いつきません

 DXライブラリであれば、普通に 3D機能使えばいいんじゃないでしょうか?

 適当に板を1枚置いて、カメラの向きを斜めから見るように配置すれば
それっぽくなると思いますが。


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

Name: TKOZ  ..上級者(22,628ポイント)   Date: 2009/05/15(金) 08:02   No:33469     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
ああ、そのやり方がありましたね。
気づきませんでした。
Justyさん、ありがとうございます。


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

Name: TKOZ  ..上級者(22,665ポイント)   Date: 2009/05/15(金) 20:28   No:33496     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
カメラの向きの角度と、カメラの座標を操作する関数みたいなものは、ありますでしょうか?
一応、ポリゴンの座標点を操作して、それっぽい画面を作ってみました。


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

Name: TKOZ  ..上級者(22,708ポイント)   Date: 2009/05/15(金) 22:04   No:33500     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
自分なりに回転と移動を実装してみましたが、うまくいきませんでした。
どこがおかしいのでしょうか?
ソースを添付します。

void YRotate(float angle)
{
for(int i=0;i<6;i++)
{
float xt=Vertex[i].pos.x;float zt=Vertex[i].pos.z;
float xd=xt*cos(angle*RAD)-zt*sin(angle*RAD);
float zd=xt*sin(angle*RAD)+zt*cos(angle*RAD);

Vertex[i].pos.x=xd;
Vertex[i].pos.z=zd;
}
}


void move(float speed)
{
for(int i=0;i<6;i++)
{
Vertex[i].pos.x+=cos(CameraRot*RAD)*speed;
Vertex[i].pos.z-=sin(CameraRot*RAD)*speed;
}
}


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

Name: Justy  ..伝説なるハッカー(354,942ポイント)   Date: 2009/05/15(金) 22:55   No:33503     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>カメラの座標を操作する関数みたいなものは、ありますでしょうか

 あります。
 SetTransformToView()がそうで、カメラのビュー行列を指定します。
 ビュー行列は CreateLookAt*()系の関数で作成できます。



>回転と移動を実装してみましたが、うまくいきませんでした

 そんなしち面倒な計算は自前でやらなくても、せっかくDXライブラリがあるのですがら
それを使いましょう。


1 オブジェクトの姿勢を決める(移動・回転行列を作る)
 CreateIdentityMatrix() / CreateTranslationMatrix() / CreateRotation?Matrix() / CreateMultiplyMatrix()など

2 1をワールド行列として設定
 SetTransformToWorld()

3 オブジェクトを描画
 DrawPolygon3D() / DrawPolygon3DBase()

 これで移動・回転したオブジェクトが表示されるはずです。

 つまり、Vertexの中身は最初に設定したものをそのまま使い、以降は行列を変更することで
移動・回転・拡大を行います。

 ただ、注意が必要なのは、DXライブラリの初期のカメラの位置は [0, 0, 0]ではく、
2D画面と合わせようとおかしな位置にあるので、カメラの位置もきちんと併せて設定した方がいいでしょう。



 FZero/Mカートを作るなら、今の形のように背景を動かして移動するのではなく、
コース(地面・背景)は位置を固定し、キャラを行列で移動させ、プレイヤーをカメラが追っ掛ける、
という形で作ると楽かと思います。


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

Name: TKOZ  ..上級者(22,634ポイント)   Date: 2009/05/16(土) 20:27   No:33536     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
Justyさん、すみませんが、行列系の関数の使い方がいまいち分かりません。
実行してみたら、うまくいきませんでした。

サンプルプログラムみたいなものを書いて頂くか、
ソースを添削して頂くと大変嬉しいです。

私が書いたソースプログラムをアップします。


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

Name: Justy  ..伝説なるハッカー(355,858ポイント)   Date: 2009/05/17(日) 17:25   No:33595     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
 ざっくりとサンプルを作ってみました。
 添付のサンプルは cart.pngと course.pngがあれば動きます。
 
 Cart::Draw()内の処理を見るとわかると思いますが、CreateTranslationMatrixはただ移動するだけ、
CreateRotation*Matrixはただ回転するだけの行列を生成しますので、移動して回転するには
それぞれの行列を CreateMultiplyMatrix()で合成しなけばなりません。

    MATRIX    m, matTrans, matRotY;
    
    CreateTranslationMatrix(&matTrans, m_Pos.x, m_Pos.y, m_Pos.z);
    CreateRotationYMatrix(&matRotY, m_RotY);
    CreateMultiplyMatrix(&m, &matRotY, &matTrans);
    
    SetTransformToWorld(&m);


 そのあたりに注意して自分なりに書き直してみてください。


※ 5/19 00:04 ちょっとバグ修正と調整をしました


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

Name: TKOZ  ..上級者(22,826ポイント)   Date: 2009/05/19(火) 21:25   No:33702     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
地面との当たり判定を行ってみました。一応、うまく動作します。
やり方は、LoadSoftImage関数で頂点群と同じ大きさの画像を扱える形のデータ
(courcedat.png::2000×1500の大きさ)
にして、GetPixelSoftImage関数で無理やりRGBAを読み取り、緑色(0,255,0)だったら、
カートのスピードを遅くするというものです。しかし、コースを外れて、
コース外にでて、しばらく何もキーを押さずにすると、後ろに下がってしまいます。

ソースアップします。

あと、
>>そのあたりに注意して自分なりに書き直してみてください。
難しすぎて、自分には、少しのパラメータを自分好みにアレンジすることしか
できませんでした。


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

Name: バグ  ..ハッカー(159,707ポイント)   Date: 2009/05/19(火) 22:42   No:33706     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
遅くするのではなく、最高速度を下げるというのはどうでしょうか?

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

Name: Justy  ..伝説なるハッカー(357,805ポイント)   Date: 2009/05/20(水) 00:06   No:33709     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>カートのスピードを遅くするというものです

 そりゃまぁ Accelerator()に負を入れるというのは逆噴射しているようなものなので
速度が0になるまで減速したらそのままバックします。

 地面の状態によって速度を変えたいのであれば、摩擦係数を変えるのが一番楽です。
 UpdateParameter()の中で 0,99を掛けていたところがあったと思いますが、その値を
変動(小さくなるよう)させれば減速します。

 先のやつを少し改造して、LSHIFTキーで(芝生に入った感になるよう)減速するように
してみました。
(ついでに計算結果が NaNになる嫌なバグも直しました)

 このサンプルでは押し続ければ続けただけどんどん係数を小さくしているので速度は延々と
落ちていきますが、実際のゲームでは係数を毎フレーム変動させないで一定値にするとか、
毎フレーム変動させるとしてもどこかで止めるとか状況に合わせて工夫をした方がいいでしょう。



>難しすぎて、自分には、少しのパラメータを自分好みにアレンジすることしか
できませんでした

 理解しないまま、コピペルーチンを使うと後々修正・調整出来なくなるので、
使うのであれば理解できるよう頑張ってください。


05/21 23:58 GetVectorAngle()のバグ修正


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

Name: TKOZ  ..上級者(23,145ポイント)   Date: 2009/05/20(水) 22:03   No:33756     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
リプレイデータを作成して、敵の動きを作ろうと思ったので、
作ってみました。なんと562KBもありました。
バイナリデータで、この値は大きいのでしょうか?
添付データは120KBが限界みたいなので、載せません。
圧縮技術については、あまりよく分からないのですが、
ttp://homepage2.nifty.com/natupaji/DxLib/lecture/Press/press.html
上のURLで勉強したほうがいいのでしょうか?

あと、敵を動かすのは、リプレイデータから座標と角度を代入すれば
いいので、簡単でできるのですが、
敵の位置と敵の移動角度、カメラの位置を判断して、カメラから見た
敵の角度は、どうやって計算して、描画すればいいのか分かりません。

僕としては、15度ずつY軸で、ずらした車の画像を横並びに並べて、24枚の画像を
つなげた画像を用意しようと考えています。

ソースアップします。



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

Name: Justy  ..伝説なるハッカー(358,486ポイント)   Date: 2009/05/21(木) 00:09   No:33757     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>バイナリデータで、この値は大きいのでしょうか?

  36000フレーム(60fpsで10分)なので多少大きくはなるとは思いますが
本当に必要なデータが入ってるなら、今時の Windows環境であれば
さほど大きいわけではないと思います。

 ただ、ソースを見ると位置と角度をまんま保存しているように見えます。、
 この手のゲームならキー入力を保存しておいて、再生時はそのデータを元に
キー入力を偽装していけば、リプレイは可能だと思いますがいかがでしょうか?

龍神録プログラミングの館にリプレイをつける
ttp://www.play21.jp/board/formz.cgi?action=res&resno=22359&page=&lognum=70&id=dixq&rln=22441

リプレイ保存の方法
ttp://www.play21.jp/board/formz.cgi?action=res&resno=32519&page=&lognum=&id=dixq&rln=33526&vino=69

 キー入力を保存する方式であれば、データはもっとずっと小さくなるはずです。



>圧縮技術については、あまりよく分からないのですが

 どうしてもよほど大きくなるようなら圧縮も検討した方がいいでしょうが、
キー入力を保存する形式にすればそれほど大きくなりませんよ。



>敵の位置と敵の移動角度、カメラの位置を判断して、カメラから見た
>敵の角度は、どうやって計算して、描画すればいいのか分かりません。

 えーと、今ひとつピンとこないのですが、敵の角度……つまり、
まっすぐ進んでいるのか曲がっているのかの計算ということですか?

 前のフレームの位置と現在の位置とのベクトルを毎フレーム出して、
その変化の具合を見ればどれくらい曲がっているのかはわかると思います。


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

Name: TKOZ  ..上級者(23,433ポイント)   Date: 2009/05/21(木) 15:03   No:33785     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
ネットカフェからです。こんにちは、TKOZです。
>>えーと、今ひとつピンとこないのですが、敵の角度……つまり、
>>まっすぐ進んでいるのか曲がっているのかの計算ということですか?
すみません、私の説明が分かりにくかったみたいです。

敵座標にビルボードのようなポリゴンを生成して、テクスチャーは、
敵の向きを向いている画像にしたかったのです。

角度から画像を取り出すには、元X座標は、(角度/15)*64で良いと思います。
あとは、 DrawRectGraph()で出来るはずです。

あと、先の誘導で、リプレイデータの生成について、
Justyさんが、素晴らしいリプレイデータの作成アルゴリズムを書いてあったのを
見つけました。
そのおかげで、リプレイデータは、32kbくらいまで大幅に減りました。
ありがとうございます。

しかし、
自カートは、リプレイデータを適用すると、うまく動いたのですが、
敵カートがうまく動いてくれません。ソースをアップするので、
どこがおかしいか指摘していただくと嬉しいです。

追記:2009/5/21/17:48 SetRePlay()関数内の最後にEnemyCart.Update()としても駄目でした。


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

Name: Justy  ..伝説なるハッカー(358,758ポイント)   Date: 2009/05/21(木) 20:13   No:33800     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>敵カートがうまく動いてくれません

 EnemyCart.Update()が行われているのであれば、おかしいのは表示の部分(DrawCube3Dのあたり)でしょう。
 
 DrawCube3Dを止めて、EnemyCartのテクスチャを読み込んだ上で、従来通り DrawPolygon3DBase()で
描画するとどうなりますか?


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

Name: TKOZ  ..上級者(23,426ポイント)   Date: 2009/05/21(木) 20:40   No:33802     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
>>EnemyCart.Update()が行われているのであれば、
>>おかしいのは表示の部分(DrawCube3Dのあたり)でしょう。
>>DrawCube3Dを止めて、EnemyCartのテクスチャを読み込んだ上で、従来通り DrawPolygon3DBase()で
>>描画するとどうなりますか?

テクスチャーは読み込まれませんが、黒い四角形が移動しました。
ありがとうございます。敵が動くようになりました。
あとは、ビルボードの処理がうまくいけばいいと思います。

追記:2009/5/21/20:47
EnemyCart.LoadImage();をInit()内に書き込みましたが、それでもうまくテクスチャーが張られないようです。
きちんと、2のn乗のサイズにしてあるのですが…何故でしょうか?


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

Name: Justy  ..伝説なるハッカー(359,160ポイント)   Date: 2009/05/21(木) 23:42   No:33815     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>それでもうまくテクスチャーが張られないようです

 テクスチャが読み込めてないのでは?
 LoadGraphの戻り値を確認してください。



>ビルボードの処理

 こちらが参考になると思います。
 
ビルボード - ゲームプログラミングWiki
ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%A5%D3%A5%EB%A5%DC%A1%BC%A5%C9#w8cf1d9a

 Cameraクラスがカメラ行列を持っているので、そのまま適用できるはずです。
 求めた行列(カメラの方を向く回転行列)と敵の位置の分だけ移動した行列を掛け合わせたものを
ワールド行列に設定して、あとは DrawPolygon3DBase(CartVertex)とかで表示すれば、
敵の位置に常にカメラの方を向いたテクスチャが表示されるはずです。


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

Name: Justy  ..伝説なるハッカー(360,537ポイント)   Date: 2009/05/21(木) 23:53   No:33816     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
 あぁ、そうそう。
 何点か修正しておいた方が良い箇所があります。



    VECTOR NegativeVector(const VECTOR &v)
    {
        VECTOR    rv;
        rv.x = -v.x;
        rv.y = -v.y;
        rv.z = -v.z;
        return rv;
    }
    VECTOR VectorSlerp(const VECTOR &src, const VECTOR &dest, float t)
    {
        float    theta = DotProduct(src, dest);
        float    invT = 1.0f - t;
        
        VECTOR    src_v;
        VECTOR    dest_v;
        if(theta < 0.0f)
        {
            src_v = NegativeVector(src_v, src);
            theta = -theta;
        }

 これは前回の投稿では直したのですが、VectorSlerp()の最初の SubVectorはこのままですと
不定になってしまうので、NegativeVectorにしておいてください。




    float GetVectorAngle(const VECTOR &v1, const VECTOR &v2)
    {
        float r = DotProduct(v1, v2);
        if(r > 1.f)        r = 1.f;
        else
        if(r < -1.f)    r = -1.f;
        return acos(r);
    }

 これも直しておいたのですが、誤差で NaNになってしまう可能性がありますので
こうしておいてください。




    float VectorLength(const VECTOR &v)
    {
        return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
    }

 さっき気づきました……orz。
 こちらも修正しておいてください。


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

Name: TKOZ  ..上級者(23,590ポイント)   Date: 2009/05/23(土) 09:31   No:33897     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    
ビルボード処理を行うためにいろいろ試してみましたが、
うまくいきませんでした。
サンプルプログラムが欲しいです。
あと、画像は、正常に読み込まれているようです。
racing.mp3は、重いので、外しました。

どうやら、テクスチャーの左上の座標だけが、全体の色になっているようです。
DrawPolygon3DBaseのバグでしょうか?


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

Name: Justy  ..伝説なるハッカー(362,857ポイント)   Date: 2009/05/23(土) 16:25   No:33912     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>ビルボード処理を行うためにいろいろ試してみましたが、
>うまくいきませんでした。

 どううまくいかなかったのでしょうか。
 添付されたコードにはカメラ行列を使ってどうこうした形跡がないのですが……。

 ところで一つお訊きしますが、3Dにおける行列の概念はきちんと理解されていますか?



>サンプルプログラムが欲しいです

 先のページに二種類の方法で載っていまし、動くであろうサンプルが
zipファイルでDLできるようになっていますよ。
 これを読み解いて概念を理解すれば応用できるはずです。



>テクスチャーの左上の座標だけが、全体の色になっているようです。

 よく意味がわかりません。
 左上の座標の1点が、全体の色になっている????


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

Name: TKOZ  ..上級者(23,713ポイント)   Date: 2009/05/23(土) 22:16   No:33935     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>>3Dにおける行列の概念はきちんと理解されていますか?
行列は、あんまり理解していません。
単位行列がIdentityMatrix()で作成できて、
TranslationMatrix()で平行移動行列が作成できること、
MultiplyMatrix()で行列同士を合成できることくらいですかね。

レースゲームの作成は中断して、行列を勉強することにします。


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

Name: Justy  ..伝説なるハッカー(364,101ポイント)   Date: 2009/05/24(日) 00:34   No:33943     
Title: Re:初代マリオカート、もしくは初代F-ZEROの処理をするには?    

>行列を勉強することにします。

 行列の各値が何を意味しているのか、ベクトルの関係とか諸々が理解できると
いろいろ応用が利くようになります。

 ビルボードは結局のところ、回転要素だけ見ればカメラの向きを反対に向けたものとなります。
 従って、カメラの行列を元に回転要素を取り出し、その逆行列を求めることで
カメラの向きの反対を向く行列となります。
 この行列と敵の位置の行列とを掛け合わせれば、敵がこっちをむいた行列になります。

 先の紹介したページにあるように、カメラ行列を転置させて作っていいですね。


 ただ、このレースゲームの敵の描画、という観点から見るとビルボードで行う場合
Y軸だけは上を向いていた方がいいかもしれません。

 つまり、Y軸はワールドに対して上を向き、カメラの位置に対して回転するのはXZ軸のみ、
のようなビルボードにしないと、カメラの位置(たとえば真上から車をとらえた時など)に
よっては不自然な描画となってしまうかもしれません。
(この方法も先の紹介したページに載っています)


 あと、すでにお気づきかもしれませんが別の懸念点もありまして、
添付の図のようにコースが 180度曲がるような急なカーブで、
敵の車が先行していたような場合、敵の絵が後ろから見たものだと、
車の後ろを見せながらプレイヤーの横を通ることになり、不自然な絵となる
可能性があります。

 このあたりも考慮に入れて頑張って見てください。


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



Name: nayo  ..中級者(11,168ポイント)   Date: 2009/05/23(土) 13:27   No:33903       
Title: DirectXでの描画範囲指定や線・面の描画について    
お久しぶりです
最近は忙しくてなかなかプログラムの時間がないのですが少しでも進めようと質問する次第です

質問内容はタイトルにあるとおり
@描画範囲を指定するにはどうすればいいか
ADirectXでパフォーマンスを落とさずに色を指定して線や面を描画するにはどうすればいいか
の2つです

@についてDXライブラリのSetDrawAreaのような処理を考えています
調べてみるとステンシルを使ってクリッピング描画するといいようなのですがシテンシルバッファなどが
よく分かっていないのでどう扱っていいものか悩んでいます
また、2Dスプライトなどにも適用できるものなのでしょうか

AについてはDXライブラリのDrawLineDrawBoxといったものを考えています
WindowsAPIには線などを描画する関数が用意されていますがDirectXでこういったものを実現するには
どうすればベストなのでしょうか

環境は
OS:Windows Vista
Microsoft Visual C++ 2008 Express Edition
DirectX9
で開発しています


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


Name: Justy  ..伝説なるハッカー(363,269ポイント)   Date: 2009/05/23(土) 19:57   No:33933     
Title: Re:DirectXでの描画範囲指定や線・面の描画について    

>描画範囲を指定するにはどうすればいいか

SetViewport メソッド (IDirect3DDevice9)
ttp://msdn.microsoft.com/ja-jp/library/cc324255.aspx

 でいけると思います。


>DirectXでパフォーマンスを落とさずに色を指定して線や面を描画するにはどうすればいいか

 ただ描くだけなら

IDirect3DDevice9::DrawPrimitiveUP
ttp://msdn.microsoft.com/ja-jp/library/bb174372(VS.85).aspx
 でいいです。

 プリミティブの種類のところで 線は D3DPT_LINE*を、ボックスは
D3DPT_TRIANGLE*を指定(三角形が2枚あればボックスの形状が作れます)すればOKです。

 が、パフォーマンスを優先するのであれば

IDirect3DDevice9::SetFVF
ttp://msdn.microsoft.com/ja-jp/library/bb174433(VS.85).aspx

のページにある例のように事前に描画したいデータを作成・まとめておいて
IDirect3DDevice9の SetFVF / SetIndices /SetStreamSource /
DrawIndexedPrimitive / DrawPrimitiveで一気に描画するのがいいでしょう。

 できるだけ DrawPrimitiveUP / DrawPrimitive / DrawIndexedPrimitiveの呼び出し回数は
少なければ少ないほどパフォーマンスは良くなります。


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

Name: nayo  ..中級者(11,228ポイント)   Date: 2009/05/23(土) 23:37   No:33939 解決!     
Title: Re:DirectXでの描画範囲指定や線・面の描画について    
お返事遅れてしまいすみません

わざわざページまで紹介していただき感謝感謝です
これで目的の動作が実現できそうです
いつもお世話になってなんとお礼していいか

また分からないことがあったらそのときは宜しくお願いします


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



Name: 初心者  ..プログラマー(32,491ポイント)   Date: 2009/05/23(土) 17:13   No:33916       
Title: 無題    
 初心者です
異なる2つのソースファイルで配列の共有はできるものなのですか?

いろいろやってみてはいるのですが・・・

戻り値を配列のポインタにしてもうまくいきませんでした。

よろしくお願いします。
すいますん、初心者の質問です


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


Name: box  ..ハッカー(140,391ポイント)   Date: 2009/05/23(土) 17:28   No:33919     
Title: Re:無題    
その、「いろいろやってみたがうまくいかなかった」ソースコードを
提示してみる、というお考えはありますか?


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

Name: tieria  ..ぴよぴよ(79ポイント)   Date: 2009/05/23(土) 17:42   No:33921     
Title: Re:無題    
すいません
あまりに拙いコードなんで、勇気が要ります。

/* mainsource.c */
int main(void)
{
char* array_pointa_rec = f_scan();
printf("%s\n", array);
return 0;
}

/* subsource.c */
char* f_scan(void)
{
char array[31];
char* array_pointa;

/*
ここで"HelloWorld"と入力
*/

scanf ("%s\n", &array[0]);
printf ("%s\n", array);

array_pointa = &array[0];
return array_pointa;
}

すいません、よろしくお願いします



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

Name: tieria  ..ぴよぴよ(235ポイント)   Date: 2009/05/23(土) 17:51   No:33922     
Title: Re:無題    
すいません。#include<stdio.h>が両方のファイルに抜けていました
ヘッダファイルもです
/* f_scan.h */

#ifndef _INCLUDE_F_SCAN_
#define _INCLUDE_F_SCAN_
extern char* f_scan(void);
#endif

ここに変数を共有しようとして

extern char array[31];
としても、未解決のシンボル・・・ 
定義されていません
などとでます
どうすればいいのか途方にくれてしまって・・・

もちろん1つのファイルであればいいと思いますが、
あえて呼び出して使いたいのです

よろしくお願いします


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

Name: box  ..ハッカー(140,494ポイント)   Date: 2009/05/23(土) 17:54   No:33923     
Title: Re:無題    

ソースコードを貼り付けるときは、
HTMLの<pre>タグと</pre>タグで囲んでください。<と、>は、半角です。

一度原点に立ち返って、お手持ちのソースファイルの正確な内容を載せていただけますか?


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

Name: tieria  ..かけだし(1,337ポイント)   Date: 2009/05/23(土) 18:27   No:33925     
Title: Re:無題    
すいません、そのままコピペしました


/* test.c */

#include <stdio.h>
#include "f_scan.h"

int main(void)
{

char array[31]
char *array_pointa_rec;
array_pointa_rec = f_scan();

printf("%s\n", array);
return 0;

/*
f_scan();
return 0;
*/
}


/* f_scan.c */

#include <stdio.h>

char* f_scan(void)
{
char array[31];
char* array_pointa;

/*
ここで"HellWorld"と入力
*/

scanf("%s", &array[0]);
printf("%s\n", array);

array_pointa = &array[0];
return array_pointa;
}

/* f_scan.h */
#ifndef _INCLUDE_F_SCAN_
#define _INCLUDE_F_SCAN_
extern char* f_scan(void);
#endif



main()内で、コードを/**/に変えると、きちんと実行されます
したがって、f_scan()には問題がないと考えています。
問題は、f_scan()内で作られた配列をmain()内で使えない・・・・
いいえ、問題がわからないから質問していました。
一度どっかのページで、

return "HelloWorld";

で文字列を返していて、解説に実は文字列のポインタを返している旨があったので
ポインタを返せば f_scan()が終了しても、配列もそのまま残って main()で使えるのでは・・
と思ったりして いろいろやってみました。

よろしくお願いします


2倍のポイントを手に入れた! 1,102ポイント を手に入れた。

Name: tieria  ..かけだし(1,602ポイント)   Date: 2009/05/23(土) 18:31   No:33926     
Title: Re:無題    
エラーメッセージも提示しておきます

■C:\Users\user\Documents\C> bcc32 -etest test.c f_scan.c test.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2141 test.c 10: 宣言の構文エラー(関数 main )
エラー E2451 test.c 11: 未定義のシンボル array_pointa_rec(関数 main )
*** 2 errors in Compile ***
f_scan.c:
test.c:
エラー E2141 test.c 10: 宣言の構文エラー(関数 main )
エラー E2451 test.c 11: 未定義のシンボル array_pointa_rec(関数 main )
*** 2 errors in Compile ***

なぜ、未定義なのか? ちゃんと宣言してると思うのですが・・・


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

Name: box  ..ハッカー(140,292ポイント)   Date: 2009/05/23(土) 18:54   No:33928     
Title: Re:無題    

こういうことがしたいのでしょうか?それとも別のことですか?
なお、当該のコンパイルエラーは、

> char array[31]

最後にセミコロンがないためです。


/* test.c */
#include <stdio.h>

char array[31];

int main(void)
{
f_scan();
printf("main: %s\n", array);
return 0;
}


/* f_scan.c */
#include <stdio.h>

extern char array[];

void f_scan(void)
{
scanf("%s", array);
printf("f_scan: %s\n", array);
}



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

Name: box  ..ハッカー(140,461ポイント)   Date: 2009/05/23(土) 18:59   No:33929     
Title: Re:無題    

それとも、こういうことでしょうか?

/* test.c */
#include <stdio.h>

int main(void)
{
printf("main: %s\n", f_scan());
return 0;
}


/* f_scan.c */
#include <stdio.h>

char *f_scan(void)
{
static char array[31];

scanf("%s", array);
printf("f_scan: %s\n", array);
return array;
}



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

Name: tieria  ..かけだし(1,724ポイント)   Date: 2009/05/23(土) 19:05   No:33930 解決!     
Title: Re:無題    
いや〜
セミコロンがない・・・

ありがとうございます。

今日の昼からいろいろいじって、もうだめだと思って質問しました。

ここはなんかレベルが高そうだったので何度もためらいましたが、
質問してよかったです。

boxさん、本当にありがとうございます


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

Name: tieria  ..かけだし(1,771ポイント)   Date: 2009/05/23(土) 19:20   No:33931     
Title: Re:無題    
どちらかというと、下のほうです
下は main()内で変数を宣言していませんので。

なにはともあれ、ありがとうございました!


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



Name: やっくん  ..入門者(2,839ポイント)   Date: 2009/05/23(土) 14:06   No:33904       
Title: 無題    
DXライブラリでRPGを作っています。
戦闘画面で、攻撃、魔法、防御、道具。
と選択肢を作り選べるようにしています。
一部抜き出して書いてみます。
これに関わるのを全て書くと長くなりますので、ところどころはしょってます。
省略した関数は
・main() //DXライブラリ初期化、裏画面処理とか一通り行わせて、battle()を呼び出してます。
・battle_gamen() //戦闘画面(背景、敵、自分、HP表示するための枠など)
・mc_command() //引数にコマンド選択関数(battle_choose)で受け取った数値を与え処理を行う。
・mahou_sentaku()//以下に記述しているbattle_chooseに中身はほぼ同じで、魔法を選ぶためのもの。
です。必要とあらば上記の関数の詳細も書き込みます。


<問題点>
コンパイルにエラーは出ず、
処理も思い通りに行われるのですが、
だんだん処理が重くなっていき、
次第には選択をできなくなっていきます。
最終的にはフリーズ。
処理開始後はスムーズに選択できているので、
ソースに問題があると思うのですがどなたか診断お願いします。


//元になる関数
battle(){
int command,return_command;

while(!ProcessMessage() && !ClearDrawScreen()){

battle_gamen();//戦闘画面描画

//選択肢を表示しEnterが押された所の命令を保存
command = command_choose();

//↑の選択でcommandに受け取った命令を引数に処理を分岐。
return_command = mc_command(command);

}
}

//選択画面の関数
int command_choose(void){

int y = 360;
int Key[256];
int White = GetColor(255,255,255); //色取得

// && GetHitKeyStateAll_2(Key)==0
while(!ProcessMessage() && !GetHitKeyStateAll_2(Key)
&& !ClearDrawScreen() && !Key[KEY_INPUT_ESCAPE]){

battle_gamen(); //戦闘画面描写

//選択画面
DrawString( 30 , y , "●" , White );
DrawString( 50 , 360 , "攻撃" , White );
DrawString( 50 , 380 , "魔法" , White );
DrawString( 50 , 400 , "防御" , White );
DrawString( 50 , 420 , "道具" , White );
DrawString( 50 , 440 , "逃げる", White );

//キーが下を押されたら●を下に移動
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
y+=20;
if(y==460){
y=360;
}
}

//キーが上を押されたら●を上に移動     
else if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_UP]%5==0 && Key[KEY_INPUT_UP]>30)){
y-=20;
if(y==340){
y=440;
}
}

     //選択:攻撃
else if(y == 360 && Key[KEY_INPUT_RETURN]==1) return 1000;

     //選択:魔法
     else if(y == 380 && Key[KEY_INPUT_RETURN]==1){
return mahou_sentaku(); //更に魔法選択を呼び出し、選ばせる。
     }

ScreenFlip();//裏画面反映

}

}


ちなみに赤字で書いてる「更に魔法選択肢を呼び出し、選ばせる」
ってありますが、中身はbattle_choose関数の拡張版みたいなものです。
ほぼ同じ処理を行っています。

OS:Windows XP
メモリ:512MB
CPU:PentiumW 2.0GHz


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


Name: やっくん  ..入門者(3,288ポイント)   Date: 2009/05/23(土) 14:20   No:33905     
Title: Re:無題    
タイトル書き忘れてました(^^;)
すみません。

それと追記です。
重くなる原因を自分なりに考えてみたところ、
画像を何回も読み込んでるのも関わってるかもしれない。
ってことで、画像を呼び出してる関数も載せてみます。

battle_gamen(){

int image0; //ハンドルを受け取るためのint型変数を宣言
image0 = LoadGraph( "dat/battle_map/field_d.jpg" ) ; //char.pngのハンドルを代入
DrawGraph( 0 , 0 , image0 , FALSE ) ; //画像を表示


int image1; //ハンドルを受け取るためのint型変数を宣言
image1 = LoadGraph( "dat/enemy/pr_enemy.png" ) ; //char.pngのハンドルを代入
DrawGraph( 110 , 250 , image1 , TRUE ) ; //画像を表示

DrawGraph( 410 , 250 , mc.image[7] , TRUE ) ; //画像を表示

DrawBox( 10, 480 - 130, 640 - 11, 480 - 11, GetColor( 0,0,128 ), TRUE ) ;
DrawBox( 10, 480 - 130, 640 - 11, 480 - 11, GetColor( 255,255,255 ), FALSE ) ;
//ScreenFlip();//裏画面反映

}


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

Name: Justy  ..伝説なるハッカー(362,400ポイント)   Date: 2009/05/23(土) 14:42   No:33907     
Title: Re:無題    

>画像を何回も読み込んでるのも関わってるかもしれない

 まさに原因はそれでしょう。
 1度だけ呼び出すようにすれば、解決するかと。


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

Name: やっくん  ..入門者(3,341ポイント)   Date: 2009/05/23(土) 15:17   No:33908 解決!     
Title: Re:無題    
Justyさん
回答ありがとうございます。
パソコンが悪いかと思って買い換えるところでした(笑”
どうにかがんばって一回呼び出すだけにできるようにしてみます。


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



Name: inaba  ..ぴよぴよ(57ポイント)   Date: 2009/05/23(土) 09:37   No:33898       
Title: タイトル画面を表示するにはどうしたらいいでしょうか??    
タイトル画面を表示するにはどうしたらいいでしょうか??
かなり初歩てきな質問ですが
答えてくれるとうれしいです
ちなみにPSPようにプログラムを作っていますが
普通のプログラムと変わりはありませんでした
ただゲーム内容はできたものの
タイトル画面を表示したいです
起動からロードしおわったらタイトル画面を表示したいです
ちなみに四聖龍神録のサンプルプログラムノ50章と同じファイル構造です



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


Name: ひよこ  ..プログラマー(32,821ポイント)   Date: 2009/05/23(土) 09:55   No:33899     
Title: Re:タイトル画面を表示するにはどうしたらいいでしょうか??    
文字で表します。ソースにしてください。
自分の流星書記と同じ形のタイトルですがけっこう調整がいります。

タイトルとなる画面を表示
その上に何を選んでいるかわかるカーソルを用意し
文字を囲みます。

下キーを押したら下に動くようにして
決定キーを押したらfunc_stateをいくつにするか決めるといいと思います。





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

Name: kazuoni [URL]  ..比類無きプログラマー(87,728ポイント)   Date: 2009/05/23(土) 11:42   No:33900     
Title: Re:タイトル画面を表示するにはどうしたらいいでしょうか??    
>ちなみにPSPようにプログラムを作っていますが
>普通のプログラムと変わりはありませんでした

PSPで使用できるメモリ制限がPC用プログラミングとは違い、
相当少なく(たしか32-8=24MB)、またFPSの関係もあり、
四聖龍神録サンプルプログラムをそのまま移植するのは
結構厳しい気がします。



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

Name: yu  ..プログラマー(27,919ポイント)   Date: 2009/05/23(土) 12:40   No:33902     
Title: Re:タイトル画面を表示するにはどうしたらいいでしょうか??    
>>kazuoni様

一応龍神録の50章ですが、少しいじるだけで正常に動きましたよ。(キー入力辺り)
龍神録のデータファイルは10MBなので全てロードしたとしても足りると思います。
しかし、仰る通りFPSが60だと処理落ちが酷いです・・・

そして以前作った東方をPSPに入れてみようと思い、
FPSを30に、画像を小さくする、等をすれば簡単にできましたよ。
ですので、自分はあまりメモリは気になりませんでした。
(画像を小さくしなかったらメモリが足りていなかったかもしれませんが・・・)


本題ですが、

メニューは自分も最初は迷いましたが、
計算、描画部をメニューの数だけ作って
メニューの番号を元にして処理をしました。
後、そのメニューの選択項目の数を予め決めて管理しました。

自分は初めてメニューを作ったときはこのようにしました。


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



Name: Luck  ..ぴよぴよ(152ポイント)   Date: 2009/05/21(木) 23:15   No:33810       
Title: 照合    
こんばんは。
早速ですが、下記のプログラムで、おおよそ、
キーワードを入力して、そのキーワードを含む文字を探す
見つからない場合はNULLを返す。
と言う内容なのはわかりました。

おおよその把握しか出来てませんので、どなた様か解説をお願いできませんか?

:環境:
Windows XP
Visual C++2008 Expres Edition




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

char *search(char *,char *);

void main(void)
{
static char text[]=" 文字列や文章等";
char *p, *key="キーワード";

p=search(text,key);   //特にこのあたりからよくわかりません。
while (p!=NULL){
printf("%s\n",p);
p=search(p+strlen(key),key);
}
}
char *search(char *text, char *key)
{
int m,n;
char *p;

m=strlen(text);
n=strlen(key);
for(p=text;p<=text+m-n;p++){
if(strncmp(p,key,n)==0)
return(p);
}
return(NULL);
}




解説の程、よろしくお願いします。


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


Name: kazuoni [URL]  ..比類無きプログラマー(86,928ポイント)   Date: 2009/05/22(金) 00:01   No:33818     
Title: Re:照合    
おおよそというよりは、
キーの文字列が含まれていたら、
文字列のそのキーを含むところから最後までを出力するですかね。
例えば
キー:int
文字列:intfloatintdoubleintchar

だと出力は
intfloatintdoubleintchar
intdoubleintchar
intchar

ですかね。

>//特にこのあたりからよくわかりません。
関数searchが理解できないということでしょうか?
おおよそこんなことをやってます。
・文字列とキーの長さを求める(それぞれm,n)
・「文字列」-「キー」の長さがキーの長さより小さくなったNULLをリターン
・「文字列」-「キー」の長さがキーの長さより大きい時、
 文字列の先頭からキーの長さ分、同じ文字があるかどうか比較(strncmp参照)
 ・キーと一致したら文字列の先頭のアドレスをリターン
 ・一致しなければポインタを進める。

例えば上の例なら、

search一回目

text="intfloatintdoubleintchar"
key="int"

m=24,n=3

p

i ntfloatintdoubleintchar

strncmp=strcmp("int",key) 合致!

return p(=intfloatintdoubleintcharの先頭のアドレス)

二回目

text="floatintdoubleintchar"
key="int"

m=21,n=3

p

f loatintdoubleintchar

strncmp=strcmp("flo",key)合致しない!

p

l oatintdoubleintchar

strncmp=strcmp("loa",key)合致しない!

...以降繰り返す



...

p

i ntdoubleintchar

strncmp=strcmp("int",key) 合致!

return p(=floatintdoubleintcharの初めに出てくるintの[i]の先頭のアドレス)


ってな感じです。
探査終了の条件は、
条件はpの指すところから終わりまでの文字数が3をきったら
終了します。
今回の例でいえば、

p

a r
の地点まできたら終了です。


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

Name: Luck  ..ぴよぴよ(299ポイント)   Date: 2009/05/22(金) 20:21   No:33876     
Title: Re:照合    
ご丁寧にありがとうございます。
searchについて詳しくわかりました。

同じところで迷っている友人に、わかりやすく説明したいのですが、
各行に何をしているかというコメントを付けていただけませんか?

自分は説明が下手で、なかなかうまく伝えられません。
図々しくてすみませんが、よろしくお願いします。


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,502ポイント)   Date: 2009/05/22(金) 20:40   No:33877     
Title: Re:照合    
コメントを書いてもらうよりは、
上で書いたことを自分の手で書きこんでいったほうが
間違いなく効率が良いです。
コメントを加えるといっても数行なので、大変ではないはずです。


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

Name: Luck  ..ぴよぴよ(381ポイント)   Date: 2009/05/22(金) 21:34   No:33880     
Title: Re:照合    
お返事ありがとうございます。
頑張ってコメント付けてみようと思います。

書いていただいた

・文字列とキーの長さを求める(それぞれm,n)
・「文字列」-「キー」の長さがキーの長さより小さくなったNULLをリターン
・「文字列」-「キー」の長さがキーの長さより大きい時、
 文字列の先頭からキーの長さ分、同じ文字があるかどうか比較(strncmp参照)
 ・キーと一致したら文字列の先頭のアドレスをリターン
 ・一致しなければポインタを進める。

ですが
p=search(text,key);
から
return(NULL);
}(最後)

で行われている処理でしょうか?

あと、ここのfor文あたりがちょっと理解しがたいです。


char *search(char *text, char *key)
{
int m,n;
char *p;

m=strlen(text);
n=strlen(key);
for(p=text;p<=text+m-n;p++){ //←ここのfor文です。
if(strncmp(p,key,n)==0)
return(p);
}
return(NULL);
}







下らなくてすみませんが、お教え願います。


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,654ポイント)   Date: 2009/05/23(土) 00:59   No:33886     
Title: Re:照合    
> 書いていただいた
>
> ですが
> p=search(text,key);
> から
> return(NULL);
> }(最後)
>
> で行われている処理でしょうか?

search関数に入ってから抜けるまでに行われていることを書きました。
その下で、例を挙げて解説しています。

> あと、ここのfor文あたりがちょっと理解しがたいです。

No:33818より自分はうまく解説できる気がしません。。
まず、ペンで紙に書きながら処理を一つ一つ追っていってください。
自分で文字列とキーを用意して、
一回目にsearch関数に入ったらどうなるか見ていってください。
他人に言われるよりは、自分で理解していったほうが効率が良いです。
(さっきもこれ書きましたね・・・。)

もし違っていたら申し訳ないですが・・・。
以下のことは理解していますか?

・関数
・ポインタ
・文字列

もし理解できていないのならば、
一度基礎を学習してみてください。
でないと、根本が理解できず、他人に教えることは恐らくできません。


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

Name: たいちう  ..プログラマー(28,882ポイント)   Date: 2009/05/23(土) 09:15   No:33895     
Title: Re:照合    
> searchについて詳しくわかりました。
>
> 同じところで迷っている友人に、わかりやすく説明したいのですが、
> 各行に何をしているかというコメントを付けていただけませんか?
>
> 自分は説明が下手で、なかなかうまく伝えられません。

「理解した」と「理解したつもり」の違いは自分では分かりにくいかもしれませんが、
人に説明しようとするときに、違いがはっきりします。
自分の言葉で説明できない以上は、まだ「理解できていない」としっかり認識し、
理解を深めてください。
私の言葉の定義だと(守秘義務とかのあれこれを除き)
「理解しているけど説明できない」という状況はありえません。

kazuoniさんが指摘されている「関数・ポインタ・文字列」についても、
「理解したつもり」なだけではないですか?
完全に理解するのはまだ先でも良いですが、ある程度は理解していないと
その上により高度な内容(今回のプログラムなど)を積み上げられません。

・基礎的な事を復習する
・他人に説明する

どちらも理解を深めるためには有効な手段です。
今回たまたま手を抜いているだけならいいのですが、
(コメントまで付けてもらおうとか)常に他力本願だと、
理解する力が育ちませんよ。
自分の理解度を分析することで、自力解決できる問題も増えるはずです。

# なんか説教モードに入ってしまったみたいですが投稿しちゃえ。
# それと「searchについて詳しくわかりました」というのは、
# きっと回答者に謝意を伝えたかったのもあるんだよね。


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



Name: kronos  ..ぴよぴよ(145ポイント)   Date: 2009/05/23(土) 03:23   No:33891       
Title: 会話画面を作りたいんですが・・・    
Dxライブラリを使って、会話画面を作ろうとしているんですが、うまくできません。
作ろうとしているのは、四択問題が出されて、選択肢を選んで、正誤判定をするという感じのものです。

↓エンター
問題表示
↓エンター
選択肢表示
↓選択肢選んでエンター
正誤表示

という風にしたいのですが、どうすればいいでしょうか。


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


Name: Ma  ..初心者(8,195ポイント)   Date: 2009/05/23(土) 05:27   No:33892     
Title: Re:会話画面を作りたいんですが・・・    
最低限 言語、コンパイラ、ライブラリ ぐらい書くべきです。

質問が抽象的でしたので、回答も抽象的にしかできませんが、
DXライブラリを使用していて、基本的な関数は使ったことがあると仮定します。

・問題表示
文字なら DrawString
絵なら DrawGraph
でいいでしょう。(*1)

・エンター
WaitKey()をして、キーが押されるまで待機する。(メインループごととめる)のもありだし
メインのforループ 内で、エンターキーを押されているかの判定をif文でして、押されていたら正誤判定をする というのもあり。
(後者のほうがお勧めできます。)

・選択肢表示
(*1)と同様


・正誤表示
キーボード判定なら、どのキーを押したのかをif文で判定。
マウスクリックで判定なら、x,y座標を入手して、それに応じてif文などで判定。
どの選択肢を押したのか判定できたら、正解と比べて
正誤を表示する。



もっと、コードでの助言が欲しいなら、ぐぐるべきですよ。
選択肢で分岐なら、サンプルぐらいあると思います。


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



Name: Kana  ..ぴよぴよ(204ポイント)   Date: 2009/05/22(金) 02:12   No:33829       
Title: printf    
大学からC言語をやりはじめて2か月のど素人です。大学が豚インフルで閉鎖しちゃったので、この間に勉強してやろうと思ってます。

質問しちゃってもいいんですよね? アホみたいな質問だったらすいません。

課題が解けないとかこんなプログラムが作りたいとかではないんですけど、素朴な疑問を書いてみたいと思います。

ついこないだ「関数」を習いました。引数とか返り値とか。
んで、その時に先生が「printfも関数なんやでー」的なこと言ってました。

・・・でも、自分でこの関数作ろうと思っても無理だと思います。

たぶんprintfの引数ってどうなってんの?っていう疑問なんだと思います。たぶん。


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


Name: non  ..熟練のプログラマー(42,543ポイント)   Date: 2009/05/22(金) 08:37   No:33837     
Title: Re:printf    
Kanaさんおはようございます。インフルエンザで大学閉鎖ですか。
いつまで続くかわからないので、授業が遅れて大変ですね。
私もそうですが、昔の人はみんな、C言語は独学で学びました。
今は、本もインターネットもそして、このような掲示板もあるので
学習はやりやすい環境にあります。がんばってください。

さて、printfの引数ですが・・・・・・・・
可変引数といって、型や個数が決まっていない特殊な引数です。
とりあえず、普通の関数が理解できるようになって、ポインタも
わかるようになってから、再度質問してください。
ほんじゃ、がんばって。




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

Name: Kana  ..ぴよぴよ(373ポイント)   Date: 2009/05/22(金) 11:44   No:33845     
Title: Re:printf    
>nonさん
要するに「お前にはまだ早い」ってことですね。笑
Googleで調べてみても可変引数というワードにはいきつきました。
ワケ分からなかったですね。
こういう、「今は理解しなくていいよ」的な答えはこのようなところでしか得れないと思いました。
安心してすっ飛ばせます。ありがたいです。
ポインタやってから戻ってきます。(ポインタが山場だと言われ、恐れてます。)

ちなみに、熟練のプログラマーっていうのはどんなレベルなんですか?
学生ってことはないんですよね?


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

Name: 御津凪 [URL]  ..比類無きプログラマー(88,666ポイント)   Date: 2009/05/22(金) 12:05   No:33848     
Title: Re:printf    
> ちなみに、熟練のプログラマーっていうのはどんなレベルなんですか?

名前の横に書いてある肩書きのようなものは、ここで投稿した量に応じて変化するもので、
実際とは関係ありません。

頻繁に書き込みをしていればレベルは上がっていくので、
学生でも結構なレベルの肩書きを持っている方がいれば、その逆もあります。

ただ、名前で判断しているので、
すでに同じ名前がかぶった場合はそれのレベルで表示されちゃいますが。


可変引数を確定的に理解するには、ポインタの理解も前提ですが、
関数の呼ばれ方(スタックとか)なども知る必要があります。

つまり、他を先に理解するのが可変引数を容易に理解する近道となるわけです。

> ポインタが山場だと言われ

ポインタはC言語の肝となる部位ですのでしっかり理解しておく必要があります。
くじけず、あせらず、がんばって覚えてください。



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

Name: toyo  ..プログラマー(34,741ポイント)   Date: 2009/05/22(金) 12:09   No:33849     
Title: Re:printf    
ここの掲示板は書き込みするとポイントがつきます
40000ポイントで熟練プログラマーです
http://www.play21.jp/board/ranking.cgi?id=dixq


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

Name: Kana  ..ぴよぴよ(633ポイント)   Date: 2009/05/22(金) 21:07   No:33879     
Title: Re:printf    
>御津凪さん
ようはいっぱい書き込んでればできる人ってことですね。
○○ポイントを手に入れたっていうのもどう判断してるのかなぞですね。笑
名前だけの判断ってことは、最高レベルの人は複数人っていう可能性もあるんですねー

とりあえず言語だけがすべてじゃないってことは分かりました。
計算機の処理の仕方を覚えてなんぼですね。がんばります。ありがとうございます。



>toyoさん
一回のポイントで数百点なのに・・・何年かけたらそんなすごいレベルに達するんですか!?
とりあえずぴよぴよ脱出を目指して頑張りたいです。


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



Name: pu  ..ぴよぴよ(234ポイント)   Date: 2009/05/21(木) 23:06   No:33809       
Title: 5の倍数の和について教えてください。    
みなさん。お世話になります。
C言語の勉強を始めてみたのですが、とにかくループ処理で引っかかってます。

5の倍数の和をもとめたいのですが(範囲は5以上150以下です)
以下の方法は全く違っていますか?

#include <stdio.h>
int main(void){

int input,n,sum

sum=0;
for(input=5;input<=150;input++){
if((input%3)==0 sum=sum+input);

}
printf("5の倍数の和は%dです\n",sum);

ritrun(0);

}

チンプンカンプンの内容でしたらごめんなさい。
どうかよろしくお願いします。




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


Name: box  ..ハッカー(140,299ポイント)   Date: 2009/05/21(木) 23:22   No:33811     
Title: Re:5の倍数の和について教えてください。    
とりあえず、コンパイルエラーが出ないようにすることから始めましょう。
それから、「5の倍数の和」なのに

>(input%3)==0

これは明らかにおかしいですね。


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

Name: pu  ..ぴよぴよ(251ポイント)   Date: 2009/05/21(木) 23:31   No:33812     
Title: Re:5の倍数の和について教えてください。    
ごめんなさい。

(input%5)==0

の 間違いです。


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

Name: box  ..ハッカー(140,396ポイント)   Date: 2009/05/21(木) 23:40   No:33813     
Title: Re:5の倍数の和について教えてください。    

> int input,n,sum

文の最後にはセミコロンが必要です。

> for(input=5;input<=150;input++){
> if((input%3)==0 sum=sum+input);

inputを1ずつ増やしていくよりも、5ずつ増やしていけば、
5で割り切れるかどうかのチェックが不要になります。

> ritrun(0);

スペルが違っています。return です。



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

Name: ビギナー  ..ぴよぴよ(779ポイント)   Date: 2009/05/21(木) 23:40   No:33814     
Title: Re:5の倍数の和について教えてください。    
int input,n,sum

セミコロン「;」が抜けています。

if文ですが

if(input%5==0)
   sum=sum+input;
カッコは1つあれば十分な気もします。


ritrun(0);

return(0);ですね。


150までの確認はしてないので、合ってるかどうかは定かではないですが、
まずはコンパイルできるものを貼ることをオススメします。

//下記は追記です

ハッカーさんと投稿時間と内容ががほぼかぶってしまいました。
すみません。


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

Name: pu  ..ぴよぴよ(352ポイント)   Date: 2009/05/21(木) 23:57   No:33817     
Title: Re:5の倍数の和について教えてください。    
> int input,n,sum

→  int input,n,sum;

文の最後にはカンマが必要です。

> for(input=5;input<=150;input++){
> if((input%3)==0 sum=sum+input);

→ for(input=5;input<=150;input=input+5){
sum=sum+input;

inputを1ずつ増やしていくよりも、5ずつ増やしていけば、
5で割り切れるかどうかのチェックが不要になります。

> ritrun(0);

→ return(0)

と いう感じでよろしいのでしょうか?


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

Name: pu  ..ぴよぴよ(400ポイント)   Date: 2009/05/22(金) 00:12   No:33819     
Title: Re:5の倍数の和について教えてください。    
自分で考えておきながら・・・

#include <stdio.h>
int main(void){

int input,n,sum

scanf("%d\n",input);

for(input=5;input<=150;input=input+5){
sum=sum+i

......

などとすると 変数nはなんであるのか?いらないですか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,024ポイント)   Date: 2009/05/22(金) 00:27   No:33820     
Title: Re:5の倍数の和について教えてください。    
>sum=sum+i

sum=sum+input

の記述ミスですか?

>変数nはなんであるのか?いらないですか?
上述のコードでは使っていないので、不要ですね。

>ビギナーさん
>ハッカーさんと投稿時間と内容ががほぼかぶってしまいました。
boxさんですよ^^;
ハッカーは昇進状態によるものです。

#ハッカーの称号を持つ御三方はたまにハッカーさんと間違われますね^^;



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

Name: pu  ..ぴよぴよ(419ポイント)   Date: 2009/05/22(金) 00:49   No:33822     
Title: Re:5の倍数の和について教えてください。    
上記投稿に名前が未入力でした。
すみません<(_ _)>


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

Name: pu  ..ぴよぴよ(318ポイント)   Date: 2009/05/22(金) 00:51   No:33823     
Title: Re:5の倍数の和について教えてください。    
あの〜何度もすみません。

#include <stdio.h>
int main(void){

int input,n,sum

sum=0;
scanf(%d",&input);
for(n=5;n<=150;n=n+5){
sum=sum+n;

}
printf("5の倍数の和は%dです\n",sum);

return(0);
}

では だめでしょうか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,115ポイント)   Date: 2009/05/22(金) 00:57   No:33824     
Title: Re:5の倍数の和について教えてください。    
>scanf(%d",&input);

これはただ標準入力から読み込むだけで、
変数inputは一度も使っていないようなので、
>int input;

>scanf(%d",&input);


の二つは必要ありません。


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

Name: pu  ..ぴよぴよ(338ポイント)   Date: 2009/05/22(金) 00:58   No:33825     
Title: Re:5の倍数の和について教えてください。    
今度こそ?
だめでしょうか?

#include <stdio.h>
int main(void){

int input,n,sum;

scanf("%d",&input);
for(n=5;n<=150;n=n+5){
sum=sum+n;

}
printf("5の倍数の和は%dです\n",sum);

return(0);
}


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

Name: pu  ..ぴよぴよ(377ポイント)   Date: 2009/05/22(金) 01:03   No:33826     
Title: Re:5の倍数の和について教えてください。    
みなさんに大変お世話になっておりますが、
もう 頭がもうろうとしてきました。

頭ひやして 再度考えてみます。

遅くまでありがとうございました。


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

Name: kazuoni [URL]  ..比類無きプログラマー(87,324ポイント)   Date: 2009/05/22(金) 01:09   No:33827     
Title: Re:5の倍数の和について教えてください。    
コードを載せる際はプレタグを使用してください。

>今度こそ?
>だめでしょうか?

No:33824はご覧になりましたか?

また、No:33825のコードでは、
sum+=sum+n;
の一回目でプログラムが止まるまたは結果がおかしな値になるはずです。
理由はsumの初期化ができおらず、
sum=不定値+n

としているからです。
sumを0で初期化またはfor文の前で0を代入してください。


ちなみにですが、コンパイル・実行していますか?
百聞は一見にしかずってことで一度実行してみてはいかがですか?
無償でVC++などがあります。


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

Name: pu  ..ぴよぴよ(412ポイント)   Date: 2009/05/22(金) 01:51   No:33828     
Title: Re:5の倍数の和について教えてください。    
みなさんにいただいたヒントから
再度考えてみます。

本当にありがとうございました。


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

Name: lbfuvab  ..上級者(20,575ポイント)   Date: 2009/05/22(金) 12:19   No:33850     
Title: Re:5の倍数の和について教えてください。    
反則かもしれませんが、
1〜30までの数値の和を5倍しては駄目なのでしょうか?


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

Name: やそ  ..比類無きプログラマー(87,976ポイント)   Date: 2009/05/22(金) 18:28   No:33874     
Title: Re:5の倍数の和について教えてください。    
lbfuvab さんの
>反則かもしれませんが、
>1〜30までの数値の和を5倍しては駄目なのでしょうか?

は、答えが欲しいだけならアリ。
規則性をもった繰り返しや+=を利用した足しこみなどの練習が主題であればナシ。
ですよね。

まあ、頭をクールダウンして考えてみるとのことですので、
次の答えを待ちましょう^^


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



Name: ひよこ  ..プログラマー(32,625ポイント)   Date: 2009/05/22(金) 17:37   No:33869       
Title: 遊びで    
遊びで携帯っぽいのを作ってきました。
ここで配布しようと思ったのでコンパイルはしてません。
VCのサンプルプログラムのフォルダの中にいれてコンパイルしてくてください。
ソースも汚いけど入れてあります。
感想をお願いします。

注意
よくわからないのですがなぜか絵を読み込む?のに失敗します。


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


Name: kazuoni [URL]  ..比類無きプログラマー(87,451ポイント)   Date: 2009/05/22(金) 18:18   No:33872     
Title: Re:遊びで    
これは結構危ないです・・・。

っというのも、
Opening()
Menu()
の関数に入るたびにLoadGraph()があり、
各画像アドレス格納用変数はローカル変数ですので、
ものすごい回数画像をロードし、すべてほったらかしにしています。
LoadGraphは初期化の際に一度だけにしてください。

自分のパソコンは今までにないぐらい重くなりました。。


追記
>よくわからないのですがなぜか絵を読み込む?のに失敗します。
上記がかなり影響しているかと。。


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

Name: ひよこ  ..プログラマー(32,677ポイント)   Date: 2009/05/22(金) 18:27   No:33873     
Title: Re:遊びで    
そうでしたか・・
パソコンで作っているときに死ぬほど遅かったのは
原因をおしえてくださりありがとうございます。


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



Name: ウズ  ..ぴよぴよ(89ポイント)   Date: 2009/05/21(木) 09:02   No:33760       
Title: 文字列を配列に    
お世話になります。

タイトルどおりですが、

何個あるかわからない文字列("ABC"、"DEFG"、・・・などなど)を

配列に持ちたいのですが、

どうやったらいいのか、さっぱりわかりません。

どなたか教えてください。


何個あるかわからない文字列、とは、

実際は別関数でとってくる文字列があって、それを配列にセットしていきたいのです。

説明足らずで申し訳ないですが、宜しくお願いします。


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


Name: non  ..熟練のプログラマー(41,592ポイント)   Date: 2009/05/21(木) 10:12   No:33765     
Title: Re:文字列を配列に    
環境がわかりませんので、Cだとしたら、
reallocで必要に応じて領域を広げる方法があります。
下のプログラムは1例です。5文字分ずつ領域を広げてます。

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *str;
int ch,n;
str=(char *)calloc(6,sizeof(char));//ナル文字分を含む
n=0;
while((ch=fgetc(stdin))!=EOF){
str[n]=ch;
n++;
if(n % 5 ==0)
str=(char *)realloc(str,sizeof(char)*5);
}
str[n]='\0';
puts(str);
free(str);
return 0;
}

キー入力の終了はCTRL-Zです。


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

Name: Blue  ..中級者(10,442ポイント)   Date: 2009/05/21(木) 10:43   No:33768     
Title: Re:文字列を配列に    
C言語でstd::vector<std::string>みたいなのをやりたいってことでは?

reallocする対象がchar**になるわけで。
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200502/200502_05020032.html
が参考になるかも。



ちなみに、開発環境は必ず明記しましょう。(コンパイラ等)


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

Name: ウズ  ..ぴよぴよ(228ポイント)   Date: 2009/05/21(木) 11:21   No:33772     
Title: Re:文字列を配列に    
>non様
>Blue様
返答ありがとうございます。
開発環境はCでコンパイラはGCCです。バージョンは3.2.2です。

領域を増やす場合、よく定数で増やしたり、倍に増やしたりとしていますが、
それは何故なんでしょう??(とんちんかんなことを聞いているのかもしれませんがすみません)
strlen()で文字列の長さはわかるのに??と思ってしまいます。。




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

Name: non  ..熟練のプログラマー(42,251ポイント)   Date: 2009/05/21(木) 11:52   No:33777     
Title: Re:文字列を配列に    
strlenで長さがわかるなら、(既に別の配列に格納されているのなら)何も、reallocしなくても
いっぺんにcallocかmallocでかまいませんよ。
これは、少しずつ文字数が増えるような場合の手段です。
例えば、この掲示板に書き込むときコメントを入力する欄がありますが、この欄のために何文字分の
配列を用意しますか?1行入力するたびに、次の1行分の領域を広げると無駄がないと思いませんか?


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

Name: non  ..熟練のプログラマー(42,358ポイント)   Date: 2009/05/21(木) 12:25   No:33779     
Title: Re:文字列を配列に    
上に添付したプログラム間違いがありました。
reallocは再確保した領域のバイト数をsizeで指定しなくてはいけませんでしたね。
str=(char *)realloc(str,6+sizeof(char)*5*(n/5));
のようにすればいいでしょうか。


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

Name: YuO  ..プログラマー(30,172ポイント)   Date: 2009/05/21(木) 12:26   No:33780     
Title: Re:文字列を配列に    
malloc系の処理が重いことが多く,その実行時間を軽減する目的で過剰に確保しています。
例えば,下のプログラムで確認すると,
time1 : 63.662000
time2 : 0.024000
と,非常に大きな差がでました。
注) 例示プログラムは,size_tが25bit以上の幅を持つことを前提に書いています。

下記の結果は,一文字ずつ文字列に文字を追加する場合にmalloc/reallocにかかる時間の計測になります。
文字列やコレクションにおいて,このようなことは度々おこるため,
大きめにメモリを確保しておいて,その一部を利用するという手法がとられています。

Example)
#include  <stdio.h>

#include <time.h>
#include <stdlib.h>

#define MAX_SIZE (size_t)(1UL << 24)

size_t increment (size_t size)
{
return size + 1;
}

size_t times2 (size_t size)
{
return size * 2;
}

clock_t measure (size_t max_size, size_t (*func)(size_t))
{
clock_t start, end;
void * ptr;
size_t size;

start = clock();
ptr = 0;
for (size = 1; size < max_size; size = func(size)) {
void * nptr = realloc(ptr, size);
if (nptr == 0) {
fprintf(stderr, "memory allocation error.\n");
free(ptr);
exit(EXIT_FAILURE);
}
ptr = nptr;
}
free(ptr);
end = clock();

return end - start;
}

int main (void)
{
clock_t first, second;

first = measure(MAX_SIZE, increment);
second = measure(MAX_SIZE, times2);

printf("time1 : %f\n", first / (double)CLOCKS_PER_SEC);
printf("time2 : %f\n", second / (double)CLOCKS_PER_SEC);

return EXIT_SUCCESS;
}



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

Name: ウズ  ..ぴよぴよ(540ポイント)   Date: 2009/05/21(木) 14:11   No:33782     
Title: Re:文字列を配列に    
皆様稚拙な質問に答えていただいてありがとうございます。


@文字列”ABC”がきたら
|A|B|C|\0|
という入れ物をつくり
A次に文字列”DEFG”がきたら
|D|E|F|G|\0|
という入れ物をつくる。。
B最後には
|A|B|C|\0|
|D|E|F|G|\0|
という(2次元?)配列ができていればいいのですが、

(mojiには文字列がはいってくるとします。毎回中身は別物です)
@は
char *cp_tmp;
char **cp_table;
cp_tmp = (char * )malloc(sizeof(strlen(moji))+1);
strcpy(cp_tmp, moji);
cp_table = (char *)realloc(cp_table, sizeof(char)+1);
cp_table[0] = &cp_tmp;
というかんじになるのかとは思ったのですが、
Aになるとcp_tmpなるものがまた必要?とかいろいろぐるぐるしてしまって。。



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

Name: toyo  ..プログラマー(34,384ポイント)   Date: 2009/05/21(木) 14:39   No:33783     
Title: Re:文字列を配列に    
temporary作らなくても

char **cp_table = NULL;
cp_table = (char **)realloc(cp_table, sizeof(char*) * 1);
cp_table[0] = (char *)malloc(sizeof(strlen(moji))+1);
strcpy(cp_table[0], moji);
cp_table = (char **)realloc(cp_table, sizeof(char*) * 2);
cp_table[1] = (char *)malloc(sizeof(strlen(moji2))+1);
strcpy(cp_table[1], moji2);

で出来ます
1個ずつreallocで増やさずにあらかじめある程度の個数を確保して足らなくなったらreallocでいいと思いますが


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

Name: 初級者  ..初心者(6,604ポイント)   Date: 2009/05/21(木) 15:01   No:33784     
Title: Re:文字列を配列に    

1行あたりの文字数に制限があってよいならば、こんな方法があるかもしれません。


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

#define LEN (80)

int main(void)
{
char **p, s[LEN];
int n, i;

for (p = NULL, n = 0; printf("文字列 > "), fgets(s, sizeof(s), stdin); n++) {
s[strlen(s)-1] = '\0';
p = (char **) realloc(p, sizeof(char *) * (n + 1));
if (!p) {
exit(1);
}
p[n] = (char *) malloc(sizeof(char) * (strlen(s) + 1));
if (!p[n]) {
exit(1);
}
strcpy(p[n], s);
}

for (i = 0; i < n; i++) {
printf("%s\n", p[i]);
}

for (i = 0; i < n; i++) {
free(p[i]);
}
free(p);
return 0;
}




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

Name: ウズ  ..ぴよぴよ(889ポイント)   Date: 2009/05/22(金) 09:55   No:33839     
Title: Re:文字列を配列に    
>toyo様
>初級者様
返信ありがとうございます

参考にさせていただいて自分なりに簡単ですがサンプルソースを組んでみましたが、


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern void table();
int main(void)
{
int i_i,count=0;
char moji[50];
char *c1;

printf("*** input moji (but 50 made)...\n");

while(1){
gets(moji);
if ( moji[0] == 'e' ) {
break;
}
table(&c1, moji, &count);
}

printf("***** moji list *****\n");
for(i_i=0; i_i<count; i_i++ ) {
printf("%s\n",c1[i_i]);
}
return 0;
}

void table(char **c1, char *moji, int *count)
{
if ( *count == 0 ) {
c1 = (char **)malloc(sizeof(char *));
} else {
c1 = (char **)realloc(c1,sizeof(char *)*((*count)+1));
}

strcpy(c1[*count], moji);
(*count)++;
}


がうまくうごきませんでした。。
2行目の文字を入力しようとすると、coreはきました。。


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

Name: toyo  ..プログラマー(34,701ポイント)   Date: 2009/05/22(金) 10:34   No:33841     
Title: Re:文字列を配列に    
私なら

char **c1 = NULL;

c1 = table(c1, moji, &count);

char** table(char **c1, char *moji, int *count)
{
c1 = (char **)realloc(c1,sizeof(char *)*((*count)+1));
if (c1)
{
c1[*count] = (char *)malloc(strlen(moji) + 1);
strcpy(c1[*count], moji);
(*count)++;
}
return c1;
}

にしてrallocしたポインタを戻り値として受け取るようにします


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

Name: ウズ  ..ぴよぴよ(971ポイント)   Date: 2009/05/22(金) 11:28   No:33843     
Title: Re:文字列を配列に    
>toyo様
toyo様の提示していただいたソースに入れ替えてみました。
が、coreははかなくなりましたが、
mainにもどってからのprintfでの表示部分が動きませんでした。
変数countがカウントアップされませんでした。


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

Name: non  ..熟練のプログラマー(42,563ポイント)   Date: 2009/05/22(金) 11:31   No:33844     
Title: Re:文字列を配列に    
確認しましたが、toyoさんのプログラムは動きました。



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

Name: ウズ  ..かけだし(1,028ポイント)   Date: 2009/05/22(金) 11:55   No:33846     
Title: Re:文字列を配列に    
>toyo様
>non様
返信ありがとうございます。
toyo様申し訳ないです、私のコーディングミスでした。
toyo様のプログラムは問題なく動きました。
non様、ご指摘ありがとうございます。


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

Name: 初級者  ..初心者(6,197ポイント)   Date: 2009/05/22(金) 12:00   No:33847     
Title: Re:文字列を配列に    

動的確保した領域の後始末を含めて…


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

#define LEN (80)

char **makeTable(char **p, int *n)
{
char s[LEN];

for (p = NULL, *n = 0; printf("文字列 > "), fgets(s, sizeof(s), stdin); (*n)++) {
s[strlen(s)-1] = '\0';
p = (char **) realloc(p, sizeof(char *) * (*n + 1));
if (!p)
return NULL;
p[*n] = (char *) malloc(sizeof(char) * (strlen(s) + 1));
if (!p[*n])
return NULL;
strcpy(p[*n], s);
}
return p;
}

void printTable(char **p, int n)
{
int i;

for (i = 0; i < n; i++)
printf("%s\n", p[i]);
}

void freeTable(char **p, int n)
{
while (--n >= 0)
free(p[n]);
free(p);
}

int main(void)
{
char **p;
int n;

if (!(p = makeTable(p, &n)))
exit(1);
printTable(p, n);
freeTable(p, n);
return 0;
}




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

Name: ウズ  ..かけだし(1,079ポイント)   Date: 2009/05/22(金) 14:05   No:33858     
Title: Re:文字列を配列に    
皆様ありがとうございます。

配列のポインタを戻り値としないで、
実現できるようご教授お願いします。


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

Name: toyo  ..プログラマー(34,882ポイント)   Date: 2009/05/22(金) 14:37   No:33862     
Title: Re:文字列を配列に    
じゃあポインタのポインタのポインタ使って

void table(char ***c1, char *moji, int *count)
{
*c1 = (char **)realloc(*c1,sizeof(char *)*((*count)+1));
if (*c1 == NULL) return;
(*c1)[*count] = (char *)malloc(strlen(moji) + 1);
if ((*c1)[*count] == NULL) return;
strcpy((*c1)[*count], moji);
(*count)++;
}



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

Name: ウズ  ..かけだし(1,109ポイント)   Date: 2009/05/22(金) 14:54   No:33864 解決!     
Title: Re:文字列を配列に    
>toyo様
完璧です!!すごいです。ちゃんと動きました。
本当にありがとうございます。



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



Name: TMS  ..ぴよぴよ(227ポイント)   Date: 2009/05/21(木) 16:38   No:33788       
Title: ハンドルされていない例外が発生しました    
はじめまして

自分はこちらのサイトを参考に現在ゲームを作ろうとしている者です
今回、原因のわからないエラーに出くわしてしまい、質問させていただきました

エラーはファイルの読み込み関係で起きています

コンパイルはエラーなく通過するのですが
実行中、以下の関数でfopen_sの部分を処理しようとするとき
「ハンドルされていない例外が発生しました」とエラーメッセージが出てプログラムが中断されてしまいます

*FileNameには"Map/MapData000.txt"を入れています

実際には以下の関数はもう少し長いのですがブレイクポイントを使って
以下の部分しか関係ないと判断して、省略しました


int LoadMap(const char *FileName)
{
FILE *fp;//ファイルポインタ

fopen_s(&fp,FileName,"r");
if (fp == NULL) return -1;

return 0;
}


不鮮明なところがありましたらすみません
何とぞお願いします


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


Name: TMS  ..ぴよぴよ(288ポイント)   Date: 2009/05/21(木) 16:44   No:33789     
Title: Re:ハンドルされていない例外が発生しました    
すみません環境を書き忘れてしまいました

WindowsVista、C言語、MS VisualStadio2008

です

よろしくお願いします


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

Name: kazuoni [URL]  ..比類無きプログラマー(86,097ポイント)   Date: 2009/05/21(木) 16:49   No:33790     
Title: Re:ハンドルされていない例外が発生しました    
えっと、考えられるのは、
・FileNameに終端文字が格納されていない
・関数を抜けるときにfcloseをしていない

ですかね。


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

Name: Mist  ..熟練のプログラマー(61,537ポイント)   Date: 2009/05/21(木) 17:45   No:33791     
Title: Re:ハンドルされていない例外が発生しました    
fopen_sを使用する場合は、ファイルオープン出来たかどうかはfopen_sの戻り値でチェックしてください。
MSDN読みましたけどfopen_sはファイルオープン失敗時にfpにNULLはセットしてくれないみたいです。


if (fopen_s(&fp,FileName,"r")) {
return -1;
}




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

Name: Mist  ..熟練のプログラマー(61,574ポイント)   Date: 2009/05/21(木) 17:47   No:33792     
Title: Re:ハンドルされていない例外が発生しました    
追加

失敗時には「fpの内容を変更しない」とあるのでfpにあらかじめNULLをセットするのもいいかもしれません。


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

Name: TMS  ..ぴよぴよ(183ポイント)   Date: 2009/05/21(木) 18:52   No:33793     
Title: Re:ハンドルされていない例外が発生しました    
早々の回答ありがとうございます

ですが
>fopen_sの戻り値でチェック
>fpにあらかじめNULLをセット
>関数を抜けるときにfclose

どれもやってみたのですが、結果は変わりませんでした

ただ一つ、自分が無学なもので
>FileNameに終端文字が格納されていない
をどのようにすればよいのかわかりませんでした

ご迷惑かけてすみませんが、どうぞご教授お願いします


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

Name: MNS  ..初心者(8,422ポイント)   Date: 2009/05/21(木) 19:10   No:33795     
Title: Re:ハンドルされていない例外が発生しました    
全然関係ないかもしれませんが、
"Map/MapData000.txt"
これを
"Map\\MapData000.txt"
このように書き換えてみてください。


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

Name: Mist  ..熟練のプログラマー(61,739ポイント)   Date: 2009/05/21(木) 19:23   No:33796     
Title: Re:ハンドルされていない例外が発生しました    
関数をコールする時に

LoadMap("Map/MapData000.txt");

というようにしているということですよね。
であれば、終端コードは問題ないと思います。

少なくとも提示されているソースだけでは例外を発生させるような原因は見つけられませんが、ステップ実行をしたときにどこで例外が発生するのでしょうか?
fopen_sですか?
それとも提示されていない部分ですか?

もう少し情報がないと回答できそうにないです。


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

Name: TMS  ..ぴよぴよ(456ポイント)   Date: 2009/05/22(金) 08:06   No:33835     
Title: Re:ハンドルされていない例外が発生しました    
すみませんでした

ここに投稿させていただく前に、ブレークポイントを使って自分なりにエラーの位置を判断したつもりだったんですが
Mistさんの回答から、ステップ実行で確認してみたところ
エラーは上記のソース部分ではなかったことがわかりました

素人の勘違いで皆様に無駄な時間をとらせてしまい本当にすみませんでした


また、エラーはsscanf関数部分で起きていました

自分自身としてsscanfは使い方を完全に理解できていない部分だったので
もしよろしければ、詳しい使い方等ご教授お願いします

エラーに関してはできる限り自分で解決したいので、sscanfを使う際の注意点などをお教えいただけるとうれしいです


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

Name: バグ  ..ハッカー(159,678ポイント)   Date: 2009/05/22(金) 08:27   No:33836     
Title: Re:ハンドルされていない例外が発生しました    
scanf系の関数で例外が発生するミスで多そうなのは、引数にアドレスではなく、実体のコピーを指定していた…とかでしょうか?

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

Name: toyo  ..プログラマー(34,470ポイント)   Date: 2009/05/22(金) 10:01   No:33840     
Title: Re:ハンドルされていない例外が発生しました    
>sscanfを使う際の注意点
可変引数の関数ではプログラマ側がきっちり引数の型を管理しないと危険ですね

#include<stdio.h>
int main()
{
float f;
char *str="1.23";
sscanf(str, "%lf", &f);
printf("%f\n", f);
return 0;
}

これだけで軽く死ねます


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

Name: TMS  ..ぴよぴよ(607ポイント)   Date: 2009/05/22(金) 14:52   No:33863     
Title: Re:ハンドルされていない例外が発生しました    
解決しました!!

どうやらsscanfとsscanf_sの仕様の違い(?)を理解できていなかったようです

sscanf_s(buf,"room=%10s",room);

sscanf_s(buf,"room=%10s",room,sizeof(room));
と書き換えることでエラーなくプログラムが実行されました

ちなみにroomはchar配列です

皆様、丁寧な回答ありがとうございました

またこれはMSDNを見てそのまま引用したため、詳細は理解しておりません
よろしければ解説していただけるとうれしいです


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +