C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   九九の表を表示するプ ....   
     ・[46347] sizuma 
     ・[46348] array 
     ・[46350] kerotan0820 
     ・[46351] Dixq (管理人) 
     ・[46352] non 
     ・[46354] kerotan0820 
     ・[46355] box 
     ・[46358] Dixq (管理人) 
     ・[46374] kerotan0820 
     ・[46376] Dixq (管理人) 
     ・[46379] kerotan0820 
     ・[46380] SooA 
     ・[46381] box 
     ・[46393] Dixq (管理人) 
     ・[46396] SooA 
     ・[46398] kazuoni 
     ・[46405] SooA 
     ・[46412] kazuoni 
     ・[46414] Dixq (管理人) 
     ・[46425] kerotan0820 
     ・[46426] Dixq (管理人) 
     ・[46427] SooA 
     ・[46428] softya 
     ・[46460] SooA 
     ・[46469] kerotan0820 
     ・[46474] kerotan0820 
   ちょっとしたエラーに ....   
     ・[46456] kazuoni 
     ・[46457] softya 
     ・[46458] 蒼空 
   列挙型と名前空間の関 ....   
     ・[46448] hoge 
     ・[46452] たかぎ 
     ・[46453] ぬっち 
   データを読み込みなが ....   
     ・[46365] yu 
     ・[46372] 初心者 
     ・[46373] Dixq (管理人) 
     ・[46383] Ma 
     ・[46394] Dixq (管理人) 
     ・[46429] 初心者 
   ゲーム内の細かいエフ ....   
     ・[46415] Dixq (管理人) 
     ・[46417] KA 
     ・[46419] Dixq (管理人) 
     ・[46420] KA 
     ・[46421] softya 
     ・[46423] KA 
   無題   
     ・[46401] softya 
     ・[46402] 喜久雄 
     ・[46404] softya 
     ・[46406] 喜久雄 
     ・[46407] box 
     ・[46409] kazuoni 
     ・[46410] softya 
     ・[46411] 喜久雄 
   タイピングの入力判定 ....   
     ・[46309] Mist 
     ・[46314] バグ 
     ・[46326] 初心者x 
     ・[46328] Mist 
     ・[46329] Mist 
     ・[46341] 初心者x 
     ・[46346] Mist 
     ・[46408] 初心者x 
   呼び出し元でreturnさ ....   
     ・[46356] バグ 
     ・[46357] あらたし 
     ・[46359] Dixq (管理人) 
     ・[46361] softya 
     ・[46362] box 
     ・[46364] たかぎ 
     ・[46366] softya 
     ・[46367] たかぎ 
     ・[46368] softya 
     ・[46370] たかぎ 
     ・[46371] softya 
     ・[46375] あらたし 
     ・[46377] Dixq (管理人) 
     ・[46382] box 
     ・[46386] たかぎ 
     ・[46389] dic 
     ・[46391] あらたし 
     ・[46392] Ma 
     ・[46395] softya 
   while文のループについ ....   
     ・[46378] Dixq (管理人) 
     ・[46387] nayo 
     ・[46388] たかぎ 
     ・[46390] non 
   特定のフォルダ下に置 ....   
     ・[46385] dic 
   2Dアクションゲーム ....   
     ・[46286] Ma 
     ・[46287] softya 
     ・[46293] ダイマン 
     ・[46294] Ma 
     ・[46297] SooA 
     ・[46310] softya 
     ・[46344] ダイマン 
   自機を狙わせる   
     ・[46306] ひよこ 
     ・[46308] Tororo 
     ・[46321] DVDM 
     ・[46325] Tororo 
     ・[46331] DVDM 
     ・[46332] Tororo 
     ・[46333] Tororo 
     ・[46335] Tororo 
     ・[46336] Ma 
     ・[46337] Tororo 
     ・[46338] DVDM 
   リンカ ツール エラー ....   
     ・[46280] たかぎ 
     ・[46281] トントン 
     ・[46296] KKXY 
     ・[46298] box 
     ・[46302] pie 
     ・[46307] KKXY 
     ・[46311] Mist 
     ・[46312] たかぎ 
     ・[46323] KKXY 
   Ultra-C言語について ....   
     ・[46316] softya 
   ボスの位置を表す赤い ....   
     ・[46220] ひよこ 
     ・[46222] ひよこ 
     ・[46225] kai 
     ・[46227] ひよこ 
     ・[46229] ひよこ 
     ・[46231] SooA 
     ・[46232] kai 
     ・[46244] SooA 
     ・[46246] light 
     ・[46262] ひよこ 
     ・[46301] SooA 
     ・[46304] ひよこ 
   LNK2005が出て困ってい ....   
     ・[46290] ぽこ 
     ・[46291] ぽこ 
     ・[462881264174769] ti 
   この関数の意味は?   
     ・[46198] Dixq (管理人) 
     ・[46200] たかぎ 
     ・[46203] ft 
     ・[46204] jay 
     ・[46205] sizuma 
     ・[46213] Dixq (管理人) 
     ・[46216] jay 
     ・[46260] Naohiro19 
     ・[46265] box 
     ・[46267] hoge 
     ・[46269] たかぎ 
     ・[46270] たかぎ 
     ・[46278] box 
     ・[46279] たかぎ 
   お願いします。   
     ・[46218] ぽこ 
     ・[46221] たかぎ 
     ・[46223] 入門者以下 
     ・[46224] たかぎ 
     ・[46233] 入門者以下 
     ・[46238] sizuma 
     ・[46241] ぽこ 
     ・[46245] たかぎ 
     ・[46247] バグ 
     ・[46248] 入門者以下 
     ・[46264] たかぎ 
     ・[46266] 入門者以下 
     ・[46273] kazuoni 
     ・[46274] たかぎ 
     ・[46276] 入門者以下 
   歩くプログラム   
     ・[46171] Dixq (管理人) 
     ・[46172] 初心者☆ 
     ・[46175] non 
     ・[46257] 初心者☆ 
   点滅しているときに、 ....   
     ・[46243] sizuma 
     ・[46253] kai 
     ・[46256] sizuma 
   お絵かきロジックにつ ....   
     ・[46250] box 
     ・[46251] デジキャメ 
     ・[46254] デジキャメ 
     ・[46255] デジキャメ 
   ドラクエ風の黒い窓を ....   
     ・[46236] kazuoni 
     ・[46237] softya 
     ・[462341266748535] ti 
     ・[462341266749362] ti 
   FPSの処理について   
     ・[46168] Mist 
     ・[46170] たこやき 
     ・[46174] Mist 
     ・[46177] たこやき 
     ・[46180] たこやき 
     ・[46182] たこやき 
     ・[46183] Mist 
     ・[46184] たこやき 
     ・[46186] バグ 
     ・[46187] たこやき 
     ・[46189] たこやき 
     ・[46191] たこやき 
     ・[46194] たこやき 
     ・[46196] バグ 
     ・[46201] たこやき 
     ・[46206] たこやき 
     ・[46207] バグ 
     ・[46208] バグ 
     ・[46209] たこやき 
     ・[46210] たこやき 
     ・[46212] y 
     ・[46219] たこやき 
   ペイントソフトを作っ ....   
     ・[46069] YuO 
     ・[46111] TKOZ 
     ・[46178] SGGK 
     ・[46199] TKOZ 
   弾幕のプチテストプレ ....   
     ・[45845] チルチル 
     ・[45916] jay 
     ・[45922] チルチル 
     ・[45927] 通りすがり 
     ・[45930] Dixq (管理人) 
     ・[45937] チルチル 
     ・[45940] Dixq (管理人) 
     ・[45946] ひよこ 
     ・[45963] Dixq (管理人) 
     ・[45980] チルチル 
     ・[46003] jay 
     ・[46005] チルチル 
     ・[46021] jay 
     ・[46026] チルチル 
     ・[46122] jay 
     ・[46126] Dixq (管理人) 
     ・[46129] jay 
     ・[46131] チルチル 
     ・[46133] Dixq (管理人) 
     ・[46185] jay 
   実行ファイルについて   
     ・[46143] Dixq (管理人) 
     ・[46173] 三日坊主 
   サウンドノベル風文字 ....   
     ・[45800] Mist 
     ・[45803] kazuoni 
     ・[45823] 電気屋 
     ・[45827] softya 
     ・[45830] 電気屋 
     ・[45832] softya 
     ・[45864] SooA 
     ・[45866] 電気屋 
     ・[45867] SooA 
     ・[45871] SooA 
     ・[45903] softya 
     ・[45954] 電気屋 
     ・[46164] 電気屋 
   カレントディレクトリ ....   
     ・[45975] box 
     ・[45976] 天和 
     ・[45977] たかぎ 
     ・[45978] box 
     ・[45989] 天和 
     ・[45992] qwerty 
     ・[45993] box 
     ・[45994] たかぎ 
     ・[46000] box 
     ・[46010] 天和 
     ・[46028] box 
     ・[46031] たかぎ 
     ・[46039] しえる 
     ・[46050] 天和 
     ・[46051] qwerty 
     ・[46052] 天和 
     ・[46053] たかぎ 
     ・[46055] 天和 
     ・[46056] qwerty 
     ・[46057] たかぎ 
     ・[46058] 天和 
     ・[46059] たかぎ 
     ・[46060] 天和 
     ・[46062] たかぎ 
     ・[46063] hoge 
     ・[46066] 天和 
     ・[46068] box 
     ・[46102] 天和 
     ・[46103] たかぎ 
     ・[46104] 天和 
     ・[46105] たかぎ 
     ・[46106] 天和 
     ・[46156] 天和 
   FFの戦闘シーンへのカ ....   
     ・[46080] Ma 
     ・[46093] Justy 
     ・[46115] Dixq (管理人) 
     ・[46123] 山崎 
     ・[46124] 山崎 
     ・[46125] Dixq (管理人) 
     ・[46128] 山崎 
     ・[46130] YAMATO 
     ・[46134] Dixq (管理人) 
     ・[46138] kazuoni 
     ・[46140] Justy 
     ・[46142] Ma 
     ・[46144] Ma 

Name: kerotan0820  ..上級者(21,305ポイント)   Date: 2010/01/16(土) 18:29   No:46345       
Title: 九九の表を表示するプログラム    
今、ニコニコ動画の"nm6350165"にて、for文(ループ)の応用をやっています

内容は九九の表を作ってみようというものでして、このようなプログラムです

/* kuku.c */
#include<stdio.h>
int main(void){
    int i,j;
    for(i=1;i<=9;i++){
       for(j=1;j<=9;j++){
        printf("%2d ",i*j);
    }
    printf("\n");
}
return 0;
}
最初のfor文。 iは1で9以下の間
 for(j=1;j<=9;j++){
        printf("%2d ",i*j);

を実行…

下のfor文。j(1)が9以下の間 printf("%2d ",i*j); を実行

この流れは理解できるんです

なのですが、printf("\n");のみで何故自動で出力され、尚且つ改行が効くのですか?

printf("%d\n",○○);のような記述をする必要は何故無いのでしょうか

回答よろしくお願いします

■追記■
プログラム内での¥がなぜかスラッシュに見えて表示されていますが¥での認識をしてください
仕様なのですかねこれは…
PCの環境のせいですかね 編集済み


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


Name: sizuma [URL]  ..プログラマー(27,529ポイント)   Date: 2010/01/16(土) 19:03   No:46347     
Title: Re:九九の表を表示するプログラム    
printfは文字列を出力するのに使いますから、別に変数じゃなくても

printf("string");

でも出力出来ます。また、

printf("%d回、出力します\n%c\n",1,'b');

なんてこともできます。こうすると

>1回、出力します
>b
>続行するには何かキーを押してください

となるはずです。


>プログラム内での¥がなぜかスラッシュに見えて表示されていますが¥での認識をしてください 
おそらくこの掲示板の文字コードの問題でしょう。
スラッシュではなく、バックスラッシュといい、日本以外ではおそらくエンマークの文字コードに当たるのがバックスラッシュなのだと思います。

printfは可変長の引数を受け取る特殊な関数なので、いろんなことが出来るんだな、と思っていればいいんじゃないかなぁと僕は思います。
改行するだけだったら
puts("");
でいいと思いますよ。 編集済み


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

Name: array [URL]  ..熟練のプログラマー(62,313ポイント)   Date: 2010/01/16(土) 19:14   No:46348     
Title: Re:九九の表を表示するプログラム    
> 尚且つ改行が効くのですか? 

コンピュータに改行して表示する際に、人間がどの様にコンピュータに指示するか
その時に使うのが「エスケープシーケンス」といい、コンピュータはこれを見つけると特別な処理をします。

「エスケープシーケンス」のひとつが「\n」です。コンピュータはこの文字を特別な文字として判断します。
「\n」を見つけると、コンピュータは改行するんだなーと判断して改行してくれます。

他にも「\a」などを入れるとパソコンがピーと鳴ります。

参考:エスケープシーケンス一覧
http://wisdom.sakura.ne.jp/programming/c/Cdata1.html


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

Name: kerotan0820  ..上級者(21,559ポイント)   Date: 2010/01/16(土) 20:15   No:46350     
Title: Re:九九の表を表示するプログラム    
■sizuma様 array様
回答ありがとうございます

大変申し訳ないのですが質問の内容を書き足さねばなりません;
\nが改行を表しているということに関しての知識はあるのです
この九九の場合
 1  2  3  4  5  6  7  8  9 (改行)
 2  4  6  8 10 12 14 16 18 (改行)
 3  6  9 12 15 18 21 24 27 (改行)
 4  8 12 16 20 24 28 32 36..

4の段以降省略しましたが、このように改行がなされています
この改行が何故入るのかが分からないのです
1(i)×1~9(j)を行ったらjが9だからループを抜けて iに1が加算されますよね
2(i)×1~9(j)を行ったらjが9だからループを抜けて

これを繰り返してprintfで表示されているということでしょうか?

自分で質問していてなんだか分かった気がしますが念のため投稿しておきます


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,137,501ポイント)   Date: 2010/01/16(土) 20:26   No:46351     
Title: Re:九九の表を表示するプログラム    
>> keroたんさん

こんにちは^^
ニコニコにはこんな動画もあるんですか〜、面白いですね。
今はいろんな勉強の方法があるので、勉強しやすいですね。

ところで、
(1)
for(x=0; x<3; x++){
    (2)
    for(y=0; y<2; y++){
        (3)        
    }
    (4)
}
(5)


二重ループのこの処理はどのような順番でなされるか答えられますか?
これが答えられたら疑問も晴れると思います^^


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

Name: non  ..比類無きプログラマー(87,634ポイント)   Date: 2010/01/16(土) 20:32   No:46352     
Title: Re:九九の表を表示するプログラム    
字下げがちゃんとできていないから、勘違いされているのではないでしょうか
正しく字下げをすると
    for(i=1;i<=9;i++){
        for(j=1;j<=9;j++){
            printf("%2d ",i*j);
        }
        printf("\n");
    }

こうなりますので、横に1行出力したら、改行を行ってます。


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

Name: kerotan0820  ..上級者(21,864ポイント)   Date: 2010/01/16(土) 20:40   No:46354     
Title: Re:九九の表を表示するプログラム    
■Dixq様
こんにちはです^^
ですよね〜 このような質問サイトもあるわけですし…
C言語を勉強にあたっての環境は最高です^^ 本当に助かります♪

問題に関してですが、これは数字の直下の行とセットで考えればよいのですよね…
これは普通に(1)⇒(2)⇒(3)⇒(4)⇒(5)ではないですか?
xは0で、xが3未満である間xに1を加算する
yは0で、yが2未満である間yに1を加算する
あれ…
何を考えていたかいまいち分からなくなってきました;

ニコニコ動画の動画を今思い出したのですが、プログラムの進行上たしかjが先に加算されていた気がします
j*i(1〜9)を行ったらj(2)*i(1〜9)を行っていた気がするので…
(2)⇒(1)⇒(3)⇒(4)⇒(5)でしょうか^^;
難しいです><


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

Name: box  ..ハッカー(150,012ポイント)   Date: 2010/01/16(土) 20:46   No:46355     
Title: Re:九九の表を表示するプログラム    
くだんの
printf("\n");
を外したときにどういう結果を得るか確認してみると、
printf("\n");
の役割を理解できるかもしれません。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,137,584ポイント)   Date: 2010/01/16(土) 22:06   No:46358     
Title: Re:九九の表を表示するプログラム    
むむ・・お聞きする限りfor文の仕様が理解出来ていないのではないかと思います。
また、制御文の範囲では無い限り、またはgoto文を使わない限り、
プログラムの処理が上に流れる事はありえません。

さっきの質問をもっと簡単にしてみます。
これはどのように処理が進みますか?


(1)
for(i=0;i<3;i++){
    (2)
}
(3)


答え
(1)→(2)→(2)→(2)→(3)


これにならってもう一度考えてみてください。


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

Name: kerotan0820  ..上級者(21,906ポイント)   Date: 2010/01/17(日) 01:27   No:46374     
Title: Re:九九の表を表示するプログラム    
■box様
それに関しては分かります;
最初の質問は多少内容があやふやでした;すみません。

■Dixq様
@@@AABCDが答えでしょうか


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,035ポイント)   Date: 2010/01/17(日) 02:22   No:46376     
Title: Re:九九の表を表示するプログラム    
> @@@AABCDが答えでしょうか 

いやいや、よく見てください。

(1)
for(x=0; x<3; x++){
    (2)
    for(y=0; y<2; y++){
        (3)        
    }
    (4)
}
(5)

何故(1)が最初に3回も処理されるのです?
既に私が上で言ったことと重複しますが

(1) 
for(i=0;i<3;i++){ 
    (2) 

(3) 

の処理の流れは 

(1)→(2)→(2)→(2)→(3) 

となるわけです。
for文の意味は理解されているという認識で良いのですよね?
iが最初0で、3未満の間iをインクリメントしてループするわけですから、
0,1,2の3回ループするわけです。

で、for文の有効範囲ではない(1)にはその制御が及びません。
(1)には何にも干渉されないし、処理は上に流れる事は基本的にないので処理の流れが

(1)→(1)→(1)

になることはないですよね?
言っている意味が解らなければ一度入門サイトで勉強して下さい。

http://www5c.biglobe.ne.jp/~ecb/c/03_07.html

http://www9.plala.or.jp/sgwr-t/c/sec06-2.html

http://homepage1.nifty.com/toshio-k/prog/c/for.html

http://c-production.com/contents/c/sec06.html#03

勉強し終わったらもう一度整理してみましょう。

(1)
for(x=0; x<3; x++){
    (2)
    for(y=0; y<2; y++){
        (3)        
    }
    (4)
}
(5)

では改めて処理の流れは?

「全く解らない」という場合は無理して先に先に進んでも逆に解らないことだらけで効率が良くありません。
基礎から着実に勉強していってみてください。


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

Name: kerotan0820  ..上級者(21,976ポイント)   Date: 2010/01/17(日) 03:06   No:46379     
Title: Re:九九の表を表示するプログラム    
すみません、(1)がfor(x=0; x<3; x++){ だと思っていました

となると
(1)(2)(2)(2)(3)(3)(4)(5)でいいのでしょうか;
間違っていたら勉強しなおします^^;


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

Name: SooA [URL]  ..プログラマー(25,052ポイント)   Date: 2010/01/17(日) 03:21   No:46380     
Title: Re:九九の表を表示するプログラム    
FLASHでやってみた
これで解らないかな?

http://www42.tok2.com/home/tuk2nd/bbs/img/32.swf


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

Name: box  ..ハッカー(150,053ポイント)   Date: 2010/01/17(日) 05:56   No:46381     
Title: Re:九九の表を表示するプログラム    
> (1)(2)(2)(2)(3)(3)(4)(5)でいいのでしょうか;

(1)〜(5)のタイミングでprintfをかませて、
確認してみてはいかがでしょうか。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,487ポイント)   Date: 2010/01/17(日) 11:34   No:46393     
Title: Re:九九の表を表示するプログラム    
> SooAさん

ちょっと違いませんか?;
二重ループの中を通らずに一度ループを終了し、終了した後で二重ループの中に入り、
二重ループが終わってもネストしてる方のループの下には行っていないように見えるのですが、
見えるだけでしょうか;

> kerotanさん

百聞は一見にしかずです。
boxさんが仰る通り、printfを書いてみてください。
私が(1)等と書いている部分をprintfに置き換えて数値を出力できるようにしてみて、実行して確認してみてください。


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

Name: SooA [URL]  ..プログラマー(25,175ポイント)   Date: 2010/01/17(日) 12:10   No:46396     
Title: Re:九九の表を表示するプログラム    
>ちょっと違いませんか?; 
>見えるだけでしょうか;
ち、違いますねぇ ><;
回数だけ確認して折り返し位置とか
全く気にしてませんでした。_| ̄|○

修正を。
http://www42.tok2.com/home/tuk2nd/bbs/img/33.swf

もっと解りやすく表現できれば良かったのだけど。


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

Name: kazuoni [URL]  ..ハッカー(127,600ポイント)   Date: 2010/01/17(日) 12:20   No:46398     
Title: Re:九九の表を表示するプログラム    
> SooAさん

うん、ブラウザがIE , google chromeでは修正版もおかしい気がします。


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

Name: SooA [URL]  ..プログラマー(25,371ポイント)   Date: 2010/01/17(日) 12:55   No:46405     
Title: Re:九九の表を表示するプログラム    
>うん、ブラウザがIE , google chromeでは修正版もおかしい気がします。
ボタン配置とか出来るようになって、
ステップ実行?できるように頑張ります。

初心者用FLASHサイト見ながら作ったので
まだモーショントゥイーンしかできなかったり。・゜・(ノД`)・゜・。


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

Name: kazuoni [URL]  ..ハッカー(127,834ポイント)   Date: 2010/01/17(日) 13:50   No:46412     
Title: Re:九九の表を表示するプログラム    
あ、現在みてみたら完璧ですね。
この手の物は、やはりステップが好ましい気がしますね。
その方が、次をどの様に動くか考える事も出来ますしね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,411ポイント)   Date: 2010/01/17(日) 14:03   No:46414     
Title: Re:九九の表を表示するプログラム    
VisualC++をお使いなら、F10キーを押しても同じ事がコンパイラで確認出来ますね。

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

Name: kerotan0820  ..上級者(22,364ポイント)   Date: 2010/01/17(日) 15:51   No:46425     
Title: Re:九九の表を表示するプログラム    
■SooA様
わざわざFlashまで作ってくださってありがとうございます;
どういう流れで処理が行われているかは理解できました
ですがなぜそうなるのか理解できないのでもう一度2重ループについて勉強してみます><;

■Boxさん
(1)〜(5)のタイミングでprintfをかますとはこういうことでしょうか
#include<stdio.h>
int main(void){
    int x,y;
for(x=0; x<3; x++){
    for(y=0; y<2; y++){
        printf("テスト\n");
}
    printf("テスト2\n");
}
    return 0;
}

実行したらこうなりました
≪実行結果≫
テスト
テスト
テスト2
テスト
テスト
テスト2
テスト
テスト
テスト2

という事は…
xが2以下である間  printf("テスト\n"); を実行("テスト"を2つ表示)
2に達したために下にプログラムが進み printf("テスト2\n");を実行("テスト2"を一つ表示)
for(x=0; x<3; x++) でくくられてるからまた  printf("テスト\n");  から再開
これを3回セット繰り返すということでしょうか
なんだか分かってきた気がします^^
 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,867ポイント)   Date: 2010/01/17(日) 16:08   No:46426     
Title: Re:九九の表を表示するプログラム    
> (1)〜(5)のタイミングでprintfをかますとはこういうことでしょうか 

う〜んと正確にはこういうことでした

#include <stdio.h>

int main(){
    int x,y;
    printf("(1)→"); 
    for(x=0; x<3; x++){ 
        printf("(2)→"); 
        for(y=0; y<2; y++){ 
            printf("(3)→");        
        } 
        printf("(4)→");
    } 
    printf("(5)\n"); 
    return 0;
}
 


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

Name: SooA [URL]  ..プログラマー(25,401ポイント)   Date: 2010/01/17(日) 16:17   No:46427     
Title: Re:九九の表を表示するプログラム    
色で分けてみましたが、解決したかな?

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

Name: softya  ..比類無きプログラマー(92,489ポイント)   Date: 2010/01/17(日) 16:19   No:46428     
Title: Re:九九の表を表示するプログラム    
こんな学習ソフトもありますので学習に役立てて下さい。
http://www.vector.co.jp/soft/win95/edu/se165337.html


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

Name: SooA [URL]  ..プログラマー(25,601ポイント)   Date: 2010/01/17(日) 22:55   No:46460     
Title: Re:九九の表を表示するプログラム    
>あ、現在みてみたら完璧ですね。 
報告送れましたが、データの方だけこっそり直しました^^;
FLASHの事ばかり連続で書き込んでしまうのも
いけないかなと勝手に自重@@

文字と四角だけの処理なのに、
環境によってかなり表示も変わるようで
びっくりしました。
ステップ操作を身につけねば。


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

Name: kerotan0820  ..上級者(22,229ポイント)   Date: 2010/01/18(月) 01:33   No:46469     
Title: Re:九九の表を表示するプログラム    
■Dixq様
なるほど…;
非常に勉強になりました^^

■SooA様
Flashにしろ画像にしろ本当にありがとうございます
とても分かりやすいです><
今回は本当にありがとうございました

Flashについてここで語るのは僕がどうこう言える話ではありませんし、お気にならさずw


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

Name: kerotan0820  ..上級者(22,239ポイント)   Date: 2010/01/18(月) 08:01   No:46474 解決!     
Title: Re:九九の表を表示するプログラム    
.

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



Name: 蒼空  ..ぴよぴよ(972ポイント)   Date: 2010/01/17(日) 22:32   No:46455       
Title: ちょっとしたエラーについて、    
C++をやり始めたばっかりの私が、自分でゲーム(ドラ○エVの戦闘シーンだけみたいなやつ)を、作りたいと思い作り始めているのですが、

コマンド制にしようとしたところ、エラーが出てきてしまって、困っています。

いろんなことを試してもわからなかったので、質問してみました。

問題の部分の関数が↓です。

void fight_calc(){
    /*if(fight_count=0){
        if(boss[0].flag=1 && player[0].flag=1){//ゲーム(戦闘の)の開始なら
            fight_count=2;
        }
    }*/
    if(boss[0].flag>0 && player[0].flag<0){//要するにゲームオーバーなら、
        fight_count=3;
    }
    if(boss[0].flag<0 && player[0].flag>0){//プレイヤーが勝ったのなら、
        fight_count=4;
    }

    switch(fight_count){ // xyyで使い分ける。3けた以外のものは全て全体のシステム系、xが攻撃種類(大まかなコマンド)yyで細かいことを決める
        case 0://戦闘の初めなら、
            fight_count=10;
            break;
        case 3://ゲームオーバー
            break;
        case 4://勝利
            break;
        case 10:
            //画像
            break;
    }
}


で、switch(fight_count){ と言う所から、問題のエラーが、
1>fight.cpp
1>.\mydat\source\fight.cpp(163) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\mydat\source\fight.cpp(164) : error C2065: ' ' : 定義されていない識別子です。
1>.\mydat\source\fight.cpp(164) : error C2143: 構文エラー : ';' が 'case' の前にありません。

と出てきて、後が作れなくなって、困っています。

このエラーの対処の仕方と、直すことができないなら、違うやり方を教えていただけたらな、と思っています。

みなさん、よろしくお願いします。


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


Name: kazuoni [URL]  ..ハッカー(127,872ポイント)   Date: 2010/01/17(日) 22:35   No:46456     
Title: Re:ちょっとしたエラーについて、    
全角空白文字が入っているようです。
半角に変えてみてください。


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

Name: softya  ..比類無きプログラマー(93,207ポイント)   Date: 2010/01/17(日) 22:44   No:46457     
Title: Re:ちょっとしたエラーについて、    
全角空白と半角空白を区別出来るエディタをオススメします。
それと、このコードはC++じゃなくてC言語ですよ。


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

Name: 蒼空  ..かけだし(1,027ポイント)   Date: 2010/01/17(日) 22:46   No:46458 解決!     
Title: Re:ちょっとしたエラーについて、    
なるほど!

よく調べてみたら、switch文の後に全角の空白が入っていました。

こんな些細なことだったなんて。

答えてくださった、kazuoniさん、

本当にありがとうございました。


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



Name: ぬっち  ..中級者(9,347ポイント)   Date: 2010/01/17(日) 20:32   No:46444       
Title: 列挙型と名前空間の関係について    
ご無沙汰しています。
列挙型と名前空間について上手くいかなかったことがあって、いろいろ調べても目的としたものが出てこなかったのでここで質問させていただきます。
C++ですのでこの掲示板での質問が禁止でしたら指摘してくだされば、削除します。
言語はC++で、DirectXの自作ライブラリを行っているところです。

まず、ある名前空間(MyDirectXLib)があったとして、ここでDirectXの機能を実装しています。
そしてそのMyDirectXLibの中で、キーボードのキーを表す列挙型(KeyBoardKey)があったとします。
このKeyBoardKeyを、MyDirectXLibで実装したものを使いやすくした関数が集まっている公開用の名前空間(MyDirectXLibPublic)で、使えるようにするのにはどのようにしたらよいでしょうか?
つまり、KeyBoardKeyをMyDirectXLibで定義して、MyDirectXLibPublicで使いたいのです。
当然ながらtypedefはだめでした。
こうなると両方の名前空間に同じ列挙型を指定しなくてはならないのでしょうか?
一応下に単純なソースを載せておきます。

なお、このような面倒な方法をするのは、MyDirectXLibを公開したくないからです。
使用する人がMyDirectXLibPublicのみ使うようにしたいからです。


//------------------------
// KeyBoard.h
//------------------------

#ifndef INCLUDED_KEYBOARD_H
#define INCLUDED_KEYBOARD_H
//DirectXの機能を実装する名前空間
namespace MyDirectXLib
{
    //キーボードのキーを表す列挙型
    enum KeyBoardKey
    {
        KEYBOARD_KEY_ESC        = 0x01;
        KEYBOARD_KEY_1            = 0x02;
        ...
        ...
        KEYBOARD_KEY_MEDIASELECT    = 0xED;
    }
}
#endif

//------------------------
// Public.h
//------------------------

#ifndef INCLUDED_PUBLIC_H
#define INCLUDED_PUBLIC_H
//MyDirectXLibで実装した機能を簡単にした公開用関数をまとめた名前空間
namespace MyDirectXLibPublic
{
    //この名前空間内でKeyBoard.hで定義した列挙型KeyBoardKeyを使いたい
    // 以下エラーだったもの
    // typedef MyDirectXLib::KeyBoardKey KeyBoardKey ←これだけだと列挙子が必要だという
    // typedef MyDirectXLib::KEYBOARD_KEY_ESC KEYBOARD_KEY_ESC ←このようなことを全ての列挙子について行うと再定義だといわれる。
}
#endif



よろしくお願いします。


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


Name: hoge  ..入門者(3,520ポイント)   Date: 2010/01/17(日) 21:28   No:46448     
Title: Re:列挙型と名前空間の関係について    
using宣言するか、列挙型専用のnamespaceを作ってusing ディレクティブするかどちらかでしょうね。

//using 宣言
namespace MyDirectXLibPublic
{
    using MyDirectXLib::KEYBOARD_KEY_ESC; // これをすべての列挙子に行なう。
}
//using ディレクティブ
namespace MyDirectXLib
{

namespace MyDirectXLib_enum
{
    enum KeyBoardKey
    {
        KEYBOARD_KEY_ESC        = 0x01;
        KEYBOARD_KEY_1            = 0x02;
        ...
        ...
        KEYBOARD_KEY_MEDIASELECT    = 0xED;
    };
}
using namespace MyDirectXLib_enum;

}

namespace MyDirectXLibPublic
{
    using namespace MyDirectXLib::MyDirectXLib_enum;
}


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

Name: たかぎ [URL]  ..ハッカー(153,943ポイント)   Date: 2010/01/17(日) 22:18   No:46452     
Title: Re:列挙型と名前空間の関係について    
公開するものはMyDirectXLibPublic内で定義して、MyDirectXLib内で、

using namespace MyDirectXLibPublic;

とするか、using指令を使わずにフルネームで使えばよいのではないでしょうか?


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

Name: ぬっち  ..中級者(9,505ポイント)   Date: 2010/01/17(日) 22:23   No:46453 解決!     
Title: Re:列挙型と名前空間の関係について    
hogeさん、たかぎさん(返答のプレビューを見ているときに投稿されたようで^^;)返答ありがとうございます。

なるほど、このような方法がありましたか・・・。
C++がまだ完璧に使いこなせていないためかこの方法を思いつきませんでした^^;
おかげさまで解決しました^^
ちなみに列挙型専用のnamespaceを作る方法やたかぎさんの方法ですと、私の設計が悪かったためか、修正が困難な状況になってしまいましたので、それぞれの列挙子についてusing宣言をしたところ望んだ結果が得られました。
それにしてもやはりC++は設計を含め奥深いですね^^;

今後もわからないことがあったら質問させていただきます。
ありがとうございましたm(−−)m


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



Name: 初心者  ..熟練のプログラマー(46,481ポイント)   Date: 2010/01/16(土) 22:29   No:46363       
Title: データを読み込みながらアニメーションを表示させる方法    
メインウィンドウでアニメーションさせながら、
画像や音楽を読み込み(非同期?)させたいのですが、
どうしたらいいでしょうか?

環境は、
DxLib,C++ です。
よろしくお願いします。


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


Name: yu  ..熟練のプログラマー(41,874ポイント)   Date: 2010/01/16(土) 23:22   No:46365     
Title: Re:データ読み込み    
以前に同じような質問があったのでURLを張っておきますね

http://www.play21.jp/board/formz.cgi?action=res&resno=37480&page=&lognum=114&id=dixq&rln=37516#37480


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

Name: 初心者  ..熟練のプログラマー(46,522ポイント)   Date: 2010/01/17(日) 00:28   No:46372     
Title: Re:データ読み込み    

>yuさん

すいません、見落としてました(汗

ありがとうございます、参考になりました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,137,528ポイント)   Date: 2010/01/17(日) 01:10   No:46373     
Title: Re:データ読み込み    
過去ログに色々あります。

Justyさんが以前お書きになっていたものの引用です。

Now Loading の表示方法を教えてください  
http://www.play21.jp/board/formz.cgi?action=res&resno=18305&page=&lognum=58&id=dixq&rln=18325 

ロード画面 
http://www.play21.jp/board/formz.cgi?action=res&resno=35816&page=&lognum=109&id=dixq&rln=35832 

ゲーム起動時の画像の表示 
http://www.play21.jp/board/formz.cgi?action=res&resno=28831&page=&lognum=90&id=dixq&rln=28864 

ロード中のアニメーション表示 
http://www.play21.jp/board/formz.cgi?action=res&resno=39564&page=&lognum=121&id=dixq&rln=39656 



以下のようなサンプルプログラムを作った事もあります。
http://dixq.net/zip/bbs/SampleLoad2.zip


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

Name: Ma  ..プログラマー(30,597ポイント)   Date: 2010/01/17(日) 06:47   No:46383     
Title: Re:データ読み込み    
同じような質問が多発してるみたいなので、
せめてFAQのページを作って、質問欄を作り、リンクをおいてはいかがでしょうか

たとえば、


●掲示板 FAQ
 掲示板に投稿する前にチェックしてみてねb


・メニューの表示の仕方
 ・リンク1
 ・リンク2
・常に更新されるNow Loading...の表示の仕方
 ・リンク1
 ・リンク2
 ・リンク3

のように。


まぁ、検索すれば分かるだろう?といえばそこまでなんですが、
ここの検索はログの個数制限だとか少々やりずらいので、作っておいて損はないんじゃないでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,370ポイント)   Date: 2010/01/17(日) 11:38   No:46394     
Title: Re:データ読み込み    
> Maさん

そうですね、私もまさに作ろうとしていたところでした。
進路のことなんかも最近多いですね。
(まぁ進路のことは自分にあった回答が欲しいでしょうけど・・)

ただこのFAQが膨大な量になってきた時、はたして全部見てから質問してくれるかという問題が出てきそうです・・。
将来カテゴリわけとかできるようにして何とかやってみたいと思います。


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

Name: 初心者  ..熟練のプログラマー(46,596ポイント)   Date: 2010/01/17(日) 16:30   No:46429 解決!     
Title: Re:データ読み込み    
>Dixqさん

サンプルプログラムを見させていただきましたが、
とても綺麗でビックリしました。

>皆さん

いろいろとありがとうございました。
過去ログを参考にしてがんばってみます。


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



Name: KA  ..ぴよぴよ(353ポイント)   Date: 2010/01/17(日) 14:02   No:46413       
Title: ゲーム内の細かいエフェクト    
よくゲームをやっていると、文字や画像が色々なエフェクトで画面に出てきたりしています(横から・点滅等)。
これをDxライブラリで再現しようと思って考えていたのですが、一つのエフェクトを再現するのにかなり長くなってしまって、とても無駄な処理に思えてきます。

何かコードをスッキリさせつつ、エフェクトを再現できるような方法はありませんか?
というより、普通のゲームはエフェクトをどのようにコードを書いているのでしょうか?



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


Name: Dixq (管理人) [URL]  ..ウィザード(1,138,461ポイント)   Date: 2010/01/17(日) 14:06   No:46415     
Title: Re:ゲーム内の細かいエフェクト    
そのエフェクトによってどう再現するのが適切かは変わってくると思うので、
例えばこれと言ってもらえた方が解りやすいかも知れません。


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

Name: KA  ..ぴよぴよ(465ポイント)   Date: 2010/01/17(日) 14:25   No:46417     
Title: Re:ゲーム内の細かいエフェクト    
例えば、文字の点滅やフェードインです。

ゲームのタイトルに入る前に「ボタンを押してください」と表示されていてそれが点滅していたり、
項目が横から流れてきたりするのを表現したいのですがどうもうまくきれいなコードになりません。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,792ポイント)   Date: 2010/01/17(日) 14:33   No:46419     
Title: Re:ゲーム内の細かいエフェクト    
その程度なら大して複雑なコードにならないと思いますが・・。
例えば点滅させる描画であれば

描画();



if( (カウンタ/○)%△ )
    描画();

のように書けばいいだけじゃないでしょうか。

カウンタは0から整数で一つずつ増加している数値だとして、その割った余りによって描画するかしないかわけてやれば
簡単に点滅出来そうです。

項目を移動させたいなら項目の座標を計算する関数を作ってやり

void 項目の座標計算(){

    for(i=0;i<項目数;i++){
        項目[i].x += 移動量;
        項目[i].y += 移動量;
    }

}

void エフェクト制御メイン(){
    if(項目の座標が移動中){
        項目の座標計算();
    }
}

こんな感じで私なら作るでしょうか。
別に配列でもリストでも何でもいいんですが。

計算が単純なら一緒に書いてやってもいいと思いますし、
計算が複雑ならそれを計算する担当の関数を作ってやればどうでしょう?


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

Name: KA  ..ぴよぴよ(569ポイント)   Date: 2010/01/17(日) 14:46   No:46420     
Title: Re:ゲーム内の細かいエフェクト    
やっぱりそう書くしかないですよね…

自分のもそう書いているのですが、考えているエフェクトが細かい&多いのでいちいち関数化・分割しないといけないのが非効率な気がしたのですが、やはり地道に書いていくしかないんですね。


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

Name: softya  ..比類無きプログラマー(92,424ポイント)   Date: 2010/01/17(日) 15:02   No:46421     
Title: Re:ゲーム内の細かいエフェクト    
構造体配列でタイミングやら、パラメータやらを定義したテーブルを作るとか。
龍神録の敵の発生テーブルの様なイメージです。


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

Name: KA  ..ぴよぴよ(599ポイント)   Date: 2010/01/17(日) 15:28   No:46423 解決!     
Title: Re:ゲーム内の細かいエフェクト    
なるほど。そういう方法もありますね。

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


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



Name: 喜久雄  ..ぴよぴよ(152ポイント)   Date: 2010/01/17(日) 12:21   No:46399       
Title: 無題    
[1]http://dixq.net/rp/57.html
ここのサイトで上のページを見せてもらいましたが、
Vertex[0].pos.x = 320.0F - 50.0F ; 
について
なぜ左辺は.が二つあるのですか? Fってなんですか?
この二つが分かりません。

[2]http://dixq.net/rp/59.html
Ob->Img     = ImgHandle;//画像ハンドル
の->の演算子って何ですか?

[3]よくゲームセンターのコインなどの数を表すために表示される、デジタル数字は
ゲームでは画像処理であらわす以外ないんですか?

よろしくお願いします。


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


Name: softya  ..比類無きプログラマー(91,375ポイント)   Date: 2010/01/17(日) 12:32   No:46401     
Title: Re:無題    
>なぜ左辺は.が二つあるのですか? Fってなんですか?

Vertex[0].pos.xは、構造体に含まれる構造体の参照だからです。
Fはfloat型定数を表す接尾語です。
これについては、Cの入門書をお読み下さい。

>の->の演算子って何ですか?

Obが構造体のポインタだからです。
->は構造体のメンバを参照する参照演算子です。
これについても、Cのポインタについて入門書などで学んで下さい。

>デジタル数字はゲームでは画像処理であらわす以外ないんですか?
パソコンなどで機器が文字フォントを持っていて、その文字フォントで構わないなら文字フォントで表示することは可能です。
 編集済み


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

Name: 喜久雄  ..ぴよぴよ(253ポイント)   Date: 2010/01/17(日) 12:38   No:46402     
Title: Re:無題    
すいません。
もう少し詳しくいいですか?

320.0FってなんでFをつけてるのですか? 320.0でも同じなのか分からないんですが・・・
Fをつけることでfloat型に変換されるんですかね? float(a);のように


>パソコンなどで機器が文字フォントを持っていて、その文字フォントで構わないなら文字フォントで表示することは可能です。 

DXライブラリ+windowsのフォントでは可能ですか?


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

Name: softya  ..比類無きプログラマー(92,011ポイント)   Date: 2010/01/17(日) 12:54   No:46404     
Title: Re:無題    
>320.0FってなんでFをつけてるのですか? 320.0でも同じなのか分からないんですが・・・

320.0Fはfloat型ですが、320.0はdouble型です。
使う場所によってはエラーとなりますので、ちゃんと日頃から使わい分けておいた方が良いです。

>Fをつけることでfloat型に変換されるんですかね? float(a);のように 
変換と言うより定数ですので、コンパイラが型を認識します。

>float(a);
(float)aの事ですか?
これはキャストと言って、型を変換するときに使います。
これは実行時に型変換が行われる動的なものです。

>DXライブラリ+windowsのフォントでは可能ですか? 

それなら、DrawString()関数を使われてはどうでしょうか?





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

Name: 喜久雄  ..ぴよぴよ(379ポイント)   Date: 2010/01/17(日) 12:56   No:46406     
Title: Re:無題    
ついでなんで
この二つも教えてください。
よくfor( ;; )
if(bstrNamespace)
など、普通学校の授業で習わない演算子を難しいプログラムでは目にします。
この
for( ;; )やif(bstrNamespace)
はどういう意味を表してるんですか?
よろしくお願いします。


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

Name: box  ..ハッカー(150,139ポイント)   Date: 2010/01/17(日) 12:56   No:46407     
Title: Re:無題    
> >の->の演算子って何ですか?

> Obがポインタだからです。
> ->はポインタ参照演算子です。

なんだか誤解を招きそうです。
ちゃんと、Obは「構造体を指す」ポインタである、と書いてあげないと…。


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

Name: kazuoni [URL]  ..ハッカー(127,882ポイント)   Date: 2010/01/17(日) 13:17   No:46409     
Title: Re:無題    
> よくゲームセンターのコインなどの数を表すために表示される、デジタル数字は
> ゲームでは画像処理であらわす以外ないんですか?

できますよ。
一応ちょっと前に自作してみました。
本当は海外ドラマ24のオープニングを見て
「これが作りたい!」
って思ったのがきっかけだったんですが、途中で中折れしましたw

http://www1.axfc.net/uploader/Sc/so/74032
Key : kazuoni

とりあえず、
関数DigitalNum::DrawDigitalValueを実行すれば数値がデジタル表記できます。

int DrawDigitalValue(int x, int y, int value, int Color, int Size, int Thinck, int Cinterval);

x 描写するx座標左上
y 描写するy座標左上
value デジタル表記したい数値
Color 数値の色
Size だいたいの数値の大きさ
Thinck 太さ
Cinterval 文字間隔

戻り値 1

こんな感じです。いろいろとパラメータいじると、デジタル数字ではなく、
ホラー系の文字が出るときがありますが・・・それはご愛敬ってやつで^^;

添付したexeでは、エンターキーを押すと文字の拡大、Zキーで縮小出来ます


#相変わらず、需要のないもの作ってるなぁ・・・。


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

Name: softya  ..比類無きプログラマー(92,368ポイント)   Date: 2010/01/17(日) 13:20   No:46410     
Title: Re:無題    
>ちゃんと、Obは「構造体を指す」ポインタである、と書いてあげないと…。

あっ、そうですね。訂正します。
構造体ポインタのメンバを参照する参照演算子です。元も直しておきました。

>よくfor( ;; )if(bstrNamespace)など、普通学校の授業で習わない演算子を難しいプログラムでは目にします。

C言語の規約が良く分かってくると書ける書き方ですね。

>for( ;; )
条件式が省略されているので、無限ループです。
ループ中から、何らかの方法で抜け出さない限り無限ループとなります。
抜け出すには、break,return,gotoいずれかの方法が必要です。

>if(bstrNamespace)
if文で条件演算をせずに、変数に条件演算結果が入っている場合ですね。
if文は値が0なら偽、値が0以外なら真として動作します。


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

Name: 喜久雄  ..ぴよぴよ(433ポイント)   Date: 2010/01/17(日) 13:28   No:46411     
Title: Re:無題    
みなさん詳しい解説やプログラムを感謝します。
つまり
for( ;; )はwhileルールの感覚
if(bstrNamespace)はif(flag==True)を省略したような感じでしょうか?
質問はこれで終わりとします。


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



Name: 初心者x  ..ぴよぴよ(647ポイント)   Date: 2010/01/16(土) 11:09   No:46303       
Title: タイピングの入力判定が分かりません    
とりあえず、CUI環境で作っていくところからはじめようと思っています。
よろしくお願いします。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std;


int main()
{
    FILE *fp;                                        //ファイルポインタ
    char datafile[] = "word1.txt";                    //出力する問題
    char outtxt[256];
    char buff[1024];

    if((fp = fopen(datafile, "r")) == NULL) {
        printf("ファイルオープンエラー\n");
        exit(1);
    }

    while(fgets(buff, sizeof buff, fp) != NULL) {    //出力
        sscanf(buff, "%s", outtxt);
        printf("%s\n", outtxt);
    }

    FILE *gp;
    clock_t start, end;
    double jikan;
    char d[512];                            //入力と出力を行う変数
    char c[512];
    int i;

    cout << '\n' << "半角で入力してください\n";
    start = clock();
    
    if((gp = fopen("word2.txt", "r")) == NULL) {
        cout << "ファイルオープンエラー\n";
        exit(1);
    }
    
    do{ fgets(c, 80, gp);          /問題の部分と考えています/
        for(i=0; i<80; i++){
        cin >> d[i]; 
        if(c[i] == d[i]) cout << c[i];
        else exit(1);
        }
    }while(c != NULL);
    

    end = clock();
    jikan = (double)(end-start) / CLOCKS_PER_SEC;
    jikan = jikan/60;
    double y;
    double z;
    z = modf(jikan, &y);
    z = z*60;

    cout << "\n経過時間は" << y << "分" << z << "秒です" << '\n';
    fclose(fp);
    fclose(gp);

    return 0;
}

初心者なのでこんな感じになってしまったのですが、
入力判定のところで迷っています。
一文字ずつ打っていかなければいけないのでしょうか?
もしよければ、ヒントだけでも教えていただければもう一度勉強しなおします。


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


Name: Mist  ..比類無きプログラマー(82,236ポイント)   Date: 2010/01/16(土) 12:16   No:46309     
Title: Re:タイピングの入力判定が分かりません    
> 一文字ずつ打っていかなければいけないのでしょうか? 

質問の意図がちょっと不明確です。
このソフトの仕様次第=あなたはどうしたいのか?、によります。

あと、不具合があるので指摘しておきます。

> }while(c != NULL);

この時のcはc[512]の先頭アドレスを表すので絶対にNULLになることはありません。


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

Name: バグ  ..ハッカー(183,798ポイント)   Date: 2010/01/16(土) 12:31   No:46314     
Title: Re:タイピングの入力判定が分かりません    
Windowsならば、conio.hをインクルードして、_kbhit関数を使えば、キー入力の有無を取得できます。

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

Name: 初心者x  ..ぴよぴよ(784ポイント)   Date: 2010/01/16(土) 13:38   No:46326     
Title: Re:タイピングの入力判定が分かりません    
誠に申し訳ありません。
>一文字ずつ打っていかなければいけないのでしょうか

といった意味は、コマンドプロンプトの画面上で、タイピングした際に
打った文字と答えが合っていたら出力をする、ということを処理するにはどうしたらいいでしょうか。
という意味です。

また、不具合のご指摘ありがとうございました。

環境としてはborland c++ compiler5.5を使っています。

conio.hをインクルードできるみたいなので、_kbhit関数を使ってもう一度考えてみようと思います。

出直してきます。



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

Name: Mist  ..比類無きプログラマー(82,965ポイント)   Date: 2010/01/16(土) 13:57   No:46328     
Title: Re:タイピングの入力判定が分かりません    
> 打った文字と答えが合っていたら出力をする、ということを処理するにはどうしたらいいでしょうか。 

さらに質問ですが、今のプログラムを見ると
一文字入力してもらう

一文字判定して

マッチならその文字を出力。(意味ないような気もするが)→文字入力に戻る
アンマッチならプログラム終了

となっていますね。
これを

文字列を入力してもらう。(文字数不定)

文字列全体で判定する

としたい、ということでしょうか?
であれば、strcmp使えばすぐ解決するような気もします。(質問の意図読み違えているかも)
 編集済み


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

Name: Mist  ..比類無きプログラマー(83,022ポイント)   Date: 2010/01/16(土) 14:05   No:46329     
Title: Re:タイピングの入力判定が分かりません    
ソース

    while (fgets(c, 80, gp) != NULL) {
        cin >> d;

        if (!strcmp(c, d)) {
            // 正解した場合の処理を書く
        } else {
            // 失敗した場合の処理を書く
        }
    }


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

Name: 初心者x  ..ぴよぴよ(890ポイント)   Date: 2010/01/16(土) 17:25   No:46341 解決!     
Title: Re:タイピングの入力判定が分かりません    
Mistさんありがとうございました。
無事解決致しました。


    while(fgets(c, 80, gp) != NULL){
        cout << c << "\n";
        cin >> d;
        if((!strcmp(c, d)) && (c != NULL)){
            cout << '\a';
        } else if(c == NULL) { break;
        } else {
            cout << "アウチ"; exit(1);
        }


実は、これは最初に言っておくべきだったのかもしれませんが、
最終的には、visualC++で作りたいと考えています。
勉強することは山ほどあり、道のりは遠いかもしれませんが、これを最初の一歩として、
やっていきたいです。
また、kbhitについても調べてみようと思います。
ではまたお勉強してきます^^


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

Name: Mist  ..比類無きプログラマー(83,157ポイント)   Date: 2010/01/16(土) 18:37   No:46346     
Title: Re:タイピングの入力判定が分かりません    
どうしcをNULLと比較したがるんだろう??
エスパーで推測してcに文字列が入ってない場合を想定しているのであれば、fgetsでチェックしているからありえない。(改行のみって事はあるかもしれないけど)
で、文字終端はNULLではなく'\0'。
fgetsの動作と、文字列についてもうちょっと勉強したほうがいいかもしれません。


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

Name: 初心者x  ..ぴよぴよ(953ポイント)   Date: 2010/01/17(日) 13:14   No:46408     
Title: Re:タイピングの入力判定が分かりません    
申し訳ありません。
fgetsはEOFになったら、NULLを返すとあったもので、つい。。。

もっと復習してきます。。



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



Name: あらたし  ..ぴよぴよ(52ポイント)   Date: 2010/01/16(土) 20:36   No:46353       
Title: 呼び出し元でreturnさせるような関数    
こんばんは。
質問させて下さい。

関数を作りたいと思っています。
関数の内容は、関数を呼び出したら、呼び出し元がreturnするような関数です。
つまり、

int main()
{
 return 0;
}

を、

void func()
{
 // something..
}
int main()
{
 func();
}

のように書き換えられないか、ということです。


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


Name: バグ  ..ハッカー(183,830ポイント)   Date: 2010/01/16(土) 20:59   No:46356     
Title: Re:呼び出し元でreturnさせるような関数    
こういう事かな?

int func()
{
    // something..
    return 0;
}

int main()
{
    return func();
}



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

Name: あらたし  ..ぴよぴよ(90ポイント)   Date: 2010/01/16(土) 21:46   No:46357     
Title: Re:呼び出し元でreturnさせるような関数    
ありがとうございます。
しかし、そうではなく、mainの中のreturnを取り除きたいのです。
(先のfuncの返り値がvoid型になっていたのはミスです。)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,137,812ポイント)   Date: 2010/01/16(土) 22:13   No:46359     
Title: Re:呼び出し元でreturnさせるような関数    
> mainの中のreturnを取り除きたいのです。 

取り除けないです。
main関数はかならず帰り値を持つ必要があります。
ただし、

main(){
}



void main(){
}

でも実行できることは出来ますが、正しくないとされています。

どうしてもreturn無しに、関数を呼び出した行の次で関数を終えたいなら


main(){

   func();
   goto ex;

   //(1)
   //(2)
   //(3)
   //(4)
   //(5)
ex:
   //何か
}

でしょうが、完全に無意味なプログラムになります。

> 関数の内容は、関数を呼び出したら、呼び出し元がreturnするような関数です。

マルチスレッドで動いている場合を想定されているのでしょうか?
呼び出し元は呼び出し先の処理が終わるまで処理が進みません。


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

Name: softya  ..比類無きプログラマー(90,745ポイント)   Date: 2010/01/16(土) 22:21   No:46361     
Title: Re:呼び出し元でreturnさせるような関数    
>ありがとうございます。
>しかし、そうではなく、mainの中のreturnを取り除きたいのです。
>(先のfuncの返り値がvoid型になっていたのはミスです。)

main()のreturnは取り除けません。
関数は必ず暗黙か明示的なreturnが必要で、戻り値のある関数は必ず明示的なreturnが必要です。

main()→func()
と呼び出したら必ず
func()→main()
に戻らないといけません。



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

Name: box  ..ハッカー(150,019ポイント)   Date: 2010/01/16(土) 22:24   No:46362     
Title: Re:呼び出し元でreturnさせるような関数    
func()の中でexit()すれば?

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

Name: たかぎ [URL]  ..ハッカー(153,618ポイント)   Date: 2010/01/16(土) 23:06   No:46364     
Title: Re:呼び出し元でreturnさせるような関数    
> func()の中でexit()すれば?

これしかないでしょうね。
C++であれば、std::set_terminateでstd::exitを呼び出す関数を登録しておいて、funcから例外を送出するというのもひとつの手です。


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

Name: softya  ..比類無きプログラマー(90,831ポイント)   Date: 2010/01/16(土) 23:24   No:46366     
Title: Re:呼び出し元でreturnさせるような関数    
> func()の中でexit()すれば? 
これがfunc()の中でプログラムを抜けたいと言う意味なら正しいと思いますが。

>mainの中のreturnを取り除きたいのです。 
return文を書きたくないと言う意味なら、必ずエラーが出ることになるので避けれません。
って答になりますが、求めていることがいまいち分からないんですよね。



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

Name: たかぎ [URL]  ..ハッカー(153,626ポイント)   Date: 2010/01/16(土) 23:26   No:46367     
Title: Re:呼び出し元でreturnさせるような関数    
> return文を書きたくないと言う意味なら、必ずエラーが出ることになるので避けれません。 

エラーは出ないと思います。


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

Name: softya  ..比類無きプログラマー(90,760ポイント)   Date: 2010/01/16(土) 23:57   No:46368     
Title: Re:呼び出し元でreturnさせるような関数    
>エラーは出ないと思います。 

あっ勘違いしてました。すいません。
そうですね。Cはエラーにならないんですよね。
LINTでわざわざ引っ掛けたのを思い出しました。


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

Name: たかぎ [URL]  ..ハッカー(153,635ポイント)   Date: 2010/01/17(日) 00:17   No:46370     
Title: Re:呼び出し元でreturnさせるような関数    
> そうですね。Cはエラーにならないんですよね。 

C++でもエラーになりません。


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

Name: softya  ..比類無きプログラマー(90,806ポイント)   Date: 2010/01/17(日) 00:24   No:46371     
Title: Re:呼び出し元でreturnさせるような関数    
>C++でもエラーになりません。

エラーになる言語としては、C#とかだとエラーになります。


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

Name: あらたし  ..ぴよぴよ(125ポイント)   Date: 2010/01/17(日) 02:21   No:46375     
Title: Re:呼び出し元でreturnさせるような関数    
たくさんの回答ありがとうございます。
“まぁ無理”と言うことですね。
別の方法を取ります。
ありがとうございました。



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,138,218ポイント)   Date: 2010/01/17(日) 02:24   No:46377     
Title: Re:呼び出し元でreturnさせるような関数    
無理というか、CやC++言語は完成された言語ですから、やりたい事は99.9%出来るはずです。
出来ないなら、使い方を間違っているか、知らないか、そもそもプログラム的な考え方にマッチしないかなどだと思います。
現在あらたしさんがやろうと思っている処理の具体的な内容が解りませんが、
その内容をはっきりさせれば、これ以外にもっと簡単に適切に解決する方法があるはずだと思いますよ。


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

Name: box  ..ハッカー(150,075ポイント)   Date: 2010/01/17(日) 05:57   No:46382     
Title: Re:呼び出し元でreturnさせるような関数    
> “まぁ無理”と言うことですね。

そうじゃなくて、本当は何をしたいのかが
うまく伝わっていないだけ。


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

Name: たかぎ [URL]  ..ハッカー(153,787ポイント)   Date: 2010/01/17(日) 08:51   No:46386     
Title: Re:呼び出し元でreturnさせるような関数    
> 関数の内容は、関数を呼び出したら、呼び出し元がreturnするような関数です。 

これを字面通りに解釈すると、呼び出し元はmainとは限りませんね。
その場合、処理系に依存せずに実現することは無理です。

処理系を特定すれば、保存されている戻り先アドレスを書き換えることで実現可能です。
戻り先アドレスは、スタックに保存されていることもあれば、汎用レジスタ等に保存されていることもあります。また、スタックの場合でも、コーリングコンベンションをよく調べなければ、具体的にどこに保存されるのかわからないと思います。
典型的には...

↑アドレス上位
仮引数
戻り先アドレス
フレームポインタ
自動変数
↓アドレス下位

のようになります。
この場合であれば、
void func(void)
{
  void ** volatile dummy;
  *(&dummy + 2) = *(*(&dummy + 1)  + 2);
}

のような感じで実現できるかもしれません。
検証していないので動くかどうか知りませんし、あらたしさんの環境に通用するかどうかも知りません。


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

Name: dic  ..熟練のプログラマー(49,081ポイント)   Date: 2010/01/17(日) 09:38   No:46389     
Title: Re:呼び出し元でreturnさせるような関数    
なんでそんな子供みたいなこと言うの
ゲームができて動けばいいレベルでしょうに


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

Name: あらたし  ..ぴよぴよ(487ポイント)   Date: 2010/01/17(日) 11:12   No:46391     
Title: Re:呼び出し元でreturnさせるような関数    
>これを字面通りに解釈すると、呼び出し元はmainとは限りませんね。
mainと書いたのが混乱を招いたのですね。
すいませんでした。


>その場合、処理系に依存せずに実現することは無理です。 
そうですか。残念です。


たかぎさんの実現方法に関して、おっしゃることは何となく分かるのですが、実装がすごいことになりそうですね。
さすがにそこまで突っ込むのは気が引けてしまいます。
ですが、そういうこともできるということを知ることができて嬉しいです。
ありがとうございます。


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

Name: Ma  ..プログラマー(30,629ポイント)   Date: 2010/01/17(日) 11:20   No:46392     
Title: Re:呼び出し元でreturnさせるような関数    
dicさん、誰に言っているのでしょうか?(というかその発言は荒らしに見えます。)
私にはみんな真剣に答えているように見えます。 

ともかく、今回の件で意思疎通ができていなかったのは、質問者の質問が具体的ではなかったか、情報や例が足りなかったのが原因だとおもいます。
この件は、全面的に box さんと Dixq さんに同意です。(質問がうまく伝わっていない点で)

それに、ちょっとあいまいだった質問にたかぎさんやsoftyaさんが何を言おうとしているのか
真剣に考えて答えてくれています。

>しかし、そうではなく、mainの中のreturnを取り除きたいのです。 
このへんから、なんとなく言っていることが分かってきたかな・・ってぐらいでした。

もし、あらたしさんがまだ見ているのであれば、
これからは質問をより具体的に表現してくれることをお願いしたいです。 編集済み


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

Name: softya  ..比類無きプログラマー(91,000ポイント)   Date: 2010/01/17(日) 11:46   No:46395     
Title: Re:呼び出し元でreturnさせるような関数    
相変わらずイマイチ何をしたいか分から無いんですが、
setjmp/longjmp
で解決出来る問題かも知れません。
http://www.nurs.or.jp/~sug/soft/super/longjmp.htm
ただ、スタックの働きとか良く分かっていないと
http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=setjmp%2Flongjmp
のような問題を引き起こします。
まぁ、longjmp自体エラー処理用というか例外処理用的なものですので、日常的に使うのはどうかと思いますが。
普通こんなものを使わなくても大体はプログラムアルゴリズムで解決出来る問題ですので、アルゴリズムをちゃんと考えた方が良いとは思います。



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



Name: C言語初心者  ..入門者(4,080ポイント)   Date: 2010/01/17(日) 00:14   No:46369       
Title: while文のループについて・・・    
始めまして
C言語初心者です。

学校の課題でフローチャートを描いていたのですが、行き詰まってしまったので
どなたかアドバイスお願いします。


    while(1)
    {
        AD.ADCSR.BIT.ADST=1;

        while(AD.ADCSR.BIT.ADF==0)    {}
        
            IO.PDR5.BYTE=(AD.ADDRC>>8);


        }
 }

この場合、どのような順序で処理が行われるのでしょうか?
お手数ですが、アドバイス頂けると助かります。
よろしくお願いします。





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


Name: Dixq (管理人) [URL]  ..ウィザード(1,138,342ポイント)   Date: 2010/01/17(日) 02:27   No:46378     
Title: Re:while文のループについて・・・    
カッコの数がおかしいですし、別スレッドで共通の変数を利用しているならともかく無意味なループがあります。
本当にプログラムコードは正しいですか?

また、今ご自身で解っているのはどの段階ですか?
書きかけのフローチャートなどあれば見せてもらえると間違いの指摘がしやすいかもしれません。


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

Name: nayo  ..中級者(14,542ポイント)   Date: 2010/01/17(日) 08:57   No:46387     
Title: Re:while文のループについて・・・    
マイコンか何かのプログラムかな?

一番下の}をmainの括弧閉じと仮定してwhile(1)内だけで見るなら

@ AD.ADCSR.BIT.ADST=1;
A AD.ADCSR.BIT.ADF=0か?―yes→Aへ
      |
      no
      ↓
B IO.PDR5.BYTE=(AD.ADDRC>>8);
C @へ戻る

こんな感じですかね?

おそらくAD.ADCSR.BIT.ADST=1;はAD変換開始フラグを立て、
AD.ADCSR.BIT.ADFが0以外ならばAD変換完了なのでそうなるまで待って、
IO.PDR5.BYTEでAD.ADDRC内のAD変換結果が格納された上位8bitを何かしら出力しているといった感じでしょうか


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

Name: たかぎ [URL]  ..ハッカー(153,828ポイント)   Date: 2010/01/17(日) 09:10   No:46388     
Title: Re:while文のループについて・・・    
マイコンのプログラムでしょうね。
このループだけを見てもダメで、割り込み処理も一緒に見るようにしてください。


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

Name: non  ..比類無きプログラマー(87,736ポイント)   Date: 2010/01/17(日) 10:22   No:46390     
Title: Re:while文のループについて・・・    
H8/3664 あたりのマイコンでしょうね。
マイコンなら、型番や、各ポートに何が接続されているか書いてもらわないと困ります。
また、イニシャライズの部分を省略されると、わからない部分もある。

    while(1) 
永久ループ、通常マイコンのプログラムは永久ループにして終了しないようにする。
    { 
        AD.ADCSR.BIT.ADST=1; 
AD変換のスタート。恐らく単一モードで動かしている。ADSTを1にすると変換がスタートする。
        while(AD.ADCSR.BIT.ADF==0)    {} 
変換が終了するまで待つ。変換が終了するとレジスタ(ADDRC)に変換結果が格納されADFが1になる。
         
        IO.PDR5.BYTE=(AD.ADDRC>>8); 
データをPDR5に8ビット右シフトして出力。仮に3664なら10ビットですが、bit15からbit6に格納され
ているので、8ビットシフトすれば上位の8ビットが取り出される。これをPDR5に出力。
恐らく、LEDだろうか?
この後、割り込みがあるのなら、いいけど、割り込みがないのなら
AD.ADCSR.BIT.ADF=0;
が必要だと思われる。たぶん。自動的にADFは0に戻らないので、次の変換のために0にしておく。

    } 


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



Name: dic  ..熟練のプログラマー(49,003ポイント)   Date: 2010/01/17(日) 08:19   No:46384       
Title: 特定のフォルダ下に置くとエラーになる    
とあるツールを作ったのですが、そのツールは一日一回程度の起動で済むので
batファイル化しています

開発した時、テスト動作もきちんと期待したとおりに動いてくれました
しかし、D:ドライブのあるフォルダの下において実行した時だけエラーが
起きます
他のフォルダで実行してみたのですが、その場合は問題なく動作するのです

一定のフォルダ下でエラーが起きるってどんな原因なのでしょうか?

販売しているツールなので、公開できないのです


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


Name: dic  ..熟練のプログラマー(49,051ポイント)   Date: 2010/01/17(日) 08:26   No:46385 解決!     
Title: Re:特定のフォルダ下に置くとエラーになる    
ログを消したら期待どおりに動作しました
ログまわりがバグってますね
解決おしておきます


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



Name: ダイマン  ..ぴよぴよ(355ポイント)   Date: 2010/01/16(土) 00:47   No:46285       
Title: 2Dアクションゲームのマップエディターを作るには?    
初めて質問をさせて頂きます。
現在、OS:WindowsXP コンパイラ:Microsoft Visual Studio 2005
DirectX SDK(August 2006)で、C++言語を使用して2Dアクションゲームを作っています。

その際に、ステージのマップを作成する際、ステージ数が増えると
プログラミングで配置するのがつらくなってきたので、
マップエディターを作りたいと思っています。

具体的にはマップチップ(当たり判定のある床や壁など)や敵を、
マウスやカーソルで配置してステージを完成させるみたいに、
ビジュアル的にわかりやすいマップエディタツールを作成したいと思っていますが。

自分はそういうゲーム制作支援ツールを作ったことがないので、
どういうふうに作るのかわかりません。
そのために最適な開発環境、またはプログラミング言語があれば教えて頂きたいです。


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


Name: Ma  ..プログラマー(30,029ポイント)   Date: 2010/01/16(土) 00:54   No:46286     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
一昔の私は、DXライブラリでのプログラミングはよく使えるのに他はあまり経験がなかったので
DXライブラリを使ってエディタを作りました。

DXライブラリを離れてかつ比較的手軽に作るなら、javaやC#のフォームとかも使いやすいかもしれません。
ただ、不慣れな言語だと多少手間が増えるかもしれません。
C#のフレームとかjavaは、使い方によってはエディタ自体の配置も視覚的にできるとかというプラグインだとか
あるみたいです。

実は自分もあまり経験がないので、上級者の方にお勧めとか聞きたいですね。 編集済み


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

Name: softya  ..比類無きプログラマー(89,253ポイント)   Date: 2010/01/16(土) 00:58   No:46287     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
1つは、WindowsAPIで作る方法があります。
2つめは、C++を理解していてMicrosoft Visual Studio 2005が有料版であるなら、MFCを使って作る事もできます。
3つ目としては、大半をDirectXの機能で作ってしまう方法です。
ファイルセーブロード等のメニュー類だけをWindowsAPIを使って作れば、ほとんどをDirectXだけで作れると思います。
4つ目としては、HSPなどを使って作る方法です。
HSPだとコードが公開されている物も多いので、参考になるかと思います。

とりあえず作る前にツクールとかフリーのゲームツールのマップエディタは調査しておいた方が良いでしょう。
調べられましたか?


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

Name: ダイマン  ..ぴよぴよ(609ポイント)   Date: 2010/01/16(土) 03:22   No:46293     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
Maさん、softyaさん返答ありがとうございます。
選択肢はいろいろあるようですが、
java、MFC、HSPなどは初心者なので時間がかかりそうですね。

>>とりあえず作る前にツクールとかフリーのゲームツールのマップエディタは調査しておいた方が良いでしょう。 
調べられましたか? 

ツクールシリーズは使ったことがないので、まだわかりません。
これから調べますが、ツクールシリーズのマップエディタは、
ツクール以外の全くの自作のオリジナルゲームでも使えるんでしょうか?

また自作するとしたら、自分は
Maさんが言っていたjava、
softyaさんが言っていたWindowsAPI、MFC、HSP
などを使用したいと思っておりますが、
これらの言語は初心者ですので、上記言語の内、初心者用サイトや
マップエディタ等に参考になるサイトや書籍があれば
差し支えなければ教えて頂きたいです。


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

Name: Ma  ..プログラマー(30,357ポイント)   Date: 2010/01/16(土) 03:42   No:46294     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
ちらっと調べてみたら、リソースさえいじる事ができればDXライブラリだけでメニューバーも使えるみたいです。
http://studiokingyo.fc2web.com/dxlib/kaibou/k_shiyou.html

ただ、これ以上の機能を要求する場合は、DXライブラリでは満足できそうにないですね。
(サブウィンドウみたいな機能とか。)


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

Name: SooA [URL]  ..上級者(24,790ポイント)   Date: 2010/01/16(土) 10:26   No:46297     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
>ツクール以外の全くの自作のオリジナルゲームでも使えるんでしょうか? 
使えませんが、作るときの参考になるので
体験版を使っておいて損はないです。

個人的には新しく覚えるのが辛いので
DXライブラリ + Win32 API がお勧めかな。
描画関係の関数をそのまま使いたいのが最大の理由。

http://wisdom.sakura.ne.jp/
WisdomSoft  Win32 API入門 -> 標準 Windows API 
※ボタンやリストボックス等をDXライブラリから使う場合は
 裏画面の反映はしない。

>リソースさえいじる事ができれば
もしかしてと、ググってみたらフリーのリソースエディタがありました。
http://www.hor-net.org/~vorga/freedev3vcee2.html
EEユーザーのダイアログ作成に便利そう。

>マップエディタ等に参考になるサイトや書籍があれば 
>差し支えなければ教えて頂きたいです。

マップの表示はできますよね?
例えば X=16, Y=16 の位置から 32x32ドットのチップを
マップデータに基づいて描画したとします。

マウスカーソルの位置をチェックして
(マウスカーソルX - 16)/32, (マウスカーソルY - 16)/32
とすれば、どのチップの上にマウスカーソルがあるのか判別できます。
基本はこれだけ。


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

Name: softya  ..比類無きプログラマー(90,188ポイント)   Date: 2010/01/16(土) 12:22   No:46310     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
>ツクールシリーズは使ったことがないので、まだわかりません。
>これから調べますが、ツクールシリーズのマップエディタは、
>ツクール以外の全くの自作のオリジナルゲームでも使えるんでしょうか? 

基本的に使えないと思います。
ファイルのフォーマット情報が公開されていれば使えると思いますが。
汎用のマップツールもありますが、色々と歯がゆいです。
使えると言うより、操作系や機能の参考に見てほしいです。

2つほどフリーのツールを紹介します。
「Rmake」
http://rmake.jp/document/create_tutorial
「ZGE」
http://awplus.jp/soft/page1/abp/zge.html

>softyaさんが言っていたWindowsAPI、MFC、HSP
>などを使用したいと思っておりますが、 

WindowsAPIやMFCはウィンドズアプリの作り方です。
マップエディタそのものはありませんので、地道にWindowsアプリの作り方を学ぶ必要があります。
[MFC]
http://www.crimson-systems.com/tips/index.html
http://www.g-ishihara.com/mfc_lc_06.htm
[Windows(Win32)API]
http://www.geocities.jp/ky_webid/win32c/index.html
http://wisdom.sakura.ne.jp/system/winapi/index.html
http://www.kumei.ne.jp/c_lang/

★C++のマップエディタでソース付きの物。中身未確認です。
ME MapEditer ver2.00(VC++ ソース付き)
http://www.vector.co.jp/games/soft/win95/game/se190983.html
2D RPG用のマップエディタ(C++ ソース付き)
http://www.interq.or.jp/black/minami-m/sample/sample_tool.htm
俺がRPG作るのを見守るサイト(C++ ソース付き)
http://www.geocities.co.jp/SiliconValley-Bay/2736/

一応HSPも紹介しますね。
HSPは初心者向けのスクリプト言語です。
アマチュアが主に使っていて、ゲームを作成している人も多くいます。
http://hsp.tv/make/hspbook.html
ちなみに、こんな物が作れます。2009年のコンテスト作品です。
http://hsp.tv/contest2009/list_n1.html

クイック学習型のサイトです。
http://hspcenter.com/hspsc3/hspsc1.

その他のHSPの講座サイト。
http://www.rinku.zaq.ne.jp/ultimate/hsp3/beginner/
http://oyabunn.hp.infoseek.co.jp/kouza.htm
http://hspnext.com/contents/quickstart.htm
http://hspcenter.com/hspsc.html
http://negativecelcius.web.fc2.com/hsp/p0000.html

HSP関連でマップエディタで参考になるページ。
http://hspcenter.com/hspsc2/hspj1.html
http://blog.livedoor.jp/hiro_2d/archives/cat_24843.html



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

Name: ダイマン  ..ぴよぴよ(492ポイント)   Date: 2010/01/16(土) 18:28   No:46344 解決!     
Title: Re:2Dアクションゲームのマップエディターを作るには?    
Maさん、softyaさん、たくさんの情報本当にありがとうございました。
全く新しい言語は覚えるのが辛いので、
自分はひとまずWindowsAPIを使ってマップエディタを作成しようかと思います。
それでも時間はかかると思いますが、助かりました。


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



Name: Tororo  ..かけだし(1,361ポイント)   Date: 2010/01/16(土) 10:43   No:46299       
Title: 自機を狙わせる    
お久しぶりです。
今STGを作っています。
困っているのは、自機を狙わせる方法です。
アングルは1〜0で360°をあらわしているので、
とりあえず
float GetPlayerAngle(floatx, float y){
      return atan2f(P->Y-y, P->X-x)/PHI_F/2;(敵キャラクラスの中にPと言うポインタのプレイヤーが定義されています)
}

と定義しているのですが、なぜかプレイヤーが動いても、動かなくても、ヘンな方向に出てしまいます。
どうしたらいいんでしょうか?

開発環境 
VC++ DXライブラリ

わかる範囲 ポインタ、基本はわかります。 簡単なゲームも作れます。


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


Name: ひよこ  ..比類無きプログラマー(78,217ポイント)   Date: 2010/01/16(土) 11:25   No:46306     
Title: Re:自機を狙わせる    
/PHI_F/2 これってなんでしょうか?
龍神録のソースから考えるとatan2f(P->Y-y, P->X-x);となると思います。間違っているかもしれません。


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

Name: Tororo  ..かけだし(1,447ポイント)   Date: 2010/01/16(土) 11:56   No:46308     
Title: Re:自機を狙わせる    
>>ひよこs
PHI_FはDXライブラリ内で定義されている円周率(3.1415・・・・f)です。
たしかatan2fの戻り値はラジアン?だったはずなので、0〜1で表すために、円周率で割って、2で割ってます。


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

Name: DVDM [URL]  ..熟練のプログラマー(50,103ポイント)   Date: 2010/01/16(土) 13:02   No:46321     
Title: Re:自機を狙わせる    
>>Tororoさん
仮の話ですが自機が(10, 10)、敵が(50, 50)の位置にいた時、atan2fで返ってくる値は
0.785・・・度数法で45°です。
atan2で既に0〜1の間で返ってきています。
なので、/PHI_F/2はいらないような気がします。

float GetPlayerAngle(floatx, float y)
{
      return atan2f(P->Y-y, P->X-x);
}

この、GetPlayerAngle(〜)が自機と対象となるオブジェクトとの角度を取得する関数だとすると、


Angle = GetPlayerAngle(x, y);
これで、自機と対象となるオブジェクトとの角度を取得しています。
対象となるオブジェクトが敵の弾だと仮定すると、あとは敵の弾を動かす処理だけになります。

敵の弾のX += 敵の弾の速度 * cosf(Angle);
敵の弾のY += 敵の弾の速度 * sinf(Angle);

間違っていたらごめんなさい;



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

Name: Tororo  ..かけだし(1,531ポイント)   Date: 2010/01/16(土) 13:19   No:46325     
Title: Re:自機を狙わせる    
>>DVDMさん
玉はソノ通りに動かしています^^; 
が、/PHI_F/2は無くても同じ結果でした。
現状では、玉が自機か動いてなくても動いていても、0.75ぐらいの角度に飛んでいってしまいます><
とりあえずデバッガで探ります^^;


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

Name: DVDM [URL]  ..熟練のプログラマー(50,313ポイント)   Date: 2010/01/16(土) 14:11   No:46331     
Title: Re:自機を狙わせる    
>>Tororoさん
合っても無くても同じ結果ですか・・・。
自分で作ってるSTGのソース部分に atan2fで返ってくる値に、円周率/2をすると
全然違う方向に飛んでいくんですけどね;


考えられる原因は返ってきた角度を更にいじっているとか、
実はAngleがfloatやdouble型ではなかったとか、
与える座標の情報がおかしいとか(初期化ミスやループミスなど)でしょうか。
少なくとも「/PHI_F/2」は要らないと思いますよ〜。


現時点ではどのように座標を送ったりしているのかが解りませんので
これ以上の解答はソースを添付しないと厳しいですかね;
(出来たら、問題だけを再現できるプロジェクトを上げて頂けると助かります!)


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

Name: Tororo  ..かけだし(2,197ポイント)   Date: 2010/01/16(土) 14:32   No:46332     
Title: Re:自機を狙わせる    
>>DVDMさん
ソースは何も考えずにクラスにしてたり、ヘンなことがいっぱいなので、見せれません^^;
余りにも汚くて・・ そこから直さないとw
とりあえず関わってしそうな部分です。
class EnemyBase : public Players
{
public:
    Players *player;
    float X, Y, Speed;
    int Money, cnt, ShotMode, Move_Num, Graph_Num, Bomm_cnt, Point;
    bool Flag, Bom;
         EnemyBase(void)
         {
        X = Y = Speed = 0.0f;
        Money = cnt = ShotMode = Move_Num = Graph_Num = Bomm_cnt = 0;
        Flag = false;
        Bom = false;
        player = new Players();
         }

         ~EnemyBase(void)
          {
          }

    int Search_Enemy(EnemyBase E[], int Num){
        for(int i=0;i<Num;i++){
            if(E[i].Flag == 0){
                return i;
            }
        }
        return -1;
    }

    float GetPlayerAngle(float x, float y){
        return atan2f(player->Y-y, player->X-x);
    }

};

class Players
{
public:
    bool Death;生きてますか?
    float X, Y, Speed;
    int Point, Score, Power, Money, cnt, ShotMode, Num;
    int img[3], Key;画像ハンドル、キー入力
    Players(void);全部初期化
    ~Players(void);何もしてない
    void Draw();間違いなく関係ないw
         void Load(){
        LoadDivGraph("Date\\Chara\\Player\\Player.PNG", 3, 3, 1, 32, 32, img);
        X = 200.0f;
        Y = 380.0f;
        Speed = 5.0f;
        Point = Score = Power = Money = cnt = ShotMode = Num = 0;
         }
};







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

Name: Tororo  ..かけだし(2,246ポイント)   Date: 2010/01/16(土) 14:33   No:46333     
Title: Re:自機を狙わせる    
関係ないんですけど、貰ったポイント666って不吉・・・
6は不吉な数字だったはずだから・・


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

Name: Tororo  ..かけだし(2,307ポイント)   Date: 2010/01/16(土) 15:14   No:46335 解決!     
Title: Re:自機を狙わせる    
>>皆さん
Load関数がううまく作動していませんでした^^;
答えてくれた皆さんアリガトウございましたm(_ _)m


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

Name: Ma  ..プログラマー(30,407ポイント)   Date: 2010/01/16(土) 15:22   No:46336     
Title: Re:自機を狙わせる    
>>Tororoさん 
>アングルは1〜0で360°をあらわしているので、 

>>DVDM
>atan2で既に0〜1の間で返ってきています。 
>なので、/PHI_F/2はいらないような気がします。 


なんか、どちらかが盛大な勘違いをしてらっしゃる気が・・・?
Tororo さんが言っているのは、 0が0度 0.5で180度 1.0で360度という事でありラジアンの値とはまったく関係がない勝手に作った単位です。すなわち度数の360分の1の単位です。

それに対してDVDM さんがいっているのは、ラジアンの話ですよね。
しかも atan2 の戻り値って [-pi,+pi] ラジアンのはずだと思ったのですが。。。
atan2f は使ったことないので知りませんが、atan2 と大差ないですよねきっと。

それを踏まえて、考えるとTororo さんが求めている回答はこんなんじゃないでしょうか?


float GetPlayerAngle(floatx, float y){
      float degree = atan2f(P->Y-y, P->X-x)*180/PHI_F;//これで度数
      float tororoUnit = degree/360;//tororoさんが作った単位
      return tororoUnit;
}

これをまとめると、
float GetPlayerAngle(floatx, float y){
     return atan2f(P->Y-y, P->X-x)/PHI_F/2;//これでtororo単位
}


すなわち、最初のtororoさんの式は間違っていません。

ではなぜ、正しく計算できないのか?

もしかすると、GetPlayerAngleから戻ってきた値を絶対角度として計算していませんか?
atan2 はふたつのベクトルの相対角度、いわば間の角度です。

GetPlayerAngle をどのように使っているのかというソースがないので断定はできませんが。。。。
しくみは内積と外積でそれを割って出るんですが…っていう御託はどうでもいいですね。
(どうでもよくなかったら、内積と外積を調べてみてください)

それ(相対角度であること)を知っている上で質問しているなら、私が間違っているかもしれません。
そのときはすいません。


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

Name: Tororo  ..かけだし(2,370ポイント)   Date: 2010/01/16(土) 15:25   No:46337     
Title: Re:自機を狙わせる    
何かすれ違ってます^^;
最後のPHI_F/2は、いりました。
ただただ私の初期化忘れでした><
本当にお騒がせしましたm(_ _)m


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

Name: DVDM [URL]  ..熟練のプログラマー(50,511ポイント)   Date: 2010/01/16(土) 15:58   No:46338     
Title: Re:自機を狙わせる    
>>Maさん
間違いを御指摘下さいましてありがとうございます。
「アングルは1〜0で360°をあらわしている」ってのを勝手に勘違いしていました。

>しかも atan2 の戻り値って [-pi,+pi] ラジアンのはずだと思ったのですが。。。
>atan2f は使ったことないので知りませんが、atan2 と大差ないですよねきっと。 
仰る通り、-π〜πラジアンの範囲です。
(念のため調べてきました:http://msdn.microsoft.com/ja-jp/library/88c36t42%28VS.80%29.aspx)


>>Tororoさん
こちらこそお騒がせして申し訳ございませんでした;
問題解決おめでとうございます!


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



Name: KKXY  ..かけだし(1,496ポイント)   Date: 2010/01/15(金) 21:15   No:46277       
Title: リンカ ツール エラー LNK2005について    
C言語ではなくてVisual C++の、それもC++に関わる質問になるのですが
ソースコードをビルドする際に
リンカツールエラー LNK2005というエラーが
発生するのですが何故でしょうか?
一応、いろいろ原因を調べてみた結果、

仮想関数か演算子があるクラスを宣言する。
(この時点で中身は書かない。)

そのクラスの中身をスコープを使って実装する。

クラスが実装されているソースファイルを
ほかのソースファイルに読み込む。

エラー発生。

というところまではわかったのですが、いったい何故それがエラーを起こすのか、
Visual C++ デペロッパー センターで調べても全くわかりません。


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


Name: たかぎ [URL]  ..ハッカー(153,468ポイント)   Date: 2010/01/15(金) 22:27   No:46280     
Title: Re:リンカ ツール エラー LNK2005について    
ソースも正確なエラーメッセージも不明なので推測の域を出ませんが...

おそらくは単一定義規則に違反していることが理由です。


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

Name: トントン  ..かけだし(1,197ポイント)   Date: 2010/01/15(金) 23:46   No:46281     
Title: Re:リンカ ツール エラー LNK2005について    
これですか?


引用
CRT ライブラリでは、new、delete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも new、delete、および DllMain の各関数が含まれています。これらの関数では、MFC ライブラリを CRT ライブラリより先にリンクする必要があります。

マイクロソフト サポート オンライン 
http://support.microsoft.com/default.aspx?scid=kb;ja;148652


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

Name: KKXY  ..かけだし(1,785ポイント)   Date: 2010/01/16(土) 10:06   No:46296     
Title: Re:リンカ ツール エラー LNK2005について    
ソースとエラーコードを書かなくて申し訳ございません。

ソースファイルscene.cppの中身

class Scene
{
  public:
    virtual void main()=0;
};
class Scene_T:public Scene
{
  public:
     virtual void main();
};
void Scene_T::main(){
};

ソースファイルmain.cppの中身

#include "bitmap.cpp"

int main(void){
}

エラーメッセージ
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
C:\Users\kimura  keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。




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

Name: box  ..ハッカー(149,973ポイント)   Date: 2010/01/16(土) 10:32   No:46298     
Title: Re:リンカ ツール エラー LNK2005について    
> main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。

ということは、提示されたソース「の他」に、
bitmap.cpp(maim.cppでインクルードしている)もありますね。

情報を小出しにしないで、バ〜ンと一気に出してみませんか?

何となく、main()という名前がダブっているのが気になりますが…。


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

Name: pie  ..ぴよぴよ(239ポイント)   Date: 2010/01/16(土) 10:59   No:46302     
Title: Re:リンカ ツール エラー LNK2005について    
他にあるというより、「scene.cpp」が「bitmap.cpp」の間違いじゃないですかね。

いずれにせよmain.cppで
#include "bitmap.cpp"
しちゃってるわけだから、
bitmap.cppで定義したものはすべてmain.cppでも定義される。
当然リンクエラーになります。


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

Name: KKXY  ..入門者(2,590ポイント)   Date: 2010/01/16(土) 11:41   No:46307     
Title: Re:リンカ ツール エラー LNK2005について    
bitmap.cppとscene.cppは同じソースファイルです。
本来bitmap.cppと書くべき場所をscene.cppと書き間違えたしまったのです。
間違いを修正するとこうなります。

ソースファイルbitmap.cppの中身 

class Scene 

  public: 
    virtual void main()=0; 
}; 
class Scene_T:public Scene 

  public: 
     virtual void main(); 
}; 
void Scene_T::main(){ 
}; 

ソースファイルmain.cppの中身 

#include "bitmap.cpp" 

int main(void){ 


エラーメッセージ 
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。 
C:\Users\kimura  keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

情報を出すと本来のソースファイルはもっと複雑で長い物なのですが
どこでエラーが起きているかを調べるために、
他のプロジェクトにソースファイルを写して、ソースを書き直していき、
上記のようなLNK2005のエラーを掃くソースを作ったのです。
それで何故このようなソースでエラーを掃くのかがわからないのです。

また、このソースではbitmap.cppをヘッダーファイルに変えても、
Sceneのメンバー関数である、mainを別の名前にしても同じエラーを掃きます。

>ということは、提示されたソース「の他」に、 
>bitmap.cpp(maim.cppでインクルードしている)もありますね。

僕が調べる限りbitmap.cppは一つだけのようです。
Sceneクラスのmainを仮想関数でなくするとエラーを掃きませんし・・・。
 
Visual C++ デベロッパー センターのLNK2005のページを見たのですが、
自分は/clrも/Gyもuuid.libも使用しておらず、ヘッダーファイルで
変数を定義しているわけではありませんのでおそらくは原因は3か4だと
考えているのですが・・・・。
しかし3と4の文章の意味がわからなくて・・・・。

http://msdn.microsoft.com/ja-jp/library/72zdcz6f(VS.80).aspx


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

Name: Mist  ..比類無きプログラマー(82,778ポイント)   Date: 2010/01/16(土) 12:26   No:46311     
Title: Re:リンカ ツール エラー LNK2005について    
ソースファイルはそもそもインクルードするものじゃないですが。

そのやり方でどうしてもLNK2005を出さないようにしたいのであれば、bitmap.cppをコンパイル対象からはずすように設定しなければなりません。

#include "bitmap.cpp" 

int main(void){ 
}  

これは以下と同じになります。

●コンパイルされるときのmain.cppの中身

class Scene 

  public: 
    virtual void main()=0; 
}; 
class Scene_T:public Scene 

  public: 
     virtual void main(); 
}; 
void Scene_T::main(){ 
}; 

int main(void){ 
}  

で、bitmap.cppもコンパイル対象に含まれていると、実質bitmap.cppは2回コンパイルされることになるのでLINK2005になります。
このような場合、以下のようにするのが望ましいです。

bitmap.h
class Scene 

  public: 
    virtual void main()=0; 
}; 

bitmap.cpp
#include "bitmap.h"

class Scene_T:public Scene 

  public: 
     virtual void main(); 
}; 
void Scene_T::main(){ 
}; 

main.cpp
#include "bitmap.h"

int main(void){ 
}  


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

Name: たかぎ [URL]  ..ハッカー(153,574ポイント)   Date: 2010/01/16(土) 12:27   No:46312     
Title: Re:リンカ ツール エラー LNK2005について    
予想通り単一定義規則に違反していることが原因です。
http://www.kijineko.co.jp/tech/how-to-library/header-files.html
↑でも読んで、ヘッダファイルを適当に記述・使用してください。


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

Name: KKXY  ..入門者(2,622ポイント)   Date: 2010/01/16(土) 13:15   No:46323 解決!     
Title: Re:リンカ ツール エラー LNK2005について    
Mistさんの言う通りにやってみたら解決しました。
どうもありがとうございました。


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



Name: 大学生  ..かけだし(2,114ポイント)   Date: 2010/01/16(土) 11:25   No:46305       
Title: Ultra-C言語について。    
はじめまして。

ウルトラCで卒業研究してるものです。

コンソール画面(標準出力画面)のクリアをしたいんですが・・・

どうしたら出来ますか?

グラフィック画面の場合は、ClearScreenというのがあるのですが・・・

グラフィック画面と標準出力画面とは別に出てくるので・・・

CAIソフトの開発で、問題が出てきて答えると次の問題みたいな感じです。

前の問題がそのままのこるので、その部分を消すためにいったん画面クリアの命令を掛けたいと思っていろいろ探すんですができません。

すみませんが、わかられるかたおられたらコメントよろしくお願いします。


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


Name: softya  ..比類無きプログラマー(90,523ポイント)   Date: 2010/01/16(土) 12:38   No:46316     
Title: Re:Ultra-C言語について。    
Urtla-Cは試用も出来ないので使ったことが無いですが。
標準関数のsystem()が使えるのなら、
system("cls");
でコンソールをクリア出来ると思います。


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



Name: kai  ..中級者(12,298ポイント)   Date: 2010/01/14(木) 22:43   No:46214       
Title: ボスの位置を表す赤い部分を自機が近づいたら薄くする計算式    
龍神録についてです。
添付した東方の画像なんですが、
これはボスのx軸の場所によって赤い画像も、同じx軸の場所に位置が動きます。
本題なんですが、
このボスの位置を表す赤い部分を自機が近づいたら薄くするようにしたいのですが、
計算が弱くて、どのような計算式を書けばいいのか分からなくて困ってます。
SetDrawBlendMode(DX_BLENDMODE_ALPHA,ここの計算式が分からない);        //αブレンドする

boss.dxとch.xが関わってきて、
ボスのx軸と自機のx軸が一緒の位置ならばαブレンドの値は128くらいの薄さに。

中間の薄さ

ボスのx軸と自機のx軸の差が+-100以上ならばαブレンドの値は255。

みたいな感じにしたいのですが、出来ますでしょうか?
誰か分かる方がいましたら助けてください。よろしくお願いします。 編集済み


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


Name: ひよこ  ..比類無きプログラマー(77,875ポイント)   Date: 2010/01/14(木) 23:12   No:46220     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
薄くするじゃなくて透明ってことですか?
透明だったらこんな感じでいいと思います。あくまでも参考に。
真ん中が一番薄くなるように勝手なこともしてます。(見た目が汚いと思います。
int x=ボスのx軸-自機のx軸;
int alpha=0;
if(x>0 x<100){
    if(x<=49){ 
        alpha=255-205/50*(x+1); 
    }
    if(x>=51){ 
        alpha=255-205/(x-1)*(50); 
    }
    if(x==50){ 
        alpha=40; 
    }
}
else
alpha=255;

SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);//αブレンドする 


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

Name: ひよこ  ..比類無きプログラマー(77,923ポイント)   Date: 2010/01/14(木) 23:14   No:46222     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
こうすればきれいかもしれません。
if(x<=49){ 
       alpha=255-205/(x+1)*50; 
    }


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

Name: kai  ..中級者(12,304ポイント)   Date: 2010/01/14(木) 23:50   No:46225     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
ひよこさん、ありがとうございます。

ただ、これだと、自機がボスより右にいた場合、
薄くならないようですが 編集済み


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

Name: ひよこ  ..比類無きプログラマー(78,030ポイント)   Date: 2010/01/15(金) 00:10   No:46227     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
すみません。コメント付けてませんでしたね。
if(x>0 x<100){//ボスのx軸-自機のx軸が0(ぴったし)より大きくて100(boss.x+100>自機)
未満だったらということです。
よく考えたら、−100のほうは作ってませんでした。すいません。(少し工夫すればできると思います。


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

Name: ひよこ  ..比類無きプログラマー(78,098ポイント)   Date: 2010/01/15(金) 00:13   No:46229     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
薄くならないようですが 
>>勝手に考えて、自機が真ん中?の50に来た時に一番薄くする処理になっていますので、
>>条件式や処理を逆にすればできると思います。


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

Name: SooA [URL]  ..上級者(24,328ポイント)   Date: 2010/01/15(金) 00:19   No:46231     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
こんな感じかな。

alpha = 0 ;
gap = boss_X - mychar_X ;

if( gap < 0 )
    gap = 100-( 100+gap ) ;

if( gap > 0 && gap <= 100 )
    alpha = 255/100*gap ; 編集済み


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

Name: kai  ..中級者(12,459ポイント)   Date: 2010/01/15(金) 00:31   No:46232 解決!     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
ひよこさん、SooAさん、返答ありがとうございます。
SooAさんの方法で
if( gap > 100 ) 
    alpha = 255;
を追加したらなんとかいけました。ありがとうございます。
私はてっきり、ひよこさんのおっしゃる通りに、+の値と−の値が出てしまうので、
絶対値を出してから計算するのかなと思ったのですが、
その計算をしなくても大丈夫なんですね。
勉強になりました。ありがとうございました。

追記:
if(gap < 0)
  gap = 100 - (100 + gap);
ここで絶対値を出してるんですね。なるほど。ありがとうございました。 編集済み


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

Name: SooA [URL]  ..上級者(24,460ポイント)   Date: 2010/01/15(金) 03:43   No:46244     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
>を追加したらなんとかいけました
すみませんいい加減な事を書いてました…
他も訂正しときます。

alpha = 0 ; 
gap = boss_X - mychar_X ; 

if( gap < 0 )
    gap *= -1 ; 

if( gap > 0 && gap <= 100 ) 
    alpha = 255/100*gap ; 
else if( gap > 100 )
    alpha = 255 ;


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

Name: light  ..ぴよぴよ(4ポイント)   Date: 2010/01/15(金) 07:23   No:46246     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
>>ひよこ

言ってることが間違いだらけです。


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

Name: ひよこ  ..比類無きプログラマー(77,937ポイント)   Date: 2010/01/15(金) 17:03   No:46262     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
間違いが多いので新しい方法にしました。
真ん中(50)で255
それ以外は(x>0&&x<100)
薄くなっていくと思います。
int x=ボスのx軸-自機のx軸;
int alpha=0;
if(x<0)//マイナスだったらプラスに
x*=-1;
if(x>=0 x<=100){//+-100いないだったら
    if(x<=50){ 
       alpha=255+(x-50)*5; 
    }
    if(x>=51){ 
       alpha=255-(x-50)*5; 
    }
}
else
alpha=255;

SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);//αブレンドする 


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

Name: SooA [URL]  ..プログラマー(25,017ポイント)   Date: 2010/01/16(土) 10:56   No:46301     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
最小α値を設ける場合も載せておきます。

gap = boss_X - mychar_X ;
alpha = 50 ; // 最小α

if( gap < 0 )
    gap *= -1 ;

if( gap > 0 && gap <= 100 )
    alpha += (255-alpha)/100*gap ;
else if( gap > 100 )
    alpha = 255 ; 


□ひよこさん
No:46262 のソースでは残念ながらミスがありますが、
以前に拝見した時のソースと比較すると、
「ソースの見やすさ」が上達していると思いますよ。
次は処理を簡潔にして短くできないか工夫してみましょう。

※約一年ほど前にソースの書き方に付いて
書かせてもらいました。別人だったらすみません。


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

Name: ひよこ  ..比類無きプログラマー(78,166ポイント)   Date: 2010/01/16(土) 11:19   No:46304     
Title: Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法    
SooAさんもしかして間違いというのは&&が抜けてるってことですよね?
直すとif(x>=0 && x<=100){//+-100いないだったらこうなると思います。

以前に拝見した時のソースと比較すると、 
「ソースの見やすさ」が上達していると思いますよ。 
次は処理を簡潔にして短くできないか工夫してみましょう。 

>>ありがとうございます。
>>昔はすごい見にくいソースを書いてたひよこです。
>>上の自分のソースはelse文を使えばよさそうですね。

SooAさんのソースはちゃんと、左か右の端から真ん中まで行くとalphaが減っています。
わかりやすい処理ですね。


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



Name: ti  ..入門者(4,969ポイント)   Date: 2010/01/16(土) 01:45   No:46288       
Title: LNK2005が出て困っています    
いつもお世話になります
ソースが長くなってきたのでファイルを分けようと作業していたらLNK2005が出てしまいました
make town.cppに書いてあったmakecmdwindowという関数をmake cmd.cppに移動してふたつのソースファイルで宣言しているものを global.hにて宣言すれば直るかと思いましたが直りませんでした

自分ではどうすればいいのかわからないのでどうすればエラーが消えるのか教えてください
ソースファイルを上げておきます

開発環境はwinXP VS2005SEです
画像等はサイズが大きくなるので入れていません

よろしくお願いします 編集済み


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


Name: ぽこ  ..入門者(4,619ポイント)   Date: 2010/01/16(土) 02:12   No:46290     
Title: Re:LNK2005が出て困っています    
1.Keyという変数の定義が2箇所あります。
 2重定義ならどちらかを消してください。
 変数名がかち合ったなら、どちらかの変数名を変更してください。

2.cmd_x、cmd_yという変数の定義がどこにもないです。
 どこかで定義してください。


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

Name: ぽこ  ..入門者(4,708ポイント)   Date: 2010/01/16(土) 03:00   No:46291     
Title: Re:LNK2005が出て困っています    

ファイル分割に関するアドバイスです。

1.××.cppで定義しているグローバル変数/関数は
  ××.hでextern宣言するようにしてください。

2.××.hには必ずインクルードガードを施してください。

これを守るだけで、今回のようなエラーで困ることがなくなると
思います。


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

Name: ti   Date: 2010/01/23(土) 00:39   No:462881264174769 解決!     
Title: Re:LNK2005が出て困っています    
ぽこさんありがとうございました
おかげでエラーはでなくなりました


インクルードガード
#pragma once
のほうで実装してみました

返信遅くなって申し訳ありませんでした




Name: jay  ..上級者(16,316ポイント)   Date: 2010/01/14(木) 20:22   No:46197       
Title: この関数の意味は?    
龍神録プログラミングの館で分からないことがあったので質問させて頂きます
反魂蝶八分咲きをつくろうの章で
  for(j=0;j<2;j++){
      for(i=0;i<num;i++){
          int plmn=(j ? -1 : 1);

という部分がありますが、
これはint型で宣言した文字列plmnにどのような値を代入することになるのですか?

(j ? -1 : 1)この部分はどのような意味を持つのですか? 編集済み


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,137,276ポイント)   Date: 2010/01/14(木) 20:26   No:46198     
Title: Re:この関数の意味は?    
条件演算子(三項演算子?)と言います。
http://www2.ee.knct.ac.jp/el/E3/E305/jyoukenenzansi.html
この辺参考になるかと。
if文使ってかかないといけない部分がすっきり書けていいのですが、
プログラムが読みにくくなるといって嫌う人もいます。
大勢で共有するプログラムはなるべく避ける傾向にあるかもしれませんね。


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

Name: たかぎ [URL]  ..ハッカー(151,446ポイント)   Date: 2010/01/14(木) 20:41   No:46200     
Title: Re:この関数の意味は?    
> プログラムが読みにくくなるといって嫌う人もいます。 
> 大勢で共有するプログラムはなるべく避ける傾向にあるかもしれませんね。

知らない人、使いこなせない人が多いからでしょうね。
あるべき論としては、"プログラマを信じる"ことを是とする「Cの精神」からすれば、信じるに値しないプログラマは、Cなんか使わず、能力に見合った分相応の言語や職業を選ぶべきなのですが、現実はなかなか難しいようです。

知らなかったことはしかたがありませんが、一度説明されれば分るはずですけどね。
もしかすると、末端のプログラマの問題ではなく、適切に指導できないベテランの能力の問題なのかもしれません。


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

Name: ft  ..中級者(11,752ポイント)   Date: 2010/01/14(木) 21:00   No:46203     
Title: Re:この関数の意味は?    
横からすみません。私も龍神録プログラミングの条件演算子でつっかかっていたので教えてください。
これはcshot.cpp内の一部を丸ごとコピーしたものなんですが、
これを条件演算子を一切使わずにプログラムを書くとしたらどうなるのでしょうか?
分かる方がいましたら教えてください。

#include "../include/GV.h"

int cshot0num[2]  ={2,4};
int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};

#define OPTION_X 25
#define OPTION_Y 35
int option0num[2]  ={2,4};
double option0ang[4] = {-PI/2,-PI/2,-PI/2-PI/4,-PI/2+PI/4};//オプションの発射角度(49)

//自機ショットの登録可能番号を返す
int search_cshot(){
    for(int i=0;i<CSHOT_MAX;i++){
        if(cshot[i].flag==0)
            return i;
    }
    return -1;
}

//通常ショット登録
void ch0_shot_pattern(){
    int k;
    int n=cshot0num[ch.power<200?0:1];
    for(int i=0;i<n;i++){
        if((k=search_cshot())!=-1){
            cshot[k].flag=1;
            cshot[k].cnt=0;
            cshot[k].angle=-PI/2;
            cshot[k].spd=20;
            cshot[k].x=ch.x+cshot0pos_x[i];
            cshot[k].y=ch.y+cshot0pos_y[i];
            cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
            cshot[k].knd=0;
            cshot[k].img=img_cshot[0];//画像番号代入(49)
        }
    }
    se_flag[2]=1;//発射音オン
    if(ch.power>=100){
        for(int i=0;i<(ch.power<300?2:4);i++){
            if((k=search_cshot())!=-1){
                cshot[k].flag=1;
                cshot[k].cnt=0;
                cshot[k].angle=option0ang[i];
                cshot[k].spd=20;
                cshot[k].x=option_bb[i%2].x;
                cshot[k].y=option_bb[i%2].y;
                cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
                cshot[k].knd=1;
                cshot[k].img=img_cshot[1];//画像番号代入(49)
            }
        }
    }
}

//低速通常ショット登録
void ch1_shot_pattern(){
    int k;
    int n=cshot0num[ch.power<200?0:1];
    for(int i=0;i<n;i++){
        if((k=search_cshot())!=-1){
            cshot[k].flag=1;
            cshot[k].cnt=0;
            cshot[k].angle=-PI/2;
            cshot[k].spd=20;
            cshot[k].x=ch.x+cshot0pos_x[i]/3;//低速中なら位置を中心側へ
            cshot[k].y=ch.y+cshot0pos_y[i]/2;
            cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
            cshot[k].knd=0;
            cshot[k].img=img_cshot[0];//画像番号代入(49)
        }
    }
    se_flag[2]=1;
    if(ch.power>=100){
        for(int i=0;i<(ch.power<300?2:4);i++){
            if((k=search_cshot())!=-1){
                cshot[k].flag=1;
                cshot[k].cnt=0;
                cshot[k].angle=option0ang[i];
                cshot[k].spd=20;
                cshot[k].x=option_bb[i%2].x;
                cshot[k].y=option_bb[i%2].y;
                cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
                cshot[k].knd=1;
                cshot[k].img=img_cshot[1];//画像番号代入(49)
            }
        }
    }
}

//オプションのぼんぼん計算
void calc_option_bb(){
    if(ch.power>=100){//パワー100以上ならオプションをつける
        for(int i=0;i<2;i++){
            if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
                option_bb[i].x=ch.x+OPTION_X*(i==0 ? -1 : 1);
                option_bb[i].y=ch.y+OPTION_Y+sin(PI2/150*option_bb[i].cnt)*20;
            }
            else{
                option_bb[i].x=ch.x+OPTION_X/2*(i==0 ? -1 : 1);
                option_bb[i].y=ch.y+OPTION_Y/2;
            }
            option_bb[i].cnt++;
        }
        if(option_bb[0].flag==0)
            option_bb[0].flag = option_bb[1].flag = 1;
    }
    else{
        if(option_bb[0].flag==1)
            option_bb[0].flag = option_bb[1].flag = 0;
    }
}



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

Name: jay  ..上級者(16,438ポイント)   Date: 2010/01/14(木) 21:06   No:46204     
Title: Re:この関数の意味は?    
ありがとうございます。
jがifの()の中の部分で-1が真の値、
1が偽(else)の値(または0)ですね。
今回の場合if文に直すと、
if(j==0)
   plmn=1;
else
   plmn=-1;

ということでいいのでしょうか?



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

Name: sizuma [URL]  ..プログラマー(28,507ポイント)   Date: 2010/01/14(木) 21:13   No:46205     
Title: Re:この関数の意味は?    
>ftさん
>これを条件演算子を一切使わずにプログラムを書く
条件演算子の説明を読めばわかるとおもうのですが・・・・

>int plmn=(j ? -1 : 1)
これを
int plmn;
if(j){
  plmn = -1;
}else{
  plmn = 1;
}

括弧を使わない人が多いでしょうが、僕は1行でも括弧を書きたいと思ってますので、お好みで。
こんな感じで全部書き換えればいいと思います。

僕は?演算子は見やすくなるのでいいと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,137,413ポイント)   Date: 2010/01/14(木) 22:29   No:46213     
Title: Re:この関数の意味は?    
ホントわかりにくい書き方してますね・・。すみません。

> if( j )

って書き方は本当はしない方が無難です。
それに伴って

j ? -1 : 1;

も、すっきり見えますが、誤解のもとなので、

j!=0 ? -1 : 1;

もしくは

if( j!=0 ){
   plmn = -1;
} else {
   plmn = 1;
}

と書いた方が良いでしょう。
すっきり書くのもいいですが、
誰もが見て誤解しないコード、自分が後でメンテナンスしやすいコードを書くことも重要ですね。


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

Name: jay  ..上級者(16,475ポイント)   Date: 2010/01/14(木) 22:54   No:46216 解決!     
Title: Re:この関数の意味は?    
確かにスッキリするのは良いですが、分からなければ意味がないですもんね。
とりあえず理解は出来たのでありがとうございました。


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

Name: Naohiro19  ..入門者(3,362ポイント)   Date: 2010/01/15(金) 16:57   No:46260     
Title: Re:この関数の意味は?    
jay さん>

a  > 20 ? a = 20 : a = 10;

aが20より大きければaに20が入り、それ以外はaに10が入ります。

つまり
if( a > 20){ a = 20; }else{ a = 10; }
とまったく同じです。


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

Name: box  ..ハッカー(149,830ポイント)   Date: 2010/01/15(金) 17:56   No:46265     
Title: Re:この関数の意味は?    
> a  > 20 ? a = 20 : a = 10;

> aが20より大きければaに20が入り、それ以外はaに10が入ります。

おかしいな…。
私のところでは、コンパイル時に「左辺値が必要」という意味の
エラーが出ました。

a = (a > 20) ? 20 : 10;

と勘違いされてるのかな?


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

Name: hoge  ..入門者(3,261ポイント)   Date: 2010/01/15(金) 18:14   No:46267     
Title: Re:この関数の意味は?    
> > a  > 20 ? a = 20 : a = 10;
> > 
> > aが20より大きければaに20が入り、それ以外はaに10が入ります。

> おかしいな…。
> 私のところでは、コンパイル時に「左辺値が必要」という意味の
> エラーが出ました。

Cでコンパイルしていませんか?
C++だとコンパイルできますよ。

 編集済み


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

Name: たかぎ [URL]  ..ハッカー(152,933ポイント)   Date: 2010/01/15(金) 18:16   No:46269     
Title: Re:この関数の意味は?    
> jay さん>

> a  > 20 ? a = 20 : a = 10;

> aが20より大きければaに20が入り、それ以外はaに10が入ります。

> つまり
> if( a > 20){ a = 20; }else{ a = 10; }
> とまったく同じです。

そんなことはありません。
条件演算子は代入演算子より優先順位が高いので、

((a  > 20 ? a = 20 : a) = 10;

のように解釈しようとしてエラーになります。

また、式と文では同じ意味にはなりません。
 編集済み


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

Name: たかぎ [URL]  ..ハッカー(152,942ポイント)   Date: 2010/01/15(金) 18:19   No:46270     
Title: Re:この関数の意味は?    
> Cでコンパイルしていませんか? 
> C++だとコンパイルできますよ。

そうか、C++か。紛らわしいですね。


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

Name: box  ..ハッカー(149,941ポイント)   Date: 2010/01/15(金) 21:17   No:46278     
Title: Re:この関数の意味は?    
> Cでコンパイルしていませんか?
> C++だとコンパイルできますよ。

くだんの文脈ではCかC++の判断ができなかったので、
さしあたり、私がよく知っている方の言語とみなして
コンパイルしてみたのでありました。

C++では、おっしゃるとおり問題なくコンパイルできました。
どうもありがとうございます。


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

Name: たかぎ [URL]  ..ハッカー(153,424ポイント)   Date: 2010/01/15(金) 22:04   No:46279     
Title: Re:この関数の意味は?    
Cの場合、

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

ですが、C++の場合、

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

ですので、微妙に文法が異なります。
この辺が原因ですね。


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



Name: 入門者以下  ..ぴよぴよ(233ポイント)   Date: 2010/01/14(木) 22:50   No:46215       
Title: お願いします。    
ソフトやったことないのですが、
会社からソース解析の指示を受けました。
まったく手がつけられず困っています。
お助けください。

以下

CGridCellBase* CGridCtrl::CreateCell(int nRow, int nCol)
{
    ASSERT(!GetVirtualMode());

    if (!m_pRtcDefault || !m_pRtcDefault->IsDerivedFrom(RUNTIME_CLASS(CGridCellBase)))
    {
        ASSERT( FALSE);
        return NULL;
    }
    CGridCellBase* pCell = (CGridCellBase*) m_pRtcDefault->CreateObject();
    if (!pCell)
        return NULL;

    pCell->SetGrid(this);
    pCell->SetCoords(nRow, nCol); 

    if (nCol < m_nFixedCols)
        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDCOL);
    if (nRow < m_nFixedRows)
        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDROW);
    
    pCell->SetFormat(pCell->GetDefaultCell()->GetFormat());

    return pCell;
}

以上

どのような操作?がされているのでしょうか?
ご教示ください。


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


Name: ぽこ  ..入門者(3,646ポイント)   Date: 2010/01/14(木) 23:10   No:46218     
Title: Re:お願いします。    
新規にグリッドのセルを生成して、必要な初期化を行っているだけです。

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

Name: たかぎ [URL]  ..ハッカー(152,056ポイント)   Date: 2010/01/14(木) 23:14   No:46221     
Title: Re:お願いします。    
CodeProjectあたりで出回っているCGridCtrlのソースかと思いますが、それであっていますか?
そうでないなら、開発環境を明示してください。


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

Name: 入門者以下  ..ぴよぴよ(300ポイント)   Date: 2010/01/14(木) 23:20   No:46223     
Title: Re:お願いします。    
ぽこ様、高木様
ご回答ありがとうございます。

ぽこ様のおっしゃる通りネット上に落ちているCGridCtrlのソースです。
質問ではなく、依頼のようになってしまい申し訳ありません。。。
手のつけようがなくて。


開発環境
Visual Studio2008、XPです。


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

Name: たかぎ [URL]  ..ハッカー(152,091ポイント)   Date: 2010/01/14(木) 23:29   No:46224     
Title: Re:お願いします。    
C++やMFCはどの程度まで理解できていますか?
概要としては、ぽこさんが書かれているとおりですが、そのレベルでよいのでしょうか?


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

Name: 入門者以下  ..ぴよぴよ(881ポイント)   Date: 2010/01/15(金) 01:14   No:46233     
Title: Re:お願いします。    
もともとハードで今年からソフト屋?になり、
お恥ずかしながらほとんど理解できていません。。
MFCについては、開発するために便利な様々な機能、クラスみたい認識でいます。
ソースについては、調べ調べで変数、引数、関数、*がどのような物かくらいです。
できれば1行ずつコメントを入れていただけるとありがたいのですが・・・
私の理解では下記のレベルになってしまいます。


CGridCellBase* CGridCtrl::CreateCell(int nRow, int nCol) //引数int型のnRowとnCol

    ASSERT(!GetVirtualMode()); //ASSERTで!GetVirtualMode()の評価を行う

    if (!m_pRtcDefault || !m_pRtcDefault->IsDerivedFrom(RUNTIME_CLASS(CGridCellBase))) //解読不能
    { 
        ASSERT( FALSE); 
        return NULL; //NULLを返す
    } 
    CGridCellBase* pCell = (CGridCellBase*) m_pRtcDefault->CreateObject(); //ポイントpCell
    if (!pCell) //もし(!pCell)のときNULLを返す
        return NULL; 

    pCell->SetGrid(this); //理解できない、グリッド作成??
    pCell->SetCoords(nRow, nCol);  //理解できない

    if (nCol < m_nFixedCols) //nColよりm_nFixedColsが多きとき下記を実行
        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDCOL); //理解できない
    if (nRow < m_nFixedRows) //nRowよりm_nFixedColsが多きとき下記を実行

        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDROW); //理解できない
     
    pCell->SetFormat(pCell->GetDefaultCell()->GetFormat()); //表示書式を設定?

    return pCell; //pCellを返す。pCellの中身は?


一つ一つの単語?は調べながらでわかるのですが、つながるとどのような処理になるのかわかりません。
この程度しか理解していないのにお付き合いいただき有難うございます。


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

Name: sizuma [URL]  ..プログラマー(28,994ポイント)   Date: 2010/01/15(金) 02:07   No:46238     
Title: Re:お願いします。    
C++は文法書を読んだくらいで、MFCはさわったこともありませんので、僕の勉強で書いてみました。
参考になるかは分かりませんが、間違えはきっと他のプログラマさまが訂正してくれるはず・・・・
プログラミング1年目ぐらいですので、そんくらいの人のコメントだと思ってみてください^^;


CGridCellBase* CGridCtrl::CreateCell(int nRow, int nCol) //引数int型のnRowとnCol
{ 
    ASSERT(!GetVirtualMode()); //ASSERTで!GetVirtualMode()の評価を行う

    //m_pRtcDefaultが生成してあり、かつCGridCellBaseを実行可能な派生クラスであるか調べてる?
    if (!m_pRtcDefault || !m_pRtcDefault->IsDerivedFrom(RUNTIME_CLASS(CGridCellBase))) //解読不能
    { 
        ASSERT( FALSE); 
        return NULL; //NULLを返す
    } 
    //ファクトリメソッドでインスタンスを生成し、CGridCellBase*型に明示的にキャストする
    CGridCellBase* pCell = (CGridCellBase*) m_pRtcDefault->CreateObject(); //pCellへのポインタ
    if (!pCell) //もし(!pCell)のときNULLを返す
        return NULL; 

    pCell->SetGrid(this); //pCellのグリッドとして作成したインスタンスを登録
                          //つまり、呼び出す時に使ったインスタンスを登録。
    pCell->SetCoords(nRow, nCol);  //指定した列、行を登録

    //pCellのStateフィールドに状態を表すビット列があり、そこのビットをオンにする
    if (nCol < m_nFixedCols) //nColがm_nFixedColより小さければ下記
        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDCOL); 
    if (nRow < m_nFixedRows) //同じく、上限より小さければ
        pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDROW); 
    //pCellのフォーマットに、CGridCellクラスのデフォルトフォーマットをセットする 
    pCell->SetFormat(pCell->GetDefaultCell()->GetFormat()); //表示書式を設定?

    //pCellはポインタ(ポインタの先に中身がある)
    return pCell; //pCellを返す。pCellの中身は?
}  


コメント中にも書いてますが、pCellはこのメソッド(関数)で作ったグリッドを指すポインタです。
グリッドのアドレス(住所のようなもの)でこれを返せば、グリッドの中身もその住所の場所なので分かりますよね。
ちなみに、グリッド自体を現すには
*pCellとすることで、住所の先にあるグリッドを意味します。

お仕事大変ですね^^:
ソフトしか作ったことがない人に電子回路図の説明を書けって言われるようなものでしょうか。
(組込みしてたら分かるんでしょうけど)

関係ないですが、nullってキャストして返してもいいのかな・・・
代入するときは全然意識しなかったけど、returnするのはキャストして書きたくなります 編集済み


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

Name: ぽこ  ..入門者(4,567ポイント)   Date: 2010/01/15(金) 02:40   No:46241     
Title: Re:お願いします。    
私がソースコードの解析を依頼された場合、
全体を俯瞰し、概要をつかむことから始めます。

闇雲に一行ずつ読み解くことは「絶対に」行いません。
もし入門者以下さんの頭の中に、このソースに対する、
ハードウェアでいうところブロック図が無い場合は、
それを構築することから始めるべきです。

まず、該当する関数につけられているコメントを読みます。
コメントは、*.cppファイルか*.hファイルにあるはずです。
たかぎさんは突っ込みませんでしたが、私の最初の回答は
このソースにあったコメントを日本語に訳しただけです。

全体の概要を把握する前ならこれで十分だと考え、
別の場所の解析を行います。

クドいようですが、全体の概要把握が優先されるべきことです。

さて本題。

引用が前後しますが、

> 一つ一つの単語?は調べながらでわかるのですが、つながるとどのような処理になるのかわかりません。

これに対する回答は、関数の先頭にあるコメントのまんまです。

以降、入門者以下さんの疑問に、「推測」で答えさせていただきます。
ソースコードをパッと見たときの私の所感です。
 
> CGridCellBase* CGridCtrl::CreateCell(int nRow, int nCol) //引数int型のnRowとnCol
このグリッドは何行何列目って指定して、セルを作るんだな。

>     ASSERT(!GetVirtualMode()); //ASSERTで!GetVirtualMode()の評価を行う
バーチャルモードとかいうモードがあって、このモードの時はセルの作成は出来ないんだな。

>     if (!m_pRtcDefault || !m_pRtcDefault->IsDerivedFrom(RUNTIME_CLASS(CGridCellBase))) //解読不能
>     { 
>         ASSERT( FALSE); 
>         return NULL; //NULLを返す
>     } 
メンバm_pRtcDefaultがNULLだったり、CGridCellBaseの派生クラスでない場合は生成出来ないんだな。

>     CGridCellBase* pCell = (CGridCellBase*) m_pRtcDefault->CreateObject(); //ポイントpCell
>     if (!pCell) //もし(!pCell)のときNULLを返す
>         return NULL; 
ここで、セルを生成しているな。これ以降が、セルの初期設定だな。

>     pCell->SetGrid(this); //理解できない、グリッド作成??
セルの初期設定には、自分を生成したグリッドを記録する必要があるんだな。
(セル自身に所属するグリッドを記録する必要があるんだな)

>     pCell->SetCoords(nRow, nCol);  //理解できない
Coordって座標って意味だろうから、セル自身に自分が何行何列目のセルか記録する
必要があるんだな。

>     if (nCol < m_nFixedCols) //nColよりm_nFixedColsが多きとき下記を実行
>         pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDCOL); //理解できない
>     if (nRow < m_nFixedRows) //nRowよりm_nFixedColsが多きとき下記を実行
>         pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDROW); //理解できない
きっとグリッドに「行の固定」や「列の固定」って機能があって、1列目からm_nFixedCols列目までが
固定されるんだろうな(同様に1行目からm_nFixedRows行目も固定されるんだな)。
だからセルがその範囲に入っていた場合は、セルの状態に「固定されてますビット」を立てるんだろうな。

>     pCell->SetFormat(pCell->GetDefaultCell()->GetFormat()); //表示書式を設定?
表示形式はデフォルトの設定を使うんだな。

ソースコードの解析はジグソーパズルと同じで、最初は何をやっているのか、さっぱり分かりません。
いろんな箇所を目を通していく(目を通すだけ、深入りはダメ)に連れて、徐々により細かい部分が理解
できるようになります。

私なら、上記のような推測を行った後、この関数を離れ、
変数m_pRtcDefaultかm_nFixedColsを追います。

なんかグダグダになっちゃいましたが、以上が私なりの回答です。




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

Name: たかぎ [URL]  ..ハッカー(152,553ポイント)   Date: 2010/01/15(金) 06:57   No:46245     
Title: Re:お願いします。    
まずはじめに、CGridCtrlというのが何をするものか理解できていますか?
それが分からないと先に進みません。

結論をいえば、エクセルのような格子状の表を作るためのクラスです。
rowは格子の行、すなわち縦の位置であり、column(略してcol)は格子の列、すなわち横の位置にあたります。
cellは、格子の個々のマスのことです。
gridというのはこの格子のことです。

CGridCtrlでは、各cellをいろいろな形にカスタマイズできるようになっています。
具体的には、基本的には各cellはテキストを表示・編集できるだけですが、カスタマイズすることでコンボボックスにしたり、画像を表示したりできるようになります。
CGridCellBaseは、そのようにカスタマイズされたcellに共通のインタフェースを与えるための基底クラスです。

クラスについてはわかるでしょうか?
ハード屋さんにもわかりやすいようにLSIに例えると、クラスはLSIの仕様のようなものです。個々の仕様ごとに型番(クラス名: 例えばCGridCellBaseなど)が付いています。そして、その型番の個々のLSI(現物)に該当するものがオブジェクト(インスタンスと呼ぶこともある)になります。
クラスは継承することができますが、これは例えていえば、ピンコンパチのLSIを作るようなものです。

ぽこさんがいわれているように、全体を俯瞰することは重要で、難しいようであれば、Doxygen(http://www.doxgen.jp/)などを使って視覚化してみるのもよいでしょう。

今ちょっと時間がないので、夕方以降であればもう少し詳しい説明ができるかと思います。


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

Name: バグ  ..ハッカー(183,755ポイント)   Date: 2010/01/15(金) 08:25   No:46247     
Title: Re:お願いします。    
ぽこさんの例えが上手だなぁ…と感心しつつ眺めてます。

私も以前、ハードの事が全く分からないのにVHDLでFPGAの回路を組んだ事があります。

その時は専門書を読みながら、『これはC++でいうクラスみたいなものだな…』、『これは派生クラスっぽい?いや、内包してるだけかな?』…みたいな感じで自分の得意分野に置き換えながら進めていきました。

MFCは便利なようで、仕組みというか構成を理解するまでは、取っ付きづらいかと思いますが頑張ってください。


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

Name: 入門者以下  ..かけだし(1,461ポイント)   Date: 2010/01/15(金) 10:13   No:46248     
Title: Re:お願いします。    
sizuma様、ぽこ様、たかぎ様、バグ様

ご回答ありがとうございます。
別件のiniファイル読み込みボタンの実装?に手間取ってしましました。。。
返信が遅くなってしまい申し訳ありません。


sizuma様
大変参考になりました。
これを参考にして解析進めて行きたいと思います。

ぽこ様
ハードに置き換えての説明、わかりやすくとても勉強になりました。
全体の概要の重要性がよくわかりました。
上記のソースだけでなく全体に目を向けて行きたいと思います。
また1行ずつのコメントまでして頂きありがとうございます。

たかぎ様
CGridCtrlについてですが、ざっくりとExcelの表のようなものとの認識でいましたが、
おかげでより一層CGridCtrlについて理解できました。
たかぎ様の説明を見て、より深くCGridCtrlについて理解できました。
クラス=集積回路、クラス、継承についてのイメージが凄い湧きました。
わざわざハード用語に置き換えて説明して頂き、ありがとうございます。
お時間がある時でいいのでご教示お願い致します。

バグ様
ハードの事が全く分からないのに回路を組んだなんて凄いですね!
ありがとうございます。
少しずつソフトについて理解できるよう頑張って行きたいと思います。

皆様
こんなにたくさんの方からの回答、本当にありがとうございます。
丁寧に説明もしてくださって感無量です。


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

Name: たかぎ [URL]  ..ハッカー(152,841ポイント)   Date: 2010/01/15(金) 17:52   No:46264     
Title: Re:お願いします。    
http://repo.isis.vanderbilt.edu/doxygen/great/nightly/classCGridCtrl.html#94ee58f3f36c5ab542e26bde8195ed59
↑このあたりを見れば、多少は解釈しやすくなるかもしれません。
まあ、あまりよい資料ではないので、気休め程度かもしれませんが...

一応私もコメントを付けておきます。

// CGridCtrlのメンバ関数CreateCellの定義
//    メンバ関数CreateCellは、行と列をパラメータとして受け取り、生成したセルを返す
> CGridCellBase* CGridCtrl::CreateCell(int nRow, int nCol)
> {

// この部分は状態の判定(要はエラーチェック)
>     ASSERT(!GetVirtualMode());

>     if (!m_pRtcDefault || !m_pRtcDefault->IsDerivedFrom(RUNTIME_CLASS(CGridCellBase)))
>     {
>         ASSERT( FALSE);
>         return NULL;
>     }
>     CGridCellBase* pCell = (CGridCellBase*) m_pRtcDefault->CreateObject();
>     if (!pCell)
>         return NULL;

// 生成したセルが、どのグリッドのどの位置に配置されるかを設定
>     pCell->SetGrid(this);
>     pCell->SetCoords(nRow, nCol); 

// 各種属性を設定
>     if (nCol < m_nFixedCols)
>         pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDCOL);
>     if (nRow < m_nFixedRows)
>         pCell->SetState(pCell->GetState() | GVIS_FIXED | GVIS_FIXEDROW);

// Format(具体的に何を意味するかは忘れました)をデフォルトに設定
>     pCell->SetFormat(pCell->GetDefaultCell()->GetFormat());

// 生成したセルを返す
>     return pCell;
> }

まあ、こんな感じです。


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

Name: 入門者以下  ..かけだし(1,558ポイント)   Date: 2010/01/15(金) 18:14   No:46266 解決!     
Title: Re:お願いします。    
たかぎ様
コメントにURLありがとうございます。
参考にさせていただきます。
また、勝手に拝見させて頂いたのですが、
http://www.kijineko.co.jp/の方も、今後に役立てて行きたいと思います。

本当にありがとうございました。


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

Name: kazuoni [URL]  ..ハッカー(127,493ポイント)   Date: 2010/01/15(金) 19:02   No:46273     
Title: Re:お願いします。    
http://www.kijineko.co.jp/の方も、今後に役立てて行きたいと思います。 

たかぎさんや、その社員さん(?)が書いているコラムって
評判いいですよねw
以前は「コラムはしょせんコラム程度に」っと書かれていらしたかと思いますが・・・。


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

Name: たかぎ [URL]  ..ハッカー(153,058ポイント)   Date: 2010/01/15(金) 19:19   No:46274     
Title: Re:お願いします。    
> 以前は「コラムはしょせんコラム程度に」っと書かれていらしたかと思いますが・・・。

どんな文脈でそういったのか、ぜんぜん覚えていませんが、まあ役に立ててくれる人がいるのはよいことです。
うちのサイトは、原則として初心者に迎合しない主義で運営しています。
ですので、コメントやメールでの質問を随時受け付けています。

商用サイトとしては不親切なので、できれば初心者向けの(あくまでビジネス用の)サイトを別途作った方がよいのですが、そこまで手が廻っていません。


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

Name: 入門者以下  ..かけだし(1,635ポイント)   Date: 2010/01/15(金) 20:53   No:46276 解決!     
Title: Re:お願いします。    
たかぎ様
>コメントやメールでの質問を随時受け付けています。

心強くありがたいお言葉ありがとうございます。
今後、自分で調べてもわからない事がありましたら
質問させて頂きます。
その時は、よろしくお願い致します。


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



Name: 初級者☆  ..ぴよぴよ(613ポイント)   Date: 2010/01/14(木) 14:56   No:46166       
Title: 歩くプログラム    
いきなりですみません。プログラム作成の勉強によくこのサイトを使わせてもらっています。
実際、初心者で勉強中の身です。

今回は少し質問があって書き込みをしまさいた。

サイトではフラグを立て、一定間隔は動けないようになっていますが、知り合いが違う感じでプログラムを組んでいたので、今の自分ではどう違うのかがよくわかりません。詳しく解説してくれる人を捜しています。よろしくお願いします

知り合いのプログラム(許可は得てます)
void PlayerControl(){
    
    if(Key[KEY_INPUT_RIGHT]==1){
        Player.x+=4.0f;
        if(Player.x>630.0)
            Player.x=630.0;
    }
    if(Key[KEY_INPUT_UP]){
        Player.y-=4.0f;
        if(Player.y<15.0)
            Player.y=15.0;
    }
    if(Key[KEY_INPUT_DOWN]==1){
        Player.y+=4.0f;
        if(Player.y>465.0)
            Player.y=465.0;
    }
    
    if(Key[KEY_INPUT_F12]==1){
            hp_i=chr_hp;
    }
    if(Key[KEY_INPUT_F1]==1&&bom_flag==0){
        bom_flag=1;
        cutin_flag=1;
        cutin_back=MakeGraph(640,480);//仮に画像をおく
        GetDrawScreenGraph(0,0,640,480,cutin_back) ;//現在の表示されている画面をコピー
        bom_time_cnt=GetNowCount();//ボム使用時の時間を取得
        /*
        for(int s=0;s<ENEMY_TOTAL_NUM;s++){//全敵100体分
                EnemyHP[s]=0;;
                enemy[s].flag=0;
                stg_gakiha_count++;                
        }*/
    }
    DrawGraph((int)Player.x-16,(int)Player.y-24,img_player[0],TRUE);
}

サイトのプログラム

        if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1;         //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0)        //上向きならch.y座標を減らす
                    ch.y--;
            else if(ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
            else if(ch.muki==2)        //下向きならch.y座標を増やす
                    ch.y++;
            else if(ch.muki==3)        //右向きならch.x座標を増やす
                    ch.x++;
        }
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();
    }

どう違うのでしょうか?またプログラム的にどういうゲームに向いているのか教えてください。よろしくお願いします。


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


Name: Dixq (管理人)  ..ウィザード(1,137,127ポイント)   Date: 2010/01/14(木) 15:47   No:46171     
Title: Re:歩くプログラム    
お友達のプログラムだと、押した分だけ進みますよね。
でもうちのサイトのは1区間単位で移動します。
うちのサイトのプログラムは昔のRPGを想定してます。FF1やドラクエ1、ポケモンみたいな。
そうではなくボンバーマンねような動きをさせたいなら一区間ずつではなく押した分だけ動く必要があります。
自分が作りたいゲームに合わせて作り分ける必要がありますね。


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

Name: 初心者☆  ..ぴよぴよ(6ポイント)   Date: 2010/01/14(木) 15:52   No:46172 解決!     
Title: Re:歩くプログラム    
ありがとうございます。

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

Name: non  ..比類無きプログラマー(87,486ポイント)   Date: 2010/01/14(木) 16:27   No:46175     
Title: Re:歩くプログラム    
お友達のプログラムは、同じ画像が4ドットずつ移動するのかなぁ?
すると歩いているようには動かないのでは?
F1やF2を押したとき何をやってるかはしらないけど。



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

Name: 初心者☆  ..ぴよぴよ(56ポイント)   Date: 2010/01/15(金) 14:02   No:46257     
Title: Re:歩くプログラム    
いえ、原理はまだよく分からないのですが、方向キーを素早く動かすと立ったまま動くのですが、一定間隔押していると画像が走っているように動きます。その点はまだ学習中です

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



Name: kai  ..中級者(12,613ポイント)   Date: 2010/01/15(金) 03:07   No:46242       
Title: 点滅しているときに、点滅していない部分を点滅させる方法    
また、分からないことがあったので教えてください。
例えば、
if((cnt/5)%2==0){
//画像を表示
}
の場合、10/60秒周期で画像が点滅します。
点滅してないときは、もちろん画像は表示しません。
この点滅していないときに画像を逆に点滅させて表示させたいです。
つまり、画像を交互に表示させたいのですが、
if((cnt/5)%2==0){//Aの画像が表示してないときに@の画像を表示させる
//画像を表示@
}
if(@の画像が表示してないときにAの画像を表示させるif文){//←ここが分からなくて困ってます
//画像を表示A
}
どのような計算式を書けばよろしいのでしょうか?
誰か分かる方がいましたら、是非教えてください。
よろしくお願いします。 編集済み


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


Name: sizuma [URL]  ..プログラマー(29,034ポイント)   Date: 2010/01/15(金) 03:15   No:46243     
Title: Re:点滅しているときに、点滅していない部分を点滅させる方法    
if((cnt/5)%2==0){
//画像を表示@
}else{
//画像を表示A


これでいいのでは??


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

Name: kai  ..中級者(12,688ポイント)   Date: 2010/01/15(金) 13:00   No:46253 解決!     
Title: Re:点滅しているときに、点滅していない部分を点滅させる方法    
>sizumaさん
あ〜・・恥ずかしい・・
確かにelseつけるだけでよかったです。
何か私、勘違いしていたようで・・
ありがとうございました。


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

Name: sizuma [URL]  ..プログラマー(29,085ポイント)   Date: 2010/01/15(金) 14:00   No:46256     
Title: Re:点滅しているときに、点滅していない部分を点滅させる方法    
気づかないときは気づかないですよねー
持ってるシャーペンを探す感じです(笑

では制作がんばってください。


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



Name: デジキャメ  ..初心者(5,070ポイント)   Date: 2010/01/15(金) 10:51   No:46249       
Title: お絵かきロジックについて    
ファイルから数字を読み込み、イラストロジックの問題を作成しています。
ファイルは3つあり、1つはmasu.txtの問題を読み込むファイル、
yokoは、9X9のマスの横に数字が表示される。(1が表示されます)
yokoiroは9X9のマスの横に□を出力するファイルです。

yokoiroのファイルで、いつも実行が止まってしまうのですが、
問題があるのでしょうか?


#include "DxLib.h"
#define SET_XY    (5)
#define size    (20)
#define SIZE    (10)
#define PI_H    (9)
#define PI_W    (9)
#pragma warning(disable:4996)

int YokoPixel(int x, int y, int color){
    int sx, sy, Wh=GetColor(255,255,255), Bl=GetColor(70,70,255), Yl=GetColor(249,230,0);
    int Gr=GetColor(70,255,70),Rd=GetColor(255,70,255), col[] = {Wh,Bl,Rd,Yl,Gr};
 
    sx=205+x*size;  sy=SET_XY+y*size;   
    DrawBox(sx, sy, sx+size-1, sy+size-1, col[color], TRUE);return 0;
}
int MyDrawPixel(int x, int y, int color){
    int sx, sy, Wh=GetColor(255,255,255), Bk=GetColor(0,0,0), col[] = {Wh,Bk};
 
    sx=SET_XY+x*size;  sy=SET_XY+y*size;   
    DrawBox(sx, sy, sx+size-1, sy+size-1, Wh, TRUE);
    DrawBox(sx+1, sy+1, sx+size-1-1, sy+size-1-1, col[color], TRUE);
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
 
    int SetFontThickness(int TinckPal),CheckHitKey(int KeyCode), MouseX, MouseY;char String[256];
    int WorkData[PI_H][PI_W] = {0}, PixelData[PI_H][PI_W], PixellData[PI_H][PI_W];
    int i, j, cnt=0, y=0, FileHandle, Bk=GetColor(0,0,0), Wh, Gy,Min=0;  FILE *file;
    
  file=fopen("masu.txt","r");if(file==NULL){printfDx("FILE ERORR");exit(0);}
    /*for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            fscanf(file,"%d", &PixelData[i][j]);
        }
    }
    fclose(file);
    file=fopen("yokoiro.txt","r");
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            fscanf(file,"%d", &PixellData[i][j]);
        }
    }
    fclose(file);
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            YokoPixel(j, i, PixellData[i][j]);
        }
    }*/
    ChangeWindowMode(TRUE);    if(DxLib_Init() == -1){return -1;}
    Bk=GetColor(0,0,0);        Wh=GetColor(255,255,255);Gy=GetColor(200,200,200);
    
    FileHandle = FileRead_open("yoko.txt");y=PI_H*size+SET_XY;y=0;
    while(FileRead_eof(FileHandle) == 0){
        FileRead_gets(String, 256, FileHandle);
        DrawString(SET_XY+PI_W*size, SET_XY+y, String, Wh);y+=20;   
    }      
    FileRead_close(FileHandle);
    DrawBox(SET_XY, SET_XY, size*PI_W+SET_XY-1, size*PI_H+SET_XY-1, Gy, TRUE);
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            MyDrawPixel(j, i, 0);
        }
    }  
    SetMouseDispFlag(TRUE);
    while(!ProcessMessage()){
        if(memcmp(PixelData, WorkData, sizeof(int)*PI_H*PI_W) == 0) break;
        if(GetMouseInput() & MOUSE_INPUT_LEFT){
            while (GetMouseInput() & MOUSE_INPUT_LEFT);
            GetMousePoint(&MouseX, &MouseY);
            if(MouseX>SET_XY && MouseY>SET_XY){
                MouseX = (MouseX-SET_XY)/size;
                MouseY = (MouseY-SET_XY)/size;
                if(Min<=MouseX&&MouseX<PI_W&&Min<=MouseY&&MouseY<PI_H){
                    WorkData[MouseY][MouseX]++;
                    if(WorkData[MouseY][MouseX] > 1) WorkData[MouseY][MouseX] = 0;
                    MyDrawPixel(MouseX, MouseY, WorkData[MouseY][MouseX]);cnt++;
                }
            }
        }
  }
    DrawString(40,400,"Clear!!",Wh);
    WaitTimer(3000);DxLib_End();return 0;
}
ファイル(masu)  ファイル(yokoiro)

1 0 0 0 0 0 0 0 0  1(←成功すると、9X9のマスのこの位置に青い■が表示されます。)
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0  ファイル(yoko)
0 0 0 0 0 0 0 0 0    1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0




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


Name: box  ..ハッカー(149,818ポイント)   Date: 2010/01/15(金) 11:31   No:46250     
Title: Re:お絵かきロジックについて    
> yokoiroのファイルで、いつも実行が止まってしまうのですが、
> 問題があるのでしょうか?

>   file=fopen("masu.txt","r");if(file==NULL){printfDx("FILE ERORR");exit(0);}

この直後の18行分がコメントになっています。
それは正しいですか?


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

Name: デジキャメ  ..初心者(5,111ポイント)   Date: 2010/01/15(金) 11:40   No:46251     
Title: Re:お絵かきロジックについて    
>boxさん

回答およびご指摘ありがとうございます。

コメントマーク/**/を消し忘れていました。


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

Name: デジキャメ  ..初心者(5,183ポイント)   Date: 2010/01/15(金) 13:12   No:46254     
Title: 追加です    
実行しましたが、YokoPixcel関数内の

DrawBox(sx, sy, sx+size-1, sy+size-1, col[color], TRUE);return 0;

で止まってしまい、困っています。


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

Name: デジキャメ  ..初心者(5,209ポイント)   Date: 2010/01/15(金) 13:41   No:46255 解決!     
Title: 直りました    
入力位置を間違えていました。

皆様、お騒がせしました。



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



Name: ti  ..入門者(4,828ポイント)   Date: 2010/01/15(金) 01:30   No:46234       
Title: ドラクエ風の黒い窓を作る処理で困っています    
昔のドラクエ風のゲームを作っていて
Xボタンを(Aボタン)
Zボタンを(Bボタン)
のような処理をすると考えて作っています
Xボタンを1度押すと窓1が表示されて

Zボタンを1度押すと窓を閉じて前の処理へ戻るまではできました

しかしXボタンを押して窓1が表示されているときにもう一度Xボタンを押すと窓2が表示されるようにしたいのですが二つの窓が同時に表示されてうまくいきません

int Make_CmdWindow(int cr__x,int cr__y,int i,int j,char bname[50])//座標、座標、座標、座標、bmp名
{
    CmdFlg=1;
    //image = LoadGraph( "BMP/1138--.bmp" ) ;
    DrawRectGraph( 0, 0, i, j, 640, 640, image, TRUE, FALSE ) ;
    int cr1 = LoadGraph( "BMP/cr.bmp" );
    DrawRectGraph( 320, 320, 0, 0, 32, 48, cr1, TRUE, FALSE ) ;
    DrawGraph( 50 , 50 ,cmdwindow, false ) ;
    SetTransColor( 255 , 0 , 255 ) ;
    cmdwindow = LoadGraph( "BMP/cmd-win1.bmp") ;//左上にでる話すから調べるなどの窓(窓1)
    int SPEAKwindow = LoadGraph( "BMP/cmd-win2.bmp") ;//下にでる会話窓(窓2)
    int Cr = GetColor( 255 , 255 , 255 ) ;
    DrawString( cmd_x, cmd_y , "⇒" , Cr );
    ScreenFlip();
    
    while(ProcessMessage()==0  && GetHitKeyStateAll(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && CmdFlg==1){

    
          //↑メッセージ処理         ↑画面をクリア         ↑入力状態を保存       ↑ESCが押されていない
 
        
        DrawRectGraph( 0, 0, i, j, 640, 640, image, TRUE, FALSE ) ;
        
        DrawRectGraph( 320, 320, 0, 0, 32, 48, cr1, TRUE, FALSE ) ;
        DrawGraph( 0 , 0 ,cmdwindow, true ) ;
        int Cr = GetColor( 255 , 255 , 255 ) ;
        DrawString( cmd_x, cmd_y , "⇒" , Cr );
        ScreenFlip();
        if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30) ){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            if(cmd_y != 130){
                DrawGraph( 0 , 0 ,cmdwindow, true ) ;
                cmd_y=cmd_y+30;
                DrawString( cmd_x, cmd_y , "⇒" , Cr );
                

                
                
            }    
        }
        if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30) ){
            if(cmd_y != 70){
                DrawGraph( 0 , 0 ,cmdwindow, true ) ;
                cmd_y=cmd_y-30;
                DrawString( cmd_x, cmd_y , "⇒" , Cr );
            }
        }
        if(Key[ KEY_INPUT_Z ]  == 1){
            CmdFlg=0;
        }
        if((Key[ KEY_INPUT_X ]  == 1) && CmdFlg==1){
            CmdFlg2=1;
        }
        while(!ProcessMessage() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] && CmdFlg2==1){
        
                DrawGraph( 0 , 0 ,SPEAKwindow, true ) ;

                if(Key[ KEY_INPUT_Z ]  == 1 ){
                        CmdFlg2=0;
                }
                ScreenFlip();//裏画面反映
                
        }

        
        
        ScreenFlip();//裏画面反映
        
    }
    
 
    return 0;
}



よろしくお願いします


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


Name: kazuoni [URL]  ..ハッカー(124,293ポイント)   Date: 2010/01/15(金) 01:41   No:46236     
Title: Re:ドラクエ風の黒い窓を作る処理で困っています    
CmdFlg2が
0:X
1:z
2:x&z(x優先)
3:x&z(z優先)

みたいな感じでよいのでは?


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

Name: softya  ..比類無きプログラマー(88,668ポイント)   Date: 2010/01/15(金) 02:01   No:46237     
Title: Re:ドラクエ風の黒い窓を作る処理で困っています    
少なくとも状態遷移として書くべきで、メッセージループの中にメッセージループを書くのはやめた方が良いです。
ちゃんと管理出来るなら書いても良いですけどね。今のコードを見る限りちゃんと出来ていません。
状態遷移がどんななのかと言うと

「ゲームプログラミングの館」34. メイン関数の書き方。
http://dixq.net/g/37.html
にある様にswitch〜caseで書きます。

ウィンドウの状態遷移なら、イメージ的に書くと
switch(窓の状態) {
case 閉じた状態:
 Xが押されたら、[窓の状態]を窓1状態へ。
 break;
case 窓1状態:
 窓1の表示
 Xが押されたら、[窓の状態]を窓2状態へ。
 Zが押されたら、[窓の状態]を閉じた状態へ。
 break;
case 窓2状態:
 窓2の表示
 Zが押されたら、[窓の状態]を窓1状態へ。
 break;
}
となります。



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

Name: ti   Date: 2010/02/21(日) 19:35   No:462341266748535     
Title: Re:ドラクエ風の黒い窓を作る処理で困っています    
お久しぶりです
kazuoniさんsoftyaさん返答遅くなってしまってすいません
年末から体調を崩していてしばらく間が空いてしまいましたが
問題が発生しました
メイン関数の書き方にならって
関数を書いてみました

int function_status=888;//状態設定

int Make_CmdWindow1(int cr__x,int cr__y,int i,int j)//座標、座標、座標、座標、bmp名
{
    char Key[256];
    

    GetHitKeyStateAll( Key ) ; 
    while(1){
        //GetHitKeyStateAll(Key);
        switch(function_status){
            
            case 888:

                if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=999;//初期
                break;

                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window1" , "A" ,MB_OK);
                    function_status=777;//ウィンドウ2?
                break;

            case 777:
                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window2" , "A" ,MB_OK);
                    function_status=888;//ウィンドウ2が開いた状態?
                break;

                
                
                if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=888;//初期
                break;

            

            case 999:
                return 0;
                break;
                
            default:
                return 0;
                break;

        }
    }
    
 
    return 0;
}
初期で
if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=999;//初期
                break;

                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window1" , "A" ,MB_OK);
                    function_status=777;//ウィンドウ2?
                break;


キーを押していなくても押している状態として認識してしまいます
原因がわからないのですがkeyの宣言の仕方を変えるべきか
ソースの書き方の問題か教えてくださいよろしくお願いします


Name: ti   Date: 2010/02/21(日) 19:49   No:462341266749362 解決!     
Title: Re:ドラクエ風の黒い窓を作る処理で困っています    
だいぶ間が空いてしまって過去ログになってしまったのでこちらは解決とさせていただきます
返事がおくれてしまって申し訳ありませんでした




Name: たこやき  ..初心者(6,831ポイント)   Date: 2010/01/14(木) 15:03   No:46167       
Title: FPSの処理について    
FPSのプログラムを作ったのですがこのソースを実行して少しするとSleep(team)のところで止まってしまいます。
なぜ止まってしまうのでしょうか?
ソース載せます。
static DWORD befoer_time,befoer,Count0t;
DWORD now_time,t;
static int count=0;
DWORD team=0;
TCHAR buff[100],buff2[10];
float f[FPS];
static DWORD surprus_Time=0;

now_time=timeGetTime();
if(!befoer_time)
   befoer_time=timeGetTime();
if(!befoer)
   befoer=timeGetTime();
   surprus_Time+=1000/FPS-(now_time-befoer_time);
if(surprus_Time<=0)
   team=0;
else {
   if(team!=surprus_Time)
   team=surprus_Time;
   surprus_Time=0;
   count++;
} if(team>0)
   Sleep(team);
befoer_time=timeGetTime(); t=timeGetTime()-befoer; if(t>=1000) {
   FpsDraw=count*1000/t;
   count=0;
   befoer=timeGetTime();

}
環境はVC++2005です。


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


Name: Mist  ..比類無きプログラマー(81,295ポイント)   Date: 2010/01/14(木) 15:31   No:46168     
Title: Re:FPSの処理について    
> 止まってしまいます。 

「止まる」とは、プログラムが終了してしまうという意味ですか?
それとも、Sleepから抜けなくなるという意味ですか?
後者だとすると計算ミスでteamが大きくなりすぎているのかなと予想しますが。
FPSはどう定義されているんですか?


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

Name: たこやき  ..初心者(6,912ポイント)   Date: 2010/01/14(木) 15:41   No:46170     
Title: Re:FPSの処理について    
回答有難うございます。Sleepから抜けなくなるという意味です。
FPSは60と定義しています。確かに実行途中count++;のところ
でブレークポイントを付けて止めて見るとsurprus_Timeで理由
がわからない数字が出ます。どこら辺で計算ミスされているので
しょうか?



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

Name: Mist  ..比類無きプログラマー(81,532ポイント)   Date: 2010/01/14(木) 16:08   No:46174     
Title: Re:FPSの処理について    
コメントが全く無いのであなたの考え(設計)が非常に理解しづらいです。
全体的にコメント付けてもらえないでしょうか。
(字下げがぐちゃぐちゃで読みにくいってのもありますが)

原因とは違うかもしれませんが、ざっと見て気になったのは

surprus_Time+=1000/FPS-(now_time-befoer_time);

です。
足しこんでいる(+=)理由は何ですか?

予想ですが、(now_time-befoer_time)がFPS(=60)を超え続ける(この関数に戻ってくるまでに60msec以上経過している)場合、surprus_Timeはずっと値を引かれ続けることになりマイナスの最大値を超えたときに正のとんでもない値になります。
(now_time-befoer_time)はどれぐらいで推移していますか?

あと、この式にはもうひとつまずい点があり
(now_time-befoer_time)=60
となるとき、1000/0となりますので0割が発生します。
割り算を使用する場合は、割る数が0にならないことを事前にチェックしなければなりません。





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

Name: たこやき  ..初心者(7,396ポイント)   Date: 2010/01/14(木) 17:08   No:46177     
Title: Re:FPSの処理について    
static DWORD befoer_time,befoer;
DWORD now_time,t;
static int count=0;
DWORD team=0;
float f[FPS];
static DWORD surprus_Time=0;

now_time=timeGetTime();
if(!befoer_time)
   befoer_time=timeGetTime();
//余剰時間の計算(マイナスの場合、ウェイトをかけなくてよい) surprus_Time+=(1000/FPS)-(now_time-befoer_time); //ウェイトの時間かどうか? if(surprus_Time<=0)
   team=0;
else {
  if(team!=surprus_Time)
    team=surprus_Time;
   surprus_Time=0;
  count++;
}  //ウェイト時間 if(team>0)
   Sleep(team);
//前の時間の計算 befoer_time=timeGetTime(); if(!befoer)
  befoer=timeGetTime();
//1秒間のうちどれぐらいたったか t=timeGetTime()-befoer;  //1秒間たったかどうか? if(t>=1000) {
   FpsDraw=count*1000/t;
   count=0;
   befoer=timeGetTime();

}
> surprus_Time+=1000/FPS-(now_time-befoer_time);
>です。
>足しこんでいる(+=)理由は何ですか? 
前の余分の時間(マイナス)を足しているためです。

>予想ですが、(now_time- befoer_time)がFPS(=60)を超え続ける(この関数に戻ってくるまでに60msec以上経過している)場合、surprus_Timeは
>ずっと値を引かれ続けることになりマイナスの最大値を超えたときに正のとんでもない値になります。
>(now_time-befoer_time)はどれぐらいで推移していますか? 
特に推移はしていません。
ただ60msecを越える場合ってあるのでしょうか?

わかりにくいとは思いますがよろしくお願いします。


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

Name: たこやき  ..初心者(7,567ポイント)   Date: 2010/01/14(木) 17:38   No:46180     
Title: Re:FPSの処理について    
>あと、この式にはもうひとつまずい点があり
>(now_time-befoer_time)=60
>となるとき、1000/0となりますので0割が発生します。
>割り算を使用する場合は、割る数が0にならないことを事前にチェックしなければなりません。
1000/60-60場合先に1000が/60が先に計算されると思うので0割が発生しないと思うのですが?
どういうことなのでしょうか。まだまだ自分では初心者だと思うのでよろしくお願いします。


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

Name: たこやき  ..初心者(7,616ポイント)   Date: 2010/01/14(木) 17:56   No:46182     
Title: Re:FPSの処理について    
あとif(surprus_Time<=0)で0以下の時の処理しているので、マイナスになったとしてもここでteam=0になり
Sleep(team)は処理されないと思うのですが、どういうことなのでしょうか?


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

Name: Mist  ..比類無きプログラマー(82,129ポイント)   Date: 2010/01/14(木) 18:03   No:46183     
Title: Re:FPSの処理について    
ごめんなさい。
0割の件は私の見間違いです。
あと、コメントの次の行が改行されてなかったり、字下げが変なのはここの掲示板のせいみたいですね。(私の環境だけ? FX 3.5.7)

1000/16だから17msec以上かかればマイナスになりますね。
デバッグ用のコードを追加してみました。(コンパイルしていないので間違ってたらごめんなさい)
これで値の遷移をチェックしてみてはどうでしょうか。

static DWORD befoer_time,befoer;
DWORD now_time,t;
static int count=0;
DWORD team=0;
float f[FPS];
static DWORD surprus_Time=0;

now_time=timeGetTime();
if(!befoer_time)
    befoer_time=timeGetTime();

//余剰時間の計算(マイナスの場合、ウェイトをかけなくてよい)
surprus_Time+=(1000/FPS)-(now_time-befoer_time);

// <@@>現在の値をデバッグウィンドウに出力
char strtmp[128];
sprintf(strtmp, "now_time = %d, befoer_time = %d, surprus_Time = %d\n", now_time, befoer_time, surprus_Time);
OutputDebugString(strtmp);
// <@@>

//ウェイトの時間かどうか?
if(surprus_Time<=0)
    team=0;
else {
    if(team!=surprus_Time)
        team=surprus_Time;
    surprus_Time=0;
    count++;

//ウェイト時間
if(team>0)
    Sleep(team);
//前の時間の計算
befoer_time=timeGetTime();
if(!befoer)
    befoer=timeGetTime();

//1秒間のうちどれぐらいたったか
t=timeGetTime()-befoer; 

//1秒間たったかどうか?
if(t>=1000) {
    FpsDraw=count*1000/t;
    count=0;
    befoer=timeGetTime();
}


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

Name: たこやき  ..初心者(7,692ポイント)   Date: 2010/01/14(木) 18:17   No:46184     
Title: Re:FPSの処理について    
上記のプログラムをやりましたが、13が当分続き-3になり止まるみたいです。
あとif(surprus_Time<=0)で0以下の時の処理しているので、マイナスになったとしてもここでteam=0になり
Sleep(team)は処理されないと思うのですが、どういうことなのでしょうか?



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

Name: バグ  ..ハッカー(183,455ポイント)   Date: 2010/01/14(木) 18:32   No:46186     
Title: Re:FPSの処理について    
DWORD型は非負整数型だから、マイナス値にはならないでしょ?

それどころか、マイナスになるように計算すると、DWORD型の最大値に限り無く近い数値に変わるんやないかなぁ?
一番手っ取り早いのはDWORD型を、LONGLONG型とかに変えてみてはいかがかな?


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

Name: たこやき  ..初心者(7,695ポイント)   Date: 2010/01/14(木) 18:39   No:46187 解決!     
Title: Re:FPSの処理について    
回答ありがとうございます。longに変えてみたら処理してくれました。回答誠に有難うございました。

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

Name: たこやき  ..初心者(7,719ポイント)   Date: 2010/01/14(木) 19:12   No:46189     
Title: Re:FPSの処理について    
すみません。intでやると大丈夫なのですがなぜか、longとlong longでやると止まってしまします。
signedを付けてもダメでした。なぜなのでしょうか?


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

Name: たこやき  ..初心者(7,743ポイント)   Date: 2010/01/14(木) 19:21   No:46191     
Title: Re:FPSの処理について    
どの辺かというとteamの宣言のところをlong longとやると止まります。

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

Name: たこやき  ..初心者(7,840ポイント)   Date: 2010/01/14(木) 20:07   No:46194     
Title: Re:FPSの処理について    
何度もすいません。static DWORD surprus_Time=0;をstatic long long surprus_Time=0;にすると
という話です。あともう一つteamの宣言のところをlong longとunsigned longとやると止まります。
マイナスをする必要がないので、unsignedをしても大丈夫のような気がしますが・・・


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

Name: バグ  ..ハッカー(183,511ポイント)   Date: 2010/01/14(木) 20:21   No:46196     
Title: Re:FPSの処理について    
いまいち質問の真意が伝わってこないのですが、teamという変数に動きがある場所にブレイクポイントを設定して中身の確認はしましたか?

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

Name: たこやき  ..初心者(8,067ポイント)   Date: 2010/01/14(木) 20:58   No:46201     
Title: Re:FPSの処理について    
回答ありがとうございます。
質問し直します。static DWORD surprus_Time=0; のところをstatic long longにして、DWORD team=0; のところの
DWORDをlong longか unsigned longにするのと、 
DWORD team=0;のところをstatic long longにしてstatic DWORD surprus_Time=0; のところのDWORDをlong longにすると
Sleep(team)のところを抜けないで処理されて(止まっている状態)になるのですがどうして止まってしまうのでしょうか?
足りないのは補足しますのでよろしくお願いします。


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

Name: たこやき  ..初心者(8,143ポイント)   Date: 2010/01/14(木) 21:16   No:46206     
Title: Re:FPSの処理について    
>teamという変数に動きがある場所にブレイクポイントを設定して中身の確認はしましたか?
ブレークポイントというかOutputDebugString()でやったらlong long,unsigned long両方とも-13で止まってしまいます。


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

Name: バグ  ..ハッカー(183,547ポイント)   Date: 2010/01/14(木) 21:18   No:46207     
Title: Re:FPSの処理について    
ですから、ブレイクポイントを設定してteamという変数の中身を確認して報告していただけますか?
ついでにunsignedでなければ駄目な理由もお願いします。


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

Name: バグ  ..ハッカー(183,595ポイント)   Date: 2010/01/14(木) 21:20   No:46208     
Title: Re:FPSの処理について    
どうして、非負整数なのにマイナス値が表示されるのでしょうか?
そこを変だとは思いませんでしたか?


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

Name: たこやき  ..初心者(8,167ポイント)   Date: 2010/01/14(木) 21:22   No:46209     
Title: Re:FPSの処理について    
変だと思いました。それでなぜそうなったのかわからなくなったので質問させていただきました。

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

Name: たこやき  ..初心者(8,195ポイント)   Date: 2010/01/14(木) 21:24   No:46210     
Title: Re:FPSの処理について    
unsignedでなければ駄目な理由は特にないのですが・・・

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

Name: y  ..入門者(4,391ポイント)   Date: 2010/01/14(木) 22:10   No:46212     
Title: Re:FPSの処理について    
Sleep関数の引数は、DWORD(= unsigned int)型です。
DWORD型以外の値を渡した場合は、DWORD型に勝手にキャストされます。
いくら計算結果を入れる変数が符号付きのsigned intでも、
結局unsigned int(= DWORD)にキャストされるので、意味が無いです。
マイナスにならないように計算させるか、
マイナスになったときは別の処理をさせるなどしたらいいと思います。


あと、sprintfの%dで表示させるとint型で扱われます。
unsigned intの場合は%uを使うべきです。


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

Name: たこやき  ..初心者(8,223ポイント)   Date: 2010/01/14(木) 23:10   No:46219 解決!     
Title: Re:FPSの処理について    
そういうことでしたか、盲点でした。誠に回答ありがとうございました。

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



Name: TKOZ  ..熟練のプログラマー(44,551ポイント)   Date: 2010/01/12(火) 18:38   No:46054       
Title: ペイントソフトを作っているのですが…    
WIN32APIの応用として、ペイントソフトを作っています。しかし、問題が発生してしまいました。
長時間、描画命令を繰り返すと、ウィンドウが変に描画されてしまいます。
どういう風に変かというと、説明しずらいのですが、メニューだけが消えたり、
ウィンドウが消えたりします。なので、デバッグしているのですが、
デバッグしても、原因が分からないのです。なにしろ、本格的なウィンドウズアプリケーションを
C言語(C++)で作ったのは初めてですので…。

ソースを載せますね。

原因が分かる方はどうかアドバイスをください。宜しくお願いします。

環境は、VC++6.0でWindowsXPです。 編集済み


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


Name: YuO  ..熟練のプログラマー(42,327ポイント)   Date: 2010/01/12(火) 22:24   No:46069     
Title: Re:ペイントソフトを作っているのですが…    
コードは見ていないですが,症状だけを見るとGDIリソースをリークさせているのではないかと思います。
例えば,CreatePenでペンを作ったあと,不要になったら,
ペンがどのDCにも選択されていない状態にしてDeleteObjectする必要があります。

タスクマネージャのプロセスタブで,列としてGDIオブジェクトを表示させておいた場合に,
対象プロセスのGDIオブジェクトの数が増加していくのであれば,間違いなくGDIリソースのリークです。


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

Name: TKOZ  ..熟練のプログラマー(45,627ポイント)   Date: 2010/01/13(水) 17:34   No:46111     
Title: Re:ペイントソフトを作っているのですが…    
GDIというか、CreateDIBSectionで32ビットのDIBを作成して、そこのバッファ(LPDWORD lpPixel)に
書き込んでいます。
なので、DIBSectionなので、GDIでも自前描画クラスでもピクセルバッファに書き込めるのですが、
あえて、自前描画クラスで書き込んでいます。
クラスは、下のような感じです。
//描画用クラス
class CDraw{
private:
    int width;
    int height;
    
    struct BufStr buff[MAXSIZE]; /* シード登録用バッファ */
    struct BufStr *sIdx, *eIdx;  /* buffの先頭・末尾ポインタ */
public:
    int OldPointX;
    int OldPointY;
    int DrawMode;
    int DrawCount;
public:
    CDraw()
    {
        //(コンストラクタ)特に無し
    }
    CDraw(int xwidth,int yheight)
    {
        width=xwidth;
        height=yheight;
    }
    ~CDraw()
    {
        //(デストラクタ)特に無し
    }
    int GetPoint(int x,int y)
    {
        if(x<0 || x>width) return 0;
        if(y<0 || y>height) return 0;
        if(y==0) y=1;
        int p=lpPixel[x+(480-y)*width];
        int a,r,g,b;
        a = (p>>24&0xFF);
        r = ((p>>16)&0xFF);
        g = ((p>>8)&0xFF);
        b = (p&0xFF);
        int Col2 = (b<<16) | (g<<8) | r | 0xff000000;
        return Col2;
    }
    void DrawPixel(int x,int y,int Col)
    {
        int a,r,g,b;
        a = (Col>>24&0xFF);
        r = ((Col>>16)&0xFF);
        g = ((Col>>8)&0xFF);
        b = (Col&0xFF);

        int Col2 = (b<<16) | (g<<8) | r | 0xff000000;
        if(x<0 || x>width) return;
        if(y<0 || y>height) return;
        if(y==0) y=1;
        lpPixel[x + (480-y) * width] = Col2;
        
        
    }
    void ColorDivide(int Col,int *r,int *g,int *b)
    {
        *r=((Col>>16)&0xFF);
        *g=((Col>>8)&0xFF);
        *b=(Col&0xFF);
    }
    void DrawRect(int x0,int y0,int x1,int y1,int Col)
    {
        int i,j;//矩形を描画するメンバ関数

        for(i=x0;i<x1;i++)
        {
            for(j=y0;j<y1;j++)
            {
                DrawPixel(i,j,Col);
            }
        }
        
    }
    void DrawLine(int x0,int y0,int x1,int y1,int Col)
    {
        int i;//線を描画するメンバ関数

        int dx = ( x1 > x0 ) ? x1 - x0 : x0 - x1;
        int dy = ( y1 > y0 ) ? y1 - y0 : y0 - y1;
        int sx = ( x1 > x0 ) ? 1 : -1;
        int sy = ( y1 > y0 ) ? 1 : -1;

        /* 傾きが1以下の場合 */
        if( dx >= dy )
        {
            int E = -dx;
            for( i = 0 ; i <= dx ; i++ ) 
            {
                DrawPixel(x0,y0,Col);
                x0 += sx;
                E += 2 * dy;
                if( E >= 0 )
                {
                    y0 += sy;
                    E -= 2 * dx;
                }
            }
        /* 傾きが1より大きい場合 */
        } else 
        {
            int E = -dy;
            for( i = 0 ; i <= dy ; i++ ) 
            {
                DrawPixel(x0,y0,Col);
                y0 += sy;
                E += 2 * dx;
                if( E >= 0 )
                {
                    x0 += sx;
                    E -= 2 * dy;
                }
            }
        }
        
    }
void DrawCircle(int mx,int my,int r,int Col)
{
    int sx=mx-r;
    int sy=my-r;
    int dx=mx+r;
    int dy=my+r;

    int x,y;

    for(y=sy;y<=dy;y++)
    {
        for(x=sx;x<=dx;x++)
        {
            //円の範囲内?
            if( (x-mx)*(x-mx)+(y-my)*(y-my)<=r*r)
            {
                DrawPixel(x,y,Col);
            }
        }
    }
}
};


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

Name: SGGK  ..ぴよぴよ(27ポイント)   Date: 2010/01/14(木) 17:11   No:46178     
Title: Re:ペイントソフトを作っているのですが…    
ぱっと見ただけだけど、
・WndProc の WM_TIMER
・MyDlgProc の WM_PAINT
でリソースリークが発生してる。

後、WM_TIMER ではきちんとIDをチェックした方が良いよ。
SetTimer() をするのは自分だけでは無く、システムも必要に応じて SetTimer() してくるから。


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

Name: TKOZ  ..熟練のプログラマー(45,666ポイント)   Date: 2010/01/14(木) 20:35   No:46199 解決!     
Title: Re:ペイントソフトを作っているのですが…    
YuOさんへ
SGGKさんへ

ありがとうございました。おかげでメモリリークはなくなりました。
ご協力ありがとうございました。

しかし、これから、また新しい関数を作ると、メモリリークする機会が出てくると
思います。なので、注意したいです。

解決ボタンを忘れてました。すみません。 編集済み


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



Name: jay  ..中級者(13,148ポイント)   Date: 2010/01/09(土) 23:19   No:45844       
Title: 弾幕のプチテストプレイその4    
現在シューティングゲームを制作中です。
龍神録の仕様で弾幕のコードを書きますので、コピペしてプレイしてみて下さい。
プレイした後で指摘、感想、意見等よろしくお願いします。

void boss_shot_bulletH035(){
    int i,k,t=boss_shot.cnt;
    double angle=bossatan2();
        if(t%5==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =0;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI/2+(0.1*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.5;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t%4==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =1;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI*1.5-(0.2*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.9;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t>=780 && t%120==0){
            for(i=0;i<24;i++){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =2;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =angle+PI2/24*i;
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =2.4;
                boss_shot.bullet[k].state =0;
                }
            }
        }

    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 && boss_shot.bullet[i].state == 0 ){
            double x=boss_shot.bullet[i].x;
            double y=boss_shot.bullet[i].y;
            // 右の壁にぶつかっているか
            if( x > FMX-9 ){
                boss_shot.bullet[i].x = 0;
                boss_shot.bullet[i].state = 1;
            }

            // 左の壁にぶつかっているか
            if( x < 9 ){
                boss_shot.bullet[i].x = FMX-9;
                boss_shot.bullet[i].state = 1;
            }
        }
    }
}

この弾幕はステージ4のボスが使う予定です。
そのこともふまえて、指摘、意見等よろしくお願いします。


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


Name: チルチル  ..比類無きプログラマー(87,503ポイント)   Date: 2010/01/09(土) 23:40   No:45845     
Title: Re:弾幕のプチテストプレイその4    
第一印象は単調すぎて退屈ですね・・

見たところ「ヤマトトーラス」ですが
スコアボードに隠れる前に消えるのは違和感が凄いです
なのでスコアボードの外に入ったらスコアボードの外に移動させて欲しいです

それから何が起きているかわかりにくいので
円形発射とかより何かの形にするか色を変えた方が良いと思います

あとコピーするだけなので問題は無いですが
一応コードはタグで囲んだ方が良いですよ


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

Name: jay  ..上級者(15,327ポイント)   Date: 2010/01/10(日) 21:56   No:45916     
Title: Re:弾幕のプチテストプレイその4    
ヤマトトーラス、確か八坂神奈子のスペカだったか・・・
でもノーマルシューターの僕は見たことがありません。

>第一印象は単調すぎて退屈ですね・・
繋ぎだからむしろ退屈でいいのです。
繋ぎのインパクトが強すぎたらメインの影が薄れるから・・・

>円形発射とかより何かの形にするか色を変えた方が良いと思います
円形発射なら、それこそ495の波紋みたいになります

とりあえず、アレンジを二つ程考えたのでコードを乗せてみますね。
あとタグとか分かりません、ごめんなさい。

一つ目
void boss_shot_bulletH019(){
    int k,t=boss_shot.cnt;
    double angle=bossatan2();
        if(t%4==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =0;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =rang(PI2/7)+PI2/10*t;
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.5+rang(0.2);
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t>=360 && t%4==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =1;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =rang(PI2/7)+PI2/10*t;
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.8+rang(0.3);
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t>=840 && t%4==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =2;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =rang(PI2/7)+PI2/10*t;
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =2.1+rang(0.4);
                boss_shot.bullet[k].state =0;
                }
            }
if(t==360 || t==840)
        se_flag[1]=1;


    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 && boss_shot.bullet[i].state == 0 ){
            double x=boss_shot.bullet[i].x;
            double y=boss_shot.bullet[i].y;
            // 右の壁にぶつかっているか
            if( x > FMX ){
                boss_shot.bullet[i].x = 0;
                boss_shot.bullet[i].state = 1;
            }

            // 左の壁にぶつかっているか
            if( x < 0 ){
                boss_shot.bullet[i].x = FMX;
                boss_shot.bullet[i].state = 1;
            }
        }
    }
}

二つ目
void boss_shot_bulletH020(){
    int i,k,t=boss_shot.cnt;
    double angle=bossatan2();
        if(t%5==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =0;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI/2+(0.1*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.5;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t%5==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =1;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI/2-(0.1*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.5;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t%6==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =0;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI*1.5+(0.1*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.9;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }
        if(t%6==0){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =1;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =PI*1.5-(0.1*t);
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =1.9;
                boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }

        if(t>=660 && t%120==0){
            for(i=0;i<6;i++){
  if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].knd   =5;
                boss_shot.bullet[k].col   =2;
                boss_shot.bullet[k].x     =boss.x;
                boss_shot.bullet[k].y     =boss.y;
                boss_shot.bullet[k].flag  =1;
                boss_shot.bullet[k].angle =angle;
                boss_shot.bullet[k].cnt   =0;
                boss_shot.bullet[k].spd   =2.0-i*0.1;
                boss_shot.bullet[k].state =0;
                }
            }
        }

    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 && boss_shot.bullet[i].state == 0 ){
            double x=boss_shot.bullet[i].x;
            double y=boss_shot.bullet[i].y;
            // 右の壁にぶつかっているか
            if( x > FMX-9 ){
                boss_shot.bullet[i].x = 0;
                boss_shot.bullet[i].state = 1;
            }

            // 左の壁にぶつかっているか
            if( x < 9 ){
                boss_shot.bullet[i].x = FMX-9;
                boss_shot.bullet[i].state = 1;
            }
        }
    }
}


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

Name: チルチル  ..比類無きプログラマー(87,769ポイント)   Date: 2010/01/10(日) 23:10   No:45922     
Title: Re:弾幕のプチテストプレイその4    
何ででしょうね、避けていて楽しくないです・・

とりあえず最初のばら撒きかたが汚い気がします
何かしらの規則性が見て取れる感じが欲しいですね

あと反射にしても移動にしても
もう少し画面外まで行って欲しいです
微妙にはみ出ている気がしますから

と言うより弾幕としての印象が薄いです
前置きが無かったら1と2の違いに気付くのに時間が掛かる気がしますので

それからタグに関しては規約の1つなので
省略する事はできないようです


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

Name: 通りすがり  ..上級者(18,384ポイント)   Date: 2010/01/11(月) 00:31   No:45927     
Title: Re:弾幕のプチテストプレイその4    
わざわざトピ立ててみんなに見てもらおうというのに
「別に退屈な弾幕でいいのです、つなぎの弾幕だから」ってどうなの・・。

しかもタグとか解りませんじゃなくて規約ちゃんと読みましょう。

どうせ見てもらうならきちんと作ったもの見てもらったらどうですか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,132,748ポイント)   Date: 2010/01/11(月) 01:02   No:45930     
Title: Re:弾幕のプチテストプレイその4    
>> jayさん

こんにちは。
スペルとスペルの間のつなぎということでしょうか?

跳ね返りなら、画像の中心が画面の端に差し掛かった時折り返してはどうでしょう?
後、もし色を変えるなら跳ね返った時に変えてはどうでしょう?

--------------------

関係ない話ですが、最近弾幕作りしてないな〜と思っているとこんなもの見つけました。
龍神録の館作ってた頃作った物です。

http://dixq.net/zip/Ryujin_Rockon.zip

館にロックオン機能付けて、新たに弾幕2種類作った物です。

Zボタンを押しっぱなしで溜める・・。緑の丸範囲まで近づけるとロックオンになり、
Zボタンを離すとホーミング発射です。

ちなみに900からボス弾幕です。
弾幕はあまり目新しくはないですが・・。

何かこんなものでも弾幕作りの刺激になればどうぞ・・。(ならんか^^;


--------------------


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

Name: チルチル  ..比類無きプログラマー(88,001ポイント)   Date: 2010/01/11(月) 02:44   No:45937     
Title: Re:弾幕のプチテストプレイその4    
>jayさん

そういえば色を変えた方が良いって言いましたけど
反射した時に変わるとかじゃなくて撃つ方向によって色を変えて
反対から出てきた事をアピールしてみてはどうですかって意味でした

>管理人さん

おお、これは凄いですね
私には十分刺激になりましたよ

ところで円が2つ表示されていますけど
どこまで溜まっているのかゲージ的な物が見当たらないのですが・・

とりあえず5秒ほど押しっぱなしにしてみましたが
ホーミング的な事はしてくれなかったです・・

私としては目新しい弾幕で楽しかったですよ
余裕のある時に番外編として龍神録の館に加えてみてはどうですか?

ところで

>館にロックオン機能付けて〜



Zボタンを押しっぱなしで〜

の間に何かあるんでしょうか?

何かが読み込めてないようなアイコンが出ているのですが・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,133,584ポイント)   Date: 2010/01/11(月) 03:18   No:45940     
Title: Re:弾幕のプチテストプレイその4    
あ〜暇つぶしに作ったようなものなので、
全然ちゃんと出来ていませんので^^;
ためるといっても溜めているようなエフェクトは出ません・・。

敵の近くに一度行けばその敵をロックオンしますので、
その状態ならどこにいてもしばらくZを押して離せばホーミングして弾を発射すると思います。

こんなものも出来るかな〜というただの試作です。
円も赤円内だともっと激しい弾の出し方にしようと思いましたが、作ってるうちに飽きたのでそのまま放置です(笑

> 何かが読み込めてないようなアイコンが出ているのですが・・

あれ、ブログの画像直リンクできないんですかね、うちの環境では表示されるんですが^^;
ではうちのサーバーに画像移しておきました。


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

Name: ひよこ  ..比類無きプログラマー(77,510ポイント)   Date: 2010/01/11(月) 08:45   No:45946     
Title: Re:弾幕のプチテストプレイその4    
Dixqさんすごい・・・私にはここまで作れませんよ。
いい刺激になります。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,134,607ポイント)   Date: 2010/01/11(月) 13:25   No:45963     
Title: Re:弾幕のプチテストプレイその4    
いやいや、ひよこさんの年齢を知りませんが、
きっと私がひよこさんの年齢の時は作れませんでしたよ。

「爽快感」ってどうやったら出せるんだろうと試行錯誤したものの、難しいですね・・。

研究会で爽快感あるゲームを作るにはみたいなの分析図で導いたような気がしますが、
理屈ばかりじゃうまくいかないこと多いですね〜^^;


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

Name: チルチル  ..比類無きプログラマー(88,042ポイント)   Date: 2010/01/11(月) 15:51   No:45980     
Title: Re:弾幕のプチテストプレイその4    
おお、表示されました
こういう感じになっていたんですね

敵の近くに行くとロックオンされるんですか
演出もかっこよくて良いですね


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

Name: jay  ..上級者(16,604ポイント)   Date: 2010/01/11(月) 18:54   No:46003     
Title: Re:弾幕のプチテストプレイその4    
Dixqさん
>スペルとスペルの間のつなぎということでしょうか?
その通りです、分かりにくかったですか?

>何かこんなものでも弾幕作りの刺激になればどうぞ・・。
zipですか・・・、明日学校で開いてみますね。
(解凍ソフトダウンロードしようかな・・・)

通りすがりさん
>きちんと作ったもの見てもらったらどうですか?
別に手抜きとか全くしてませんよ。
ただサブがメインより目立ってはいけないという意味です。
それともサブに関して意見をもらってはいけないということですか?

あとタグは規約みて理解しました。
どうもすいませんでした。

チルチルさん
>何かしらの規則性が見て取れる感じが欲しいですね 
こんな感じでしょうか?
あっ、画面外に行くようにしてみました。

void boss_shot_bulletH021(){
#define TM021 400
#define    ADIST 80
int i,k,t=boss_shot.cnt%TM021;
static int s;
double angle=bossatan2();
    if(t==0 || t==90) s=30;
    if(t>=1 && t<=60){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =0;
            boss_shot.bullet[k].angle =PI2/120*s;
            boss_shot.bullet[k].x     =boss.x+cos(boss_shot.bullet[k].angle)*ADIST;
            boss_shot.bullet[k].y     =boss.y+sin(boss_shot.bullet[k].angle)*ADIST;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =0;
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s--;
        }

    if(t>200 && t<=260){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =1;
            boss_shot.bullet[k].angle =PI2/120*s;
            boss_shot.bullet[k].x     =boss.x+cos(boss_shot.bullet[k].angle)*ADIST;
            boss_shot.bullet[k].y     =boss.y+sin(boss_shot.bullet[k].angle)*ADIST;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =0;
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s++;
        }
    if(t%100==0){
        for(i=0;i<30;i++){
            if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =2;
            boss_shot.bullet[k].angle =angle+PI2/30*i;
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2.8;
            boss_shot.bullet[k].state =1;
                se_flag[0]=1;
            }
        }
    }


    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
    if( boss_shot.bullet[i].flag > 0 && boss_shot.bullet[i].state == 0 ){
        double x=boss_shot.bullet[i].x;
        double y=boss_shot.bullet[i].y;
        //発射時間
        if(t==90 || t==290){
            boss_shot.bullet[i].spd=1.5;
            se_flag[1]=1;
        }

        // 右の壁にぶつかっているか
        if( x > FMX+12 ){
            boss_shot.bullet[i].x = -12;
            boss_shot.bullet[i].state = 1;
            }

        // 左の壁にぶつかっているか
        if( x < -12 ){
            boss_shot.bullet[i].x = FMX+12;
            boss_shot.bullet[i].state = 1;
            }
        }
    }
}


アレンジというより別の弾幕ですが。
しかし何か物足りない感じがします。


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

Name: チルチル  ..比類無きプログラマー(88,373ポイント)   Date: 2010/01/11(月) 19:17   No:46005     
Title: Re:弾幕のプチテストプレイその4    
おお、これはなかなか面白いですね

ところでスペルとスペルの間と言うのは通常攻撃の事ですか?
それともメインとメインの間の引き立てスペルでしょうか?

まあ確かに物足りなさは感じますね
見たところ原因としては全方位発射に近いので
反対に移動しても特に難しくない事ですかね・・

つなぎの弾幕という事であればボスを頻繁に移動させてみてはどうですか?
ボスが同じ場所にいると弾が移動する場所も同じになるので慣れてしまうと思うんですよ

それから弾の発射間隔が短いので画面が常に弾に覆われていて
弾が反対に移動しても特に関係ない感じになってる気がします

そうですね・・例えば方向を徐々に変えて行きながら狭い範囲にばらまきショットを撃った後に
少しの間発射するのを止めて、その間にボスをランダムな方向に移動させる
・・というのを繰り返してみてはどうですか?

まんま「ヤマトトーラス」ですけどjayさんは見た事が無いそうなのでアリかと
これなら反対側から出てきて怖いですしね


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

Name: jay  ..上級者(15,135ポイント)   Date: 2010/01/11(月) 21:00   No:46021     
Title: Re:弾幕のプチテストプレイその4    
チルチルさんのご意見を取り入れつつもう少し改造してみました。
改良になるか改悪してるかは分かりませんが
風神録は一度Lunaで挑んだのですが「のびーるアーム」で撃沈しました。

改造前とどちらがいいですかね?
あと質問の答えは通常攻撃・・・のつもりです。

void boss_shot_bulletH022(){
#define TM022 530
#define    DIST1 35
#define    DIST2 70
#define    DIST3 100
int k,t=boss_shot.cnt%TM022;
static int s;
double angle=bossatan2();
    if(t==0 || t==140 || t==290) s=0;
    if(t==0)
        boss_shot.base_angle[0]=bossatan2();
    if(t>=1 && t<=40){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =0;
            boss_shot.bullet[k].angle =boss_shot.base_angle[0]+PI2/40*s;
            boss_shot.bullet[k].x     =boss.x+cos(boss_shot.bullet[k].angle)*DIST1;
            boss_shot.bullet[k].y     =boss.y+sin(boss_shot.bullet[k].angle)*DIST1;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =0;
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s++;
        }
    if(t==150)
        boss_shot.base_angle[0]=bossatan2();
    if(t>150 && t<=210){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =1;
            boss_shot.bullet[k].angle =boss_shot.base_angle[0]+PI2/60*s;
            boss_shot.bullet[k].x     =boss.x+cos(boss_shot.bullet[k].angle)*DIST2;
            boss_shot.bullet[k].y     =boss.y+sin(boss_shot.bullet[k].angle)*DIST2;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =0;
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s++;
        }
       if(t==300)
        boss_shot.base_angle[0]=bossatan2();
    if(t>300 && t<=380){
            if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =2;
            boss_shot.bullet[k].angle =boss_shot.base_angle[0]+PI2/80*s;
            boss_shot.bullet[k].x     =boss.x+cos(boss_shot.bullet[k].angle)*DIST3;
            boss_shot.bullet[k].y     =boss.y+sin(boss_shot.bullet[k].angle)*DIST3;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =0;
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
            s++;
        }
    if(t==420)
        move_boss_pos(40,40,FMX-40,130,80, 60);

    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
    if( boss_shot.bullet[i].flag > 0 ){
        double x=boss_shot.bullet[i].x;
        double y=boss_shot.bullet[i].y;
        int state=boss_shot.bullet[i].state; 
        //発射時間
    if(state==0){
        if(t==80){
            boss_shot.bullet[i].spd=1.8;
            boss_shot.bullet[i].state=1;
            se_flag[1]=1;
        }
        if(t==250){
            boss_shot.bullet[i].spd=1.3;
            boss_shot.bullet[i].state=2;
            se_flag[1]=1;
        }
        if(t==420){
            boss_shot.bullet[i].spd=0.8;
            boss_shot.bullet[i].state=3;
            se_flag[1]=1;
        }
    }
    if(state==1){
        // 右の壁にぶつかっているか
        if( x > FMX+7 ){
            boss_shot.bullet[i].x = -7;
            boss_shot.bullet[i].state = 2;
            }

        // 左の壁にぶつかっているか
        if( x < -7 ){
            boss_shot.bullet[i].x = FMX+7;
            boss_shot.bullet[i].state = 2;
                }
            }
    if(state==2){
        // 右の壁にぶつかっているか
        if( x > FMX+12 ){
            boss_shot.bullet[i].x = -12;
            boss_shot.bullet[i].state = 3;
            }

        // 左の壁にぶつかっているか
        if( x < -12 ){
            boss_shot.bullet[i].x = FMX+12;
            boss_shot.bullet[i].state = 3;
                }
            }
    if(state==3){
        // 右の壁にぶつかっているか
        if( x > FMX+18 ){
            boss_shot.bullet[i].x = -18;
            boss_shot.bullet[i].state = 4;
            }

        // 左の壁にぶつかっているか
        if( x < -18 ){
            boss_shot.bullet[i].x = FMX+18;
            boss_shot.bullet[i].state = 4;
                }
            }
        }
    }
}

難易度的にも大丈夫でしょうか?
全5ステージ中第4ステージのボスの通常攻撃
という設定で。


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

Name: チルチル  ..比類無きプログラマー(88,464ポイント)   Date: 2010/01/11(月) 21:21   No:46026     
Title: Re:弾幕のプチテストプレイその4    
難易度的には大丈夫ですけど
前と比べてどうかと言うと微妙ですね・・

どうも反射系とか移動系って全方位は不向きな気がしてきましたね
いっそのこと咲夜さんの通常攻撃みたいにしてみてはどうですか?


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

Name: jay  ..上級者(16,109ポイント)   Date: 2010/01/13(水) 21:51   No:46122     
Title: Re:弾幕のプチテストプレイその4    
チルチルさん
>例えば方向を徐々に変えて行きながら狭い範囲にばらまきショットを撃った後に 
少しの間発射するのを止めて、その間にボスをランダムな方向に移動させる

つまりこういうことでしょうか?
なんかいい感じな気がします。

通常攻撃にしては少々難易度が高い気がしますが・・・
void boss_shot_bulletH023(){
#define TM023 320
int i,k,t=boss_shot.cnt%TM023;
static int s;
if(t==0 || t==100)
        s=0;
    if(t>=0 && t<=60){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =0;
            boss_shot.bullet[k].angle =PI/2+PI/4+PI/180*s+rang(0.1);
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =1.3+rang(0.5);
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }

    if(t>=0 && t<=60){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =1;
            boss_shot.bullet[k].angle =PI/2-PI/4-PI/180*s-rang(0.1);
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2.4+rang(0.5);
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s++;
        }

    if(t>=160 && t<=220){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =1;
            boss_shot.bullet[k].angle =PI/2+PI/4+PI/180*s+rang(0.1);
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2.4+rang(0.5);
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        }

    if(t>=160 && t<=220){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =5;
            boss_shot.bullet[k].col   =0;
            boss_shot.bullet[k].angle =PI/2-PI/4-PI/180*s-rang(0.1);
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =1.3+rang(0.5);
            boss_shot.bullet[k].state =0;
                se_flag[0]=1;
            }
        s++;
        }

if(t==80 || t==240)
        move_boss_pos(40,40,FMX-40,130,80, 60);

    for( int i = 0; i < BOSS_BULLET_MAX; i++ ){
    if( boss_shot.bullet[i].flag > 0 && boss_shot.bullet[i].state == 0 ){
        double x=boss_shot.bullet[i].x;
        double y=boss_shot.bullet[i].y;

        // 右の壁にぶつかっているか
        if( x > FMX+12 ){
            boss_shot.bullet[i].x = -12;
            boss_shot.bullet[i].state = 1;
            }

        // 左の壁にぶつかっているか
        if( x < -12 ){
            boss_shot.bullet[i].x = FMX+12;
            boss_shot.bullet[i].state = 1;
            }
        }
    }
}


あと管理人さんが上に張ってくれたファイルを解凍して、実行してみたところ
 fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
こんなエラーが出てきました。
このエラーは初見で対処法が分からないのですがどうすればいいのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,136,488ポイント)   Date: 2010/01/13(水) 22:16   No:46126     
Title: Re:弾幕のプチテストプレイその4    
#include <DxLib.h>
ここを
#include "../../../include/DxLib.h"

こう変えたらエラーは消えるかと。
(../の数あってるかな?^^;)

もしくはDXライブラリの初期設定のページの手順をきちんとやればエラーは出ません。


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

Name: jay  ..上級者(16,110ポイント)   Date: 2010/01/13(水) 22:58   No:46129     
Title: Re:弾幕のプチテストプレイその4    
エラー消えましたよ、ありがとうございます。

凄いですね、極まれば我流(?)でもここまでできるのか・・・
1つ目の弾幕はいい刺激になりましたよ
やはり人さまのコードは参考になりますねぇ。

2つ目の方は、なんか似たようなの見たことありましたが。
(夢子が似たような奴を使ってた)

刺激を受けて弾幕づくり頑張りますね。
そろそろゲームも完成が見えてきたので。


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

Name: チルチル  ..比類無きプログラマー(88,689ポイント)   Date: 2010/01/13(水) 23:15   No:46131     
Title: Re:弾幕のプチテストプレイその4    
おお、これは良い感じですね
避けていて楽しいです

確かに少し難易度が高いようですが
色々と調整すればOKな所まで来ていると思いますよ

そうですね・・

・赤と青を交互に撃つ
・撃つ方向を毎回多少変える
・弾を他の種類、色に変えてみて映えるものを探してみる
・弾の画像が重ならないように乱数の均一性を上げる
・もう少し待ち時間を長くして前回の弾をはけさせる
・試しに上下も入れてみる
・1本にしてみる
・狭く長くしてみる
・幅を変えてみる

この辺を調整すると良いかもしれません


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,136,593ポイント)   Date: 2010/01/13(水) 23:38   No:46133     
Title: Re:弾幕のプチテストプレイその4    
龍神録の館のコードで遊んで下さっている方で
天神録Gというゲームを作っている方がいらっしゃるのですが

http://video.mixi.jp/list_video.pl?owner_id=7919453

龍神録なんかよりよっぽど綺麗な弾幕が沢山ありましたよ。
センスがあれば弾幕なんてどうにでもなりますよね。
センスを磨きたいものです・・。


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

Name: jay  ..上級者(16,172ポイント)   Date: 2010/01/14(木) 18:30   No:46185 解決!     
Title: Re:弾幕のプチテストプレイその4    
調整し難易度の問題もどうにかなりました。
お世話になりました。

残念ながらmixiは登録してないので見ることができません。


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



Name: 三日坊主  ..ぴよぴよ(22ポイント)   Date: 2010/01/14(木) 04:53   No:46141       
Title: 実行ファイルについて    
龍神録プログラミングの館を読ませていただいてる初心者です。
visual studio上では正常に動作しているプロジェクトを
Debugフォルダ内のRyuJin.exeから起動するとread errorと出て画像が描画されません。
この問題を解決するにはどうすれば教えていただけないでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,136,988ポイント)   Date: 2010/01/14(木) 07:30   No:46143     
Title: Re:実行ファイルについて    
.exeはプロジェクトではなく実行ファイルです。
実行ファイルはプロジェクトのあるフォルダと同じ階層でないといけません。
.exeを一つ上のフォルダに移動して実行してみてください。


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

Name: 三日坊主  ..ぴよぴよ(34ポイント)   Date: 2010/01/14(木) 15:54   No:46173 解決!     
Title: Re:実行ファイルについて    
ありがとうございました!

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



Name: 電気屋  ..入門者(3,425ポイント)   Date: 2010/01/08(金) 16:31   No:45797       
Title: サウンドノベル風文字列表示法    
どうも、たびたびお世話になっています。
今回は、プログラムのバグ(不具合)について聞きたいと思っています。
課題で、友人と一緒にプログラム作成を行っています。
自分の担当は、『サウンドノベル風文字列表示』のような文字表記のところなのですが、
前回教えてもらったプログラムを自分なりにアレンジしたところ様々な不具合が出てきました。
自分では大丈夫だと思っていたのですが、どうもうまく動きません。
プログラムの一部を乗せておくので何処か『ここが悪い!』と思うところがあれば教えてください。
不具合が起こっている可能性でもかまいません。
今の自分ではどうも気づくことができません。どうかお願いします。

値がわからないと答えられない。という人がいるかもしれませんが、そこは、適当に当てはめてください。


※不具合
・会話(内容)をすべて表示しない。
・改行しない
・WaitKey() ;を設定した覚えのないところでKey入力を待つ
・ENDflgを立てても、綺麗に次の関数に行かない
・その他(その他の不具合はある程度検討がついているので自分でどうにかします。)

※求めること
・現状のプログラムで、どこが悪いか?
・IF文よりswitch文の方がよかったのか?
・上記の不具合の改善点
・プログラムの流れは良いか?

※その他の願い
 
 もしプログラムがあまり良いものではないと思い、一から作り直した方がいい!と思うなら
 最後のコメントに  『作り直し』  と書いてください。
 まだ、いけると思うなら『再トライ』 と書いてくださると助かります。


  編集済み


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


Name: Mist  ..比類無きプログラマー(80,429ポイント)   Date: 2010/01/08(金) 17:24   No:45800     
Title: Re:サウンドノベル風文字列表示法    
> ・会話(内容)をすべて表示しない。 
// 1文字描画
した後に画面に反映している(ScreenFlip)ところが見当たらないのですが。

> ・改行しない 

関数がコメントアウトされているから当然な気もしますけど。

            if(Moji=='/'){    // 改行文字
                // 改行処理および参照文字位置を一つ進める
                //Kaigyou() ;
                CP++;
                }


> ENDflgを立てても、綺麗に次の関数に行かない 

// 終了フラグが1だったら終了する
がwhileループの外にあるからじゃないですか?
return_kaiwaを2にするところがループ内に無いからループを終了できないのでしょう。

    while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
がループの外なのも変と思いますが。

> ・その他

定期的にProcessMessageを呼び出してないのは大問題。
一応、WaitTimerとWaitKey内で実行されるけどそう意図して作ったとは思えないんですけど。


作り直すかどうかを悩む前に、もう少し自分が作ったプログラムについて理解をしないと意味無いように思いました。(作り以前の問題)
足りないのはソースの流れを読む力だと思いますよ。


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

Name: kazuoni [URL]  ..ハッカー(124,854ポイント)   Date: 2010/01/08(金) 18:19   No:45803     
Title: Re:サウンドノベル風文字列表示法    
> 自分の担当は、『サウンドノベル風文字列表示』

ということは、他のイベント担当がほかにもいるわけですよね?
関数culeは関数ClearDrawScreenを使っていますが、
他の方が担当している部分が関数culeの前にあり、LoadGraphScreen()が書かれていたら
それは消えてしまいます。(関数LoadGraphScreenは処理が重いってことも頭の片隅に。)
また、関数GetHitKeyStateAllは毎ループに一回でOKです。

自分が感じたたのは、ひとつのプロジェクトの一関数としては
関数が独立しすぎなのでは?っと思いました。


> ※その他の願い

みんなとプロジェクト全体についてディスカッション 編集済み


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

Name: 電気屋  ..入門者(3,995ポイント)   Date: 2010/01/09(土) 10:49   No:45823     
Title: 回答について    
どうも、回答ありがとうございます。
いただいた回答から、自分のプログラムを見直したのですが、どうもうまくいきません。
また、言い訳になるかもしれませんが。
プログラムに所々変なところがあるのは、うまく動かなかったので所々いじった残りです。
また、プログラムの結合度を低くする目的と見やすくするために関数を独立化させました。乗せてあるプログラムは一応皆さんに意見をもらうために簡易化したものなので、元々から独立化していたわけではありません。
プログラムがループ外にあったのは自分のミスです。所々のミスはプログラムを移動させたところのミスなので、間違えをそのまま乗せたこと、どうもすみませんでした。


意見をもらっている側なのに勝手なことを書いて申し訳ありません。
どうか気を悪くしないでください。




一つ一つバグを化片付けたいと思います。

まず、改行のところからです。

コメントアウトがされているから

と書かれていましたが、これは見直しをしたときの残骸です実際は


            if(Moji=='/'){    // 改行文字
                // 改行処理および参照文字位置を一つ進める
                Kaigyou() ;
                CP++;
                }


このようになっています。しかし、このプログラムを実行すると


    『名前』→’キー待ち’→『どうも、テストです』→三行目の『名前』→『またテストです』

と表記されます。
文を    ":名前/どうも、テストです/仮名として表示しています",
と一行にまとめても同じ結果が出てきます。

また'/’を名前後だけにしたら、
///////////////////////////////
名前
どうも、テストです仮名とし
///////////////////////////////
と表示されます。


自分は、名前のところでは改行されていますし、'/'の文字表記もされていませんので、うまくいっているのだと思っています。しかしその後の改行がうまくいっていないと思っています。サンプルのプログラムを真似て作っていたのですが、うまく動きません。サンプルに当てはめるとうまく動きます。何ででしょう?
どうか回答お願いします。

  編集済み


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

Name: softya  ..比類無きプログラマー(85,449ポイント)   Date: 2010/01/09(土) 12:23   No:45827     
Title: Re:回答について    
とりあえず動かして問題を確認してみたいのですが、最新のコードを動く形(main付き)で添付してもらえませんか。

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

Name: 電気屋  ..入門者(4,195ポイント)   Date: 2010/01/09(土) 15:20   No:45830     
Title: 貼り付け方がわかりません。    
すみません。以前圧縮形式で乗せようとしてできなかったので
コードの貼り付け方はtxet形式でいいですか?

一応、明日にはテキスト形式にして貼り付けときます。

今のプログラムは、友達と一緒にして作っているので、結合度と容量がおおきので


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

Name: softya  ..比類無きプログラマー(85,486ポイント)   Date: 2010/01/09(土) 15:53   No:45832     
Title: Re:貼り付け方がわかりません。    
動くコードならテキストでも構いませんよ。
ファイルはzipなら添付出来るはずです。


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

Name: SooA [URL]  ..上級者(23,230ポイント)   Date: 2010/01/10(日) 10:26   No:45864     
Title: Re:貼り付け方がわかりません。    
>まず、改行のところからです。
添付されているソースでは '/'、'E'、':'、else{ } の分岐で、
else { } が処理された後に '\0' の判定が行われています。
正しく表示できないのはそのためだと思います。


>※その他の願い
まずは単体で動作するプログラムを作ってみてはどうでしょう。


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

Name: 電気屋  ..入門者(4,280ポイント)   Date: 2010/01/10(日) 12:50   No:45866     
Title: Re:貼り付け方がわかりません。    
約束のプログラムです。時間がなく、一応動きますが
"E"の後のループや、その他の不具合がありますが、改行のところだけ見てください。
一応原本と、結合度の低いやつと二つ張ります。


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

Name: SooA [URL]  ..上級者(23,234ポイント)   Date: 2010/01/10(日) 12:58   No:45867     
Title: Re:貼り付け方がわかりません。    
>改行のところだけ見てください。
ぱっと見て足りないトコ

    } else
    // 参照文字列の終端まで行っていたら参照文字列を進める
    if( String[ SP ][ CP ] == '\0' )
    {
        WaitKey() ;
        SP ++ ;
        CP = 0 ;
    }

 編集済み


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

Name: SooA [URL]  ..上級者(23,243ポイント)   Date: 2010/01/10(日) 14:05   No:45871     
Title: Re:貼り付け方がわかりません。    
追記
ScreenFlip(); が Kaigyou(); にしかないので
改行が行われるまで描画が反映されません。


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

Name: softya  ..比類無きプログラマー(85,812ポイント)   Date: 2010/01/10(日) 19:40   No:45903     
Title: Re:サウンドノベル風文字列表示法    
思いっきり変更させてもらいました。
根本的にメインループのありかたを見直した方が良いと思います。
それにウィンドウズ・アプリとして、トンデモナイ事をあちこちでしてました。
これでは、終了したいときに終了しませんし、起動したままウィンドウズの終了をした場合に支障が出ます。

[注意点]
・ウィンドウズ・アプリは、必ずProcessMessage()を必ず周期的に呼び出さなくてはいけません。
・ScreenFlip()をしないと画面は更新されません。
・無限ループに近い方法でタイミング制御をしてはいけません。
・メインループを複数持つと終了処理で困るので、出来るだけ1つにまとめましょう。
・グローベル変数が多すぎるので、構造体にまとめた方がよいでしょう。

直したところや問題のあるところは★コメントで書き込んであります。


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

Name: 電気屋  ..入門者(4,330ポイント)   Date: 2010/01/11(月) 10:49   No:45954     
Title: お礼    
ありがとうございます。
大変お騒がせしました。いただいたプログラムから、もう一度やり直してみます。
そのときにまた、お願いします。


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

Name: 電気屋  ..入門者(4,372ポイント)   Date: 2010/01/14(木) 14:32   No:46164 解決!     
Title: Re:お礼    
プログラムをいただいて作り直した結果、バグもなくきれいに動くようになりました。
どうも、ありがとうございました。


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



Name: 天和  ..中級者(14,066ポイント)   Date: 2010/01/11(月) 14:22   No:45971       
Title: カレントディレクトリ内の検索    
使用OS Mac
コンパイラ GCC
技術レベル fopenが使える程度。



前回の投稿で(URL http://www.play21.jp/board/formz.cgi?action=res&resno=45449&page=&lognum=139&id=dixq&rln=45491
(課題はカレントディレクトリ内にある.cファイルのすべてを対象にしてその次に検索したい言葉を入力して
ファイル名と検索したい言葉がある行の文章そしてその行の行数を出力するプログラムを作りなさい。 )
解決しましたといっときながらなんですが・・・
以下のようにプログラムを組んだのですが
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;/*検索対象になるファイル*/
FILE *fl;/*filelist用*/
int ch;/*putchar用*/
int che;/*putchar用(filelist用の)*/
int h, i, j, k, n, s;
int count;/*文字の判定*/
int count2;/*行の文字数*/
int count3;/*forループ用*/
int flag;/*判定*/
char fname[1024];/*検索したいファイル名*/
char word[1024];/*検索したい文字列*/
char string[1024];/*文字を格納する場所*/
h = 0;/*ファイル名用*/
i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が今何文字あってるか?*/
s = 0;/*検索したい文字数*/
count = 0;

system("ls *.c > filelist");

printf("検索したい文字は?");
scanf("%s", word);

while(1){
     if(word[j] == '\0')
        break;
    s++;
    j++;
}

j = 0;

if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
   printf("ERROR\n");

else{

while((che = fgetc(fl)) != EOF){

       if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
            fname[h] = '\0';
                printf("%s\n", fname);

     h = 0;
     i = 0;
     j = 0;
     n = 0;
     s = 0;
     count = 0;
     count2 = 0;
     count3 = 0;

if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
           printf("ERROR2\n");

else{

i++;/*最初の行数*/

while((ch = fgetc(fp)) != EOF){

    string[count2] = ch;
    count2++;

if(count == 0)/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
{

      j = 0;
      n = 0;

}

if(ch == '\n')/*もし改行なら行番号をあげなさい*/
     {
       i++;
        string[count2] = '\0';

            if(flag == 1){
             count3 = 0;/*forループに使用*/
         
                 for(;count3 < count2 + 1; count3++)
                    printf("%c", string[count3]);

                          }

      count2 = 0;
      flag = 0;
     }
}

fclose(fp);
}
    }
       fname[h] = che;
       h++;
  }
}

fclose(fl);
return 0;
}

エラーが出ないはいいのですが上のソースを実行すると

検索したい文字は?printf
2-11.c
2-7.c
ERROR2

3-11.c
ERROR2

3-11a.c
ERROR2

3-14.c
ERROR2

3-15.c
ERROR2

3-16.c
ERROR2

3-18.c
ERROR2

4-13.c
ERROR2

az.c
ERROR2

bubble.c
ERROR2

copy.c
ERROR2

ennsyuu3-1.c
ERROR2

exlexico.c
ERROR2

file.c
ERROR2

fopen.c
ERROR2

fopen2.c
ERROR2

fopen3.c
ERROR2

fscanf.c
ERROR2

ifbun.c
ERROR2

kouzoutai.c
ERROR2

list13-10.c
ERROR2

list13-6.c
ERROR2

list13-9.c
ERROR2

search.c
ERROR2

switch.c
ERROR2

switch2.c
ERROR2

syukudai.c
ERROR2

test.c
ERROR2

time.c
ERROR2
と出てしまいます(最初の.cファイルだけなぜかエラーが出ませんが)
カレントディレクトリ内のファイル名はきちんと出ているので
ファイル名を検索するとき多分文字のデータとして扱われてないんじゃないかと思われるのですが。
(if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
          printf("ERROR2\n");  のとき)
最初にERROR2と表示されずきちんと表示されているファイル名のファイル内の検索をする対処法をお願いします。


 編集済み


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


Name: box  ..ハッカー(149,513ポイント)   Date: 2010/01/11(月) 14:59   No:45975     
Title: Re:カレントディレクトリ内の検索    
インデントにポリシーがないため、ソースが見づらくて仕方ありません。
まずはそこから手をつけてみてはいかがでしょう。


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

Name: 天和  ..上級者(15,012ポイント)   Date: 2010/01/11(月) 15:20   No:45976     
Title: Re:カレントディレクトリ内の検索    
>boxさん
編集>再インデントとやってみましたが
(なんかコメントがちょっと見づらいので勝手に自分で改行とかしてますが)
#include<stdio.h>
#include<stdlib.h>
int main(void){
    FILE *fp;/*検索対象になるファイル*/
    FILE *fl;/*filelist用*/
    int ch;/*putchar用*/
    int che;/*putchar用(filelist用の)*/
    int h, i, j, k, n, s;
    int count;/*文字の判定*/
    int count2;/*行の文字数*/
    int count3;/*forループ用*/
    int flag;/*判定*/
    char fname[1024];/*検索したいファイル名*/
    char word[1024];/*検索したい文字列*/
    char string[1024];/*文字を格納する場所*/
    h = 0;/*ファイル名用*/
    i = 0;/*行数用の数字*/
    j = 0;/*j番目の文字列*/
    n = 0;/*検索したい文字列が今何文字あってるか?*/
    s = 0;/*検索したい文字数*/
    count = 0;
    
    system("ls *.c > filelist");
    
    printf("検索したい文字は?");
    scanf("%s", word);
    
    while(1){
        if(word[j] == '\0')
            break;
        s++;
        j++;
    }
    
    j = 0;
    
    if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
        printf("ERROR\n");
    
    else{
        
        while((che = fgetc(fl)) != EOF){
            
            if(che == '\n' || che == EOF){/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
                fname[h] = '\0';
                printf("%s\n", fname);
                
                h = 0;
                i = 0;
                j = 0;
                n = 0;
                s = 0;
                count = 0;
                count2 = 0;
                count3 = 0;
                
                if((fp = fopen(fname, "r")) == NULL)
/*fname内の文字データと同じファイル名が存在するかチェックする*/
                    printf("ERROR2\n");
                
                else{
                    
                    i++;/*最初の行数*/
                    
                    while((ch = fgetc(fp)) != EOF){
                        
                        string[count2] = ch;
                        count2++;
                        
                        if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
                        {
                            
                            j = 0;
                            n = 0;
                            
                        }
                        
                        if(ch == '\n')/*もし改行なら行番号をあげなさい*/
                        {
                            i++;
                            string[count2] = '\0';
                            
                            if(flag == 1){
                                count3 = 0;/*forループに使用*/
                                
                                for(;count3 < count2 + 1; count3++)
                                    printf("%c", string[count3]);
                                
                            }
                            
                            count2 = 0;
                            flag = 0;
                        }
                    }
                    
                    fclose(fp);
                }
            }
            fname[h] = che;
            h++;
        }
    }
    
    fclose(fl);
    return 0;
}



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

Name: たかぎ [URL]  ..ハッカー(149,171ポイント)   Date: 2010/01/11(月) 15:37   No:45977     
Title: Re:カレントディレクトリ内の検索    
前回までの内容を追っていないのでよくわかりませんが...

system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか?


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

Name: box  ..ハッカー(149,517ポイント)   Date: 2010/01/11(月) 15:42   No:45978     
Title: Re:カレントディレクトリ内の検索    
「検索したい文字は?」

で入力した文字列を全然使ってないんですけど…。
使わなくていいんですか?


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

Name: 天和  ..上級者(15,100ポイント)   Date: 2010/01/11(月) 17:46   No:45989     
Title: Re:カレントディレクトリ内の検索    
>boxさん
すいませんチェックしたときエラーがなかったものですからつい忘れてしまいました以下が修正したものです。
#include<stdio.h>
#include<stdlib.h>
int main(void){
    FILE *fp;/*検索対象になるファイル*/
    FILE *fl;/*filelist用*/
    int ch;/*putchar用*/
    int che;/*putchar用(filelist用の)*/
    int h, i, j, k, n, s;
    int count;/*文字の判定*/
    int count2;/*行の文字数*/
    int count3;/*forループ用*/
    int flag;/*判定*/
    char fname[1024];/*検索したいファイル名*/
    char word[1024];/*検索したい文字列*/
    char string[1024];/*文字を格納する場所*/
    h = 0;/*ファイル名用*/
    i = 0;/*行数用の数字*/
    j = 0;/*j番目の文字列*/
    n = 0;/*検索したい文字列が今何文字あってるか?*/
    s = 0;/*検索したい文字数*/
    count = 0;
    
    system("ls *.c > filelist");
    
    printf("検索したい文字は?");
    scanf("%s", word);
    
    while(1){
        if(word[j] == '\0')
            break;
        s++;
        j++;
    }
    
    j = 0;
    
    if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
        printf("ERROR\n");
    
    else{
        
        while((che = fgetc(fl)) != EOF){
            
            if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
                fname[h] = '\0';
                printf("%s\n", fname);
                
                h = 0;
                i = 0;
                j = 0;
                n = 0;
                s = 0;
                count = 0;
                count2 = 0;
                count3 = 0;
                
                if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
                    printf("ERROR2\n");
                
                else{
                    
                    i++;/*最初の行数*/
                    
                    while((ch = fgetc(fp)) != EOF){
                        
                        string[count2] = ch;
                        count2++;
                        
                        if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
                        {
                            
                            j = 0;
                            n = 0;
                            
                        }
                        if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
                            
                        {
                            
                            n++;/*同じ文字かの正解数を1つあげる*/
                            
                            count++;/*現在の文字が正解か否かの判定*/
                            
                            j++;/*検索したい次の文字にチャレンジする*/
                            
                        }
                        
                        else{
                            
                            count = 0;
/*不合格なので検索したい最初の文字からやり直し*/
                            
                        }
                        
                        
                        
                        if(s == n){
/*もし検索したい文字数と正解数が一緒ならその行番号を出力しなさい*/
                            
                            printf("%d:", i);
                            
                            flag = 1;
                            
                            j = 0;
                            
                            n = 0;
                            
                        }
                        
                        if(ch == '\n')/*もし改行なら行番号をあげなさい*/
                        {
                            i++;
                            string[count2] = '\0';
                            
                            if(flag == 1){
                                count3 = 0;/*forループに使用*/
                                
                                for(;count3 < count2 + 1; count3++)
                                    printf("%c", string[count3]);
                                
                            }
                            
                            count2 = 0;
                            flag = 0;
                        }
                    }
                    
                    fclose(fp);
                }
            }
            fname[h] = che;
            h++;
        }
    }
    
    fclose(fl);
    return 0;
}

ちなみにまだERROR2の所でつまずいているためキチンと行番号が出るとかの確認とかしていません。

>たかぎさん
> 前回までの内容を追っていないのでよくわかりませんが...
>system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか? 
grep -n while ./*cとかだと確かに出せますがプログラムでやると1種類の言葉でしかできませんよね?
greo -n word(検索したい文字データが入っている配列)./*cみたいにできませんし
あとなるべくgrepは禁止の方向でお願いします。
  


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

Name: qwerty  ..かけだし(1,337ポイント)   Date: 2010/01/11(月) 18:09   No:45992     
Title: Re:カレントディレクトリ内の検索    
>>たかぎさん
>grepコマンド
Unix系ではこのような便利なコマンドがあるんですね。
初めて知りました。
確かにこのコマンドを利用すれば天和さんの求めている動作を容易に実現できそうです。

>>天和さん
>プログラムでやると1種類の言葉でしかできませんよね
入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。


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

Name: box  ..ハッカー(149,641ポイント)   Date: 2010/01/11(月) 18:15   No:45993     
Title: Re:カレントディレクトリ内の検索    
1文字ずつ読んではチェックしていく、というのは
いかにも効率が悪そうです。

1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が
よほど効率的ではないかと思います。


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

Name: たかぎ [URL]  ..ハッカー(149,149ポイント)   Date: 2010/01/11(月) 18:19   No:45994     
Title: Re:カレントディレクトリ内の検索    
grepを使わないとして...

> 1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が 
> よほど効率的ではないかと思います。

fgets等でいちいち読み込むより、mmapでファイルの内容をメモリにマッピングして操作した方が簡単かと思います。


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

Name: box  ..ハッカー(149,655ポイント)   Date: 2010/01/11(月) 18:39   No:46000     
Title: Re:カレントディレクトリ内の検索    
mmapは初めて知りました。

機会が訪れれば使ってみようと思います。
永遠に訪れないかもしれませんが…。


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

Name: 天和  ..上級者(15,198ポイント)   Date: 2010/01/11(月) 20:05   No:46010     
Title: Re:カレントディレクトリ内の検索    
>boxさん
そんな便利な関数あったんですねありがとうございます。
そして早速作ってみたのですが
#include<stdio.h>

int main(void)

{
    
    char *ch;
    
    FILE *fp;
    
    char fname[99]; /*検索したいファイル名*/
    
    char word[99]; /*検索したい文字列*/
    
    char string[1024];/*検索対象になる文字列*/
    
    int i, n;
    
    
    
    i = 0;/*行数用の数字*/
    
    n = 1024;/*fgetsで使う*/
    
    
    printf("FILEname?\n");
    
    scanf("%s", fname);
    
    printf("検索したい文字は?");
    
    scanf("%s", word);
    
    if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
        
        printf("ERROR");
    
    else{
        i++;
        
        while((ch = fgets(string, n, fp)) != EOF)
        {
            
            if((ch = strstr(ch,word)) != NULL){
                printf("%d:", i);
                puts(ch);
            }
            i++;
        }
        
        
        
    }
    
    fclose(fp);
    
    
    
    return 0;
    
}


エラーは出ませんが警告はでます。
(警告内容)
search.c:42: warning: comparison between pointer and integer
search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’

(出力結果)
FILEname?
fopen.c
検索したい文字は?printf
25:printf("検索したい文字は?");

38:printf("ERROR\n");

46:printf("%s\n", fname);

58:printf("ERROR2\n");

98:printf("%d:", i);

117:printf("%c", string[count3]);

Bus error
>たかぎさん
すいません今回はそのstrstrの方向でいかせていただきます。
>qwertyさん
>入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。

まあでもgrepは使ってはいけませんから・・・。




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

Name: box  ..ハッカー(149,812ポイント)   Date: 2010/01/11(月) 22:09   No:46028     
Title: Re:カレントディレクトリ内の検索    
> (警告内容)
> search.c:42: warning: comparison between pointer and integer

>         while((ch = fgets(string, n, fp)) != EOF)

ファイルを読み終わったときにfgetsは何を返すのでしょうか? EOFでしょうか?

> search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’

strstr関数の引数の型(constがらみ)の話だと思います。
 編集済み


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

Name: たかぎ [URL]  ..ハッカー(149,205ポイント)   Date: 2010/01/11(月) 22:42   No:46031     
Title: Re:カレントディレクトリ内の検索    
> strstr関数の引数の型(constがらみ)の話だと思います。

違うでしょう。
関数原型なしでstrstrを呼び出しているので、

int strstr();

とみなされるわけですが、これは組み込み関数のシグニチャと矛盾することが指摘されているのです。


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

Name: しえる  ..ぴよぴよ(39ポイント)   Date: 2010/01/12(火) 01:14   No:46039     
Title: Re:カレントディレクトリ内の検索    
すみません天和さんへの私信です。

以前こちらの投稿を見たのですが。
http://www.play21.jp/board/formz.cgi?action=res&resno=44989&page=&lognum=138&id=dixq&rln=45023
mygrep.plの動作は天和さんの理解されているものとは違うと思いますよ。
># Usage: mygrep pattern file1 file2 ...
と書かれてますので、コマンドプロンプトからこんな感じに使う想定です。

mygrep printf main.txt main2.txt
→main.txtとmain2.txtからprintfを探す

出題者の方がいるなら確認してみるのをお勧めします。

あとついでに、
grep -n while ./*.c 
の"./*.c"はワイルドカードというもので、
こう指定するとどうなるのかも聞いてみた方がいいかも。

初心者にはかなり難しい問題です。


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

Name: 天和  ..上級者(15,478ポイント)   Date: 2010/01/12(火) 13:34   No:46050     
Title: Re:カレントディレクトリ内の検索    
>しえるさん
えーと今回の課題は$ grep -n 文字列 ファイル名と同じ効果をもつプログラムを作りなさい
ということなのでよくわからないので教授に「ようするにカレントディレクトリ内にある.cファイル例えば
printfならprintfと書かれている文字列を行番号付きで出せとのことでしょうか?」
と聞いたら「はいそうです」といったので上のようなソースを作った訳なんですけど
ちなみに教授はそれをPerl言語で書くと
# grep for perl version
# Usage: mygrep pattern file1 file2 ...
#

if (@ARGV < 1) {
    die "Usage: mygrep pattern [file..]\n";
}

$pattern = shift;
foreach $file (@ARGV) {
    open(FILE, $file);
    $line = 1;
    while (<FILE>) {
    print "$file $line: $_" if /$pattern/o;
    $line++;
    }
    close(FILE);
}

と同じになるっていってたんですけど間違えたんでしょうか?


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

Name: qwerty  ..かけだし(1,519ポイント)   Date: 2010/01/12(火) 15:25   No:46051     
Title: Re:カレントディレクトリ内の検索    
>>天和さん
>間違えたんでしょうか?
大筋は合っていると思いますが、少し無駄に拡大解釈しているのだと思います。

課題の内容は“コマンドラインから受け取ったファイル名”を対象として、そのファイルに対し検索を実行するようです。
それをあたかもワイルドカードまで考慮して実装しなくてはならないような解釈をしておられるようなので、
話がややこしくなっているのだと思います。


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

Name: 天和  ..上級者(15,591ポイント)   Date: 2010/01/12(火) 17:20   No:46052     
Title: Re:カレントディレクトリ内の検索    
>qwertyさん
あっじゃあ自分はこの課題の大部分はすでにできているということでしょうか?
(ファイルをひとつ指定して検索するプログラムはできているため)
まあ今度はコマンドラインからの入力で反応できなきゃだめですが・・・
(scanfをつかってファイル指定しているため)


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

Name: たかぎ [URL]  ..ハッカー(149,414ポイント)   Date: 2010/01/12(火) 17:44   No:46053     
Title: Re:カレントディレクトリ内の検索    
Perlのコードを見る限り、パターンやファイル名の指定はコマンドライン引数で与える必要があるのではないでしょうか?
だとすれば、ワイルドカードの扱いも簡単に解決できます。
それより、Perlのコードに合わせるためには、正規表現も必要になります。非標準の関数を使ってもよいのかどうか知りませんが、非標準関数を使わずに正規表現を実装するのは大変です。
仮に非標準関数を使ってもよいとしても、Perlの正規表現と同じ動作にするのは困難です。いっそ、system関数でPerlを呼び出した方がよいと思います。


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

Name: 天和  ..上級者(15,709ポイント)   Date: 2010/01/12(火) 19:09   No:46055     
Title: Re:カレントディレクトリ内の検索    
>たかぎさん
つまりsystem関数で
if (@ARGV < 1) {
    die "Usage: mygrep pattern [file..]\n";
}

$pattern = shift;
foreach $file (@ARGV) {
    open(FILE, $file);
    $line = 1;
    while (<FILE>) {
    print "$file $line: $_" if /$pattern/o;
    $line++;
    }
    close(FILE);
}

を呼び出せということでしょうか?


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

Name: qwerty  ..かけだし(1,589ポイント)   Date: 2010/01/12(火) 19:13   No:46056     
Title: Re:カレントディレクトリ内の検索    
>>たかぎさん
対象ファイルにしか目が行ってませんでしたが、たしかに検索文字列に正規表現が使われていますね。
「同等以上」のプログラムとなると難しそうです。


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

Name: たかぎ [URL]  ..ハッカー(149,447ポイント)   Date: 2010/01/12(火) 19:22   No:46057     
Title: Re:カレントディレクトリ内の検索    
> つまりsystem関数で
> (中略) 
> を呼び出せということでしょうか?

まあ、そういうことです。
強引にワンライナーで呼び出してください。
grepは使いたくないけれど、PerlならOKですよね。


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

Name: 天和  ..上級者(15,901ポイント)   Date: 2010/01/12(火) 19:39   No:46058     
Title: Re:カレントディレクトリ内の検索    
>たかぎさん
もしかしてそれって
perl mygrep.pl while ./*.cってやつでしょうか?
それだとしたたぶんだめです課題のプリントにすでに書いてあるので・・・。
(mygrep.plは上のperl言語のソースコードが書いてあるファイルです)


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

Name: たかぎ [URL]  ..ハッカー(149,506ポイント)   Date: 2010/01/12(火) 19:42   No:46059     
Title: Re:カレントディレクトリ内の検索    
> もしかしてそれって 
> perl mygrep.pl while ./*.cってやつでしょうか? 

違います。

system("perl -e \'スクリプト\'");

のように、system関数を使って呼び出してください。
@ARGVを使う必要はないので、スクリプトに必要なパラメータを直接埋め込めばよいでしょう。


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

Name: 天和  ..上級者(16,042ポイント)   Date: 2010/01/12(火) 20:21   No:46060     
Title: Re:カレントディレクトリ内の検索    
すいません自分perl言語なんてやったことないのでよくわからないのですが。
文字検索するワンライナーとはどんなのでしょうか?
逆ならあったのですが・・・
参考URL
http://dyno2316.blogspot.com/2009/07/blog-post_3805.html
# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt


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

Name: たかぎ [URL]  ..ハッカー(149,525ポイント)   Date: 2010/01/12(火) 20:27   No:46062     
Title: Re:カレントディレクトリ内の検索    
> すいません自分perl言語なんてやったことないのでよくわからないのですが。 
> 文字検索するワンライナーとはどんなのでしょうか? 

話すと長くなるので、Perlの解説サイトでも見てください。


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

Name: hoge  ..入門者(3,237ポイント)   Date: 2010/01/12(火) 20:44   No:46063     
Title: Re:カレントディレクトリ内の検索    
> すいません自分perl言語なんてやったことないのでよくわからないのですが。
> 文字検索するワンライナーとはどんなのでしょうか?
> 逆ならあったのですが・・・

同じページにあるじゃん。

# grepのように使う
perl -ne "print if (/検索パターン/)" filename


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

Name: 天和  ..上級者(16,236ポイント)   Date: 2010/01/12(火) 22:06   No:46066     
Title: Re:カレントディレクトリ内の検索    
>hogeさん
あっホントですね。
でもこのままだと特定のひとつのファイルまたはカレントディレクト内全部検索できるのはいいですが
行番号とファイル名が・・・
なのでとりあえずファイル名を文字データとして代入させてやる感じにしないといけないわけですが。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char fname[1025];
scanf("%s" fname);
system("perl -ne 'print if while' fname");
return 0;
}

だとfnameというファイルを探してしまうんですがfname内にある文字データで検索させるにはどうすればいいんでしょう?




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

Name: box  ..ハッカー(149,794ポイント)   Date: 2010/01/12(火) 22:11   No:46068     
Title: Re:カレントディレクトリ内の検索    
> > strstr関数の引数の型(constがらみ)の話だと思います。

> 違うでしょう。
> 関数原型なしでstrstrを呼び出しているので、

はい。大間違いでした。
string.hをインクルードしていなかったからですね。


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

Name: 天和  ..上級者(16,063ポイント)   Date: 2010/01/13(水) 13:17   No:46102     
Title: Re:カレントディレクトリ内の検索    
YAHOO知恵袋に答えらしきものがあったのですが・・・
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1035210505
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void
grep_file(const char *file, const char *pattern)
{
FILE *fp;
int line;
char buf[BUFSIZ];

/* ファイルをオープンする */
fp = fopen(file, "r");
if (fp == NULL)
{
/* ファイルのオープンに失敗 */
return;
}

line = 1;

/* 注意
下記のコードは簡易版です。バイト数が BUFSIZ を超える行がある場合、
正しく動作しません。但し、この課題が、C言語初学者用のものである
ならば、十分な内容です。*/

/* ファイルから一行ずつ取り出しながら処理する */
while (fgets(buf, sizeof(buf), fp) != NULL)
{
/* buf の中に pattern があれば、strstr() は NULL 以外を返す */
if (strstr(buf, pattern) != NULL)
{
printf("%s %d: %s", file, line, buf);
}

++line;
}

/* 開いたファイルを閉じる */
fclose(fp);
}

int
main(int argc, char *argv[])
{
int i;

/* 引数が何も指定されていない場合 */
if (argc <= 1)
{
printf("Usage: mygrep pattern [file...]\n");
return EXIT_FAILURE;
}

/* 二番目以降の引数をファイル名とみなし、それらを一つずつ処理する */
for (i = 2; i < argc; ++i)
{
/* 第一引数にファイル名、第二引数にパターンを指定して
grep_file() 関数を呼び出す。*/
grep_file(argv[i], argv[1]);
}

return EXIT_SUCCESS;
}

(ちなみに知恵袋の質問者は自分じゃありません)

なんかワンライナーとか使わなくてもできそうですね


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

Name: たかぎ [URL]  ..ハッカー(149,788ポイント)   Date: 2010/01/13(水) 13:26   No:46103     
Title: Re:カレントディレクトリ内の検索    
> なんかワンライナーとか使わなくてもできそうですね

(Perl式の)正規表現が使えないので、できたとはいわないのでは?


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

Name: 天和  ..上級者(16,285ポイント)   Date: 2010/01/13(水) 13:57   No:46104     
Title: Re:カレントディレクトリ内の検索    
>たかぎさん
知恵袋のほうだと正規表現スルーしてますねたしかに
でも問題文といいファイル名といいたぶん自分の大学と同じ人だと思うんですけどね。
でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
「力技でもいいよ」とはいったんですが。
やっぱりワンライナーで真面目にやるしかないですよね?


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

Name: たかぎ [URL]  ..ハッカー(149,880ポイント)   Date: 2010/01/13(水) 14:06   No:46105     
Title: Re:カレントディレクトリ内の検索    
> でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
> 「力技でもいいよ」とはいったんですが。 

Perlならこうなるというコードを示されていますから、正規表現は当然必要です。
正規表現不要なら、Perlのコードでも正規表現が働かないように実装しなければなりませんから。
「力技」が何を意味するのかわかりませんが、Perlをワンライナーで呼び出すのは十分力技です。


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

Name: 天和  ..上級者(16,424ポイント)   Date: 2010/01/13(水) 14:13   No:46106     
Title: Re:カレントディレクトリ内の検索    
>たかぎさん
perlをワンライナーで呼び出すって結構力技だったんですね
初めてやってる自分からするとかなり新鮮なかんじがしたんですが。
そして話し変えますけど、次、どうすればいいんでしょうか?
perl -ne "print if (/検索パターン/)" filename
だと文字は出してくれてもファイル名と行数は出してくれませんし・・・
(自分がPerlをワンライナーで呼び出すってことを勘違いしてるだけかもしれませんが)


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

Name: 天和  ..上級者(16,501ポイント)   Date: 2010/01/14(木) 12:30   No:46156 解決!     
Title: Re:カレントディレクトリ内の検索    
今日教授に聞いたところ正規表現のほうはスルーしてもいいみたいのなので
YAHOO知恵袋を参考に作りたいと思いますので解決とさせていただきます。
お手数とらせて申し訳ありません。
 編集済み


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



Name: YAMATO  ..ぴよぴよ(28ポイント)   Date: 2010/01/12(火) 23:50   No:46078       
Title: FFの戦闘シーンへのカットインみたいな処理    
FFやテイルズの戦闘シーンへのカットインみたいな処理で
現在表示されている画像がガラスが用に砕け散るエフェクトはどのように行っているのでしょうか
研究の為に何回も見ていたのですが毎回違った割れ方をしており
プログラムの書き方の見当がつきません・・・。


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


Name: Ma  ..プログラマー(28,233ポイント)   Date: 2010/01/13(水) 01:18   No:46080     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
環境を記載しましょう。

DXライブラリで、ですよね??

昔、似たようなスレがあったような気がします。
ただ、簡単ではなかったし、あまり高速な描画に向いていなかった気がしますが^^;

過去ログ紹介しようと思ったのですが、どうもみつからない・・・。


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

Name: Justy  ..伝説なるハッカー(493,858ポイント)   Date: 2010/01/13(水) 02:39   No:46093     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    

> 現在表示されている画像がガラスが用に砕け散るエフェクト

 一番簡単な方法は事前にある程度破片状に割ってある板の3Dモデルと割れるモーションを作って、
画面全体をテクスチャ化したものを貼り付けてあげればそんなかんじになりますね。
(必要なら光源とスペキュラも入れて)


 でも、望みのように毎回異なるようにしたいのなら、モデルだけ用意してモーションはソフト的に
つけた方がいいかも。
 その方が割れ始める位置、飛ばす強さ・方向・回転とか、ランダム性を入れたり自由にコントロール
できますし。

 割れる切れ目も毎回変えたいのなら、少し細かく割ったモデルにしておいて、ランダムで破片を
グループ化し、同じグループは1つの破片として動くように計算すればできるんじゃないでしょうか。

 面倒なら、切れ目を変えたモデルを複数用意してもいいですが。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,136,492ポイント)   Date: 2010/01/13(水) 18:24   No:46115     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
私も何回か作りました。
中でもFFX-2の戦闘シーンにはいるエフェクトが好きだったので

これを何度も見てなるべくそっくりになるように作った覚えがあります。
その時々で適切な計算をさせるのはなかなか難しいです。
Justyさんが仰るようにいくつかパターンを用意すると良いと思います。
多少複雑に割れさせればいくつかのパターンがあることは解らないと思います。



う、FLASHのタグが入らない・・。
この前いろいろお願いした時に反映されないように対策されちゃったんでしょうかね・・。


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

Name: 山崎  ..プログラマー(34,313ポイント)   Date: 2010/01/13(水) 22:01   No:46123     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
"似たようなスレ"の主はもしかしたら私でしょうかな?
私も探せませんでした・・・。^^;

な、なるほど・・・。
割るたびに動的に破片の形を決めたいと思っていたのですが、
細かく割ったモデルを用意して、それを組み合わせれば十分に動的に割ったと見せられそうですね・・・。
質問者じゃないですが、非常に参考になりました。

管理人さんが作った「割り方」は、
Justyさんのおっしゃるような、破片のモデルを準備するやり方でしょうか?
それとも、ランダムに割れ方が決まるタイプでしょうか?
もしよろしければお聞きしたいです。


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

Name: 山崎  ..プログラマー(34,359ポイント)   Date: 2010/01/13(水) 22:10   No:46124     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
探してきました。
これでしょうかな?

http://www.play21.jp/board/formz.cgi?action=res&resno=39676&page=&lognum=121&id=dixq&rln=39714


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,136,394ポイント)   Date: 2010/01/13(水) 22:13   No:46125     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
最初はランダムで作っていたのですが、パターンを作った方が断然楽だと思い、途中からパターンを作りました。
Justyさんの仰る破裂モデルタイプです。


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

Name: 山崎  ..プログラマー(34,435ポイント)   Date: 2010/01/13(水) 22:34   No:46128     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
管理人様
すばやいご返信誠にありがとうございます。
私も「破片モデル式」で再度チャレンジしてみようと思います。
・・・動的式はできなくて途中で頓挫していたので・・・。

質問者でもないのに途中から割って入って申し訳ないです・・・。


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

Name: YAMATO  ..ぴよぴよ(216ポイント)   Date: 2010/01/13(水) 23:14   No:46130     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
皆さんご回答ありがとうございます。
正直こんなにレスがつくとは思っていませんでした。

かなり難しそうですね・・・。
正直、言っている意味がよく理解できませんでした・・・。
こちらのサイトのおかげで最近シューティングが作れるようになってきていたので
調子に乗っておりました。申し訳ないです。

他にも皆様のお考えなどが御座いましたら
ご回答いただけますと助かります。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,136,944ポイント)   Date: 2010/01/13(水) 23:44   No:46134     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
あらら^^;
最近Cを学び始めたばかりだとするとちょっとハードルが高かったかも知れません。
まずはガラスのように難しい割れ方じゃなく、長方形とかに分割してバラバラにするところから始めてみてはいかがでしょうか?

例えば
http://dixq.net/sakuhin.html
こちらで紹介しているRPGのサンプルでは画面をいくつかの長方形に分割して戦闘に突入します。
ハッキリ言ってすごく演出はダサくなってしまっていますが、
その分プログラムは本当に簡単です。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N12
この関数を使えば好きな長方形に現在の描画先データから切り取ることが出来ます。
これで作った画像を好きなようにバラバラにすればいいのです。

まずは簡単なところからトライしてみてはいかがでしょう?

> 調子に乗っておりました。申し訳ないです。

欲張ってなんぼですよ!
私はいつも調子に乗ってます。何しろこのサイトはC言語の勉強を始めた年に作り始めたんですからね・・w
私のように調子に乗っても成長しない人はいますが、
臆病になってしまってはますます成長しないと思いますし、
常に色んなことに挑戦することはよいことだと思いますよ。


>>山崎さん

いえいえ、お気になさらず^^
少々他の話題が混ざったとしても色んな情報交換が出来た方が良いと思っています☆


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

Name: kazuoni [URL]  ..ハッカー(124,236ポイント)   Date: 2010/01/14(木) 00:56   No:46138     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
個人的に興味があるので参戦させてください。
動的に割る方法として以下のように考えてみました。

1、前提として直角二等辺三角形がある。
2、直角から斜辺に対し垂直線を引き、二つの直角二等辺三角形をつくる(分割する)。
3、2を行うかどうかは、重み付きランダムで決める。
(例えば、割れる中心からの距離で近ければ重みが強くなる→分割されやすくなる)
4、2、3を最大規定回数以下まで各三角形ごとに繰り返す。

画面の大きさが640*480の場合、正三角形(160*160)を12個でき、
それを向かい合う頂点同士を結んで直角二等辺三角形を2つ作ります。

これを繰り返していけば、形は直角二等辺三角形ですが、
大きさはかなりランダムになります(なりました)

が、問題なのは、やはり速度ですね。
実際、再帰版、繰り返し版両方作ってみましたが、
割る中心を1つなら、まぁ重みしだいですけどとりあえずできます。が、
銃弾で撃たれた画面のように数点中心を決めるとものすごいことになり、
FPS=60はまずできないです。。

また、これに、おのおのの三角形が3Dの回転で飛んでいくなんて・・・厳しいです。。
重みを軽くして、分割数を減らすと、比較的大きな二等辺三角形がきれいにできてしまい、
とてもガラスには見えません。

うーん。。如何したものか。。

> Justyさん

とりあえず破片2Dの画像ができたとして、それを回転させるとしたら
三角形各頂点を三次元で回転させるっということですよね?
(DirectXで表現するとすれば、)どのような方針で書けばよいのでしょうか?
ただ単に各三角形の重心を原点として、各頂点を随時三次元的に回転して、
出力(座標セット)すればよいのでしょうか?
とりあえず、裏面は真っ黒で。
(本来なら裏は画像が反転してると「それっぽい」かななんて思いますが)

Justyさんの書かれたことを考えると、
・質量
・重心
・回転量
・飛ぶ方向のベクトル
・各頂点座標
が破片情報で、
・風向
・風量
が必要ということですよね?(まだあるかも・・・)

・・・破片が多くてもこの方針で通用するでしょうか?^^;


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

Name: Justy  ..伝説なるハッカー(494,358ポイント)   Date: 2010/01/14(木) 03:20   No:46140     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    

> 各頂点を随時三次元的に回転して出力(座標セット)すればよいのでしょうか

 基本的にはそんな感じです。
 ただ、各破片の位置とか姿勢はその情報をライブラリに渡せば、HW/ライブラリ側で
各頂点を移動・回転してくれますので、事前に各破片ごとにローカル座標系での頂点情報を
用意しておいて、破片の移動に際し各破片が今どこにあってどう回転しているかだけを
計算すればいいです。



> 破片が多くてもこの方針で通用するでしょうか

 項目はお好みで、ってところです。
 どういう移動をするのかで変わっていますので。
 
 強いて挙げるなら重力を追加で(風で代用してもいいですけど)、質量は微妙ってところです。
 破片同士の衝突とかあれば必要ですけど、ガラスが割れてくくらいのエフェクトなら
要らない気がしますね。

 あとは計算負荷とか描画負荷と相談です。


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

Name: Ma  ..プログラマー(29,657ポイント)   Date: 2010/01/14(木) 06:01   No:46142     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
ちょっと時間があったので初挑戦でしたがサンプル作ってみました。
Justyさんのアイディアを基にしてみました。


http://masao.s5.pf-x.net/download2/glass.zip


が・・・、いろいろ問題が。。。
たとえば、回転の中心座標が破片の中心ではなく原点になってるところとか。←結構重要かも
あと、モデル作るの面倒ですね、これは・・・w

割れ方のパターンは一個しかありませんが、ここからさらに改良して破片のグループ化とかすれば(たぶん)何通りでも作れますとも。
(あれ、回転の中心座標が原点のおかげで、グループ化しても綺麗に回転してくれそう。)


ちょっと、これからグループ化とかに挑戦してみようと思いますお。




(追記)
矢印キーで移動、マウスでカメラ角度変更です。 編集済み


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

Name: Ma  ..プログラマー(29,731ポイント)   Date: 2010/01/14(木) 07:36   No:46144     
Title: Re:FFの戦闘シーンへのカットインみたいな処理    
余分な機能がいろいろついちゃいましたが、改良版できました。
前のよりはちょっとソースが読みやすくなっていると思います。

http://masao.s5.pf-x.net/download2/glass2.zip

UIで可変になっていうのは破片数のみです。(1から25個)
これ以上増やす場合は、mqoデータとソースをちょこっとだけいじらないといけません。

これ以外のパラメータはソースコードをいじる必要がありますが、簡単に改造できるようになってますので、
これだけでもパラメータいじりで結構遊べます。


追記
そういえば、 FFの戦闘シーンへのカットイン は知らないので的外れなことになってたらすいません。 編集済み


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +