C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   変数の計算がうまくい ....   
     ・[53916] たいちう 
     ・[53918] たいちう 
     ・[53920] ひよこ 
     ・[53970] たいちう 
     ・[53989] ひよこ 
     ・[53997] YuO 
     ・[54162] ひよこ 
     ・[54228] YuO 
     ・[54255] ひよこ 
   『独習C 第3版』の例 ....   
   スキップ機能   
     ・[54245] kazuoni 
     ・[54248] 深黒 
   三角関数で弾幕(2)   
     ・[54142] シエル 
     ・[54145] Ultimate 
     ・[54147] シエル 
     ・[54148] たいちう 
     ・[54157] Dixq (管理人) 
     ・[54215] Ultimate 
     ・[54216] fatens 
     ・[54218] softya 
     ・[54219] Ultimate 
     ・[54221] シエル 
     ・[54223] Ultimate 
     ・[54224] fatens 
     ・[54227] シエル 
     ・[54230] fatens 
     ・[54231] Ultimate 
     ・[54232] softya 
     ・[54236] Ultimate 
     ・[54237] fatens 
     ・[54238] シエル 
     ・[54239] fatens 
     ・[54241] シエル 
     ・[54242] Ultimate 
     ・[54244] fatens 
     ・[54247] Tatu 
   Visual Studio 2010 C ....   
     ・[54211] トントン 
     ・[54212] asdf 
     ・[54214] Ultimate 
     ・[54226] たいちう 
   フェード+効果音   
     ・[54169] Dixq (管理人) 
     ・[54202] 深黒 
     ・[54204] シエル 
     ・[54208] 深黒 
   横シューティングでの ....   
     ・[54031] シエル 
     ・[54089] Dixq (管理人) 
     ・[54101] PVM 
     ・[54102] Dixq (管理人) 
     ・[54104] TKOZ 
     ・[54135] TKOZ 
     ・[54137] TKOZ 
     ・[54189] PVM 
     ・[54196] PVM 
   実行ファイルの作り方   
     ・[54192] たかぎ 
     ・[54193] レイ 
     ・[54194] シエル 
   敵機を弧を描くように ....   
     ・[54158] たろう 
   プログラマの数学につ ....   
     ・[53857] たいちう 
     ・[53859] たろう 
     ・[53864] たかぎ 
     ・[53868] たいちう 
     ・[53869] たろう 
     ・[53877] たかぎ 
     ・[53879] たいちう 
     ・[53886] たろう 
     ・[53887] たかぎ 
     ・[53888] Dixq (管理人) 
     ・[53893] たかぎ 
     ・[53897] softya 
     ・[53900] ぽこ 
     ・[53910] シエル 
     ・[53944] しろ 
     ・[53952] たろう 
     ・[53969] たろう 
     ・[53975] softya 
     ・[53979] たろう 
     ・[53981] たろう 
     ・[53983] softya 
     ・[53984] たろう 
     ・[53990] たいちう 
     ・[53991] たかぎ 
     ・[53993] しろ 
     ・[53995] しろ 
     ・[54006] たろう 
     ・[54008] たいちう 
     ・[54009] 匿名 
     ・[54014] たろう 
     ・[54015] たかぎ 
     ・[54016] たいちう 
     ・[54020] たろう 
     ・[54021] たかぎ 
     ・[54022] たろう 
     ・[54023] たかぎ 
     ・[54024] たろう 
     ・[54025] たかぎ 
     ・[54026] たろう 
     ・[54027] たかぎ 
     ・[54029] たろう 
     ・[54033] たろう 
     ・[54035] ぽこ 
     ・[54037] toyo 
     ・[54039] たろう 
     ・[54042] ぽこ 
     ・[54043] 匿名 
     ・[54044] たろう 
     ・[54045] ぽこ 
     ・[54046] たろう 
     ・[54048] しろ 
     ・[54049] たかぎ 
     ・[54052] しろ 
     ・[54061] 匿名 
     ・[54064] たろう 
     ・[54070] たかぎ 
     ・[54072] たいちう 
     ・[54073] Dixq (管理人) 
     ・[54074] たかぎ 
     ・[54075] 匿名 
     ・[54076] Dixq (管理人) 
     ・[54077] たろう 
     ・[54078] たかぎ 
     ・[54079] たかぎ 
     ・[54080] たろう 
     ・[54082] たいちう 
     ・[54083] たろう 
     ・[54084] Dixq (管理人) 
     ・[54085] a 
     ・[54086] たかぎ 
     ・[54150] たろう 
   int型char型間の型変換 ....   
     ・[54112] y 
     ・[54113] たかぎ 
     ・[54114] やんち 
     ・[54115] hoge 
     ・[54121] 白い時空 
     ・[54124] box 
     ・[54125] 大学生 
     ・[54129] 白い時空 
     ・[54149] 大学生 
   三角関数   
     ・[53928] たかぎ 
     ・[53929] Ultimate 
     ・[53932] Ultimate 
     ・[53934] たかぎ 
     ・[53936] Ultimate 
     ・[53937] たかぎ 
     ・[53940] Dixq (管理人) 
     ・[53941] Ultimate 
     ・[53942] たかぎ 
     ・[53943] Ultimate 
     ・[53945] Dixq (管理人) 
     ・[53946] Ultimate 
     ・[53948] Ultimate 
     ・[53962] fatens 
     ・[53966] シエル 
     ・[53977] たいちう 
     ・[53988] Ultimate 
     ・[54056] Ultimate 
     ・[54058] MNS 
     ・[54059] Ultimate 
     ・[54136] Ultimate 
     ・[54141] Ultimate 
   グローバル変数とstat ....   
     ・[53964] fatens 
     ・[53965] シエル 
     ・[53967] 胡椒 
     ・[53968] fatens 
     ・[53972] シエル 
     ・[53974] 胡椒 
     ・[54116] hoge 
     ・[54120] シエル 
     ・[54131] dic 
   アセンブラできる方い ....   
     ・[53992] たかぎ 
     ・[53994] ookami 
     ・[53999] 寅之助 
     ・[54000] たかぎ 
     ・[54001] 寅之助 
     ・[54002] たかぎ 
     ・[54018] Dixq (管理人) 
     ・[54032] 寅之助 
     ・[54034] YuO 
     ・[54038] ookami 
     ・[54040] たかぎ 
     ・[54093] 寅之助 
     ・[54095] toyo 
     ・[54110] hoge 
     ・[54118] 寅之助 
     ・[54119] たかぎ 
     ・[54122] softya 
   フォルダ内のソースを ....   
     ・[54108] たかぎ 
     ・[54117] M.N 
   巡回セールスマン問題 ....   
     ・[54091] Mr. Wing 
     ・[54092] Mr. Wing 
     ・[54094] Mr. Wing 
     ・[54096] たいちう 
     ・[54097] Mr. Wing 
     ・[54098] たいちう 
     ・[54106] Mr. Wing 
     ・[54111] たいちう 
   龍神録の13章について   
     ・[54053] yu 
     ・[54055] シエル 
     ・[54057] yu 
     ・[54060] シエル 
     ・[54062] yu 
     ・[54065] Dixq (管理人) 
     ・[54071] Dixq (管理人) 
     ・[54100] シエル 
     ・[54103] Dixq (管理人) 
     ・[54105] シエル 
   DXライブラリの ClsDr ....   
     ・[54066] つうこうにん 
     ・[54067] kazuoni 
     ・[54068] ムンバ 
     ・[54069] ムンバ 
   コンビネーション   
     ・[54007] たいちう 
     ・[54011] ねここんぶ 
     ・[54012] たいちう 
     ・[54013] ねここんぶ 
   Box2Dに関してPart2   
     ・[53750] るー 
     ・[53757] Justy 
     ・[53780] るー 
     ・[53801] Justy 
     ・[53876] るー 
     ・[53892] Justy 
     ・[53899] るー 
     ・[53902] Justy 
     ・[54005] るー 
   DirectXのおススメサイ ....   
     ・[53931] Tororo 
     ・[54004] はね 
   敵に玉が当たった後の ....   
     ・[53963] シエル 
   C言語初心者です。   
     ・[53950] MNS 
     ・[53951] naka 
     ・[53953] ぽこ 
     ・[53954] ぽこ 
     ・[53955] MNS 
     ・[53956] naka 
     ・[53958] naka 
     ・[53959] box 
   用語・関数の質問(龍神 ....   
     ・[53852] toyo 
     ・[53855] シエル 
     ・[53863] 匿名 
     ・[53865] シエル 
     ・[53866] たかぎ 
     ・[53870] 匿名 
     ・[53873] Dixq (管理人) 
     ・[53878] たかぎ 
     ・[53889] dic 
     ・[53890] toyo 
     ・[53896] softya 
     ・[53904] Ultimate 
     ・[53905] softya 
     ・[53906] たかぎ 
     ・[53907] シエル 
     ・[53909] たかぎ 
     ・[53911] シエル 
     ・[53912] たかぎ 
     ・[53914] Ultimate 
     ・[53915] Ultimate 
     ・[53922] dic 
     ・[53923] Ultimate 
     ・[53925] たかぎ 
     ・[53927] Dixq (管理人) 
     ・[53930] Ultimate 
   『独習C 第3版』 の ....   
     ・[53919] たいちう 
     ・[53926] さくら 
   息抜きに遊んでいたら   
     ・[53903] ぽこ 
   双方向リストのソート ....   
     ・[53894] たかぎ 
     ・[53895] 夏ミカン 
     ・[53898] たいちう 
   指定した行に値を書き ....   
     ・[53732] たいちう 
     ・[53733] 通りすがり 
     ・[53736] シオン 
     ・[53737] シオン 
     ・[53743] シオン 
     ・[53747] Ma 
     ・[53849] シオン 
     ・[53853] mila 
     ・[53885] バグ 
     ・[537301276442638] Justy 
   3Dと2Dについて   
     ・[53867] たかぎ 
     ・[53871] たいちう 
     ・[53872] たろう 
     ・[53874] たろう 
     ・[53880] たかぎ 
     ・[53884] たろう 
   エラー(龍神録の「まず ....   
     ・[53692] softya 
     ・[53709] Ultimate 
     ・[53721] fatens 
     ・[53789] Ultimate 
     ・[53790] シエル 
     ・[53793] ムンバ 
     ・[53811] Dixq (管理人) 
     ・[53817] Ultimate 
     ・[53821] ムンバ 
     ・[53822] Ultimate 
     ・[53834] Ultimate 
     ・[53850] Ultimate 
   完全初心者です。   
     ・[53840] シエル 
     ・[53842] たかぎ 
   ■ Dixqの黒歴史に残る ....   
     ・[53704] ぽこ 
     ・[53705] Tororo 
     ・[53706] 御津凪 
     ・[53713] あ〜る 
     ・[53722] Tatu 
     ・[53734] dic 
     ・[53738] array 
     ・[53748] Ma 
     ・[53778] 霧蘭 
     ・[53782] sn 
     ・[53784] asd 
     ・[53805] Dixq (管理人) 
     ・[53833] ひよこ 
     ・[53836] Dixq (管理人) 
   スコアを残す   
     ・[53770] ideyan 
     ・[53771] あ〜る 
     ・[53772] シエル 
     ・[53791] 匿名 
     ・[53795] dic 
     ・[53830] jay 

Name: ひよこ  ..比類無きプログラマー(85,747ポイント)   Date: 2010/06/10(木) 17:44   No:53913       
Title: 変数の計算がうまくいきません。    
私は今、小数第3位までを文字列から取り出すプログラムを書いているのですが
下の関数で

//小数点第三桁までdoubleのポインタに代入
void atof(double *Double,const char *String){
    int i,s,num;//num :整数を入れる
    char one,two,three;//Stringの.の後3ケタを入れるバッファ
    int one_num,two_num,three_num;//小数第1位、小数第2位、小数第3位の値
    one_num=0;two_num=0;three_num=0;
    for(i=0;i<String[i]!='\0';i++){
        if(String[i]=='.'){
            for(s=i+1;String[s]!='\0';s++){
                if(s-i==1){
                    one=String[s];
                    one_num=atoi(&one);
                }
                if(s-i==2){
                    two=String[s];
                    two_num=atoi(&two);
                }
                if(s-i==3){
                    three=String[s];
                    three_num=atoi(&three);
                }
            }
        }    
    }
    if(Double!=NULL){
        num=atoi(String);
        *Double=num+(one_num*0.1+two_num*0.01+three_num*0.001);        
    }
}
double a;
    
atof(&a,"1.1\0");とすると、aには1.1000000000000001と謎の1が入ってしまうのですが
どうすればいいでしょうか?
VC++EE2008 Vistaです。お願いいたします。


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


Name: たいちう  ..比類無きプログラマー(93,447ポイント)   Date: 2010/06/10(木) 18:12   No:53916     
Title: Re:変数の計算がうまくいきません。    
> どうすればいいでしょうか?

有限の桁数で小数を扱うため誤差は付き物です。
関数から受け取った値をうまく使えばよいでしょう。


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

Name: たいちう  ..比類無きプログラマー(93,484ポイント)   Date: 2010/06/10(木) 18:15   No:53918     
Title: Re:変数の計算がうまくいきません。    
ちょっと補足

double a = 1.1;

この代入の結果はどうなりますか?
謎の1が入りますか?
原理的に誤差は付いて回るものと思ってください。


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

Name: ひよこ  ..比類無きプログラマー(85,783ポイント)   Date: 2010/06/10(木) 18:23   No:53920     
Title: Re:変数の計算がうまくいきません。    
double a = 1.1; 
>>この計算は謎の1が入りました。
これは計算の誤差ということですか。わかりました。

原理的にというと、どういう原理でしょうか?


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

Name: たいちう  ..比類無きプログラマー(93,560ポイント)   Date: 2010/06/11(金) 00:08   No:53970     
Title: Re:変数の計算がうまくいきません。    
1/3を10進数で表そうとすると、小数点以下何桁で四捨五入しても
正確な値を表現できません。

1.1をコンピュータが一般的に使う2進数で表そうとすると、
小数点以下何桁で四捨五入しても正確な値を表現できません。
(本当は四捨五入でなく、切り捨てか切り上げですが)


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

Name: ひよこ  ..比類無きプログラマー(85,918ポイント)   Date: 2010/06/11(金) 06:15   No:53989 解決!     
Title: Re:変数の計算がうまくいきません。    
なるほど、つまり小数は2進数では計算しきれないことですね。
わかりました。たいちうさん、詳しい説明ありがとうございました。


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

Name: YuO  ..熟練のプログラマー(46,136ポイント)   Date: 2010/06/11(金) 10:21   No:53997     
Title: Re:変数の計算がうまくいきません。    
> つまり小数は2進数では計算しきれないことですね。

10進数で表せる小数の中に,2進数で表せない物がある,というだけです。
具体的に書くならば,Σkn2-n (ただしknは0または1, nは正整数) という形で書き表せるものは,
10進数でも2進数でも小数として正確に書き表せます。
e.g.) 0.5(10) = 0.1(2), 0.375(10) = 0.011(2)


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

Name: ひよこ  ..比類無きプログラマー(85,994ポイント)   Date: 2010/06/12(土) 23:29   No:54162     
Title: Re:変数の計算がうまくいきません。    
YuOさん補足ありがとうございます。
数式まで書いてくださりありがとうございます。
しかし、数式はよくわかりませんでしたが、
2の-n乗なら10進数でも2進数でも表せるという見方でよろしいでしょうか?


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

Name: YuO  ..熟練のプログラマー(46,686ポイント)   Date: 2010/06/13(日) 17:09   No:54228     
Title: Re:変数の計算がうまくいきません。    
> 2の-n乗なら10進数でも2進数でも表せるという見方でよろしいでしょうか?

2の-n乗ではなく,2の-n乗の和という形で表せるのであれば,2進数でも10進数でも表すことができます。
# -nにしたのは,小数部だけを取り出すため。


Name: ひよこ  ..比類無きプログラマー(86,044ポイント)   Date: 2010/06/13(日) 21:41   No:54255     
Title: Re:変数の計算がうまくいきません。    
2の-n乗の和ならできるのですか。わかりました。
Yuoさんありがとうございました。


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



Name: さくら  ..かけだし(1,616ポイント)   Date: 2010/06/13(日) 20:51   No:54251       
Title: 『独習C 第3版』の例の実行結果がおかしいのですが    
『独習C 第3版』に↓のような例がありますが、実行結果がおかしいです
原因が分かりませんので、教えて下さい
―――――――――――――――――――――――――――――――――
●プログラムコード
/* qが入力されるまでループする */

#include<stdio.h>
#include<conio.h>

int main(void)
{
    char ch;

    ch = getche();

    while(ch != 'q') ch = getche();

    printf("qが入力されました");

    return 0;
}

―――――――――――――――――――――――――――――――
●実行結果

      qが入力されました
h:\C_prog\chapter03\3.04>
    e
   d
  c
hb\C_prog\chapter03\3.04>ex01
a


このように変に入力されてしまいます
ちょっと見辛いので、「a,b,c,q」と入力した場合↓のようになってしまいます

   q
  c
 b
a


勉強始めたばかりで何が悪いのかわかりません
よろしくお願いします


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




Name: 深黒  ..入門者(3,566ポイント)   Date: 2010/06/13(日) 17:35   No:54235       
Title: スキップ機能    
よくゲームで、ENTERやCTRLキーを押しっぱなしにしてるとスキップ機能(ゲームの進行速度を早くする)が使える物がありますが、
DXライブラリで、これをやることは出来ますか?
可能なら、やり方を教えて欲しいです。


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


Name: kazuoni [URL]  ..ハッカー(143,021ポイント)   Date: 2010/06/13(日) 18:44   No:54245     
Title: Re:スキップ機能    
恐らくそれはDXライブラリでどうこうというよりは、
そのように出来るように自分で実装する必要があるかと思います。

例えば、ノベル系ゲームで、特定キーを押している間は、文字の速度を変えたい場合、
5(word/s)→10(word/s)とするだけで、表示する文字の速度は変わります。

ダンジョンRPGで、特定キーを押している間は、キャラクターの歩く速度を変えたい場合、
歩いてるときに

++座標;

となっているならば、

座標 += 2;

とすれば、早く歩いてるように見えます。

要するに、速度を管理している物を変えるだけです。
簡単に書けばこんな感じですが、すべてがこれで解決するとは思えません。
もう少し具体的な質問のほうが、より有益な回答が得られるかと思います。


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

Name: 深黒  ..入門者(3,618ポイント)   Date: 2010/06/13(日) 18:52   No:54248 解決!     
Title: Re:スキップ機能    
返信ありがとうございます。
作成してるゲームの使用上難しい気がしますが、自力で実装できるように頑張ってみたいと思います。


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



Name: Ultimate  ..入門者(4,915ポイント)   Date: 2010/06/12(土) 21:47   No:54140       
Title: 三角関数で弾幕(2)    
math.hでsinとcosが出せることがわかりました。

苦しんで覚えるC言語で調べてみたら、

「[  sin  ]
関数型 : double sin(double x);
引数  : ラジアン単位の角度
戻り値 : サイン値
機能  : サインを計算する」

「[  cos  ]
関数型 : double cos(double x);
引数  : ラジアン単位の角度
戻り値 : コサイン値
機能  : コサインを計算する」

となっていたのですが、これをうまく利用すれば全方向ショットが再現できるようです。

http://sinkai.net/rp/4.php

カッコ内のdouble xはラジアンですよね?

ということは、角度×3.141592/180の値がdouble xですよね?

これからの参考に、cos,sinを利用した簡単なプログラムを載せていただけませんか?(探してみましたが、あまりはっきりとわからなかったので)

あと、これを利用して円を一定の角度ごとに円周上に(表現がわかりにくくてすみません)表示できたら、そのsinとcosの値を順に10倍,20倍,30倍・・・としていけば全方向ショットができますか?(こちらも表現がわかりにくくてすみません。)

よろしくお願いします。


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


Name: シエル  ..入門者(3,768ポイント)   Date: 2010/06/12(土) 21:52   No:54142     
Title: Re:三角関数で弾幕(2)    
下記のページを参考にしてみてはどうでしょう?
http://dixq.net/s/26.html


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

Name: Ultimate  ..初心者(5,200ポイント)   Date: 2010/06/12(土) 22:00   No:54145     
Title: Re:三角関数で弾幕(2)    
atan2関数は初めて知りました。

http://www.orchid.co.jp/computer/cschool/CREF/atan2.html

「斜辺 * cosでx座標が、斜辺 * sinでy座標が求まります。斜辺はPATTERN1SPEEDでしたね。この値を座標に増やします。」



sinとcosの値を順に10 倍,20倍,30倍・・・としていけば全方向ショットができますか?

で予想が当たっていたことがわかりました。(つまり、斜辺を10倍・・・ということなので)

全方向ショットはそのページのアルゴリズムからラジアンを2.0ずつ引く操作を抜いた感じでしょうか?

それであっていて、あとは自分でやってできるようであればこれは解決にしたいと思います。


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

Name: シエル  ..入門者(3,813ポイント)   Date: 2010/06/12(土) 22:06   No:54147     
Title: Re:三角関数で弾幕(2)    
あまり質問内容がよくわかりませんが、全方向ショットであれば
下記のページをごらん下さい。
http://dixq.net/s/27.html


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

Name: たいちう  ..比類無きプログラマー(94,624ポイント)   Date: 2010/06/12(土) 22:07   No:54148     
Title: Re:三角関数で弾幕(2)    
提案なんですが、三角関数を使わずに上下左右の4方向に
弾を撃つプログラムを書いてみてはどうでしょうか?
これが1段階目。

これは90度ずつ全方向に弾を撃つことと同じですので、
一段階目のプログラムを三角関数を使ったものに書き換えることができます。
これが2段階目。

最終段階は簡単で、90度ずつに弾を撃っていたのを
20度ずつに変更するだけです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,209,560ポイント)   Date: 2010/06/12(土) 22:50   No:54157     
Title: Re:三角関数で弾幕(2)    
シエルさん、シューティングプログラミングの館は見ている人が少なくなり次第削除しようと思っている所なので、申し訳ないですがなるべくリンクを張らないで頂けると幸いです。
早い所龍神録プログラミングの館の方に移行して、古い方は削除したいのですが、
要望があって現在残している状態です。

せっかく回答して下さっているところごめんなさい。


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

Name: Ultimate  ..初心者(5,964ポイント)   Date: 2010/06/13(日) 15:55   No:54215     
Title: Re:三角関数で弾幕(2)    
#include "DxLib.h"
#include <math.h>

#define π 3.14159265358979323846264338327950288419
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
 
        //ボール構造体
        typedef struct{
                int flag,x[20],y[20],z;
                double angle[20];
        }ch_t;

        ch_t ball;

        ball.z=3;

        //変数作成
        int i;
        char key[256];
        int White=GetColor(255,255,255);

        //全方向ショットフラグ初期化
        
        ball.flag=0;

        //while突入

        SetDrawScreen(DX_SCREEN_BACK);

        while(1){
                if(ProcessMessage()==-1){
                        break;
                }
                ClearDrawScreen();
                GetHitKeyStateAll(key);

                //Xで発射フラグを立てる
                if(key[KEY_INPUT_X]){
                        ball.flag=1;
                }


                //角度決定
                
                for(i=0;i<20;i++){
                        ball.angle[i]=(18*i)*π/180;
                }
                for(i=0;i<20;i++){
                    ball.x[i]=sin(ball.angle[i])+320;
                    ball.y[i]=cos(ball.angle[i])+240;
                }

                //描画
                while(ball.flag==1){
                    if(ProcessMessage()==-1){
                        break;
                    }
                    for(i=0;i<20;i++){
                        DrawCircle(ball.x[i],ball.y[i],ball.z,White,TRUE);
                    }
                    

                    ScreenFlip();
                }

                
        
        }


 
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用) 
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

全方向ショットを目指して、上のようにsin,cosを調べるところまでは成功しました。

ボールの数は20個、角度は18度ずつで画面中心から広がるようにしたいです。

Xを押して画面中央に表示はできました。

その後このボールが広がっていくようにするにはどうしたらいいでしょうか?


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

Name: fatens  ..中級者(12,127ポイント)   Date: 2010/06/13(日) 16:08   No:54216     
Title: Re:三角関数で弾幕(2)    
まず、ch_tのxなどを配列にするのではなく、ballを配列にすべきだと思います。
それから、πもPIとでもしておくほうが無難ではないでしょうか。

x, y座標の初期値を320, 240とし、それにcos, sin×速さを毎回足していけば広がります。
ですが、そのまえにもう一度三角関数について確認しておかないと後で困ります。
 編集済み


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

Name: softya [URL]  ..ハッカー(180,386ポイント)   Date: 2010/06/13(日) 16:13   No:54218     
Title: Re:三角関数で弾幕(2)    
sinとcosは0〜1の間の値しか取らないので、移動距離を掛け算してやる必要があります。
あとは、フレーム毎に距離を加算するだけです。

double kyori = 0;

                for(i=0;i<20;i++){
                    ball.x[i]=sin(ball.angle[i])*kyori+320;
                    ball.y[i]=cos(ball.angle[i])*kyori+240;
                }

                //移動する。
                kyori+=1.0;



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

Name: Ultimate  ..初心者(6,947ポイント)   Date: 2010/06/13(日) 16:26   No:54219     
Title: Re:三角関数で弾幕(2)    
ありがとうございました。

下のように変更をしました。

しかし、ball.angleは0度〜360度までをつくったはずなのに、方向が下だけです。

目標は今の下1方向から360度20方向にしたいです。

何が原因で方向が下だけになってしまっているのでしょうか?

#include "DxLib.h"
#include <math.h>

#define PI 3.14159265358979323846264338327950288419
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
 
        //ボール構造体
        typedef struct{
                int flag,x[20],y[20],z;
                double angle[20];
        }ch_t;

        ch_t ball;

        ball.z=3;

        //変数作成
        int i,j;
        char key[256];
        int White=GetColor(255,255,255);
        double kyori = 0; 

        //全方向ショットフラグ初期化
        
        ball.flag=0;

        //while突入

        SetDrawScreen(DX_SCREEN_BACK);

        while(1){
                if(ProcessMessage()==-1){
                        break;
                }
                ClearDrawScreen();
                GetHitKeyStateAll(key);

                //Xで発射フラグを立てる
                if(key[KEY_INPUT_X]){
                        ball.flag=1;
                }

                

                //角度決定
                
                for(i=0;i<20;i++){
                        ball.angle[i]=(18*i)*PI/180;
                }
                

                //描画
                while(ball.flag==1){
                    if(ProcessMessage()==-1){
                        break;
                    }
                    ClearDrawScreen();
                    for(i=0;i<20;i++){
                        DrawCircle(ball.x[i],ball.y[i],ball.z,White,TRUE);

                    

                for(i=0;i<20;i++){ 
                    ball.x[i]=sin(ball.angle[i])*kyori+320; 
                    ball.y[i]=cos(ball.angle[i])*kyori+240; 
                } 

                //移動する。 
                kyori+=5.0;
                    }
                    

                    ScreenFlip();
                }

                
        
        }


 
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用) 
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}


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

Name: シエル  ..初心者(5,112ポイント)   Date: 2010/06/13(日) 16:29   No:54221     
Title: Re:三角関数で弾幕(2)    
すいません。下のコードは何を説明しているものなのか具体的に説明していただけますか?

 for(i=0;i<20;i++){  
                    ball.x[i]=sin(ball.angle[i])*kyori+320;  
                    ball.y[i]=cos(ball.angle[i])*kyori+240;  
                }  


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

Name: Ultimate  ..初心者(7,004ポイント)   Date: 2010/06/13(日) 16:33   No:54223     
Title: Re:三角関数で弾幕(2)    
先ほど、回答をいただき追加したものです。

内容は、三角関数で出たものは、斜辺が1なので、sin,cosともに0〜1です。

なので、その斜辺をkyoriと置いてkyoriを2倍3倍にしてsin,cosを大きくしていくというものです。


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

Name: fatens  ..中級者(12,308ポイント)   Date: 2010/06/13(日) 16:44   No:54224     
Title: Re:三角関数で弾幕(2)    
http://w3e.kanazawa-it.ac.jp/math/category/sankakukansuu/henkan.cgi?target=/math/category/sankakukansuu/tani-enn.html
↑のサイトをよく見てください。
私が先に書いたこと、(おそらくシエルさんの意味していることも)が分かるかと思います。


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

Name: シエル  ..初心者(5,999ポイント)   Date: 2010/06/13(日) 16:56   No:54227     
Title: Re:三角関数で弾幕(2)    
ちょっと直してみました。Ultimateさんがイメージしてるのはこんな感じですか?
もしイメージどおりなら、私が貼ったコードと、fatensさんが記載して頂いているURLを熟読のうえ、
わからないところがあれば質問して下さい。

#include "DxLib.h" 
#include <math.h> 

#define PI 3.14159265358979323846264338327950288419
#define BALL_SPEED 4

  
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了  
  
        //ボール構造体 
        typedef struct{ 
                int flag,x[20],y[20],z; 
                double angle[20]; 
        }ch_t; 

        ch_t ball; 

        ball.z=3; 

        //変数作成 
        int i,j; 
        char key[256]; 
        int White=GetColor(255,255,255); 
        double kyori = 0;  

        //全方向ショットフラグ初期化 
         
        ball.flag=0; 

        //while突入 

        SetDrawScreen(DX_SCREEN_BACK); 

        while(1){ 
                if(ProcessMessage()==-1){ 
                        break; 
                } 
                ClearDrawScreen(); 
                GetHitKeyStateAll(key); 

                //Xで発射フラグを立てる 
                if(key[KEY_INPUT_X]){ 
                        ball.flag=1; 
                } 

                 

                //角度決定 
                 
                for(i=0;i<20;i++){ 
                        ball.angle[i]=(18*i)*PI/180; 
                }

                for(i=0;i<20;i++){
                    ball.x[i]=320;
                    ball.y[i]=240;
                }

                 

                //描画 
                while(ball.flag==1){ 
                    if(ProcessMessage()==-1){ 
                        break; 
                    } 
                    ClearDrawScreen(); 
                    for(i=0;i<20;i++){  
                    ball.x[i]+=sin(ball.angle[i])*BALL_SPEED;  
                    ball.y[i]+=cos(ball.angle[i])*BALL_SPEED;  
                    }  

                    for(i=0;i<20;i++){ 
                        DrawCircle(ball.x[i],ball.y[i],ball.z,White,TRUE); 
                    }

                    
                     
                    Sleep(17);

                    ScreenFlip(); 
                }

                 
         
        } 


  
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用)  
        DxLib_End() ;           // DXライブラリ使用の終了処理 
        return 0 ;              // ソフトの終了 
}


追記:
Ulitamteさんが作成したコードはかなり不要なところでループがあったりしてたので、
色々直しています。
一度コード全体を見直すことをお勧めします。 編集済み


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

Name: fatens  ..中級者(12,370ポイント)   Date: 2010/06/13(日) 17:21   No:54230     
Title: Re:三角関数で弾幕(2)    
typedef struct{ 
    int flag,x[20],y[20],z; 
    double angle[20]; 
}ch_t;

これのx, yがint型なのはまずいですね。


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

Name: Ultimate  ..初心者(6,950ポイント)   Date: 2010/06/13(日) 17:21   No:54231     
Title: Re:三角関数で弾幕(2)    
とても丁寧にありがとうございます。

目標はhttp://sinkai.net/rp/4.phpです。

出来れば円が同一円周上に表示したいです。

fatensさんのURLも読んで、その内容を理解し、ソースの内容もわかりました。

今まではball.xなどをそのまま変えてしまっていましたが、これはball.xなどに数を追加していくということですね。


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

Name: softya [URL]  ..ハッカー(180,550ポイント)   Date: 2010/06/13(日) 17:24   No:54232     
Title: Re:三角関数で弾幕(2)    
私のも説明不足だったので貼っておきます。
2つ目のループはまずいので排除しました。

include "DxLib.h"
#include <math.h>

#define π 3.14159265358979323846264338327950288419
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
 
        //ボール構造体
        typedef struct{
                int flag,x[20],y[20],z;
                double angle[20];
        }ch_t;

        ch_t ball;

        ball.z=3;

        //変数作成
        int i;
        char key[256];
        int White=GetColor(255,255,255);
        double kyori = 0;

        //全方向ショットフラグ初期化
        
        ball.flag=0;

        //while突入

        SetDrawScreen(DX_SCREEN_BACK);

        while(1){
                if(ProcessMessage()==-1){
                        break;
                }
                ClearDrawScreen();
                GetHitKeyStateAll(key);

                //Xで発射フラグを立てる
                if(key[KEY_INPUT_X]){
                        ball.flag=1;
                }


                //角度決定
                
                for(i=0;i<20;i++){
                        ball.angle[i]=(18*i)*π/180;
                }
                for(i=0;i<20;i++){
                    ball.x[i]=sin(ball.angle[i])*kyori+320;
                    ball.y[i]=cos(ball.angle[i])*kyori+240;
                }

                
                //描画
               for(i=0;i<20;i++){
                 DrawCircle(ball.x[i],ball.y[i],ball.z,White,TRUE);
                }

                if( ball.flag == 1 ) {
                    kyori += 1.0;
                }

                ScreenFlip();
        }


 
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用) 
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了


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

Name: Ultimate  ..初心者(6,991ポイント)   Date: 2010/06/13(日) 17:40   No:54236 解決!     
Title: Re:三角関数で弾幕(2)    
これです。

これを目指していました。

intだったから少数が表現できていなかったのですね。

疑問が解決しました。

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


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

Name: fatens  ..中級者(12,862ポイント)   Date: 2010/06/13(日) 17:43   No:54237     
Title: Re:三角関数で弾幕(2)    
>fatensさんのURLも読んで、その内容を理解し、ソースの内容もわかりました。

Ultimateさんのコードではsinとcosが逆になっていることを伝えたかったのですが、
それを理解されたということでよろしいでしょうか?

まあ、解決されたようなので、私のコードも貼っておきます。
何かの参考になれば良いのですが。

#include "DxLib.h"
#include <math.h>

//度をラジアンに変換
inline float degToRad(float deg)
{
    return deg * 3.1415926535f / 180;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    ChangeWindowMode(TRUE);

    if (DxLib_Init()) return 1;
    if (SetDrawScreen(DX_SCREEN_BACK)) return 1;

    //ボールの構造体
    const int ballMax = 256;
    struct {
        float x, y;
        float ang, spd;
        int flag;
    } ball[ballMax] = {0};

    //ボールの初期化(20発, 円形)
    for (int i = 0; i < 20; ++i) {
        ball[i].x = 320;
        ball[i].y = 240;
        ball[i].ang = 360.0f / 20 * i;
        ball[i].spd = 5.0f;
        ball[i].flag = 1;
    }

    while (!ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE)) {
        ClearDrawScreen();

        //ボールの移動
        for (int i = 0; i < ballMax; ++i) {
            if (ball[i].flag == 0)
                continue;
            ball[i].x += cos(degToRad(ball[i].ang)) * ball[i].spd;
            ball[i].y += sin(degToRad(ball[i].ang)) * ball[i].spd;
        }

        //ボールの描画
        for (int i = 0; i < ballMax; ++i) {
            if (ball[i].flag == 0)
                continue;
            DrawCircle(ball[i].x, ball[i].y, 3, GetColor(255, 255, 255));
        }

        ScreenFlip();
    }

    DxLib_End();

    return 0;
}




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

Name: シエル  ..初心者(7,140ポイント)   Date: 2010/06/13(日) 17:57   No:54238     
Title: Re:三角関数で弾幕(2)    
>intだったから少数が表現できていなかったのですね。
softyaさんの回答に対して、この返答は理解できているのか疑ってしまいますが大丈夫でしょうか?
softyaさんのコードはまだint型ですよ。

あと、softyaさんが貼っていただいているコードと私のコードとは少し方法が違います。
先ほどの私のコードはx,yをdouble型にしていなかったので、きれいに弾が広がってませんでした。
下記にdouble型に修正して、きれいに広がるようになった私のコードを一応記載しておきます。
しっかり違いを理解しておいたほうがいいですよ。


#include "DxLib.h" 
#include <math.h> 

#define π 3.14159265358979323846264338327950288419 
#define BALL_SPEED 4.0f
  
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了  
  
        //ボール構造体 
        typedef struct{ 
                int flag;
                double x[20],y[20],z; 
                double angle[20]; 
        }ch_t; 

        ch_t ball; 

        ball.z=3; 

        //変数作成 
        int i; 
        char key[256]; 
        int White=GetColor(255,255,255); 
        double kyori = 0; 

        //全方向ショットフラグ初期化 
         
        ball.flag=0; 

        //while突入 

        SetDrawScreen(DX_SCREEN_BACK); 

        for(i=0;i<20;i++){ 
           ball.x[i]=320; 
           ball.y[i]=240; 
        }

        while(1){ 
                if(ProcessMessage()==-1){ 
                        break; 
                } 
                ClearDrawScreen(); 
                GetHitKeyStateAll(key); 

                //Xで発射フラグを立てる 
                if(key[KEY_INPUT_X]){ 
                        ball.flag=1; 
                } 


                //角度決定 
                if(ball.flag==1){
                 
                for(i=0;i<20;i++){ 
                        ball.angle[i]=(18*i)*π/180; 
                } 
                for(i=0;i<20;i++){ 
                    ball.x[i]+=sin(ball.angle[i])*BALL_SPEED; 
                    ball.y[i]+=cos(ball.angle[i])*BALL_SPEED; 
                } 

                //描画 
               for(i=0;i<20;i++){ 
                 DrawCircle(ball.x[i],ball.y[i],ball.z,White,TRUE); 
                } 

                }
                ScreenFlip(); 
        } 


  
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用)  
        DxLib_End() ;           // DXライブラリ使用の終了処理 
        return 0 ;              // ソフトの終了 


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

Name: fatens  ..中級者(12,927ポイント)   Date: 2010/06/13(日) 18:00   No:54239     
Title: Re:三角関数で弾幕(2)    
>softyaさんの回答に対して、この返答は理解できているのか疑ってしまいますが大丈夫でしょうか? 

おそらくNo:54230の私の回答に対してかと。


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

Name: シエル  ..初心者(7,169ポイント)   Date: 2010/06/13(日) 18:08   No:54241     
Title: Re:三角関数で弾幕(2)    
>おそらくNo:54230の私の回答に対してかと。
で、ですよね〜。。つい微妙な返答だったもんで。。。 編集済み


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

Name: Ultimate  ..初心者(7,092ポイント)   Date: 2010/06/13(日) 18:08   No:54242 解決!     
Title: Re:三角関数で弾幕(2)    
はい、わかりました。

さきほどfatensさんに貼り付けていただいたURLを見て、間違えているのに気がつきました。

X座標がcosでY座標がsinでしたね。

逆で覚えていました。

あと、そのソースでは、勝手に弾が発射されてしまうので、少し改造してみます。

いろいろと難しいですが、いくつか読み落としがあったので、もう一度一通りソースを読み直します。
 編集済み


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

Name: fatens  ..中級者(13,100ポイント)   Date: 2010/06/13(日) 18:40   No:54244     
Title: Re:三角関数で弾幕(2)    
>あと、そのソースでは、勝手に弾が発射されてしまうので、少し改造してみます。 

そうですね。
あくまで私ならこうする、という形のサンプルですので、キー入力を必要とはしていません。

人のコードを読むのは勉強になると思うので、がんばって改造してみてください。
私のコードが良いかどうかは知りませんが...

もしわからない部分があれば遠慮なく質問してください。


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

Name: Tatu  ..プログラマー(38,714ポイント)   Date: 2010/06/13(日) 18:51   No:54247     
Title: Re:三角関数で弾幕(2)    
プログラムを書いてみました。

#include "DxLib.h"
#include <math.h>

#define PI  3.14159265358979
#define PI2 PI*2
//円周率の二倍は360度に等しく、よく使うと考えられるのでここで定義してしまう

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return -1;

    typedef struct{
        int flag;
        double x,y;
        double spd,angle;
    }ch_t;

    ch_t ball[20];
    //今後メンバ変数を追加するたびに[20]をつけるのが嫌なのでこうする。
    //また、自機などにもch_tを使用すると考えられるが
    //自機に20個の座標は明らかに不要。

    char key[256];
    int White=GetColor(255,255,255);

    for(int i=0;i<20;i++){
        ball[i].flag=0;
        ball[i].x=0;
        ball[i].y=0;
        ball[i].spd=0;
        ball[i].angle=0;
    }

    SetDrawScreen(DX_SCREEN_BACK);

    while(1){
        if(ProcessMessage()==-1){
            break;
        }
        ClearDrawScreen();
        GetHitKeyStateAll(key);

        //エスケープキーを押すことで終了できるようにする
        if(key[KEY_INPUT_ESCAPE]){
            break;
        }

        //弾のフラグをオンにする。
        //このとき弾の情報を一緒に入れておくことにより
        //毎ループ中央の座標が弾の座標として代入されることがなくなる
        //なお、単位円の円周はPIではなくPI2である。
        if(key[KEY_INPUT_X]){
            for(int i=0;i<20;i++){
                ball[i].flag=1;
                ball[i].x=320;
                ball[i].y=240;
                ball[i].spd=4;
                ball[i].angle=i*PI2/20;
            }
        }

        //弾を移動させる
        //曲がる弾を扱う場合でも発射時の条件から座標を求める必要はなく、
        //現在の弾の情報から次を計算できる。
        //念のために書いておくが
        //sin,cosの取りうる値の範囲は-1から1までの間であり、
        //0から1までではない。もしそうならball[i].spdが正のとき
        //弾は右下にしか動けないはずである。
        for(int i=0;i<20;i++){
            ball[i].x+=ball[i].spd*cos(ball[i].angle);
            ball[i].y+=ball[i].spd*sin(ball[i].angle);
        }

        //弾の描画
        for(int i=0;i<20;i++){
            if(ball[i].flag==1){
                DrawCircle(ball[i].x,ball[i].y,3,White,TRUE);
            }
        }

        ScreenFlip();
    }

    //投稿されたものにはWaitKey()がかかれていたが不要
    DxLib_End();
    return 0;
}


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



Name: Ultimate  ..初心者(5,354ポイント)   Date: 2010/06/13(日) 15:05   No:54210       
Title: Visual Studio 2010 C++ 行の表示方法    
ソースを書いているとき、エラーが起こったら出力というところにカッコ内にエラーの原因がある行番号が表示されます。

今、行が表示されていないので行が表示されるようにしたいです。

方法があったら教えてください。

まだ下の質問が解決していないのに質問ですみません。

これは開発環境についての質問なので・・・

今の現状の画像もつけておきます。


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


Name: トントン  ..かけだし(1,230ポイント)   Date: 2010/06/13(日) 15:12   No:54211     
Title: Re:Visual Studio 2010 C++ 行の表示方法    
オプション→テキストエディタ→全ての言語

と進んでいくと行番号の指定があります。


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

Name: asdf  ..入門者(3,510ポイント)   Date: 2010/06/13(日) 15:13   No:54212     
Title: Re:Visual Studio 2010 C++ 行の表示方法    
ツール>オプション>テキストエディター>C/C++>全般

で行番号にチェックすればいいはずです。


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

Name: Ultimate  ..初心者(5,382ポイント)   Date: 2010/06/13(日) 15:25   No:54214 解決!     
Title: Re:Visual Studio 2010 C++ 行の表示方法    
ツール>オプション>テキストエディター>C/C++>全般で無事、表示させることができました。

とても助かりました。 編集済み


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

Name: たいちう  ..比類無きプログラマー(94,747ポイント)   Date: 2010/06/13(日) 16:51   No:54226     
Title: Re:Visual Studio 2010 C++ 行の表示方法    
エラーメッセージをダブルクリックしても、その行が表示されるはずです。

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



Name: 深黒  ..入門者(3,079ポイント)   Date: 2010/06/13(日) 00:24   No:54166       
Title: フェード+効果音    
    int fie=LoadGraph( "field.bmp" ) ;
    int ble=LoadGraph( "bless.bmp" ) ;
    for(i=255;i>=0;i-=3){
        ClearDrawScreen();
        SetDrawScreen( DX_SCREEN_BACK ) ;
        DrawGraph(0,0,fie,FALSE);
        SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255); 
        DrawGraph(300,300, ble, FALSE );
        SetDrawBlendMode(DX_BLENDMODE_ALPHA,i); 
        DrawBox(300,300,430,488,GetColor(255,255,255),TRUE);
        SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255); 
        ScreenFlip() ;
    }
    SetDrawScreen( DX_SCREEN_FRONT ) ;
    field(1);
こんな感じにプログラムを入力して、白→フェードしながらに画像を表示というのを作りました。
これに効果音を出せるように仕組んで、フェードしつつ効果音を出すというのがやりたいのですが、平行できません。
どうすればいいかアドバイスが欲しいです。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,210,801ポイント)   Date: 2010/06/13(日) 00:56   No:54169     
Title: Re:フェード+効果音    
ゲームプログラミングの館にDXライブラリの使い方が一通り載っているので目を通して頂ければと思います。
例えば今回の件ならこの辺が参考になると思います。

http://dixq.net/g/33.html

画面消去や反映は複数個所に書くべきではなく、どこか1か所に書き、毎回そこをループする必要があります。
プログラムを書く時は処理の担当を明確にし、関数化すると解りやすいでしょう。

また、裏画面に設定する関数はループで呼ぶ必要はありません。


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

Name: 深黒  ..入門者(3,398ポイント)   Date: 2010/06/13(日) 13:46   No:54202     
Title: Re:フェード+効果音    
返信ありがとうございます。
    int fie=LoadGraph( "field.bmp" ) ;
    int ble=LoadGraph( "bless.bmp" ) ;
    ClearDrawScreen();
    SetDrawScreen( DX_SCREEN_BACK ) ;
    DrawGraph(0,0,fie,FALSE);
    for(i=255;i>=0;i-=3){
        SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255); 
        DrawGraph(300,300, ble, FALSE );
        SetDrawBlendMode(DX_BLENDMODE_ALPHA,i); 
        DrawBox(300,300,430,488,GetColor(255,255,255),TRUE);
        SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255); 
        ScreenFlip() ;
    }
    SetDrawScreen( DX_SCREEN_FRONT ) ;
    field(1);
指摘された部分を考えるとこんなプログラムになりました。

効果音が平行できないというのは、例えばfor文の前に効果音の文を入れると、効果音が鳴り終わらないとフェードの作業をしないため、うまくいかないという事です。
鳴らしつつ、フェードするというのがしたいです


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

Name: シエル  ..入門者(4,328ポイント)   Date: 2010/06/13(日) 13:53   No:54204     
Title: Re:フェード+効果音    
効果音を鳴らすときの関数でPlayTypeという引数があると思いますが、
その引数がDX_PLAYTYPE_NORMALになってませんか?
DX_PLAYTYPE_BACKにすると再生した後すぐに制御を返してくれます。


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

Name: 深黒  ..入門者(3,402ポイント)   Date: 2010/06/13(日) 14:22   No:54208 解決!     
Title: Re:フェード+効果音    
返信ありがとうございます。
変更したら成功しましたm(_ _)m 編集済み


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



Name: PVM  ..ぴよぴよ(132ポイント)   Date: 2010/06/11(金) 18:17   No:54030       
Title: 横シューティングでの自機の傾き    
はじめまして、私はシューティング好きですが、初心者・・・いわゆるド素人です。
現在は横スクロールシューティングを作っています。
もし自分のゲームを完成したらコミケ、コンテストなどに出展しようと思っています。

ゲームプログラミングの館(昔のほう)を見て自機の移動までできましたけど、
どうも自機の傾きのプログラムがわかりません・・・。
自機を傾かせるにはどうしたらよいのでしょうか・・・?

自機はドット絵はどんな感じか、私の描いた画像を添付します。
(すいません・・・掲示板は初めてなんでどういったらいいか・・・。)








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


Name: シエル  ..入門者(3,165ポイント)   Date: 2010/06/11(金) 18:32   No:54031     
Title: Re:横シューティングでの自機の傾き    
下を押したら下に傾く画像に、上を押したら上を向く画像に変える。
下記のページを参考にしてはいかがでしょうか?
http://dixq.net/g/23.html


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,206,002ポイント)   Date: 2010/06/12(土) 03:56   No:54089     
Title: Re:横シューティングでの自機の傾き    
傾かせるというのは、例えば下キーを押した時は添付ファイルの右上の画像が表示されるとかそういうことですか?
下キーを押したときに画像を変えるのは解りますか?
そこが解るとなると、
下キー押しっぱなしで
画像1→画像2→画像3とアニメーションさせる方法が解らないということでしょうか?


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

Name: PVM  ..ぴよぴよ(141ポイント)   Date: 2010/06/12(土) 10:54   No:54101     
Title: Re:横シューティングでの自機の傾き    
はい、そういうことです。
3枚目でループさせないようにするにはどうしたらいいのか、
私は悩んでいました。

 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,206,090ポイント)   Date: 2010/06/12(土) 11:14   No:54102     
Title: Re:横シューティングでの自機の傾き    
http://dixq.net/g/41.html
この章の内容は解りますか?
キーがどれ位押されたかが解ります。
これを使って例えば

下キーが押されていない時は画像1
下キーが押されてから20カウントまでは画像2
下キーがおされてから20カウント以上では画像3

を表示するようにしてみてはいかがでしょうか?


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

Name: TKOZ  ..熟練のプログラマー(59,637ポイント)   Date: 2010/06/12(土) 11:25   No:54104     
Title: Re:横シューティングでの自機の傾き    
こんな感じでどうでしょう。
コンパイルしてないので、うまくいくかどうか分かりませんが…

typedef struct rollstruct{
    int min,max;
}rollstruct;

void RollShip()
{
    rollstruct r[5]={
        {-20,-15},
        {-15,-5},
        {-5,5},
        {5,15},
        {15,20}
    };
    
    if(CheckHitKey(KEY_INPUT_UP) && -21<roll) roll--;
    
    if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) roll++;
    
    if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN))
    {
        roll<0 ? roll--:roll++;
    }
    
    for(int i=0;i<5;i++)
    {
        if(r[i].min<=roll && roll<r[i].max)
        {
            switch(i)
            {
                //iの値によって異なるパターンを描画する
            }
        }
    }
    
編集済み


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

Name: TKOZ  ..熟練のプログラマー(60,687ポイント)   Date: 2010/06/12(土) 21:19   No:54135     
Title: Re:横シューティングでの自機の傾き    
もう少し改良して、自分のパソコンで動かしてみました。
ship.pngというのは、保存した画像ファイル名です。
追記:ソースファイルとデータをアップロードしました。
自由に使ってください。

#include"DxLib.h"

int image;

typedef struct Player{
    float x,y;
    int width,height;
}Player;
typedef struct rollstruct{ 
    int min,max; 
}rollstruct; 

typedef struct NewRect{
    int x,y;
}NewRect;
  
Player Jiki;

void DrawAndMove()
{
    static int roll=0;
    int i;
    rollstruct r[7]={ 
        {-20,-15}, 
        {-15,-10},
        {-10,-5},
        {-5,5}, 
        {5,10}, 
        {10,15},
        {15,20}
    }; 
    
    NewRect N[7]={
        {96,0},
        {48,0},
        {0,0},
        {0,0},
        {0,64},
        {48,64},
        {96,64}        
    };
    

    if(CheckHitKey(KEY_INPUT_UP)) Jiki.y-=2;
    if(CheckHitKey(KEY_INPUT_DOWN)) Jiki.y+=2;
    if(CheckHitKey(KEY_INPUT_LEFT)) Jiki.x-=2;
    if(CheckHitKey(KEY_INPUT_RIGHT)) Jiki.x+=2;

    if(CheckHitKey(KEY_INPUT_UP) && -21<roll)
    {
        roll--;
        if(roll<-20) roll=-20;
    }
     
    if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) {
        roll++; 
        if(roll>19) roll=19;
    }
     
    if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN)) 
    { 
        if(roll<0) roll++;
        else if(0<roll)roll--; 
    } 
     

    for(i=0;i<7;i++)
    {
        if(r[i].min<=roll && roll<r[i].max)
        {
            
            DrawRectGraph(Jiki.x,Jiki.y,N[6-i].x,N[6-i].y,Jiki.width ,Jiki.height ,
                image,TRUE,FALSE);
            
        }
    }
}

void Init()
{
    image=LoadGraph("./Data/ship.png");
    Jiki.width=48;
    Jiki.height=35;
    Jiki.x=(320-Jiki.width)/2;
    Jiki.y=(240-Jiki.height)/2;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hP,LPSTR lpC,int nC)
{
    
    SetGraphMode(320,240,32);
    ChangeWindowMode(TRUE) ;
    SetMainWindowText("横シュー"); //ウィンドウのタイトル
    if(DxLib_Init() == -1) return (-1);    //DXライブラリ初期化

    
    //データ読み込み中と表示する
    DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );

    //各種変数の初期化など
    Init();
    
    
    //乱数の初期化
    srand((unsigned)GetTickCount());
    //メインループ
    while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
        
        ClearDrawScreen();        
        
        DrawAndMove();

        ScreenFlip();                //フリップする
    }
    
    DxLib_End();    //DXライブラリ終了処理
    return (0);        //終了
}
 編集済み


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

Name: TKOZ  ..熟練のプログラマー(60,800ポイント)   Date: 2010/06/12(土) 21:30   No:54137     
Title: Re:横シューティングでの自機の傾き    
ところで、この画像のドット絵はどうやって描いたんですか?
Edgeで読み込もうとしたら、256色以上になってたみたいなので、
減色ソフトで256色に減色しました。
GIMPかフォトショップか何かでドット絵を描いたんですか?


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

Name: PVM  ..ぴよぴよ(175ポイント)   Date: 2010/06/13(日) 10:29   No:54189     
Title: Re:横シューティングでの自機の傾き    
Edgeやフォトショップ以外で、
GraphicsGale Free editionというツールで描きました。
私はそのツールでしか慣れていないです。


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

Name: PVM  ..ぴよぴよ(270ポイント)   Date: 2010/06/13(日) 11:56   No:54196 解決!     
Title: Re:横シューティングでの自機の傾き    
TKOZさん、
ソースまでもありがとうございます!

自機を傾かせるのにどれだけ悩んだのやら・・・

後に何かあったらまた掲示板に知らせます。
また、雑談でもかまいませんが
今後ともよろしくお願いいたします!


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



Name: haruto  ..ぴよぴよ(16ポイント)   Date: 2010/06/13(日) 10:43   No:54190       
Title: 実行ファイルの作り方    
プログラムは作れたのですが、どうやって実行ファイル(exe)を作るんですか?

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


Name: たかぎ [URL]  ..ハッカー(207,164ポイント)   Date: 2010/06/13(日) 11:10   No:54192     
Title: Re:実行ファイルの作り方    
まず最初に行うべきことは、規約と注意事項を熟読することです。


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

Name: レイ  ..かけだし(1,748ポイント)   Date: 2010/06/13(日) 11:11   No:54193     
Title: Re:実行ファイルの作り方    
コンパイラはVC++でしょうか。

その場合ならF5(デバッグ開始)を押せば
exeが生成されますよ。


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

Name: シエル  ..入門者(4,110ポイント)   Date: 2010/06/13(日) 11:14   No:54194     
Title: Re:実行ファイルの作り方    
利用規約を読んで、質問していただけると助かります

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



Name: たろう  ..プログラマー(26,005ポイント)   Date: 2010/06/12(土) 22:26   No:54153       
Title: 敵機を弧を描くように移動するには    
敵機を20カウントしながら下に移動してカウントし終わったら弧を描くようにプログラミングしたつもりなのですが、止まったままになります。どうしたら弧を描くようになるでしょうか?
ソース載せます。
void enemy_pattern2(int i)
{
    int idou=0;
    float x=enemy[i].x,y=enemy[i].y;
    if(enemy[i].cnt==0)
    {
        enemy[i].ang=0;
        enemy[i].vy=2;
        enemy[i].vx=0;
        enemy[i].sp=0;
        return;
    }
    if(enemy[i].cnt==20)
    {
        enemy[i].gentenx=enemy[i].x;
        enemy[i].genteny=enemy[i].y;
        return;
    }
    if(enemy[i].cnt==40)
    {
        enemy[i].ang=0;
        enemy[i].vy=0;
        enemy[i].vx=0;
        enemy[i].sp=0;
        idou=1;
    }
    if(enemy[i].cnt%80==0)
    {
        enemy[i].ang=0;
        enemy[i].vy=0;
        enemy[i].vx=0;
        enemy[i].sp=0;
        idou=1;
    }
    if(enemy[i].cnt%160==0)
    {
        enemy[i].ang=0;
        enemy[i].vy=0;
        enemy[i].vx=0;
        enemy[i].sp=0;
        idou=2;
    }
    switch(idou)
    {
    case 1:
        //左に弧を描くように移動
        x=((enemy[i].x-enemy[i].gentenx)*cos(2*PI/180)-(enemy[i].y-enemy[i].genteny)*sin(2*PI/180))
            +enemy[i].gentenx;
        y=((enemy[i].x-enemy[i].gentenx)*sin(2*PI/180)+(enemy[i].y-enemy[i].genteny)*cos(2*PI/180))
            +enemy[i].genteny;
        break;
    case 2:
        //右に弧を描くように移動
        x=((enemy[i].x-enemy[i].gentenx)*cos(-2*PI/180)-(enemy[i].y-enemy[i].genteny)*sin(-2*PI/180))
                    +enemy[i].gentenx;
        y=((enemy[i].x-enemy[i].gentenx)*sin(-2*PI/180)+(enemy[i].y-enemy[i].genteny)*cos(-2*PI/180))
                    +enemy[i].genteny;
        break;
    }
    enemy[i].x=x,enemy[i].y=y;
}

よろしくお願いします。


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


Name: たろう  ..プログラマー(26,014ポイント)   Date: 2010/06/12(土) 23:15   No:54158 解決!     
Title: Re:敵機を弧を描くように移動するには    
自己解決しました。すみませんでした。

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



Name: たろう  ..上級者(23,133ポイント)   Date: 2010/06/10(木) 09:26   No:53856       
Title: プログラマの数学について    
ゲームを作るために数学を勉強しようと思っているのですが、数学が苦手なのでシューティング、アクションの2Dゲームに使える数学のサイト、本などありましたら教えてください!よろしくお願いします。


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


Name: たいちう  ..比類無きプログラマー(92,917ポイント)   Date: 2010/06/10(木) 09:36   No:53857     
Title: Re:プログラマの数学について    
直接ゲーム作成に役立つわけではないですが、
特に数学が苦手ということならば、まず『プログラマの数学』という本を読んでみてはどうかと。

http://www.amazon.co.jp/dp/4797329734


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

Name: たろう  ..上級者(23,183ポイント)   Date: 2010/06/10(木) 09:51   No:53859     
Title: Re:プログラマの数学について    
回答ありがとうございます。
>直接ゲーム作成に役立つわけではないですが、
申し訳ないのですが、できれば、役に立つのを教えてください。


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

Name: たかぎ [URL]  ..ハッカー(202,268ポイント)   Date: 2010/06/10(木) 10:24   No:53864     
Title: Re:プログラマの数学について    
高校の教科書や参考書が一番わかりやすく、内容も充実しています。
私が知る限り、高校で習う数学については(物理等への応用に必要ということも含めて)役に立たないものはひとつもありません。
もちろん、今作っているゲームでは、例えば複素数は使わないとか、そういったことはあると思います。


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

Name: たいちう  ..比類無きプログラマー(93,059ポイント)   Date: 2010/06/10(木) 10:33   No:53868     
Title: Re:プログラマの数学について    
持っている本だとこれかな。
『シューティングゲームアルゴリズムマニアックス』
http://www.amazon.co.jp/dp/4797327316

でも数学の解説に重点を置いているわけではありません。
この本の数学の説明が判らないがちゃんと理解したい場合、
高校の数学の教科書や参考書が一番判りやすく書かれているはずです。


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

Name: たろう  ..上級者(23,292ポイント)   Date: 2010/06/10(木) 10:33   No:53869     
Title: Re:プログラマの数学について    
回答ありがとうございます。
高校の数学は覚えているんので、sin()cos()などはわかるのですが。
応用が効かなくてなかなか思うようにプログラムが出来ていないのです。
応用を鍛えるにはどうすればよいのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(202,522ポイント)   Date: 2010/06/10(木) 11:07   No:53877     
Title: Re:プログラマの数学について    
> 高校の数学は覚えているんので、

数学は暗記するものではないので、ちゃんと理解して身に付けましょう。
そうすれば、応用がきかないということはないと思います。
推測ですが、受験勉強しかやらなかったのではないでしょうか?


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

Name: たいちう  ..比類無きプログラマー(93,349ポイント)   Date: 2010/06/10(木) 11:11   No:53879     
Title: Re:プログラマの数学について    
> 応用を鍛えるにはどうすればよいのでしょうか?

まず基本を理解することです。
この場合は三角関数などの数学とサンプルプログラムですね。
どう計算したら答えが出るかとか、プログラムをどう書くかを覚えるのではなく、
どうしてこの計算で答えがでるのか、どうしてこのプログラムは
こう書いているのかを理解しましょう。

ゲームに限らずプログラミングの経験もまだ浅いことと思います。
難しい数学が関係ない分野ならば、自由にプログラムが作れるのですか?
自分の目的には遠回りに思えるかもしれませんが、基本は重要ですので、
そういう意味でも先ほど紹介した『プログラムの数学』という本はお勧めです。


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

Name: たろう  ..上級者(23,522ポイント)   Date: 2010/06/10(木) 11:53   No:53886     
Title: Re:プログラマの数学について    
たかぎさん回答ありがとうございます。
受験勉強は全くしませんでした(汗)理解しているつもりではいるのですが、問題を出されたらできるのですが、いざプログラムしようと思うと思い浮かびません。やっぱり応用が利かないのでしょうか。。。
たいちうさん回答ありがとうございます。
基本を理解していないと言うことでしょうか・・・サンプルプログラムを見れば理解できるのですが。
いざプログラムしろと言われたらできません。(と思います。)理解していないと言うことでしょうか・・・
「プログラムの数学」を本屋で読んでみたいと思います。


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

Name: たかぎ [URL]  ..ハッカー(202,705ポイント)   Date: 2010/06/10(木) 12:07   No:53887     
Title: Re:プログラマの数学について    
> 問題を出されたらできるのですが、いざプログラムしようと思うと思い浮かびません。

ということは、紙の上でなら解決できるということでしょうか?
それならプログラミングのスキルだけの問題なので、数学がどうこういうのは関係ありません。

それとも、すぐ解き始められる問題が与えられなければ、できないということでしょうか?
だとすると、それは典型的な受験勉強です。


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

Name: Dixq (管理人)  ..ウィザード(1,204,020ポイント)   Date: 2010/06/10(木) 12:38   No:53888     
Title: Re:プログラマの数学について    
sin、cos程度であればプログラムへの応用が利かないとか難しく考える必要もないのでは^_^;

何か問題を出しましょうか。
例えば

0から100まで1ずつカウントアップするカウンタがあります。
これを使って、座標0,0から座標200,300へ滑らかに移動するプログラムを書きなさい

とかどうでしょう。
こんな事は私はいつもやるのですが、難しく考える必要もないですよね。
sin波の波形はよく活用します。


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

Name: たかぎ [URL]  ..ハッカー(202,875ポイント)   Date: 2010/06/10(木) 14:30   No:53893     
Title: Re:プログラマの数学について    
私が中学〜大学のころは、紙カウンターやミニチュアフィギュア等を使ってシミュレーションゲームをやっていたので、どちらかというとこういう数学や物理は体に染み付いています。
自分でゲームを作る場合も、コンピュータは使わないので、暗算と表でいかに高速かつ正確に結果を求められるかが重要だったため、近似の取り方とかに相当苦労した記憶があります。
その意味では、コンピュータを使って計算できるのであれば楽勝なのですが、世代の違いなんでしょうね。


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

Name: softya [URL]  ..ハッカー(179,379ポイント)   Date: 2010/06/10(木) 15:17   No:53897     
Title: Re:プログラマの数学について    
じゃあ、プログラムに関係なく純粋に数学でこれは出来ますでしょうか?
座標(50,50)の点を座標(-40,20)を中心とする回転移動で時計方向に20度回転した場合の座標は?
高校の数学が理解出来ているならすぐ出来るはずです。 編集済み


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

Name: ぽこ  ..中級者(14,588ポイント)   Date: 2010/06/10(木) 16:16   No:53900     
Title: Re:プログラマの数学について    
> 応用を鍛えるにはどうすればよいのでしょうか?

ゲーム作成時の問題を数学の問題に置き換えることが出来ないんですよね?
単純に問題を解く数をこなせばいいと思いますよ。
分からないことがあれば、この掲示板で聞けばいいんです。


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

Name: シエル  ..入門者(2,727ポイント)   Date: 2010/06/10(木) 17:12   No:53910     
Title: Re:プログラマの数学について    
私も数学や物理が苦手ですので、たろうさんの気持ちはよく分かります(笑)

私が先ほど見つけた下記のサイトはいかがでしょうか?
http://hakuhin.jp/as.html
このサイトの「基本的な移動方法について」のところの記述は非常に参考になりました。

今まで画像の動作は安っぽい動きしかできなかったんですが、速度を変化させて動かせるように
なったので、少しマシな動作ができるようになりました。

C言語ではなく、FLASHのActionScriptでの解説ですが、アルゴリズムについては理解できる内容だと
思いますので、是非参考にしてみてください。

たろうさんの求めている内容と違ったらすみません。。。



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

Name: しろ  ..中級者(10,224ポイント)   Date: 2010/06/10(木) 20:40   No:53944     
Title: Re:プログラマの数学について    
>> softyaさん

その問題は文系だと難しいかもしれません。今は複素平面は高校の教程の範囲外ですし、行列は基本的には文系はやらないですから。もちろん幾何と三角関数を使えば解けると思いますが・・・・・・

ちなみに私の場合、数学というより、プログラミングのスキルがまだまだなので苦労してます。


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

Name: たろう  ..上級者(23,803ポイント)   Date: 2010/06/10(木) 22:00   No:53952     
Title: Re:プログラマの数学について    
softyaさんレスありがとうざいます。(cos(-20)-40,sin(-20)+20)ですか?
すみませんわかりません。高校の数学もできない基礎自体できてなかったみたいです。
解き方教えてください。よろしくお願いします。

ぽこさんレスありがとうございます。
>単純に問題を解く数をこなせばいいと思いますよ。 
>分からないことがあれば、この掲示板で聞けばいいんです。
解く数をこなせばいいのですね。ありがとうございます。

シエルさんレスありがとうございます。
このサイトありがたく参考にさせていただきます。ありがとうございます。

しろさんレスありがとうございます。
私は数学もプログラミングもなまだまだ未熟者です。

softyaさんの問題ができないくらい未熟者ですのでよろしくお願いします。


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

Name: たろう  ..上級者(24,026ポイント)   Date: 2010/06/11(金) 00:03   No:53969     
Title: Re:プログラマの数学について    
もうひとつ質問させてください。
アクションゲームなどで、移動するとき、
int a={1,1,1,1,1,1,1,1,1,1,1,1
            1,1,1,0,1,0,0,0,0,1,1,1,
            1,1,1,0,0,0,0,0,0,1,1,1,
            1,1,1,1,1,1,1,1,1,1,1,1}

としますがこれ以外に移動させる方法ってあるのでしょうか?


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

Name: softya [URL]  ..ハッカー(180,155ポイント)   Date: 2010/06/11(金) 00:24   No:53975     
Title: Re:プログラマの数学について    
>>座標(50,50)の点を座標 (-40,20)を中心とする回転移動で時計方向に20度回転した場合の座標は? 
>softyaさんレスありがとうざいます。(cos(-20)-40,sin(-20)+20)ですか?
>すみませんわかりません。高校の数学もできない基礎自体できてなかったみたいです。
>解き方教えてください。よろしくお願いします。 

一応行列を使って説明しますが分からなかったら聞いてください。
行列を使わなくても面倒ですが可能です。

まず分かりやすいレベルに置き換えます。
座標(50,50)をA、座標(-40,20)をBとして説明します。
(1)Bを原点に座標変換します。簡単に言うと、Bを原点に移動させる分、A-Bで座標Aを移動します。この座標をCとします。
(2)座標Cを行列で回転変換します。変換された座標はDです。
回転変換は、これです。↓
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html
(3)で、ずらしていた原点を元に戻します。当然座標Dも移動します。D+Bとしてやるだけです。これが座標Eです。
以上で、座標(50,50)の点を座標 (-40,20)を中心とする回転移動で時計方向に20度回転した座標であるEを求めることが出来ます。
つまり、こういう事が出来るかどうかが数学を道具として使えるかどうかって事ですね。たかぎさんの受験勉強と言っているのは、そういう事だと思います。


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

Name: たろう  ..上級者(24,202ポイント)   Date: 2010/06/11(金) 00:44   No:53979     
Title: Re:プログラマの数学について    
回答ありがとうございます。
>(3)で、ずらしていた原点を元に戻します。当然座標Dも移動します。D+Bとしてやるだけです。これが座標Eです。
はなぜ+Bなのでしょうか?
もしかして、 
>(1)Bを原点に座標変換します。簡単に言うと、Bを原点に移動させる分、A-Bで座標Aを移動します。この座標をCとします。
−Bしているから、元に戻すには、+Bしてやればいいということしょうか?


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

Name: たろう  ..上級者(24,253ポイント)   Date: 2010/06/11(金) 00:58   No:53981     
Title: Re:プログラマの数学について    
>(1)Bを原点に座標変換します。簡単に言うと、Bを原点に移動させる分、A-Bで座標Aを移動します。この座標をCとします。 
なぜAじゃなくBを原点にするのでしょうか?


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

Name: softya [URL]  ..ハッカー(180,046ポイント)   Date: 2010/06/11(金) 01:15   No:53983     
Title: Re:プログラマの数学について    
色々聞く前にまず計算をしてみてください。
それと方眼紙に点を打って分度器で回転した座標も求めてみてください。
(1)(2)(3)をそれぞれ方眼紙でやってみるのも良いでしょう。
勉学の基本は、実際に自分でやってみることです。丸暗記じゃない数学ってそうやって理解するものですよ。
その上で分からないことは聞いてくださいね。


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

Name: たろう  ..上級者(24,344ポイント)   Date: 2010/06/11(金) 02:28   No:53984     
Title: Re:プログラマの数学について    
回答ありがとうございます。
計算してみました。
なんとか理解しました。
プログラムで実装もできました。
公式は暗記ですよね。それとも公式も理解しろと言うことでしょうか?


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

Name: たいちう  ..比類無きプログラマー(93,644ポイント)   Date: 2010/06/11(金) 06:33   No:53990     
Title: Re:プログラマの数学について    
> 公式は暗記ですよね。それとも公式も理解しろと言うことでしょうか?

一次変換の公式ですよね?当然理解するのが望ましいです。
試験のために勉強するわけではないので暗記は必要ないですが、
覚えるとしたら公式の導き方でしょう。
他の公式でも同じです。

プログラムを作るのには結果だけが必要だ、と理解を諦めても良いですが、
その分、応用できるケースが減ります。


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

Name: たかぎ [URL]  ..ハッカー(203,775ポイント)   Date: 2010/06/11(金) 07:26   No:53991     
Title: Re:プログラマの数学について    
> 公式は暗記ですよね。それとも公式も理解しろと言うことでしょうか?

当然理解すべきでしょう。
小中学生なら、とりあえず公式をブラックボックスとして使うのもしかたないでしょうが、そうでなければ理解しなければ応用がききません。
プログラミングも同じで、既存の関数等の組み合わせを丸暗記するだけではまったく応用がききません。


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

Name: しろ  ..中級者(10,352ポイント)   Date: 2010/06/11(金) 07:39   No:53993     
Title: Re:プログラマの数学について    
高校数学で理解より暗記を優先すべきものは微分積分関連の一部の公式のみです。
(厳密論をやると、大学レベルの数学まで立ち入らなければいけないので。教科書もごまかしながら説明している部分はあります。「中間値の定理」「挟み撃ちの定理」など)

ただし公式を「理解→使う」が望ましいのはわかりますが、ときにはなんとなく使ってるうちに公式を理解し、そのうち導き方も理解できる場合もあります。

最終的に理解するというのは大前提として「わからないけど、とりあえず使ってみる」というのも時には必要ですよ。


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

Name: しろ  ..中級者(10,404ポイント)   Date: 2010/06/11(金) 07:44   No:53995     
Title: Re:プログラマの数学について    
補足ですが、上記の2つの定理も完全丸暗記するのではなく、感覚的には理解しておきましょう。(証明できるかは別として)

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

Name: たろう  ..上級者(24,400ポイント)   Date: 2010/06/11(金) 14:03   No:54006     
Title: Re:プログラマの数学について    
回答ありがとうございます。
それじゃこの式は
xcosθ-ysinθ,xsinθ+ycosθ
どういう風に理解すればよいのでしょうか?


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

Name: たいちう  ..比類無きプログラマー(93,791ポイント)   Date: 2010/06/11(金) 14:23   No:54008     
Title: Re:プログラマの数学について    
softyaさんの紹介しているリンク先に書いてありますが。
読んでいないのですか?


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

Name: 匿名  ..上級者(22,779ポイント)   Date: 2010/06/11(金) 14:25   No:54009     
Title: Re:プログラマの数学について    
xcosθ-ysinθ,xsinθ+ycosθというのは
原点中心に図形を回転させる。(サインとコサイン)
xy座標上にある図形を原点中心に回転させるということでしょうか?
それならば次の式になりますね。

x'=xcosθ-ysinθ 
y'=xsinθ+ycosθ 

まず、この前にサイン、コサインがあまり分からないとのことですので
こちらをご覧ください。
http://www.urban.ne.jp/home/kz4ymnk/seminar/digipt/sincos.html

直角三角形がありますね。右下に直角を位置したような直角三角形で、
ちょうどSの字を描くように(筆記体のS)

(高さ)/(斜辺)=sin(サイン)
(底辺)/(斜辺)=cos(コサイン)といいます。

このほか、タンジェントもあります。
また座標表現のところを見てみましょう。
半径rの円周上の点(x,y)の座標は、
この点と原点を結ぶ直線(半径)と、x軸とのなす角度αによって

(x,y)=(rcosα,rsinα)・・・(☆)
と表されるのです。
さて、このことを用いて、
(x,y)=(rcosα,rsinα)ですが、これをθだけ回転させた座標(x',y')とは
x軸から考えると(α+θ)だけ動かしたことになります。
ですから、(☆)において動かす角度をx軸から考えて(α+θ)だと考えると

(x',y')=(rcos(α+θ),rsin(α+θ))・・・(★)
となります。

ここで、三角関数の加法定理というのがあるのですが、
たろうさんはサイン、コサインがまだよく知らないとのことですので、
そういう定理があるんだな、とご理解ください。
それによると、

cos(α+θ)=cosαsinθ-sinαcosθ
sin(α+θ)=sinαcosθ+cosαsinθ
のようになります。

これを(★)に代入すると

x'=rcos(α+θ)=r{cosαsinθ-sinαcosθ}=rcosαsinθ-rsinαcosθ
ここでrcosα=x,rsinα=yですから
x'=xsinθ-ycosθ

同様に
y'=sin(α+θ)=r{sinαcosθ+cosαsinθ}=rsinαcosθ+rcosαcosθ
=xcosθ+ysinθ

となるので

x'=xcosθ-ysinθ 
y'=xsinθ+ycosθ 

がいえますね。


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

Name: たろう  ..上級者(24,504ポイント)   Date: 2010/06/11(金) 16:08   No:54014     
Title: Re:プログラマの数学について    
たいちうさん回答あいがとうございました。このサイト参考にさせていただいたのですが。
いまいちわかりませんでした。

匿名さんありがとうございます。
わかりやすかったです回答ありがとうございました。
ところで、定理は暗記ですよね?


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

Name: たかぎ [URL]  ..ハッカー(204,494ポイント)   Date: 2010/06/11(金) 16:12   No:54015     
Title: Re:プログラマの数学について    
> いまいちわかりませんでした。 

では、どこまでわかったのか、自分の言葉で説明してみてください。

> ところで、定理は暗記ですよね?

定理は証明を理解することが原則です。
一方、公理は暗記しかありませんが、字面を暗記するだけではなく、どういう意味かだけは理解する必要があります。


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

Name: たいちう  ..比類無きプログラマー(93,918ポイント)   Date: 2010/06/11(金) 16:25   No:54016     
Title: Re:プログラマの数学について    
> ところで、定理は暗記ですよね?

何かの試験を受けるつもりなのですか?
趣味でプログラムを作るだけならば、暗記の必要はありません。
本でもサイトでもノートでも好きな時に好きなだけ見てください。

応用力を付けるには理解することが大事であると、
何度も指摘されていますが、応用ができていないところを見ると、
まだ指摘を理解できていないようですね。


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

Name: たろう  ..上級者(24,643ポイント)   Date: 2010/06/11(金) 16:57   No:54020     
Title: Re:プログラマの数学について    
回答ありがとうございます。
>一方、公理は暗記しかありませんが、字面を暗記するだけではなく、どういう意味かだけは理解する必要があります。 
意味を理解すればよいのですね。
加法定理によりx'=cos(a)cos(θ)-sin(a)sin(θ)だったら角度aをプラスθされた座標xということでいいのでしょうか。



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

Name: たかぎ [URL]  ..ハッカー(204,582ポイント)   Date: 2010/06/11(金) 17:05   No:54021     
Title: Re:プログラマの数学について    
> 加法定理によりx'=cos(a)cos(θ)-sin(a)sin(θ)だったら角度aをプラスθされた座標xということでいいのでしょうか。

加法定理は、その名の通り「定理」であって「公理」ではありません。
公理というのは、任意の2点を結ぶ線分は存在するとか、線分を延長して直線にすることができるとか、すべての直角は等しい角度であるといったものです。


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

Name: たろう  ..上級者(24,588ポイント)   Date: 2010/06/11(金) 17:13   No:54022     
Title: Re:プログラマの数学について    
公理とは、言っている意味はなんとなくわかるのですが、どういうのが公理なのでしょうか。(sincosの公理とは何でしょうか?)

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

Name: たかぎ [URL]  ..ハッカー(204,708ポイント)   Date: 2010/06/11(金) 17:23   No:54023     
Title: Re:プログラマの数学について    
> どういうのが公理なのでしょうか。

公理というのは、何か別のことから導かれるものではなく、「こうだ」と決めたルールのことだと考えてください。
先ほど挙げたのはユークリッド幾何学におけるの5つの公理の一部ですが、それが現実世界にも当てはまるかというと必ずしもそんなことはありません。
例えば、重力場による空間の歪がありますので、任意の2点を結ぶ線分は常に存在するわけではありません。


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

Name: たろう  ..上級者(24,629ポイント)   Date: 2010/06/11(金) 17:40   No:54024     
Title: Re:プログラマの数学について    
そうなんですか。
何度も質問すみません。
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html 
のp'=xe+yfとはなぜこのような式になるのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(204,723ポイント)   Date: 2010/06/11(金) 17:43   No:54025     
Title: Re:プログラマの数学について    
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html 
> のp'=xe+yfとはなぜこのような式になるのでしょうか?

ウェブページが開けません。


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

Name: たろう  ..上級者(24,655ポイント)   Date: 2010/06/11(金) 17:46   No:54026     
Title: Re:プログラマの数学について    
昨日softyaさんに紹介されたさサイトです。
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html


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

Name: たかぎ [URL]  ..ハッカー(204,743ポイント)   Date: 2010/06/11(金) 18:04   No:54027     
Title: Re:プログラマの数学について    
> のp'=xe+yfとはなぜこのような式になるのでしょうか?
→   →   →
p'=xe'+ye'

のことでしょうか?


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

Name: たろう  ..上級者(24,660ポイント)   Date: 2010/06/11(金) 18:17   No:54029     
Title: Re:プログラマの数学について    
はいそうです。

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

Name: たろう  ..上級者(24,688ポイント)   Date: 2010/06/11(金) 19:05   No:54033     
Title: Re:プログラマの数学について    
後もう一つ質問させてください。
加法定理はどうやって求めるのでしょうか?


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

Name: ぽこ  ..中級者(14,940ポイント)   Date: 2010/06/11(金) 19:28   No:54035     
Title: Re:プログラマの数学について    
応用力を鍛えるために数をこなすべし、
分からないことがあれば聞けばいい。
と言いましたが、取り組み方間違ってますよ。

少なくとも現時点で、たろうさんがどう求めていって、
どこで詰まったか、自分の考え書かなきゃ駄目ですよ。


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

Name: toyo  ..熟練のプログラマー(48,834ポイント)   Date: 2010/06/11(金) 19:47   No:54037     
Title: Re:プログラマの数学について    
加法定理ですが添付画像のA-B = A'-B'で求められます


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

Name: たろう  ..上級者(24,765ポイント)   Date: 2010/06/11(金) 19:58   No:54039     
Title: Re:プログラマの数学について    
図で見ればわかりますが。
すみません。
なぜcos(α+θ)=cosαcosθ-sinαsinθ 
sin(α+θ)=sinαcosθ+cosαsinθ 
になるのか知りたいのです。理解していればできるんですよね?


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

Name: ぽこ  ..上級者(15,068ポイント)   Date: 2010/06/11(金) 20:49   No:54042     
Title: Re:プログラマの数学について    
たろうさんに逆質問。
なんで図を見て分かったのですか?
説明願えませんか?

#私は図を見るだけではわかりませんでした。
#私は図とtoyoさんのヒントを元に自分で計算して、5分かけてようやく
#cos(α+θ)=cosαcosθ-sinαsinθ
#を導くことが出来ました。


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

Name: 匿名  ..上級者(24,121ポイント)   Date: 2010/06/11(金) 21:04   No:54043     
Title: Re:プログラマの数学について    
まずは「加法定理」について検索してみましたか?
グーグルや、ヤフーを活用してネットサーフィンすると
分かりやすく解説しているサイト様が沢山見つかると思います。
昔は教科書や書籍、先生、親を頼りに勉強するしかありませんでしたが
今は、PCを使いネットにつないで検索すれば
さまざまな分野の勉強だって調べ物だって簡単に可能な時代です。
有効活用しましょう。

http://www.google.co.jp/search?hl=ja&rlz=1T4ADBF_jaJP273JP275&q=%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86&btnG=%E6%A4%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=
http://search.yahoo.co.jp/search?p=%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86

加法定理(加法公式)といっても、
・三角関数の加法定理
・楕円関数の加法定理
・楕円曲線の加法公式
・ヤコビ多様体の加法公式
・確率の加法定理
・速度の加法定理
など、数学や物理学で使われてるさまざまなものがありますが、
たろうさんがおっしゃっているのは教育数学で使われてる"三角関数"の加法定理のことですよね?
(以下、加法定理と略)

>加法定理はどうやって求めるのでしょうか?
つまり加法定理の証明の方法が分からないと考えてよろしいですね?

加法定理の証明方法について分かりやすく解説しているお勧めのサイト様を下記に紹介しておきます。

http://w3e.kanazawa-it.ac.jp/math/category/sankakukansuu/kahouteiri/henkan-tex.cgi?target=/math/category/sankakukansuu/kahouteiri/kahouteiri-2.html

理解できないのであれば、先生に教えてもらいましょう。
教師は教えることのプロですから、きっと助けになってもらえるはずです。
その先生ですら分からない質問、学校で教わらない質問があれば
こちらの掲示板でまた気軽に聞いてください。

余談ですが、巨大掲示板の2chで「高校生のための数学の質問スレ」

http://find.2ch.net/?STR=%B9%E2%B9%BB%C0%B8%A4%CE%A4%BF%A4%E1%A4%CE%BF%F4%B3%D8%A4%CE%BC%C1%CC%E4%A5%B9%A5%EC&COUNT=50&TYPE=TITLE&BBS=ALL

というスレがあります。
高校数学について困ったことがあればこちらで聞いたほうが確実に正確な答えが返ってくると思います。
ただし、こんなに丁寧に回答してくれる方はいませんけど。
一応、ここは"C言語の"なんでも質問掲示板なので、本格的な数学についての質問はそちらで聞くと良いでしょう。

話は戻りますが、加法定理の証明を見ると分かると思いますが、
いちいちこれらの計算をして加法定理を求めてから活用するのは面倒ですよね?
なのでこれは暗記するのが一般的です。大幅な時間短縮になります。
有名な暗記方法で

咲いたコスモス コスモス咲いた
sinα  cosβ +  cosα   sinβ

等あります。
加法定理の覚え方は下記のサイト様が
面白い覚え方も含め、沢山書かれてあります。
自分が一番覚えやすいと思う方法で暗記するとよいでしょう。
http://www.d2.dion.ne.jp/~hmurata/goro/kahou.html

たろうさんは中学生か高校生の方でしょうか?
私の時代は中学時代に加法定理を学びましたが、現代の教育では高校2年生の時に学びます。
まだ習ってないこと、分からないことについて自ら学ぼうとする意欲は大変素晴らしいですね。
これからも頑張ってください。


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

Name: たろう  ..上級者(24,770ポイント)   Date: 2010/06/11(金) 21:10   No:54044     
Title: Re:プログラマの数学について    
わかるといったのは単純に見て思っただけです。なぜこうなったか図だけではわかっていないです。
どうやってできたのでしょうか?図とtoyoさんのヒントだけでどうやってできたのでしょうか?
教えてください。


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

Name: ぽこ  ..上級者(15,120ポイント)   Date: 2010/06/11(金) 21:20   No:54045     
Title: Re:プログラマの数学について    
> わかるといったのは単純に見て思っただけです。なぜこうなったか図だけではわかっていないです。
> どうやってできたのでしょうか?図とtoyoさんのヒントだけでどうやってできたのでしょうか?
> 教えてください。

toyoさんは、図を示された上で
A-B = A'-B'を求めろと言っています。
ここにはsin,cosがありません。

つまり、A-BやA'-B'をsin,cosで表わして等式で結ぶと何かが出てくることを示唆しています。
それを行っただけです。

追記:
ちなみに、最初私はtoyoさんが提示された導出法とは別のやり方で
加法定理を導出しました。 編集済み


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

Name: たろう  ..上級者(24,858ポイント)   Date: 2010/06/11(金) 21:27   No:54046     
Title: Re:プログラマの数学について    
匿名さん回答ありがとうございます。
高校2年です。加法定理はまだ習ってないです。
先生に聞いてみます。
サイトも参考にさせていただきます。
ありがとうございます!
暗記といっても実際説明できないと話にならないですよね?


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

Name: しろ  ..中級者(10,533ポイント)   Date: 2010/06/11(金) 21:50   No:54048     
Title: Re:プログラマの数学について    
加法定理の証明はまぁ一度自分で導出できれば、それでいいかと。あとは覚えて使えるようになりましょう。

toyoさんの図を用いた証明は有名ですが、0から自分で思いついて証明できるものではなかなかないと思います。
(図があれば、導くことは容易ですが)

ほかにも複素平面を用いた証明などがよく知られています。

なお、98年の東大前期で加法定理の証明が出題されています。

正答率はあまりよくなかったらしいですよ。


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

Name: たかぎ [URL]  ..ハッカー(205,048ポイント)   Date: 2010/06/11(金) 21:53   No:54049     
Title: Re:プログラマの数学について    
学校で習う順番はともかく、加法定理を導く上で一番簡単なのは、回転行列を2つ掛ける方法ですね。


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

Name: しろ  ..中級者(10,600ポイント)   Date: 2010/06/11(金) 22:19   No:54052     
Title: Re:プログラマの数学について    
>>加法定理を導く上で一番簡単なのは、回転行列を2つ掛ける方法ですね

確かにそれもありましたね。本質的には複素平面と同じでしょうか。

まぁそろそろ話題がずれてきたのでこのへんで辞めておきます。


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

Name: 匿名  ..上級者(24,582ポイント)   Date: 2010/06/11(金) 23:39   No:54061     
Title: Re:プログラマの数学について    
>暗記といっても実際説明できないと話にならないですよね?

加法定理の場合、
世の中、加法定理を説明する機会より、
加法定理を応用する機会のほうが多いと思います。

一番最初の質問に戻りますが、
>ゲームを作るために数学を勉強しようと思っている
のならば、プログラムで加法定理を証明するわけではない限り、
加法定理を使ってゲームを作る機会のほうが多いのではないでしょうか。
そういう意味では、説明することは大事ですが、
活用する力(応用力)をつけることのほうがもっと大事だと思います。

しろさんがおっしゃるとおり、加法定理の証明を理解するのはなかなか難しいです。
当時教えていた数学教師は加法定理の証明は「理解しなくてもいい」と言うほどでしたので。
大切なのは加法定理自体とその応用です。でも加法定理の証明を理解しても損はありません。
ただ、理解する時間があるのならば、他の勉強にその時間を当てることをおススメします。
教師を目指していたり、大学で数学科、物理学科に入る等の目的ならば話は別ですけど。




まあ、自分の子供が出来た時に
子供が「加法定理って何?」と聞かれたときにスラスラ言えるとかっこいいですけどねw 編集済み


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

Name: たろう  ..上級者(24,899ポイント)   Date: 2010/06/11(金) 23:52   No:54064     
Title: Re:プログラマの数学について    
わかりました。
加法定理の方の応用を勉強したいと思います。プログラムのほうに力をいれていきたいと思います。
回答ありがとうございました。


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

Name: たかぎ [URL]  ..ハッカー(205,448ポイント)   Date: 2010/06/12(土) 00:15   No:54070     
Title: Re:プログラマの数学について    
> 子供が「加法定理」って何?って聞かれたときにスラスラ言えるとかっこいいですけどねw

証明できるかどうかはともかく、加法定理が何かぐらい子供に説明できないと恥ずかしいですよ。
第一、何かわからない定理は使うことすらできません。
例えば、「清宮の定理」という言葉を聞いて、それが何か分からなければ何の応用価値もありませんよね。それといっしょです。

加法定理に限らず、どんな定理でもそうですが、それを証明する機会より利用する機会が多いことは間違いありません。
けれども、定理を証明できるのであれば、証明の過程で得た知見をいかすことで、類似の命題に対して応用がききます。
これが大事なのです。

プログラミングでも同じことで、汎用の関数やクラス(例えば標準ライブラリに含まれるようなもの)というのは、実装するより利用する機会のほうが圧倒的に多いのですが、実際に内部を理解しておく(できれば自分で実装してみる)と、応用力が格段に高まることは間違いありません。

こうしたプリミティブな内容の理解や実装経験を積まなければ、結局は既存のもののパッチワークしかできなくなってしまいます。
もちろん、目先の問題としてそれでもよいでしょう。一度にすべてを理解することは困難ですし、現実的でもありません。
けれども、理解する努力をするのと、理解を放棄して有り物を組み合わせるだけに徹するのでは、将来的にその人の実力の限界に大きな差を生じます。


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

Name: たいちう  ..比類無きプログラマー(94,068ポイント)   Date: 2010/06/12(土) 00:39   No:54072     
Title: Re:プログラマの数学について    
> 加法定理の方の応用を勉強したいと思います。プログラムのほうに力をいれていきたいと思います。

匿名さんの考えとは違うのですが、理解できないと応用はできないのです。
加法定理をブラックボックスとみなして、使い方だけ何通りか覚えることは可能ですが、
覚えた使い方以外の事、すなわち、応用は期待できないでしょう。

また、今高校2年生との事ですが、加法定理程度のものを理解不能なブラックボックスとしてしまうと、
たろうさんの数学の世界はたいそう暗いものになってしまいますよ。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,205,400ポイント)   Date: 2010/06/12(土) 00:54   No:54073     
Title: Re:プログラマの数学について    
ブラックボックス化してしまうと、勉強も楽しくなくなっちゃうんですよね。
意味も解らず計算に使うと、計算結果も「コレ何が出たの?」って状態になって魅力を感じなくなると思います。

プログラムにおいては、計算結果が出ればいいって場合があるでしょうから、魅力はそこに感じなくてもいい場合もあるかもしれませんが、
数学をエンジョイするなら、やはり何故?何故?と意欲的に理解を深める必要があるでしょう。

私の経験で言うと、初めて行列計算を習った時、
何の為にこんな変な掛け算の仕方をしなければならないのか、全く理解できず、
先生に聞いても特に何に使うのか教えてくれず、
何の魅力も感じませんでした。

しかし大学で線形代数を学んでからやっとその意味が解り、面白くなりました。
そのうちブラックボックス化しないとやってられない分野にも遭遇するでしょうから若いうちはなるべくブラックボックスにしない事が望ましいですねぇ・・。


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

Name: たかぎ [URL]  ..ハッカー(205,520ポイント)   Date: 2010/06/12(土) 00:59   No:54074     
Title: Re:プログラマの数学について    
> 先生に聞いても特に何に使うのか教えてくれず、 
> 何の魅力も感じませんでした。

これはありますね。
私は学校で教えるときには、ざっと概要を説明した後、「これが使えると、どんなおいしいことがあるのか」ということを話すようにしています。
三角関数や行列のような数学もそうですし、ポインタとか再帰呼び出しなどのプログラミング的なこともそうです。


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

Name: 匿名  ..上級者(24,670ポイント)   Date: 2010/06/12(土) 01:07   No:54075     
Title: Re:プログラマの数学について    
>私の経験で言うと、初めて行列計算を習った時、 
>何の為にこんな変な掛け算の仕方をしなければならないのか、全く理解できず、 
>先生に聞いても特に何に使うのか教えてくれず、 
>何の魅力も感じませんでした。 
その理由は教科書のまえがきに書いてあるから
あえてその先生は自分で調べさせるために何も教えなかったんじゃないかな。
良い先生ですね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,205,124ポイント)   Date: 2010/06/12(土) 01:23   No:54076     
Title: Re:プログラマの数学について    
そうでしょうか。数Cの教科書が手元に無いのでわかりませんが、
数学の導入ページに書いてあることなんて、せいぜいwikiに書いてある事位じゃないでしょうか。
それが具体的に何に応用出来て、どういう魅力があるのかなんて、解るように書いてあったかな・・。

wiki引用
数学において、行列(ぎょうれつ、matrix)とは、ある固定された環の元を矩形(長方形)状に並べたものである。特に、すべての成分が実数の行列を実行列、すべての成分が複素数の行列を複素行列という。
同じサイズの行列の集合はアーベル群の構造を持ち、更に同じサイズの正方行列全体はひとつの環をなすので、行列の集合それ自体が代数学の対象である。また、行列は線形写像の表示手段として数学の様々な場面で現れ、数学を道具とする自然科学や工学の各分野でも基本的な道具としての位置を占める。
行列の起源は連立一次方程式の解法にある。例えば、加減法とも呼ばれる方程式の解法を定式化したものとして行列の基本変形や、それによるガウスの消去法などのアルゴリズムが挙げられる。これは三角化・対角化や逆行列の計算などに広範に適用できる。


まぁもっと砕いてあるかも知れませんが、似たような説明を高校生が見て魅力を持つとは思えません・・。

仮に何か書いてあったとしても、それを教えてくれない先生は良い先生とは思わないです。
少なくとも自分で調べる力を付けさせたいとは思っていない、
思っていたら
「調べてみよう、調べて解らなかったら聞きにおいで」とか
「教科書のどこかにそれが書いてあるからみてごらん」とか何か言ってくれると思います。

先生ならその分野に興味を持たせるような何らかのサポートをしてほしいものです。
数学を好きにしようとしてくれる先生は実際少ないですよねぇ。


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

Name: たろう  ..プログラマー(25,123ポイント)   Date: 2010/06/12(土) 01:25   No:54077     
Title: Re:プログラマの数学について    

たかぎさん回答ありがとうございます。
>証明できるかどうかはともかく、加法定理が何かぐらい子供に説明できないと恥ずかしいですよ。
加法定理とは角度と角度を足したときに求まる(x,y)というものとこんな感じにいえばよいのでしょうか?

たいちうさん回答ありがとうございます。
加法定理とは角度と角度を足したときに求まる(x,y)というものとこんな感じにいえばよいのでしょうか?
Dixq (管理人)さん
回答ありがとうございます。
なんとかして理解しようと思います。
加法定理とは角度と角度を足したときに求まる(x,y)というものとこんな感じにいえばよいのでしょうか?
という答えではダメでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(205,578ポイント)   Date: 2010/06/12(土) 01:29   No:54078     
Title: Re:プログラマの数学について    
> 加法定理とは角度と角度を足したときに求まる(x,y)というものとこんな感じにいえばよいのでしょうか? 

本当に理解できていますか?
せめて、「2つの角度の和に対する正弦・余弦・正接を、もとの角度の正弦・余弦・正接を用いて表すやりかた」ぐらいのことをいってください。
 編集済み


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

Name: たかぎ [URL]  ..ハッカー(205,686ポイント)   Date: 2010/06/12(土) 01:34   No:54079     
Title: Re:プログラマの数学について    
> 数Cの教科書

学校の教科書は出版社によってかなり異なります。
数学の教科書は、歴史なんかに比べればずっとましですが、それでも「まえがき」なんか、余計なことさえ書かなければ何を書いてもよいので、一般論として取り上げられるようなものではありません。


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

Name: たろう  ..プログラマー(25,180ポイント)   Date: 2010/06/12(土) 01:40   No:54080     
Title: Re:プログラマの数学について    
せめて、「2つの角度の和に対するsin(a)・cos(a)を、もとの角度のsin(a')・cos(a')を用いて表すやりかた」ぐらいのことをいってください。
ということでしょうか?


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

Name: たいちう  ..比類無きプログラマー(94,204ポイント)   Date: 2010/06/12(土) 01:54   No:54082     
Title: Re:プログラマの数学について    
どう言ったらよいでしょうか?ではないのです。
理解度に応じた表現が出来るはずですので理解度を高めて下さい。
表現力のみを磨こうというのは間違ってます。


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

Name: たろう  ..プログラマー(25,212ポイント)   Date: 2010/06/12(土) 02:04   No:54083 解決!     
Title: Re:プログラマの数学について    
回答ありがとうございます。
理解度を高めるよういきたいと思います。
ありがとうございました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,205,806ポイント)   Date: 2010/06/12(土) 02:16   No:54084     
Title: Re:プログラマの数学について    
コメント一つ内にマルチポスト状態・・^^;

えぇと、
「角度と角度を足したときに求まる(x,y)」という表現が微妙なので・・
ちょっと図を作ってみました。



角度aに対して、図の部分、sin aになりますよね。



赤四角の部分は更にcos bしたものですよね?
ということで、ここは、sin a*cos bになります。



一方で、角度aに対して図の部分、cos aになりますよね。



赤四角の部分は更にsin bしたものですよね?
ということで、ここは、cos a*sin bになります。



2つ足し合わせると、a+bのsinが求まるという事です。なので、

sin(a+b) = sin a*cos b + cos a*sin b

となるという事です。


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

Name: a  ..かけだし(1,507ポイント)   Date: 2010/06/12(土) 02:22   No:54085     
Title: Re:プログラマの数学について    
>たかぎさん

日本の公立の高校数学では数研出版が一般的でしょう。
むしろ数研出版を知らない子供がいたら珍しいですね。

「余計なことさえ書かなければ何を書いてもよい」
という根拠のソースが全くないので事実かどうかは不明ですが、
あくまでも高等学校向けの文部科学省検定済教科書なのにそれだと問題でしょう。
全国の子供が使う教科書でまえがきが適当に書かれてて
それを真にうけとめる子供がいたとしたら(ry


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

Name: たかぎ [URL]  ..ハッカー(206,297ポイント)   Date: 2010/06/12(土) 02:55   No:54086     
Title: Re:プログラマの数学について    
> 日本の公立の高校数学では数研出版が一般的でしょう。 
> むしろ数研出版を知らない子供がいたら珍しいですね。 

数研が多いのは確かでしょうね。
# 私のときもそうでしたし。
ただ、他の教科書がないわけではありませんので、数研を使っているのが当たり前のような主張は正しくないでしょう。

> 「余計なことさえ書かなければ何を書いてもよい」 
> という根拠のソースが全くないので事実かどうかは不明ですが、 
> あくまでも高等学校向けの文部科学省検定済教科書なのにそれだと問題でしょう。 

高等学校教科用図書検定基準によると、

   [数学科]

1 範囲及び程度
(1) 「数学B」及び「数学C」においては,学習指導要領に示す項目のすべてを取り上げていること。
(2)  「数学C」においては,必要な限りにおいて数学科の他の科目の内容を関連付けて扱っても差し支えないこと。 
2 選択・扱い及び組織・分量
(1) 定理,公式等の知識や計算技能の習得に偏ることなく,各学習内容について,そのねらい,有用性及び前後の学習内容との関連が明らかになるよう配慮されていること。

ですので、必要なことが盛り込まれてさえいれば、まえがきには「一所懸命書いたので、しっかり勉強してください」といった趣旨のことしか書いていなくても基準は満たします。
学習指導要領にある目標を盛り込むのが正攻法だとは思いますが、それをまえがきに書かないといけないとは決まっていませんね。

> 全国の子供が使う教科書でまえがきが適当に書かれてて 
> それを真にうけとめる子供がいたとしたら(ry

だから余計なことは書いたらダメなんです。
先ほどの検定基準にも、

 第2章 各教科共通の条件
1 範囲及び程度
(1) 高等学校学習指導要領(平成11年文部省告示第58号。以下「学習指導要領」という。)に示す教科及び科目の「目標」(以下「学習指導要領に示す目標」という。)に従い,学習指導要領に示す科目の「内容」(以下「学習指導要領に示す内容」という。)及び「内容の取扱い」(「各科目にわたる 指導計画の作成と内容の取扱い」及び「各科目にわたる内容 の取扱い」を含む。以下「学習指導要領に示す内容の取扱い」 という。)に示す事項を不足なく取り上げていること。

(2) 本文,問題,説明文,注,資料,作品,挿絵,写真,図など教科用図書の内容(以下「図書の内容」という。)には,学習指導要領に示す目標,学習指導要領に示す内容及び学習指導要領に示す内容の取扱いに照らして,不必要なものは取り上げていないこと。
(3) 図書の内容は,生徒の心身の発達段階に適応しており,その能力からみて程度が高過ぎるところはないこと。

とありますから。
もっとも、歴史教科書とかには、余計なことが書かれているケースが多々あるわけですが...
 編集済み


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

Name: たろう  ..プログラマー(25,274ポイント)   Date: 2010/06/12(土) 22:16   No:54150     
Title: Re:プログラマの数学について    
Dixq (管理人)さん回答ありがとうございます。わかりやすかったです。
これを活かししていきたいと思います。
それとプログラムでわからないことができたので。
新規投稿します。


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



Name: 大学生  ..入門者(2,726ポイント)   Date: 2010/06/12(土) 13:04   No:54109       
Title: int型char型間の型変換について    
四則演算を実行する電卓機能を持ったプログラムを作成しています。
その過程で、計算結果の値(int型)をスタック(char型で宣言)に格納する必要性が出てきました。
char型のスタックに格納するためには、計算結果の値をchar型に変換しなくてはなりません。
しかし、キャスト(このように:(char)answer)すると、容量(?)がchar型<int型のためか値が正しく保持されませんでした。
また、itoa関数というものも使ってみましたが、使用しているOSがLinuxのため、itoaが定義されてないとのエラーが表示されうまく機能しません。
他にint型からchar型へ型変換する方法はありますか?
やはりchar型<int型の関係から不可能なのでしょうか・・・。

回答お願いします。
コンパイラはgcc使用です。


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


Name: y  ..初心者(5,552ポイント)   Date: 2010/06/12(土) 13:16   No:54112     
Title: Re:int型char型間の型変換について    
整数値の計算をするだけならば、スタックをchar型で作る意味はありません。
配列でスタックを作っているのか、それともmallocで作っているのかは分かりませんが、
素直にint型で作ることをおすすめします。



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

Name: たかぎ [URL]  ..ハッカー(206,378ポイント)   Date: 2010/06/12(土) 13:18   No:54113     
Title: Re:int型char型間の型変換について    
> 他にint型からchar型へ型変換する方法はありますか? 

結局どうしたいのかがわかりませんが、普通はキャストしかありません。
情報が失われるのが嫌なら、sizoef(int)個のchar変数または配列を使うしかないでしょう。


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

Name: やんち [URL]  ..かけだし(1,902ポイント)   Date: 2010/06/12(土) 13:20   No:54114     
Title: Re:int型char型間の型変換について    
発想を逆転して、char 型のスタックの方を int 型にみたてるとどうでしょう。


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

Name: hoge  ..入門者(4,117ポイント)   Date: 2010/06/12(土) 13:21   No:54115     
Title: Re:int型char型間の型変換について    
256以上の値は char型のスタックには入りません。
多くの場合、128以上でもオーバーフローするでしょう。
そのスタックを使う限り、キャストしようが変換しようが同じです。

もしそれでもやりたいのならば、intをchar配列にエンコード、デコードしてpush pop するしか無いでしょう。


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

Name: 白い時空  ..ぴよぴよ(64ポイント)   Date: 2010/06/12(土) 14:38   No:54121     
Title: Re:int型char型間の型変換について    
すいません。ひとつ気になったんですが、itoa関数はint型をchar *型(文字列)に変換します。
もしかして、123→"123"のように数値を文字列に変換したいんですか?


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

Name: box  ..ハッカー(154,490ポイント)   Date: 2010/06/12(土) 17:50   No:54124     
Title: Re:int型char型間の型変換について    
> その過程で、計算結果の値(int型)をスタック(char型で宣言)に格納する必要性が出てきました。

そうする必要がある理由がわかりません。


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

Name: 大学生  ..入門者(2,882ポイント)   Date: 2010/06/12(土) 19:10   No:54125     
Title: Re:int型char型間の型変換について    
皆様ご回答ありがとう御座います。
int型のスタックを用意してやってみることにします。

白い時空様、
はい、数値→文字列、です。
すみません、私の親記事の書き方だと数値→文字1文字となってしまいますね・・・。

box様、
括弧付き演算式(例:12*(3+15))の実現のためです。
括弧内を計算してその結果をスタックにプッシュしたくて。
説明不足申し訳ありません。


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

Name: 白い時空  ..ぴよぴよ(185ポイント)   Date: 2010/06/12(土) 20:18   No:54129     
Title: Re:int型char型間の型変換について    
数値→文字1文字はおかしいと思ったらやはりそうでしたか。
数値を文字列にするのは簡単ですよ。sprintf関数を使ってください。

たとえば文字列strに "12*(3+15)" を入れたいなら
sprintf(str,"%d*(%d+%d)",12,3,15);
とすればOKです。

第1引数に文字列をいれ、第2引数からはprintf関数と同じように扱ってください。
結果を画面に出力するのではなく、文字列に入れてくれます。


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

Name: 大学生  ..入門者(2,966ポイント)   Date: 2010/06/12(土) 22:10   No:54149 解決!     
Title: Re:int型char型間の型変換について    
白い時空様、
ありがとうございます!!
sprintf関数を使ったところ上手く数値→文字列に出来ました。
これでchar型スタックのままプログラムを書けそうです。

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



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



Name: Ultimate  ..入門者(3,108ポイント)   Date: 2010/06/10(木) 18:44   No:53924       
Title: 三角関数    
さっき質問が解決したばかりでまたすぐに投稿ですみません。

弾幕の円形のショットに、三角関数が必要なようです。

龍神録をやっている途中ですが、以前作りかけていたインベーダーに円形ショットなどの弾幕のような機能を追加して練習したいです。

僕は、今中2で、学校では公立より進んだ勉強をしているようですが、さすがにまだ三角関数までは進んでいません。

さっきから、http://www8.plala.or.jp/ap2/suugaku/sankakukansuunoshoho.htmlを読んで三角関数がなんとなくわかってきた感じです。

このサイトの内容が理解できれば、円形に図形を絵画できるようになる知識は身につくでしょうか?

もっとよい、また何の知識もなくてもわかるサイトがあったら教えてください。

Googleで検索して、はじめのほうのものの中でわかりやすかったのがそのページです。

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


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


Name: たかぎ [URL]  ..ハッカー(203,465ポイント)   Date: 2010/06/10(木) 18:53   No:53928     
Title: Re:三角関数    
三角関数を勉強したいのであれば、やはり高校の教科書か参考書が一番です。
学校の図書室とかにもあると思いますし、数学の先生に相談するのもよいと思いますよ。


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

Name: Ultimate  ..入門者(3,136ポイント)   Date: 2010/06/10(木) 19:00   No:53929     
Title: Re:三角関数    
中高一貫校ですので、図書館には高校の教科書もあるので、探して借りてみようと思います。 編集済み

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

Name: Ultimate [URL]  ..入門者(3,450ポイント)   Date: 2010/06/10(木) 19:41   No:53932     
Title: Re:三角関数    
三角関数のsinとcosの求め方とhttp://shigihara.hp.infoseek.co.jp/sin21.htmhttp://shigihara.hp.infoseek.co.jp/sin22.htmは完全に理解できました。

円形ショットはこれ以外に具体的に何を使いますか?


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

Name: たかぎ [URL]  ..ハッカー(203,496ポイント)   Date: 2010/06/10(木) 19:43   No:53934     
Title: Re:三角関数    
念のために確認しますが、弧度法は理解されていますか?


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

Name: Ultimate  ..入門者(3,467ポイント)   Date: 2010/06/10(木) 20:06   No:53936     
Title: Re:三角関数    
いいえ、知りません。

それは三角関数関係の内容ですか?


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

Name: たかぎ [URL]  ..ハッカー(203,633ポイント)   Date: 2010/06/10(木) 20:15   No:53937     
Title: Re:三角関数    
> いいえ、知りません。 

確認しておいて正解ですね。

> それは三角関数関係の内容ですか?

三角関数をはじめ、数学や物理で角度を扱う場合は弧度法を使います。
具体的には、45°や90°のような度数法による単位ではなく、π/4ラジアンやπ/2ラジアンのように角度の単位にラジアンを使います。

ラジアンという単位は、半径と弧の長さが等しくなるときの中心角を1ラジアンとします。
つまり、360°は2πラジアンですし、180°はπラジアンになります(円周は2πrなので)。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,204,558ポイント)   Date: 2010/06/10(木) 20:23   No:53940     
Title: Re:三角関数    
習ってないのにこの辺を理解するのは難しいですよね〜^^;

ラジアンってなんだ・・?みたいに私なら成ると思います・・。

・孤度法
・度数法
・ラジアン
・円周率

この辺のキーワードで調べてみるといいと思います。


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

Name: Ultimate  ..入門者(3,620ポイント)   Date: 2010/06/10(木) 20:27   No:53941     
Title: Re:三角関数    
http://w3e.kanazawa-it.ac.jp/math/category/sankakukansuu/henkan-tex.cgi?target=/math/category/sankakukansuu/kodohou.html

と、たかぎさんとDixqさんの回答を参考に、弧度法と度数法についてある程度理解しました。

中心角は弧度法であらわすのですね。

度数法から弧度法に変換はできるようになりました。

結構スムーズに理解できています。 編集済み


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

Name: たかぎ [URL]  ..ハッカー(203,700ポイント)   Date: 2010/06/10(木) 20:29   No:53942     
Title: Re:三角関数    
> 習ってないのにこの辺を理解するのは難しいですよね〜^^;

定義そのものを理解することは特に問題ないはずです。
問題なのは、弧度法を使うとどんな利点があるのかを理解しにくいことです。
弧度法の利点を理解するには、少なくとも微分法を習う必要がありますので、これはちょっと難関ですよね。


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

Name: Ultimate  ..入門者(3,634ポイント)   Date: 2010/06/10(木) 20:32   No:53943     
Title: Re:三角関数    
微分法というのも勉強したほうがいいのでしょうか?

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,204,685ポイント)   Date: 2010/06/10(木) 20:51   No:53945     
Title: Re:三角関数    
いやいや、微分積分を勉強し始めたら帰ってこれなくなります・・w
中学生で解けたらそれはそれでカッコイイかもしれませんが・・。

「プログラミングをする為に勉強する」と思って勉強したらたいして勉強できないと思いますし、
実際自分が行いたい事それだけに焦点を当てたら使う知識なんてしれいている場合が多いと思います。

また、関数というものは最初は「使い方だけ解れば理屈なんてどうでもいい」という気軽な姿勢でドンドン使って行くことも大事だと思います。
概要を把握できたら手当たり次第にプログラムを書いてみてはどうでしょう。


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

Name: Ultimate  ..入門者(3,826ポイント)   Date: 2010/06/10(木) 21:09   No:53946     
Title: Re:三角関数    
わかりました。

ところで、この三角関数を利用して、弾幕風な円形ショットを表示するにはどのような手順でしょうか?

まだ、三角関数に慣れていなく、使ったことがないので、表示手順を教えてください。

ソースは自分で考えてやりたいです。

(わからなかったら質問してヒントをもらいます。)

たとえば、円形の球を上に発射だとすれば、

「円を表示し、だんだんにY座標を0に近づけて画面をクリアーし、・・・をループ」

のように言葉での説明をもらえるとうれしいです。 編集済み


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

Name: Ultimate  ..入門者(3,970ポイント)   Date: 2010/06/10(木) 21:33   No:53948     
Title: Re:三角関数    
何がわからないのかを具体的に書いておきます。

三角関数の練習なので、1つのcppだけで考えていただけると嬉しいです。

似たような内容のソースを見てみると、まずはθの値を決めているような感じでした。

その後たぶん三角関数を使うのですよね。

そこまではわかっています。

ただ、for文などでループさせてx,yの値を得る方法がわかりません。


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

Name: fatens  ..中級者(11,571ポイント)   Date: 2010/06/10(木) 23:23   No:53962     
Title: Re:三角関数    
半径1の円上の点をP(x, y)とします。
このとき、点Pとx軸とのなす角をθとすると、x, yの値は何になるでしょうか?
また、半径が5のときはどうなるか分かりますか?


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

Name: シエル  ..入門者(3,048ポイント)   Date: 2010/06/10(木) 23:33   No:53966     
Title: Re:三角関数    
下記のページを参考にしてはいかが?
http://dixq.net/s/26.html


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

Name: たいちう  ..比類無きプログラマー(93,737ポイント)   Date: 2010/06/11(金) 00:36   No:53977     
Title: Re:三角関数    
たかぎさんも書いていますが、高校の数学を理解したいならば、
高校の教科書が一番の近道ですよ。

教科書の執筆・編集には莫大な手間と暇と金がかかっています。
教科書と聞くだけでアレルギー反応を起こす人もいるでしょうが、
莫大な手間と暇と金は判りやすくするために費やされていますので、
他の本やサイトとは比較になりません。


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

Name: Ultimate  ..入門者(3,985ポイント)   Date: 2010/06/11(金) 05:58   No:53988     
Title: Re:三角関数    
ありがとうございました。

教科書は土曜日に学校で見ようと思います。

今日は事情により、皆さんの回答に対して投稿がこれで最後になると思います。

明日はまた返事ができると思います。


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

Name: Ultimate  ..入門者(4,082ポイント)   Date: 2010/06/11(金) 22:51   No:54056     
Title: Re:三角関数    
たとえば、半径がわかっていて、中心角がθの時、sinθ,cosθは三平方の定理で比を出してこのサイトではやっています。

http://shigihara.hp.infoseek.co.jp/sin.htm

どのようにループさせて、sin,cosを出すのでしょうか?

そこを詳しく教えてください。

よろしくお願いします。


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

Name: MNS  ..プログラマー(35,101ポイント)   Date: 2010/06/11(金) 23:03   No:54058     
Title: Re:三角関数    
質問の意味がよく分かりませんね…。
例えば、弾の座標が(x, y)であるとき、
角度θで大きさ(半径?)1 の分、移動したら、
弾の座標はなんと書けるか分かりますか?


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

Name: Ultimate  ..入門者(4,430ポイント)   Date: 2010/06/11(金) 23:09   No:54059     
Title: Re:三角関数    
すみません、言葉足らずでした。

質問内容は、お察しの通りです。

やりたいのは、球を18個用意し、角度20度ずつ(ここではラジアンを使ったほうがいいのでしょうか?)大きく設定し、円形に球を飛ばしたいのです。

目標:http://sinkai.net/rp/4.php

θは、順に0度、20度・・・で球のx,yを出したいです。

三角関数は何度なく分かる程度で、なかなかどうしていいか思いつかないので、回答お願いします。 編集済み


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

Name: Ultimate  ..入門者(4,438ポイント)   Date: 2010/06/12(土) 21:27   No:54136     
Title: Re:三角関数    
ありがとうございました。

続きの質問は新しくしようと思います。


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

Name: Ultimate  ..入門者(4,939ポイント)   Date: 2010/06/12(土) 21:51   No:54141 解決!     
Title: Re:三角関数    
ここで解決にします。

新しい質問もよろしくお願いします。


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



Name: 胡椒  ..中級者(9,238ポイント)   Date: 2010/06/10(木) 23:18   No:53961       
Title: グローバル変数とstaticについて    
void game_con(){
   static int a=1;
    switch(a){
        case 1:
            if(CheckStateKey(KEY_INPUT_X) == 1 )++con_f;
            break;
        case 2:
            if(CheckStateKey(KEY_INPUT_X) == 1 )con_f++;
            break;
        case 3:
            if(CheckStateKey(KEY_INPUT_Y) == 1)con_f=1;
            break;
        default:
            break;
    }
}
というコードにおいて、aの初期値は1です。
ここでXを押すとaの値が一気に3まで増えてしまいます。
aをグローバル変数とし

int a=1;
void game_con(){
    switch(a){
        case 1:
            if(CheckStateKey(KEY_INPUT_X) == 1 )++con_f;
            break;
        case 2:
            if(CheckStateKey(KEY_INPUT_X) == 1 )con_f++;
            break;
        case 3:
            if(CheckStateKey(KEY_INPUT_Y) == 1)con_f=1;
            break;
        default:
            break;
    }
}
というコードとすると、一度Xを押すとaの値は2となり、もう一度Xを押すと3となります。

これはどうしてなのでしょうか?


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


Name: fatens  ..中級者(11,587ポイント)   Date: 2010/06/10(木) 23:25   No:53964     
Title: Re:グローバル変数とstaticについて    
提示されたコードからはaの値が変化するとは思えませんが...


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

Name: シエル  ..入門者(3,020ポイント)   Date: 2010/06/10(木) 23:32   No:53965     
Title: Re:グローバル変数とstaticについて    
記載しているコードからはaの値を変化させるようなコードはないと思います。
変化するとしたら、con_fという変数ぐらいだと思います。

この関数外でcon_fをaに代入したり、足してたりするのでしょうか?


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

Name: 胡椒  ..中級者(9,601ポイント)   Date: 2010/06/10(木) 23:46   No:53967     
Title: Re:グローバル変数とstaticについて    
すみませんコードを変えて記載したので、いろいろ間違ってました(汗)
正しくは
void game_con(){ 
   static int a=1; 
    switch(a){ 
        case 1: 
            if(CheckStateKey(KEY_INPUT_X) == 1 )a++; 
            break; 
        case 2: 
            if(CheckStateKey(KEY_INPUT_X) == 1 )a++; 
            break; 
        case 3: 
            if(CheckStateKey(KEY_INPUT_Y) == 1)a=1; 
            break; 
        default: 
            break; 
    } 



 
int a=1; 
void game_con(){ 
    switch(a){ 
        case 1: 
            if(CheckStateKey(KEY_INPUT_X) == 1 )a++; 
            break; 
        case 2: 
            if(CheckStateKey(KEY_INPUT_X) == 1 )a++; 
            break; 
        case 3: 
            if(CheckStateKey(KEY_INPUT_Y) == 1)a=1; 
            break; 
        default: 
            break; 
    } 

でした。
申し訳ないです・・・


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

Name: fatens  ..中級者(11,628ポイント)   Date: 2010/06/10(木) 23:56   No:53968     
Title: Re:グローバル変数とstaticについて    
game_con 関数がどのように呼び出されているのか分かりませんので、
その部分のコードも提示していただけますか。


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

Name: シエル  ..入門者(3,100ポイント)   Date: 2010/06/11(金) 00:09   No:53972     
Title: Re:グローバル変数とstaticについて    
ループしている中でこの関数が呼び出されているとしたら、
キーを押しっぱなしにしている時間が関係してるのではないかと。


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

Name: 胡椒  ..中級者(9,897ポイント)   Date: 2010/06/11(金) 00:23   No:53974     
Title: Re:グローバル変数とstaticについて    
この関数はゲームのコンフィング関係の関数なので、
ゲームタイトルで
http://dixq.net/g/36.html
を参考にして移動制御しmenuの値を決め

int title_flag=1

if(title_flag>0){
if( CheckStateKey(KEY_INPUT_X) == 1 ){
 switch(menu)
        {
        case 0:
            break;
    case 1:
            confing_flag=1;
            title_flag=0;
            break;
    case 2:
            break;
        case 3:
            DxLib_End();
            break;
        default:
            break;
        }
}
と置き、menuが1の状態の時にXを押すとconfing_flag=1;となり、それによって
if(confing_flag>0){
        game_con();
    }
というふうに呼び出してます。
上の関数をさらにmain関数ほうで呼び出しています。
こっちのmain関数はシエルさんがおっしゃる通り、龍神録のようなループの中で呼び出しています。

キーを押す長さは私自身がどんなに素早く押して放しても、結果は変わりませんでした・・・


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

Name: hoge  ..入門者(4,219ポイント)   Date: 2010/06/12(土) 13:28   No:54116     
Title: Re:グローバル変数とstaticについて    
グローバル変数と関数内のstatic変数は、関数の外から見えるかどうかの違いしかありません。
その変数の更新にかんする挙動が変わることはありません。
両者で挙動が違うとしたら、原因は別にあるはずです。


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

Name: シエル  ..入門者(3,666ポイント)   Date: 2010/06/12(土) 14:07   No:54120     
Title: Re:グローバル変数とstaticについて    
すべてのコードを見ないとなんともいえないです。
全コードアップしてくれたら、原因が分かるかもしれないです。


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

Name: dic  ..比類無きプログラマー(71,906ポイント)   Date: 2010/06/12(土) 20:40   No:54131     
Title: Re:グローバル変数とstaticについて    
>case 3:  
>            if(CheckStateKey(KEY_INPUT_Y) == 1)a=1;


KEY_INPUT_X
KEY_INPUT_X
KEY_INPUT_Y

の順になってますが
タイプミスしてませんか?

3になるのは当然に見えますが


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



Name: 寅之助  ..ぴよぴよ(601ポイント)   Date: 2010/06/11(金) 04:49   No:53986       
Title: アセンブラできる方いますか?    
アセンブラの勉強がしたいのでCで
#include <stdio.h>
int main(void)
{
printf("hello");
}
という入門書一ページ目レベルのものを作成し、
OllyDbgでアセンブラコードを見てみましたが
まったく理解不能でした。

Cではたかが5行程度ですがアセンブラだと
100行超えますね。。。

Cだってどうせコンパイルするときに
一度アセンブラに落ちるわけですから
アセンブラなんか使うより
最初からCを使ったほうがいいのではないですか?

アセンブラができる方はどのように勉強したのでしょう?
本屋とかに言ってもなぜかアセンブラの本はあまり目に付きません。

どこか詳しくかつ簡単に記載してあるサイトないでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(204,044ポイント)   Date: 2010/06/11(金) 07:35   No:53992     
Title: Re:アセンブラできる方いますか?    
> Cだってどうせコンパイルするときに 
> 一度アセンブラに落ちるわけですから 
> アセンブラなんか使うより 
> 最初からCを使ったほうがいいのではないですか? 

アセンブリ言語でなければ記述できないものがあります。
例えば、プログラムの起動直後にスタックポインタを設定する必要がありますが、これをCで記述することは原則として不可能です。
あるいは、マルチスレッドを実現するためにはコンテキストの切り替えが必要になりますが、これをCで実現することも原則として不可能です。
他にも、割り込みハンドラの記述やレジスタを直接操作するような処理を書くにはアセンブリ言語が不可欠になります。

> アセンブラができる方はどのように勉強したのでしょう? 

どのようにといわれても、アセンブリ言語もCも基本的には勉強方法は変わりません。
一つアドバイスするとすれば、いきなりIA-32とかからやろうとすると挫折しますので、8ビットかせいぜい16ビット程度のマイコンから勉強する方が、場合によっては今やりたいことから見れば遠回りだと感じるかもしれませんが、結局は近道になります。

> どこか詳しくかつ簡単に記載してあるサイトないでしょうか?

半導体メーカーのサイトに行けば、ハードウェアマニュアル、ソフトウェアマニュアル、アプリケーションノートなどのドキュメントが公開されているはずです。
ただし、有効活用するには、コンピュータや電子工学に関する最低限の知識は必要になります。
 編集済み


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

Name: ookami  ..上級者(24,457ポイント)   Date: 2010/06/11(金) 07:43   No:53994     
Title: Re:アセンブラできる方いますか?    
ちょっと前まではコンパイラにも至らないところが多く、「アセンブラで書いた方が確実だし動作も速い」って事があったそうです。

最近ではコンパイラの性能も上がり、
> 最初からCを使ったほうがいい
という場合がほとんどのようです。

調べるなら大きめの図書館とか…ですかね。
ところでなぜアセンブラを勉強したいのですか?


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

Name: 寅之助  ..ぴよぴよ(649ポイント)   Date: 2010/06/11(金) 12:56   No:53999     
Title: Re:アセンブラできる方いますか?    
>たかぎさん
私はハード系にはホントに疎いのですが
それでも勉強できますでしょうか?

>ookamiさん
ゲームなどの解析をしたいのです。


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

Name: たかぎ [URL]  ..ハッカー(204,196ポイント)   Date: 2010/06/11(金) 13:00   No:54000     
Title: Re:アセンブラできる方いますか?    
> 私はハード系にはホントに疎いのですが 
> それでも勉強できますでしょうか? 

ハードウェアを避けるつもりならアセンブラには手をだすべきではありません。
現在疎いのであれば、これから勉強すればよいだけのことです。


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

Name: 寅之助  ..ぴよぴよ(722ポイント)   Date: 2010/06/11(金) 13:03   No:54001     
Title: Re:アセンブラできる方いますか?    
>現在疎いのであれば、これから勉強すればよいだけのことです。 
具体的には何を勉強すればいいのですか?
ハードというとどうしても自作PCとかを想像してしまうのですが・・・


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

Name: たかぎ [URL]  ..ハッカー(204,280ポイント)   Date: 2010/06/11(金) 13:18   No:54002     
Title: Re:アセンブラできる方いますか?    
> 具体的には何を勉強すればいいのですか? 

最低限、回路図が読めるようになりましょう。
多くの書店では、プログラミング関係と比較的近い棚にハードウェアの入門書があるはずです。

> ハードというとどうしても自作PCとかを想像してしまうのですが・・・

無意味とはいいませんが、自作PCではアセンブラの勉強には直結しません。


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

Name: Dixq (管理人)  ..ウィザード(1,204,775ポイント)   Date: 2010/06/11(金) 16:48   No:54018     
Title: Re:アセンブラできる方いますか?    
自作PCとは全く関係ないですね…。ただパーツ買ってつけるだけで何の専門的知識もいらないです。


アセンブラを知るためにはまずCPUと回路の知識が不可欠です。
本屋さんでCPUの本にザッと目を通してみれば、今後勉強すべき事のイメージわいて来るんじゃないかと思います。


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

Name: 寅之助  ..ぴよぴよ(764ポイント)   Date: 2010/06/11(金) 19:01   No:54032     
Title: Re:アセンブラできる方いますか?    
自分で書けるようになれなくてもいいので
どんな処理が書かれているかみたなことだけでも
読めるようになりたいのです。

やはりハードの知識が必要でしょうか?


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

Name: YuO  ..熟練のプログラマー(46,512ポイント)   Date: 2010/06/11(金) 19:25   No:54034     
Title: Re:アセンブラできる方いますか?    
> やはりハードの知識が必要でしょうか?

私は,ハードの知識はアセンブラの勉強自体には不要だと思っています。
ただし,CPUの構成などの知識は必要になりますが。

個人的な経験として,PC-9801時代にMASM 6を使っていました。
しかし,ハードの知識はほとんど無く,あったのは,ハードをI/Oポートを通して見た場合の知識でした。
ゲーム云々ということですし,ユーザーモードで動かすアプリケーションであれば,現状でもそのような感じの知識で十分だと思います。
# どうせハードウェア叩けないですし。


ところで,ライセンスにリバースエンジニアリングの禁止条項は当たり前のように付いてきていると思うのですが……。


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

Name: ookami  ..上級者(24,582ポイント)   Date: 2010/06/11(金) 19:57   No:54038     
Title: Re:アセンブラできる方いますか?    
アセンブリコードは、極端に言えば、四則と代入とジャンプだけで書かれていて、数個しかないレジスタ(変数みたいなもの)を巧みに使いまわし、しかもコンパイラによる最適化がかかっていますから、元のソースコードからはいろんな意味で掛け離れています。

なので、「何のためにアセンブラを?」の答えが「ゲームでどんな処理が書かれているか」っていうのがちょっとピンと来ないのです。

人間ひとりひとりを観察して、「世界がどう動いているか考える」ようなものです。


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

Name: たかぎ [URL]  ..ハッカー(205,002ポイント)   Date: 2010/06/11(金) 20:26   No:54040     
Title: Re:アセンブラできる方いますか?    
寅之助さんは、

> ゲームなどの解析をしたいのです。

といわれていますが、どんなプラットフォームで、どんな素性のゲームを、なぜ解析したいのかを明確にしていません。
また、「など」に何が含まれているのかもわかりません。

PCのような環境であれば、ハードウェアの知識はそれほど必要ありませんが、そうでなければ、I/Oポートひとつ叩くにしても、それがトライステートなのかオープンドレインなのか、正論理なのか負論理なのかなど、回路図から読み取らなければならないことは多々あります。
割り込み制御にしても、割り込み信号がエッジなのかレベルなのかは回路図から読み取らなければなりません。
これらはCを使っても同じですが、わざわざアセンブリ言語を使うのは、多くの場合、このような低水準な制御を行うためですからね。

また、解析といってもリバースエンジニアリングの話とは限らず、社内の既存のソースをメンテナンスするために解析するのかもしれませんし、自分で作ったプログラムの不具合を解析するのかもしれません。

そうした可能性を想定すれば、ハードウェアを理解することは不可欠です。

> 自分で書けるようになれなくてもいいので 
> どんな処理が書かれているかみたなことだけでも 
> 読めるようになりたいのです。 

では、そのプログラムが誰がどのようにして書いたものなのでしょうか?


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

Name: 寅之助  ..かけだし(1,167ポイント)   Date: 2010/06/12(土) 06:32   No:54093     
Title: Re:アセンブラできる方いますか?    
今さっきまで入門サイトのようなものを見て勉強してきました。
そこで1つ気になったのですが、

http://itpro.nikkeibp.co.jp/article/COLUMN/20070404/267378/?ST=slfsys
ここのサイトで使われてるアセンブラと
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
ここのサイトで使われてるアセンブラって同じですか?

上記のサイトだと
C言語で言う代入
a = 1;
はアセンブラだと
LD GR0,=1
と解釈したのですが、
下記のサイトでは
mov a,2
となりますよね?(五時間くらいしか見てないので違ってたらすみません。)

基本情報技術者などの情報処理系のアセンブラソースを見てみると
上記のサイトのような記述ですが、
>>1で記入したような自分で作ったC言語のハローワールドを逆アセすると
下記のサイトのような記述になってます。

これはどういうことでしょうか?

CとC++の違いみたいな感じでしょうか?


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

Name: toyo  ..熟練のプログラマー(49,003ポイント)   Date: 2010/06/12(土) 07:51   No:54095     
Title: Re:アセンブラできる方いますか?    
LDやらmovというアセンブラの命令をニーモニックといいますがニーモニックはCとは違いCPUによってまったく異なるということです
レジスタに値を入れるにもLD(loadでしょうか)やmov(moveでしょうね)など異なりますし
ジャンプ命令もJMPだったりbrc(branch)だったり
それぞれのCPUに対応したニーモニックを覚えないといけないのがアセンブラの面倒なところですね


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

Name: hoge  ..入門者(4,012ポイント)   Date: 2010/06/12(土) 13:06   No:54110     
Title: Re:アセンブラできる方いますか?    
一つ目のサイトは CASLというアセンブラでCOMETというCPUで動くものです。
これは実用的なものではなく情報処理試験などでしか見かけない簡易的なアセンブラです。
二つ目のサイトはx86という一般にもっともよく使われているCPUのものです。
他の人が書いているようにCPUによってアセンブラも変わります。
また同じCPUでも複数のアセンブラがあります。


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

Name: 寅之助  ..かけだし(1,031ポイント)   Date: 2010/06/12(土) 13:36   No:54118     
Title: Re:アセンブラできる方いますか?    
一言で「アセンブラ」と言ってもCPUによってアセンブラの種類が違うのですね。

それを聞くと厄介だと感じるようになりました。
アセンブラがハードと親密って言うのはそういうところなのでしょうか?

前者のサイトでレジスタなど勉強になりましが後者のサイトで使われるアセンブラにも関係するものなのでしょうか?
話しを聞くところ、私の目的とするアセンブラは後者のようですが、先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。


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

Name: たかぎ [URL]  ..ハッカー(206,396ポイント)   Date: 2010/06/12(土) 13:45   No:54119     
Title: Re:アセンブラできる方いますか?    
> 先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。

おそらく、まったく違うと答えた方が適切なのでしょうね。


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

Name: softya [URL]  ..ハッカー(180,269ポイント)   Date: 2010/06/12(土) 15:20   No:54122     
Title: Re:アセンブラできる方いますか?    
リバースエンジニアリングの件についてスルーされているのは気になりますが・・・。

>それを聞くと厄介だと感じるようになりました。
>アセンブラがハードと親密って言うのはそういうところなのでしょうか?

パソコン、家庭用ゲーム機毎、スマートフォンなど使われているCPUが全て違います。
なので、CPU毎にアセンブラ命令の記述方法は全く異なります。
代用可能な命令がない事もありますし、レジスタの数が全く違います。レジスタのビット数も違います。

>話しを聞くところ、私の目的とするアセンブラは後者のようですが、先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。

実のところ、入門者向けなCASLに比べてx86系はかなり命令が複雑です。
更に、C++などのプログラムをコンパイラが最適化していた場合は、元のプログラムの動きを理解する事は非常に難しく熟練を必要とします。一つ一つの命令は分かっても1つの関数として何をしている処理なのかを理解することは大変困難だと言う事になりますね。
とにかく、長大なx86アセンブラのゲームのコードなど不毛に労力が必要なので私は解析したくありません。


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



Name: M.N  ..ぴよぴよ(59ポイント)   Date: 2010/06/12(土) 12:31   No:54107       
Title: フォルダ内のソースをすべてコンパイルするには    
BORLAND  C++(BCC32)を使っています。特定のフォルダ内に例えば10個のソースコード
があるとして(独立したファイルです)これらをすべて同時にコンパイルするプログラムを書きたいのですが
どのようなプログラムを書けばよろしいでしょうか。


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


Name: たかぎ [URL]  ..ハッカー(206,318ポイント)   Date: 2010/06/12(土) 13:02   No:54108     
Title: Re:フォルダ内のソースをすべてコンパイルするには    
bcc32 ファイル1 ファイル2 ファイル3

のように、必要なだけファイルを並べればよいのでは?

> どのようなプログラムを書けばよろしいでしょうか。

system関数でも使って呼び出すのが簡単だと思います。


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

Name: M.N  ..ぴよぴよ(77ポイント)   Date: 2010/06/12(土) 13:31   No:54117     
Title: Re:フォルダ内のソースをすべてコンパイルするには    
すばやい対応に感謝します。
ありがとうございました。


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



Name: Mr. Wing  ..かけだし(1,704ポイント)   Date: 2010/06/12(土) 06:17   No:54090       
Title: 巡回セールスマン問題(by. GA)    
初めて投稿します. 実験レポートの課題です.
課題1が
Individual *create_generation(void) {
    return (Individual *)malloc(sizeof(Individual) * num_ind);
}
というのはわかったのですが, 課題2以降から手も足も出ず, 四苦八苦しています.  ほぼ丸投げのような状態で大変恐縮ですが, どうか皆さんのお力添えを頂きたく存じます.  長くなりますので, プログラム本体は別で投稿いたします.  長文で申し訳ないですが, 何卒宜しくお願い申し上げます. 
遺伝的アルゴリズムで巡回セールスマン問題を解く

・ 遺伝的アルゴリズムにおける処理の流れ
Step0: 巡回セールスマン問題を遺伝的アルゴリズムで解くための前処理(課題2)
        ↓
Step1: 親の世代に属する全個体と、子の世代に属する全個体を生成(課題1)
        ↓
Step2: 親の世代に属する各個体の遺伝子型(都市の巡回経路)、適応度を設定(課題3,4,5)
        ↓
Step3: 交叉(両親の遺伝子型を混ぜ合わせる)に参加する親(2個体)を選択(課題6,7)
        ↓
Step4: 交叉を実行し、子(2個体)の遺伝子型を仮決定(課題10)
        ↓
Step5: 子の遺伝子を突然変異させ(課題8)、子の遺伝子型を最終決定
        ↓
Step6: 複数の親に対してStep3-5を実行し、次世代の子(子の世代)を決定(課題11)
        ↓
Step7: 子を新たな親にする(copy_generation関数)
        ↓
Step8: 新たな親の世代で適応度が最大、最小の個体を決定(課題9)
        ↓
Step9: Step3へ (Step3-9の処理を1世代。これをN世代繰り返す)

・ 巡回セールスマン問題
課題は各都市を0から9で表し, 都市iと都市j間の距離をdouble型配列distの(i, j)要素に格納する(i, jは0から9).

・ 配列dist
     0     1     2      3     4     5     6     7     8     9   → j
 0  0.0   0.2   0.001  1.4   2.1   9.1   20.1  29.0  9.0   10.0
 1  0.2   0.0   45.5   1.0   0.1   0.01  22.1  2.1   0.1   120.0
 2  0.001 45.5  0.0    55.0  10.0  0.01  0.002 0.01  2.01  200.1 
 3  1.4   1.0   55.0   0.0   4.0   2.1   0.01  1.1   20.1  40.0
 4  2.1   0.1   10.0   4.0   0.0   22.1  90.0  22.0  1.0   1.0
 5  9.1   0.01  0.01   2.1   22.1  0.0   79.0  2.1   0.1   2.0
 6  20.1  22.1  0.002  0.01  90.0  79.0  0.0   0.1   4.1   0.01
 7  29.0  2.1   0.01   1.1   22.0  2.1   0.1   0.0   3.1   30.1
 8  9.0   0.1   2.01   20.1  1.0   0.1   4.1   3.1   0.0   10.1
 9  10.0  120.0 200.1  40.0  1.0   2.0   0.01  30.1  10.1   0.0
↓
i

・ 最短巡回経路
都市0→都市1→都市5→都市8→都市4→都市9→都市6→都市3→都市7→都市2→都市0

・ 巡回経路距離の例
ある個体のgenoが|0|2|3|5|1|9|4|7|8|6|のとき
セールスマンの巡回径路: 都市0→都市2→都市3→都市5→都市1→都市9→都市4→都市7→都市8→都市6(→都市0)
巡回経路距離 = dist[0][2] + dist[2][3] + dist[3][5] + dist[5][1] + dist[1][9] + dist[9][4] + dist[4][7] + dist[7][8] + dist[8][6] + dist[6][0]

・ 距離データファイル
データの区切り: ホワイトスペース
データの並びと距離データd[i][j]の関係:
・ 1行目から始める. i,jの初期値は0.  
・ 左端から右端に向けて, データがある毎にjを1ずつ増加する.
・ jがNum_City-1なったら, iを1増やし, jは0にする.
・ 行末まで来たら, 次の行の左端へ行く.

・ 距離データファイルの例(Num_City = 10)
   0.0   0.2   0.001  1.4   2.1   9.1   20.1  29.0  9.0   10.0   0.2
   0.0   45.5  1.0   0.1   0.01  22.1  2.1   0.1   120.0   0.001
   45.5  0.0   55.0  10.0  0.01  0.002 0.01  2.01  200.1
   1.4   1.0   55.0   0.0   4.0   2.1   0.01  1.1   20.1  40.0
   2.1   0.1   10.0   4.0   0.0   22.1  90.0  22.0  1.0   1.0    9.1   0.01
   0.01   2.1   22.1  0.0   79.0  2.1   0.1   2.0
   20.1  22.1  0.002  0.01  90.0  79.0  0.0   0.1   4.1   0.01
   29.0  2.1   0.01   1.1   22.0  2.1   0.1   0.0   3.1   30.1
   9.0   0.1   2.01   20.1  1.0   0.1   4.1   3.1   0.0   10.1
   10.0  120.0 200.1  40.0  1.0   2.0   0.01  30.1  10.1   0.0

・ 突然変異
二つの遺伝子(都市)をランダムに選び交換する操作
例.
         遺伝子2,6に突然変異
            ↓    ↓
遺伝子型: |0|2|4|3|6|1|7|5|8|9| → |0|6|4|3|2|1|7|5|8|9|
                      遺伝子(都市)2と6を交換

以上が課題の説明文です. 加えて, 適応度に関する画像も添付しておきます.


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


Name: Mr. Wing  ..かけだし(2,193ポイント)   Date: 2010/06/12(土) 06:27   No:54091     
Title: Re:巡回セールスマン問題(by. GA)    
/* 
** fitness = 1/巡回経路距離** コマンド行のオプション
** 第1オプション: 距離データ保存ファイルを指定
** 第2オプション: 出力用ファイルを指定
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

#define Num_City 10                // 全都市数

/* Individual型(Individual型のオブジェクト: 個体) */
typedef struct {
    unsigned short geno[Num_City]; // 遺伝子型: セールスマンが巡回する都市の経路
    double fitness;                // 個体の適応度: 個体が持つ遺伝子型(巡回経路)の優秀さ(巡回経路距離の短さ)を示す指標
} Individual;

/* グローバル変数 */
double dist[Num_City][Num_City]; // 2都市間の距離を納める配列
int num_ind;                     // 全個体数

/* 関数プロトタイプ宣言 */
int set_city(FILE *);
Individual *create_generation(void);
double sum(Individual *);
void set_geno(Individual *);
void set_fitness(Individual *);
void initialize_population(Individual *);
int compare(unsigned short, unsigned short, unsigned short *);
void bubble(unsigned short *, unsigned short *, unsigned short *);
void cross_over(Individual *, Individual *, Individual *, Individual *);
Individual *pick_up(Individual *, double);
void next_generation(Individual *, Individual *, double, double);
void copy_generation(Individual **, Individual **);
void statistics(Individual *, int *, int *);
void mutation(Individual *);


プログラム自体も長くなるので何度かに分けて投稿します.


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

Name: Mr. Wing  ..入門者(4,225ポイント)   Date: 2010/06/12(土) 06:29   No:54092     
Title: Re:巡回セールスマン問題(by. GA)    
int main(int argc, char *argv[]) {
    int i;
    int seed;           // 乱数の種
    int num_generation; // 世代数
    int imax;           // 適応度が最大の個体番号
    int imin;           // 適応度が最小の個体番号
    double sum_fitness; // 各個体の適応度の和
    double mu_rate;     // 突然変異率
    
    FILE *fl[2] = {NULL};
    char *mode[2] = {"r", "w"};
    char f_name[20] = {'\0'};
    char line[100] = {'\0'};
    
    Individual *old_pop = NULL; // 親の世代を指すポインタ
    Individual *new_pop = NULL; // 子の世代を指すポインタ
    
    /*  ファイルをオープン */
    if (argc == 3) {
        for (i = 0; i < argc - 1; ++i) {
            sprintf(f_name, "%s", argv[i + 1]);
            
            if ((fl[i] = fopen(f_name, mode[i])) == NULL) {
                printf("ファイルを開けません\n");
                return 1;
            }
        }
    } else {
        printf("コマンドオプションは2つです");
        return 1;
    }

    /* 個体数を入力(偶数−>親は二人必要) */
    printf("個体数を入力[偶数]:");
    if (fgets(line, sizeof(line), stdin) != NULL) {
        if ((sscanf(line, "%d", &num_ind) != 1) || (num_ind <= 0) || (num_ind % 2 != 0)) {
            printf("個体数の入力が正しくありません。");
            return 1;
        }
    } else {
        printf("個体数の入力でエラー。");
        return 1;
    }
    
    /* 世代数を入力 */
    printf("世代数を入力:");
    if (fgets(line, sizeof(line), stdin) != NULL){
        if ((sscanf(line, "%d", &num_generation) != 1) || (num_generation <= 0)){
            printf("世代数の入力が正しくありません。");
            return 1;
        }
    } else {
        printf("世代数の入力でエラー。");
        return 1;
    }
    
    /* 突然変異率を入力 */
    printf("突然変異率を入力[0以上1.0以下]:");
    
    if (fgets(line, sizeof(line), stdin) != NULL){
        if ((sscanf(line, "%lf", μ_rate) != 1) || (mu_rate < 0) || (mu_rate > 1)) {
            printf("突然変異率の入力が正しくありません。");
            return 1;
        }
    } else {
        printf("突然変異率の入力でエラー。");
        return 1;
    }
    
    /* 乱数の種を決める */
    printf("乱数の種を入力[整数値]:");
    if (fgets(line, sizeof(line), stdin) != NULL) {
        if (sscanf(line, "%d", &seed) != 1) {
            printf("乱数値の入力が正しくありません。");
            return 0;
        }
    } else {
        printf("乱数値の入力でエラー。");
        return 1;
    }
    
    /* 乱数の種を設定 */
    srand(seed);
    
    /* 親の世代の個体を生成 */
    if ((old_pop = create_generation()) == NULL) {
        printf("メモリを確保できません\n");
        return 1;
    }
    
    /* 子の世代の個体を生成 */
    if ((new_pop = create_generation()) == NULL) {
        printf("メモリを確保できません\n");
        return 1;
    }
    
    /* 都市間の距離データを入力 */
    if (set_city(fl[0]) == 1) {
        printf("ファイルからのデータ入力に失敗しました\n");
        return 1;
    }
    
    /* 親の個体を初期化(遺伝子型および適応度の設定) */
    initialize_population(old_pop); 
    
    for(i = 0; i < num_generation; ++i) {
        /* 親の世代における適応度(フィットネス)の合計値を計算 */
        sum_fitness=sum(old_pop); 
        
        /* 交叉により親の世代から子の世代を作る */
        next_generation(old_pop, new_pop, sum_fitness, mu_rate);
        
        /* 世代を更新 */
        copy_generation(&old_pop, &new_pop);
        
        /* 新しい親の世代で適応度が最大、または最小の個体を探査 */
        statistics(old_pop, &imax, &imin);
        
        /* 新しい親個体の適応度の合計値を計算 */
        sum_fitness=sum(old_pop);
        
        /* 世代iで最大の適応度を出力 */
        //fprintf(fl[1], "%lf\n", old_pop[imax].fitness);
    }
    
    /* ファイルをクローズ */
    fclose(fl[0]);
    fclose(fl[1]);
    
    /* 確保した記憶域を開放 */
    free(new_pop);
    free(old_pop);
    
    return 0;
}

Individual *create_generation(void) {
    return (Individual *)malloc(sizeof(Individual) * num_ind);
}

int set_city(FILE *fp) {
    /* 課題 2 */
}

void set_geno(Individual *ind) {
    /* 課題 3 */
}

void set_fitness(Individual *ind) {
    /* 課題 4 */
}

void initialize_population(Individual *pop) {
    /* 課題 5 */
}

double sum(Individual *pop) {
    /* 課題 6 */
}

Individual* pick_up(Individual *pop, double sum_fitness) {
    /* 課題 7 */
} 

void mutation(Individual *ch) {
    /* 課題 8 */
}

void statistics(Individual *pop, int *imax, int *imin) {
    /* 課題 9 */
}

void cross_over(Individual *p1, Individual *p2, Individual *c1, Individual *c2) {
    /* 課題 10 */
}

void next_generation(Individual *old_pop, Individual *new_pop, double sum_fitness, double mu_rate) {
    /* 課題 11 */
}

void copy_generation(Individual **old_pop, Individual **new_pop) {
    Individual *tmp;
    tmp = *old_pop;
    *old_pop = *new_pop;
    *new_pop = tmp;
}

プログラムの続きです.


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

Name: Mr. Wing  ..入門者(4,165ポイント)   Date: 2010/06/12(土) 06:34   No:54094     
Title: Re:巡回セールスマン問題(by. GA)    
課題の内容は以上です.
月曜日が締め切りなので, できればこの土日に答えていただけたら幸いです.
皆さん, どうか宜しくお願い申し上げます.


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

Name: たいちう  ..比類無きプログラマー(94,370ポイント)   Date: 2010/06/12(土) 08:44   No:54096     
Title: Re:巡回セールスマン問題(by. GA)    
> 月曜日が締め切りなので, できればこの土日に答えていただけたら幸いです.

課題を代わりにやってあげるための掲示板ではないので、
Mr. Wingさんが課題を解く力を付けるためのアドバイスならできます。
頑張り次第ですが、締め切りに間に合わない可能性も高いですね。
それでよければ、課題2から始めましょう。

テキストファイルから数値を読む部分です。
fscanfを使うのが最も簡単でしょう。
データのテキストファイルを用意して、出来るところまで書いてください。
また、正しく読みこめたことを確認するために、set_cityの処理が終わってから、
distの内容を全てprintfしてください。


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

Name: Mr. Wing  ..入門者(4,480ポイント)   Date: 2010/06/12(土) 09:31   No:54097     
Title: Re:巡回セールスマン問題(by. GA)    
たいちうさん、お答えいただきありがとうございます。
課題2の部分は、
int set_city(FILE *fp) {
    int i, j;
    
    for (i = 0; i < Num_City; i++) {
        for (j = 0; j < Num_City; j++) {
            fscanf(fp, "%f", &dist[i][j]);
        }
    }
    
    for (i = 0; i < Num_City; i++) {
        for (j = 0; j < Num_City; j++) {
            printf("%f ", dist[i][j]);
        }
        printf("\n");
    }
}

としてみたのですが、distの中身が全部ゼロで出力されてしまいました。
それに、「このような書き方では文字判定ができないので、エラー処理ができないのでは?」
という疑問もあり、行き詰っている状態です。
いいわけになるかもしれませんが、自分はC言語を勉強しているときに
ファイルリダイレクトばかり使っていたので、ファイル入出力に関してかなり疎いようです。


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

Name: たいちう  ..比類無きプログラマー(94,425ポイント)   Date: 2010/06/12(土) 09:50   No:54098     
Title: Re:巡回セールスマン問題(by. GA)    
> としてみたのですが、distの中身が全部ゼロで出力されてしまいました。

scanf系の書式指定を確認してください。


> それに、「このような書き方では文字判定ができないので、エラー処理ができないのでは?」
> という疑問もあり、行き詰っている状態です。 

まずは理想的なデータだけを処理できるプログラムを作ってはどうですか?
時間的余裕があれば、その後でエラー処理を追加することもできます。


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

Name: Mr. Wing  ..入門者(4,595ポイント)   Date: 2010/06/12(土) 12:04   No:54106     
Title: Re:巡回セールスマン問題(by. GA)    
返信が遅くなりまして、申し訳ないです。

> scanf系の書式指定を確認してください。
書式指定が間違っているということでしょうか?
fscanfの文法的には問題ないと思うのですが・・・。

ちなみに・・・、紛らわしい書き方をしてしまって恐縮ですが、
「ゼロ」というのは0.0のことです。


> まずは理想的なデータだけを処理できるプログラムを作ってはどうですか?
上記のfor文はそのつもりで作っていたものです。
while文にしてみたり、fgetsを使ってみたり、
こちらにお聞きする前に色々試してみたのですが、全部ダメでした。


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

Name: たいちう  ..比類無きプログラマー(94,448ポイント)   Date: 2010/06/12(土) 13:16   No:54111     
Title: Re:巡回セールスマン問題(by. GA)    
> 書式指定が間違っているということでしょうか?
> fscanfの文法的には問題ないと思うのですが・・・。

間違っているから確認を促しているのです。


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



Name: シエル  ..入門者(3,432ポイント)   Date: 2010/06/11(金) 22:19   No:54051       
Title: 龍神録の13章について    
しょうもない質問ですみません。。

龍神録の13章「敵にショットを撃たせてみよう」で、
弾の画像を描画するところの処理は下記の関数で書かれているのですが、
このDrawROtaGraphFの第四引数のラジアンを指定するところの計算について、
自機と敵の位置から求めたラジアンにPIを2で割った値を足していますが、
なぜ、PIを2で割った値を足すと、弾の画像が自機の方向に正しく向いてくれるのでしょうか?

どなたか分かるように説明していただけると助かります。。
よろしくお願い致します。

DrawRotaGraphF(shot[i].bullet[j].x+FIELD_X,shot[i].bullet[j].y+FIELD_Y,1.0, shot[i].bullet[j].angle+PI/2,img_bullet[shot[i].bullet[j].knd][shot[i].bullet[j].col],TRUE);


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


Name: yu  ..熟練のプログラマー(42,966ポイント)   Date: 2010/06/11(金) 22:24   No:54053     
Title: Re:龍神録の13章について    
弾画像が -PI/2 の方向に向いているので
+PI/2 で弾が進んでいる方向に画像を回転しています。


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

Name: シエル  ..入門者(3,433ポイント)   Date: 2010/06/11(金) 22:40   No:54055     
Title: Re:龍神録の13章について    
yuさん、ありがとうございます。

-PI/2の方向とはどういう方向ですか?


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

Name: yu  ..熟練のプログラマー(43,087ポイント)   Date: 2010/06/11(金) 22:58   No:54057     
Title: Re:龍神録の13章について    
> -PI/2の方向とはどういう方向ですか?

度数法で表すと -90° の向きです。今の場合は、上向きです。
また PI/2 は 90°ですね。

今、弾画像は -90°の向きであり、+90°をせずに 0°の方向に弾を進めようとすると
 -90°の向きで 0°の方向に進みます。
これだと不自然になるので、進行方向と弾の画像の向きを揃えるために +90°をしてます。

# 追記
# 弾画像の向きというものは、弾が進むべき方向を指します。(説明下手ですみません;)
# ナイフを例に挙げると、柄の部分を進行方向に向けて進んでくると違和感がありますよね。
# しかし、不自然にならない弾もあります。(向きが関係無い円形の弾等) 編集済み


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

Name: シエル  ..入門者(3,360ポイント)   Date: 2010/06/11(金) 23:22   No:54060     
Title: Re:龍神録の13章について    
角度って、360度(2πラジアン)で考えるのではないのでしょうか?

180度で考えて、上をマイナスで、下をプラスで180度ずつ考えるのでしょうか?

あと少しで分かりそうなんですが。。。 編集済み


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

Name: yu  ..熟練のプログラマー(43,194ポイント)   Date: 2010/06/11(金) 23:41   No:54062     
Title: Re:龍神録の13章について    
0 〜 360°で表すこともできますが、個人的に
-90°+ 90° = 0°の形にしたかったので負の値を用いました。

記述する際には分かりにくいのでしませんが、
関数に角度として 720°(4π)等を渡すこともできますよ。 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,205,062ポイント)   Date: 2010/06/11(金) 23:54   No:54065     
Title: Re:龍神録の13章について    
 90°と  90°+360°

-90°と -90°+360°

もっと言えば

  x°と x°+360°

これってそれぞれ向き異なるでしょうか?
試しに計算結果を表示させてみて下さい。
同じ結果になるはずです。
つまり延々と数値が増えても大丈夫なのです(あまりに大きいと計算誤差が増えるでしょうけど)

例えば

(90*n)°

のnを0〜延々とカウントアップさせてみて下さい。

右、下、左、上、 右、下、左、上、 右・・・

を繰り返すはずです。


で、0°って右ですよね?
しかし、弾の画像って上向いてるんですよ。
だから、PI/2を足して右向き状態をデフォルトにさせてるんです。

弾の画像を回転させて右向きに予めフォトショなどで変換しておけばこれは必要なくなります。

参考:http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sin.3.html


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,205,357ポイント)   Date: 2010/06/12(土) 00:18   No:54071     
Title: Re:龍神録の13章について    
単位円における(45+360*n)°の座標を計算するプログラムを
DXライブラリで作ってみました。

#define _USE_MATH_DEFINES
#include <math.h>
#define M_PIF ((float)M_PI)
#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

    ChangeWindowMode( TRUE ) ;          // ウインドウモードに変更
    if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了 

    printfDx("正常範囲\n");
    for( int i=0; i<10; i+=1 ){
        printfDx("%f,%f\n",cosf(M_PIF*2*i+M_PIF/4),sinf(M_PIF*2*i+M_PIF/4));
    }

    printfDx("--------------------------------\n異常範囲\n");//あまりに数が大きいとダメ

    for( int i=0; i<10000; i+=1000 ){
        printfDx("%f,%f\n",cosf(M_PIF*2*i*100+M_PIF/4),sinf(M_PIF*2*i*100+M_PIF/4));
    }

    ScreenFlip();
    WaitKey();

    DxLib_End() ;// DXライブラリ使用の終了処理
    return 0 ;// ソフトの終了
}


実行結果は添付ファイル参照
計算誤差がなければ計算結果は全て同じである事が期待されるものです。


floatの有効桁数が大体6桁である事を頭に入れておくと良いと思います。


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

Name: シエル  ..入門者(3,515ポイント)   Date: 2010/06/12(土) 10:52   No:54100     
Title: Re:龍神録の13章について    
あっ!
もしかして、atan2の関数が返す値って、右向きの0度を基準にして
時計回りで、360度(2πラジアン)までの値をラジアンの値で返すんですかね?

だとすると、その基準に合わせるために、現在上向きに向いている弾画像にPI/2(90度)分の
傾きをプラスすることによって、0度の向きにあわせる。

その値に後はatan2関数で求まったラジアンを足せば、見事に自機の方に画像が
向いてくれるということですかね?

理解できてる気がします。どうでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,206,382ポイント)   Date: 2010/06/12(土) 11:20   No:54103     
Title: Re:龍神録の13章について    
いえ、atan2は

-PI <= atan2(y,x) <= -PI

の範囲だったと思います。
しかし、範囲がどうだろうと関係ないのです。
だって-PIとPIは同義なのですから、0と2PIも同じなのです。

この話はそんなに深く考えるようなものではなく、

・角度は360°ごとに同じものになる
・龍神録のデフォルトの画像は-90°の向きを向いている

ということから、計算結果+90°の向きを向かせて描画しているのです。
良く解らなければ弾の画像をペイントでも何でもいいので、90°回転させて上書き保存し、
+90°を消して下さい。同じ事になります。
(その場合、弾の読み込み関数を少しいじらないといけません)


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

Name: シエル  ..入門者(3,580ポイント)   Date: 2010/06/12(土) 11:29   No:54105 解決!     
Title: Re:龍神録の13章について    
何か深く考えすぎてたようでした。
たぶん理解できたので、これにて解決にします。

yuさん、Dixqさん本当にありがとうございました! 編集済み


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



Name: ムンバ  ..熟練のプログラマー(65,024ポイント)   Date: 2010/06/11(金) 23:42   No:54063       
Title: DXライブラリの ClsDrawScreen関数につきまして    
こんばんは。お世話になります。

今、勉強してる本の内容で「画像を動かす」という項目があって
例文のソース内に、ClsDrawScreen という関数が出てきました。

Dixqさんのサイト内の「ゲームプログラミングの館」の13. 裏画面処理をして画像を動かす。 
と同じ様な内容なのですが
ゲ−ムプログラミングの館では、ClearDrawScreen関数を使用されていますし
DXライブラリ本家の関数リファレンスでは、ClearDrawScreen関数はあるのですが
ClsDrawScreen関数は見つけられませんでした。

検索エンジンで
ClsDrawScreen ClearDrawScreen 比較
などで、検索してみたのですが両者の関数の違いなどは自力で見つからず
質問させて頂きます。

ちょっと編集してますが、本の例文は

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int)
{
    if( DxLib_Init() == -1 ) return -1;

    int gazou001 = LoadGraph("abc.bmp"); 
    
    SetDrawScreen(DX_SCREEN_BACK); //裏画面を描画対称にする

    for(int x = 0; x < 320; x++)
    {
        ClsDrawScreen(); //画面消去
        DrawGraph(x, 224, gazou001, TRUE);

        ScreenFlip(); //画面入れ替え
    }

    WaitKey();

    DxLib_End();

    return 0;
}


この二つの関数の、使い分け方(どっちでもいいとか、それは使わない方がいい)などの
違いなど、ご存知の方いらっしゃれば、ご指導の程、宜しくお願い致します。


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


Name: つうこうにん  ..かけだし(2,027ポイント)   Date: 2010/06/12(土) 00:05   No:54066     
Title: Re:DXライブラリの ClsDrawScreen関数につきまして    
http://homepage2.nifty.com/natupaji/DxLib/dxlog.html

DXライブラリの更新履歴

(2006/3/11)
2.21a

ClsDrawScreen の名称を ClearDrawScreen に変更。
(今まで通りClsDrawScreen でもコンパイルは通ります)

と書かれているので性能は同じものだと思います。


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

Name: kazuoni [URL]  ..ハッカー(142,773ポイント)   Date: 2010/06/12(土) 00:06   No:54067     
Title: Re:DXライブラリの ClsDrawScreen関数につきまして    
何かわからない関数があったらDxLib.hを参照すると幸せになれるかもしれません。

int ClearDrawScreen( void ); // 画面の状態を初期化する
int ClsDrawScreen( void ); // 画面の状態を初期化する(ClearDrawScreenの旧名称)

となっていました。仕様などは本家に聞いてみたほうが確実かと思います。


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

Name: ムンバ  ..熟練のプログラマー(65,087ポイント)   Date: 2010/06/12(土) 00:10   No:54068 解決!     
Title: Re:DXライブラリの ClsDrawScreen関数につきまして    
つうこうにんさん、早速のご解説ありがとうございます。

納得できました。
本で使用されてる関数が、古かったのですね。
ありがとうございました。


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

Name: ムンバ  ..熟練のプログラマー(65,249ポイント)   Date: 2010/06/12(土) 00:15   No:54069 解決!     
Title: Re:DXライブラリの ClsDrawScreen関数につきまして    
kazuoniさんとがぶってしまいました。
ごめんなさい。

>>何かわからない関数があったらDxLib.hを参照すると幸せになれるかもしれません。 

>>int ClearDrawScreen( void ); // 画面の状態を初期化する 
>>int ClsDrawScreen( void ); // 画面の状態を初期化する(ClearDrawScreenの旧名称) 

>>となっていました。仕様などは本家に聞いてみたほうが確実かと思います。

ご指導、ご解説どうもありがとうございます。

---↓修正・追加部位---

次からは、本家でお聞きしたいと思います。(修正前)
 ↓修正
使用など、気になる事がありましたら、本家でお聞きしたいと思います。(修正後)

またまた変な意味は無いのです。(涙

kazuoniさんへ:
もしも、またこのレス、見ていましたら
言い方(表現の仕方)が悪いと自分なりに感じたので
私のレス、修正させて頂きました。
もし、ご気分を悪くされた様でしたら、申し訳御座いませんでした。
お詫びして訂正させて頂きます。(謝

---↑修正・追加部位---

失礼します。 編集済み


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



Name: ねこんぶ  ..ぴよぴよ(440ポイント)   Date: 2010/06/11(金) 13:26   No:54003       
Title: コンビネーション    
箱に入ったボール1〜6の数字
のボールを3つ取り出し
その取り出した数字を毎回表示させる
すべて表示されたら終了というDxで書こうと思っています。
頭が悪いのでどうやって関数を書いていいのかわかりません。
どなたかヒントだけでも教えていただけないでしょうか。

int n;//1〜6の数字
int r[3];//3つ取り出す。
int p[6];//フラグスイッチ1~6が使われているかどうか
int i,j//ループの時に使う数字

conb(){//ここで処理する
/*ここがわからない
for(j=0;,j<3;,j++){//3つ取るという意味
     for(i=0;,i<6;,i++){//1~6の数字を取る
       p[i]=1;    //使われた数字にフラグをたて次は使えないようにする。
       r[j]=i;//取り出したボールの順番と番号 
       //箱に戻す
              //組み合わせた種類を記憶?????     
      }
}
    */
}

main(){
     while(){
            conb();//
      for(i=0;,i<3;,i++){
               DrawFormatString(i*20,, White , "%d",r[i]);//パチンコのスロットのように表示させる。
            }
      }
}


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


Name: たいちう  ..比類無きプログラマー(93,752ポイント)   Date: 2010/06/11(金) 14:19   No:54007     
Title: Re:コンビネーション    
他にも色々やり方はありますが、、、
#include <stdio.h>

int main() {
    int i, j, k;
    for (i = 1; i <= 6; i++)
        for (j = 1; j <= 6; j++)
            for (k = 1; k <= 6; k++)
                if (i != j && i != k && j != k)
                    printf("%d %d %d\n", i, j, k);

    return 0;
}


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

Name: ねここんぶ  ..ぴよぴよ(88ポイント)   Date: 2010/06/11(金) 15:24   No:54011     
Title: Re:コンビネーション    
たいちうさん、ありがとうございます。
とても助かります^^
2,1,3の組み合わせも3,2,1の2,1,3同じとみなして
処理したいのですが
そこでずっと頭をかかえてます;;

頭の悪い私にご教授をお願いします;;




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

Name: たいちう  ..比類無きプログラマー(93,799ポイント)   Date: 2010/06/11(金) 15:34   No:54012     
Title: Re:コンビネーション    
これでいいですか?
for (i = 1; i <= 6; i++)
    for (j = i + 1; j <= 6; j++)
        for (k = j + 1; k <= 6; k++)


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

Name: ねここんぶ  ..ぴよぴよ(127ポイント)   Date: 2010/06/11(金) 15:47   No:54013 解決!     
Title: Re:コンビネーション    
たいちうさん、
ありがとうございます。
自分、頭が悪いのでとても助かります。
でも、がんばりますのでまた機会があれば教えてください^^


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



Name: るー  ..かけだし(2,021ポイント)   Date: 2010/06/07(月) 11:59   No:53729       
Title: Box2Dに関してPart2    
以前Box2Dに関して質問させて頂いた者です。
Justyさんをはじめ、お答え下さった方々に改めてお礼を言いたいです。
ありがとうございました。

あれからもう1度Box2Dを復習していたのですが、
やはり分からないところが出てきたので質問させて下さい。

プログラムを添付したので見て下さい。
まずブロックが3個出ているプログラムからです。
ブロックを3個積み上げたらクリアするという簡単なプログラムを作りたいのですが、
この場合、衝突検出用のコールバック関数にあるResult関数で衝突情報を保存し、
その衝突情報をメインループ内にある「// 接触のリストに対する処理」のところで
プログラム処理を書いていけばいいのでしょうか?
そうであれば書く場合にはどうすればいいのですか?
そもそもこの考え方が合っているのでしょうか?

考え方が合っていると仮定して、今度はブロックが5個出ているプログラムです。
こちらもブロック3個の時と同じく、ブロックを3個積み上げたらクリアという条件です。
ブロックが5個ということは、例えば片方に2個ブロックを積み上げ、もう片方に3個積み上げたい場合、
2個積み上げたときはまだクリアになりません。ですが、残りの3個のブロックで3個積み上げるとき、
1個積み上げた瞬間にクリアになってしまうと思います。
これを回避したいときはどうすればいいでしょうか。
また、2個くっついてるブロックの上にブロックを置いた(漢字でいう「品」)状態のとき、
さらに1個ブロックを積んだらクリアになるのでしょうか?

長文ですいませんが、アドバイスを頂きたいです。


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


Name: るー  ..かけだし(2,052ポイント)   Date: 2010/06/08(火) 09:51   No:53750     
Title: Re:Box2Dに関してPart2    
上のプログラムにピクチャーが入っていなかったので、
入れ直しました。
こちらのプログラムを見てください。


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

Name: Justy  ..伝説なるハッカー(541,167ポイント)   Date: 2010/06/08(火) 19:46   No:53757     
Title: Re:Box2Dに関してPart2    
>その衝突情報をメインループ内にある「// 接触のリストに対する処理」のところで 
>プログラム処理を書いていけばいいのでしょうか? 
>そうであれば書く場合にはどうすればいいのですか? 

 アプローチとしては間違っていないと思います。

 ただどう書くかはどういう情報をどう保存したのか、何をするのかによって
変わってきますのでなんとも言えません。



>これを回避したいときはどうすればいいでしょうか。

 前者を回避、というかどうしてそうなるのか今ひとつわかりませんが、
各ボックスが地面に与える力を調べて、ボックス3つ分の力が1つのボックスから
(安定して)かかっているものを調べれば出来そうです。

 しかし。


>また、2個くっついてるブロックの上にブロックを置いた(漢字でいう「品」)状態のとき、 
>さらに1個ブロックを積んだらクリアになるのでしょうか? 

 この後者もクリアにしたいなら、この方法ではだめですね。
 多分次の条件を満たすように書けばできるような気がしますけどどうでしょうね。

1) 地面の上に直接載っているボックスをリストアップ
2) それらのボックスが接触している別のボックスを順繰りに辿りつつ
 片方が片方の上に載っている(位置情報だけで判定)ものを見つけ、
 それが3つ以上連なっているものを探す
3) マウスのイベントがなく一定時間安定して同じ 2)が見つかったらクリア


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

Name: るー  ..入門者(2,755ポイント)   Date: 2010/06/09(水) 09:55   No:53780     
Title: Re:Box2Dに関してPart2    
>ただどう書くかはどういう情報をどう保存したのか、何をするのかによって
変わってきますのでなんとも言えません。

●例えば、ブロックが接触した時、
 接触されたブロックの方を消すプログラムの場合、

// 1フレーム内に発生した接触情報を保存しておく配列
#define CONTACTLIST_MAX    100 // 配列の数 1フレーム内に発生するであろう衝突の数以上準備しとかないとね
b2ContactResult ContactList[CONTACTLIST_MAX];  // 配列
int numContactList = 0;                        // 配列インデックス

// 接触を把握するためのコールバック関数
// このクラスをワールドのセットリスナーで登録することで、接触が発生した場合に自動的にコールする
// それぞれの関数ないにあたったときに行いたい処理を記述していく
class MyContactListener : public b2ContactListener
{
public:
    // 接触開始
    void Add(const b2ContactPoint* point)
    {
    }
    
    // 接触中
    void Persist(const b2ContactPoint* point)
    {
    }
    
    // 接触終了
    void Remove(const b2ContactPoint* point)
    {
    }

    // 接触情報が発生した時に呼ばれる    一般的にはよばれるタイミングは接触中とおなじだと思う
    void Result (const b2ContactResult *point)
    {
           DrawFormatString( 0, 20, GetColor( 255, 0, 0 ),"接触情報が発生" );

     // ここでは、衝突した際に行う処理は、行えないし行わないほうがよい
     // よって、ここでは衝突情報の保存のみを行い、実際の処理はメインループのほうでやる
           if( numContactList < CONTACTLIST_MAX )
           {
                  ContactList[numContactList] = *point;  // 接触情報の保存
         numContactList++;           // 更新
           }
    }
};
//    コンタクトリスナーの実体を作成
MyContactListener cListener;


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


// 接触のリストに対する処理
for( int i = 0; i < num; i++ )
{
         // ボックスとボックスが衝突したら、衝突された方のブロックを消す
         if( (int)ContactList[i].shape1->GetBody()->GetUserData() == USERDATA_FREEBOX &&  
             (int)ContactList[i].shape2->GetBody()->GetUserData() == USERDATA_FREEBOX )
         {
         // ボディが存在してるいるかどうか確認、静的か動的かのフラグが立つ
         if( ContactList[i].shape2->GetBody()->IsDynamic() || ContactList[i].shape2->GetBody()->IsStatic() )
         {
        world->DestroyBody( ContactList[i].shape2->GetBody() );  // ボディの削除
         }
    }
}
num = 0;  // インデックスリセット
.
.
.
.
.
書き加える部分はこんな感じですね。


地面と接触しているものをリストアップするというのは、
GetBodyList()を使うんですよね? 編集済み


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

Name: Justy  ..伝説なるハッカー(542,248ポイント)   Date: 2010/06/09(水) 19:30   No:53801     
Title: Re:Box2Dに関してPart2    
>↑保存の仕方はこんな感じです。 
 なるほど。
 
 まずこの衝突コールバック(Result)は b2Shape単位での衝突の結果を返してくるのですが
このプログラムにおける1つのボックス(b2Body)は2つの b2Shapeから出来ていますので
ボックス同士が接触すると2回呼ばれることがあります。

 そうするとこれをそのまま保存した b2Shapeレベルの接触情報リストのままでも
問題はないのですが、もう少し扱いやすくする為一度 b2Bodyレベルの接触リストに
変換した方がいいかと思います。

 実際前回こちらから出したコードではこの情報からもっと単純な接触した b2Bodyの組のリストを
作って連なりを調べていたはずです。
 たしかに一手間かかりますが、接触している b2Body同士を調べるのはかなり楽になるはずです。



>書き加える部分はこんな感じですね。 
 なんとなくですが、だめな気がします。

 b2Bodyを破棄した後はその b2Bodyは無効になるわけですが、直後の ContactList[i].shape1->GetBody()が
その破棄した b2Bodyだった場合問題になりませんか?

 それに「ボディが存在してるいるかどうか確認」として b2Body::IsDynamicか b2Body::IsStaticなのかを
見ているのもよくわかりません(全ての b2Bodyは IsDynamicか IsStaticのどちらかしかないのでは?)。

 b2Bodyの安全に破棄をするのであれば、このループ内で「破棄する(重複無しの)b2Bodyリスト」を構築して
ループが終わったら改めてその破棄リストを元に破棄をするのがいいかと思います。



>地面と接触しているものをリストアップするというのは、 
>GetBodyList()を使うんですよね? 
 b2World::GetBodyList()のことですか?
 んー、使っても出来なくはないですが、面倒というか効率が悪いです。
 
 衝突コールバックで集めた衝突情報リスト(b2Shape / b2Bodyレベルのどちらであるかは別として)を
辿った方がいいでしょう(b2Bodyレベルの方が効率よく探せるのは言うまでもないですね)。

 或いは地面の b2Bodyのコンタクトリストか。
 コールバックで集めた衝突情報リストはワールド全体のであるのに対し、こちらの方は確実に接
触しているとは言えませんが、地面と接触している可能性があるものだけをピンポイントで辿れますので
処理的には早いかと思います。


 もう少し補足をしましょうか。

>>1) 地面の上に直接載っているボックスをリストアップ 
>>2) それらのボックスが接触している別のボックスを順繰りに辿りつつ 
>> 片方が片方の上に載っている(位置情報だけで判定)ものを見つけ、 
>> それが3つ以上連なっているものを探す 
 このあたりは結局前回のてんびんのときと似たような処理になるでしょう。

 前回ですと各バスケットを起点として GetMassOnBasket / GetTotalMassContactedBoxを呼び出し
順繰りにコンタクトリストを辿って、再帰しながらバスケット上に載っている物を調べていました。

 これが今回は地面の上に載っているボックスを起点として順繰りにコンタクトリストを辿って、
3つのボックスが位置関係的に「載っている」ものかどうかを調べていくことになります。

 今回は連なっている数を意識しながら3つ以上になった段階で処理を打ち切り
その3つのボックスの組み合わせを記録していく感じになるのではないでしょうか。


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

Name: るー  ..入門者(3,684ポイント)   Date: 2010/06/10(木) 11:05   No:53876     
Title: Re:Box2Dに関してPart2    
>実際前回こちらから出したコードではこの情報からもっと単純な接触した b2Bodyの組のリストを 
  作って連なりを調べていたはずです。 
 たしかに一手間かかりますが、接触している b2Body同士を調べるのはかなり楽になるはずです。

class DestructionListener : public b2DestructionListener
{
public:
    DestructionListener(){}
    void SayGoodbye(b2Shape* shape)
    {
    }

    void SayGoodbye(b2Joint* joint)
    {
    }
    

private:

};

↑の部分のことでしょうか?違いますかね?すいません、よく分かりません。
正直私が相当苦手にしているのがコンタクトリスナーのプログラムの書き方ですね。
書き方も特殊ですし。


>b2Bodyを破棄した後はその b2Bodyは無効になるわけですが、直後の ContactList[i].shape1->GetBody()が 
 その破棄した b2Bodyだった場合問題になりませんか?

 問題になりましたw
  ContactList[i].shape1側をマウス操作して当てた場合は大丈夫ですが、
 ContactList[i].shape2側から当てた場合だと停止してしまいますね。

>これが今回は地面の上に載っているボックスを起点として順繰りにコンタクトリストを辿って、 
 3つのボックスが位置関係的に「載っている」ものかどうかを調べていくことになります。

 ちょっと待って下さい。
 この「コンタクトリストを辿る」という部分を完全に理解したいので、
 もっと簡単な例を出してもいいですか?
 地面があり、ボックスが2個離れて地面の上に乗っているプログラムがあったとして、
 どちらかのボックスをもう一方のボックスに積んだら即クリアするというプログラムにする場合、
 考え方として、
 @地面に接触しているボックスをコンタクトリスナーで探して、接触しているボックスを探す
 A接触しているボックスがあったら、そのボックスからまたコンタクトリスナーで接触している
 ボックスを探す
 Bあったらクリアにする
 という考え方でいいのでしょうか?

 この考え方が合ってるかどうかはさておき、条件として「接触している」では駄目ですよね。
 特にAの場合、接触しているという条件だったらボックス横にくっついてる場合も考えられますし。
 うーん、難しいですね。


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

Name: Justy  ..伝説なるハッカー(543,449ポイント)   Date: 2010/06/10(木) 14:29   No:53892     
Title: Re:Box2Dに関してPart2    
>↑の部分のことでしょうか?違いますかね?すいません、よく分かりません。 
 そこはオブジェクトが破棄されるときに呼び出されるところです。

 該当する箇所は前回のてんびんでいうと MyContactListener::Persistと 
MyContactListener::IsContactedBodiesです。

 前回のてんびんでは b2ContactResultの情報を必要としていなかったので、
MyContactListener::Resultは使っていませんでした。

 代わりに接触している b2Bodyの組として MyContactListener::Persistの中で
bodyPairに組を入れて、そのまま vectorコンテナに保存しています。
 これが「接触してるb2Bodyの組リスト」としています。

 これを利用して接触している b2Body同士を調べていたのは GetTotalMassContactedBox関数の中で、
MyContactListener::IsContactedBodiesを使って2つの b2Bodyが接触していたかどうかを
調べていました。



>地面があり、ボックスが2個離れて地面の上に乗っているプログラムがあったとして、 
>〜という考え方でいいのでしょうか? 
 ここで言っている「コンタクトリスト」は「コンタクトリストナー」とは別もので、
地面の b2Body::GetContactListで取得できるリスト(b2ContactEdgeの集合)のことを指しています。
 コンタクトリストを辿るというのは前回のコードでいうと「GetTotalMassContactedBox関数の forループ」
の処理で、あれがまさに「バスケットのコンタクトリストを辿って」います。

 それを踏まえて訂正すると

 1) 地面に接触しているボックスのコンタクトリストを探して、接触している可能性のあるボックスを探す 
 2) 接触している可能性のあるボックスがあったら、そのボックスが確実に接しているかどうかを
 コンタクトリストナーのリストで調べる。
 3) 確実に接していることを確認できたら、位置関係を調べて載っているかどうか調べる
 4) 載っていたらクリアにする 

となります。



>条件として「接触している」では駄目ですよね。
 そうですね。
 接触しているだけでなく、位置関係も見る必要があります。ただこれはそんなに難しく考えなくても
ボックスの中心位置と幅・高さの情報からそれなりの精度で割り出せます。
 座標が安定していること(ほとんど動いていない)、Y軸的に一方が上にあること、
X軸は上と下のオブジェクトの差が幅より小さいことくらいみておけば大丈夫かと。
(あとはやってみて調整)


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

Name: るー  ..入門者(3,962ポイント)   Date: 2010/06/10(木) 15:47   No:53899     
Title: Re:Box2Dに関してPart2    
>該当する箇所は前回のてんびんでいうと MyContactListener::Persistと  
 MyContactListener::IsContactedBodiesです。

 すいません、これはもしかしたら実行ファイルだけ頂いたものですか?
 該当箇所が見当たらないのですが・・。

>コンタクトリストを辿るというのは前回のコードでいうと「GetTotalMassContactedBox関数の forループ」 
 の処理で、あれがまさに「バスケットのコンタクトリストを辿って」います。

 こちらはありました。2008バージョンアップした方ですよね。
 かなり記述が複雑で難しそうですね。
 実行はできませんが、見てみます。
 
>接触しているだけでなく、位置関係も見る必要があります。ただこれはそんなに難しく考えなくても 
 ボックスの中心位置と幅・高さの情報からそれなりの精度で割り出せます。

 難しく考えてしまうんですよねぇw
  とりあえずGetTotalMassContactedBoxの部分を見て辿り方を勉強する他ないようですね。


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

Name: Justy  ..伝説なるハッカー(543,639ポイント)   Date: 2010/06/10(木) 16:25   No:53902     
Title: Re:Box2Dに関してPart2    
> すいません、これはもしかしたら実行ファイルだけ頂いたものですか? 
> 該当箇所が見当たらないのですが・・。 

 あれ、お持ちじゃないですか?
 GetTotalMassContactedBox関数が入っている main.cppと一緒に入れた(と思う)
MyContactListener.hの方です。

 No:52857でみなかさんが MyContactListener.hで扱っている tuple関連でエラーが出た
ということだったので、みなかさんは持っているかもしれません。
http://www.play21.jp/board/formz.cgi?action=res&resno=52059&page=&lognum=162&id=dixq&rln=52933#52855


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

Name: るー  ..入門者(4,080ポイント)   Date: 2010/06/11(金) 13:41   No:54005 解決!     
Title: Re:Box2Dに関してPart2    
ありがたく頂きます。
とりあえずこのレスでこのスレッドは解決にしたいと思います。
Justyさんには本当に感謝しています。
ありがとうございました。


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



Name: はね  ..上級者(17,175ポイント)   Date: 2010/06/10(木) 18:24   No:53921       
Title: DirectXのおススメサイト    
DXライブラリを使ったプログラムで簡単な知識の勉強をしたので
次にちょっと難しいと言われてるDirectXに挑戦してみたいと思ってるのですが、
DirectXを使ったゲームプログラミングのサイトで
ここのサイトさんはとても参考になる!なった!
など、分かりやすいかつ、勉強になるお勧めのサイトがあったら教えてください。
特に、プログラムの書き方が(誰もがお手本にしていいと呼べるくらい)上手いサイトを重点的にお願いします。
出来れば、なぜそのサイトは参考になるのかという理由もつけて
教えてもらえるとうれしいです。
よろしくお願いします。


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


Name: Tororo [URL]  ..初心者(7,583ポイント)   Date: 2010/06/10(木) 19:12   No:53931     
Title: Re:DirectXのおススメサイト    
サイトならば
http://marupeke296.com/
が、オススメですね。

DirectX9の事がかなり詳しく書かれています。
それ以外にもためになるような事が沢山書かれています。


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

Name: はね  ..上級者(17,198ポイント)   Date: 2010/06/11(金) 13:31   No:54004     
Title: Re:DirectXのおススメサイト    
ありがとうございます。参考にさせてもらいます

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



Name: ともこ  ..入門者(4,369ポイント)   Date: 2010/06/10(木) 23:03   No:53960       
Title: 敵に玉が当たった後の処理    

初心者です。昨日に引き続き、2回目の投稿です。

インベーダーゲームのようなものを作ることに挑戦しています。

敵に玉が当たった後、敵のイメージ画を変える(敵を消す)ところまで進みましたが
玉が通り過ぎると元のイメージ(敵が復活する)に戻ってしまいます。
どうすればよいでしょうか?

アドバイスお願いいたします。


----------------------------------------------------------------

#include "DxLib.h"

#define PLAYER_Y 416

typedef struct{
        int x,y,img,muki,walking_flag;
}Jiki;

struct shot{
    int x,y;
    int flag;
};
struct shot tama[10];
 
typedef struct{
        int x,y,muki;
        //,img,muki;
}Teki;

typedef struct{
        int x,y;
}Atari;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[16],counter=0;
    char Key[256];

    Jiki jiki;
    jiki.x    =320;
    jiki.y    =PLAYER_Y;
    jiki.walking_flag=0;
    jiki.muki=3;

    Teki teki[2][2]={64,0,0,64,32,0,96,0,0,96,32,0};

    for(int i=0;i<10;i++){
        tama[i].x=320;    
        tama[i].y=PLAYER_Y-32;
        tama[i].flag=0;
    }

    Atari atari;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
     SetDrawScreen( DX_SCREEN_BACK ) ;                           //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

        ///////////////////////////////////////////////////////////////////////
        ////////////////////// 敵描画  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                DrawGraph( teki[i][j].x , teki[i][j].y , image[6] , TRUE );//敵を描画
                if(teki[i][j].muki==0) teki[i][j].x+=1;
                else if(teki[i][j].muki==1) teki[i][j].x-=1;
                if(teki[i][j].x>480){
                    teki[i][j].muki=1;
                    teki[i][j].y+=32;
                }
                else if(teki[i][j].x<32){
                    teki[i][j].muki=0;
                    teki[i][j].y+=32;
                }
            }
        }

        ///////////////////////////////////////////////////////////////////////
        ////////////////////// プレイヤー位置操作  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        if(jiki.x%16==0 && jiki.y%16==0){         //座標が16で割り切れたら入力可能
            jiki.walking_flag=1;         //歩くフラグを立てる。
            if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    jiki.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    jiki.muki=3;         //右向きフラグを立てる
            else                                    //その他ボタンなら
                    jiki.walking_flag=0; //歩かないフラグを立てる
        }
 
        if(jiki.walking_flag==1){        //歩くフラグが立っていたら
            if(jiki.muki==1)        //左向きならjiki.x座標を減らす
                    jiki.x--;
                    if(jiki.x < 0) jiki.x=0;    //もし画面外まで来たら                   
            else if(jiki.muki==3)        //右向きならjiki.x座標を増やす
                    jiki.x++;
                    if(jiki.x > 480-32) jiki.x=480-32;    //もし画面外まで来たら    
        }
 
        ///////////////////////////////////////////////////////////////////////
        ////////////////////// 玉発射  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
        if(counter<10)                        //前にエンターを押してから5カウント未満なら
            counter++;                       //カウントアップ
        else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
            counter=0;                       //カウンターを戻す
            for(int i=0;i<10;i++){
                if(tama[i].flag==0)    {  //発射フラグを立てる
                    tama[i].x=jiki.x;
                    tama[i].flag=1;
                    break;
                }
            }
        }
        for(int i=0;i<10;i++){  //玉発射位置セット
            if(tama[i].flag==1){
                tama[i].y-=1;             //座標を8減らす
                DrawGraph( tama[i].x , tama[i].y , image[6] , TRUE );//玉を描画
//                ScreenFlip();//裏画面を表画面に反映
                if(tama[i].y < -32){      //もし画面外まで来たら
                    tama[i].y=PLAYER_Y-32;    //初期値に戻し、
                    tama[i].flag=0;   //発射フラグを戻す
                }
            }
        }
        DrawGraph( jiki.x , jiki.y , image[0] , TRUE  ) ;
        ////////////////////////////////////////////////////////////////////////
        
        /////////////////////////////当り判定//////////////////////////////////
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int a=0;a<10;a++){
                    atari.x=tama[a].x-teki[i][j].x;
                    atari.y=tama[a].y-teki[i][j].y;
                    if(atari.x*atari.x+atari.y*atari.y<64*64){
                        DrawGraph( teki[i][j].x , teki[i][j].y , image[9] , TRUE );//敵を描画
                    }
                }
            }
        }
        ////////////////////////////////////////////////////////////////////////

        ScreenFlip();//裏画面を表画面に反映


    }

    DxLib_End();
    return 0;
}


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


Name: シエル  ..入門者(2,943ポイント)   Date: 2010/06/10(木) 23:24   No:53963     
Title: Re:敵に玉が当たった後の処理    
ざっと見ただけですが、
敵の描画のところで、敵の表示フラグのチェックが入ってないと思います。

基本として、

@表示フラグが立っている敵だけ描画



Aあたり判定で当たった弾と当たった敵のフラグを消す。



この状態で@に戻ると、死んだ敵はフラグが消えてるので描画されない

というような状態になると思います。

それとあたり判定の部分でも、表示フラグが立っている敵と弾だけチェックすれば
いいので、すべての敵と弾までチェックする必要はありません。

他にも突っ込みどころがたくさんあるのですが、
以下のリンク先を参考にしてみてはいかがでしょうか?
http://dixq.net/s/19.html


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



Name: naka  ..ぴよぴよ(603ポイント)   Date: 2010/06/10(木) 21:43   No:53949       
Title: C言語初心者です。    
C言語・リカーシブコールを使っての関数を作りたいですが・・・

初めて質問させていただきます。

私は今、C言語の勉強中で、
リカーシブコール(再帰び出し)を勉強中です。

以下に書かせていただいた問題を解いているのですが
うまくいきません。
このpower関数の定義部分を再帰呼び出しを使って書き直したいです。

大変申し訳ないのですが、初心者のためここがわからない、という
的確なことが言えません・・・
自分で作ってみたソースでコンパイルしてみたところ、
最後の%d乗のところがうまく出せません。


うまくコンパイルできるソースがお分かりの方いらっしゃいましたら
ぜひ教えていただきたいです。


恐れ入りますが、よろしくお願い致します。




問題:
xのy乗を返す関数int power(int x,int y)を作成し、
次のようにキーボードから入力して計算を行うコードを入力してください。
***************************************************
1番目の整数を入力してください。(1〜5)
2←(キーボードから入力)
2番目の整数を入力してください。(1〜5)
3←(キーボードから入力)
2の3乗は8です。

***************************************************
(再帰呼び出しをせずに作ったソースです↓)

#include <stdio.h>

/*power関数の宣言*/
   int power(int x, int y);

   int main(void)
   {
   int num1,num2,ans;


   printf("1番目の整数を入力してください。\n");
   scanf("%d", &num1);

   printf("2番目の整数を入力してください。\n");
   scanf("%d", &num2);


   ans = power(num1,num2);

   printf("%dの%dは%dです。\n", num1,num2,ans);

   return(0);
   }

/*power関数の定義*/
   int power(int x, int y)
   { 
   int a;
   int i;

   a = x;

   for(i=1;i<y;i++){
    a = a * x;
   }
   return a;
   }



よろしくお願い致します。



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


Name: MNS  ..プログラマー(35,117ポイント)   Date: 2010/06/10(木) 21:46   No:53950     
Title: Re:C言語初心者です。    
>自分で作ってみたソースでコンパイルしてみたところ、 
>最後の%d乗のところがうまく出せません。 

まずは、自分で書いてみたコードを提示してみてください。
そうすれば、nakaさんの再帰呼び出しに対する理解の誤りが分かるかも知れません。


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

Name: naka  ..ぴよぴよ(443ポイント)   Date: 2010/06/10(木) 21:56   No:53951     
Title: C言語初心者です。    
ご指摘ありがとうございます。
そして迅速に対応していただき感謝しております。


私が考えていたものはこちらです。

int power(int x,int y)
{
   int a;
   a = x;

   if(y == 1){
     return a;
   }

   else{
   power(x,y-1);
   }

単純にaを返すだけでは全然違うことはわかっているつもりですが
どう表わしたらいいかがどうしてもわかりませんでした。
     


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

Name: ぽこ  ..中級者(14,707ポイント)   Date: 2010/06/10(木) 22:01   No:53953     
Title: Re:C言語初心者です。    
提示されたソースは再帰呼び出しになっていません。
取り敢えず、power関数を「日本語で」定義して見てください。
以下のような形式で。

「関数power(x,y)は〇〇という計算を行う関数である。」

この〇〇というところに関数powerが入っていれば、再帰的定義となります。
nakaさんが提示されたコードでは
「関数power(x,y)はxをy回掛けるという計算を行う関数である。」
になっています。再帰的定義ではありません。

#何らかの授業でやっているのなら、例題も出ているはずです。
#それも同様に再帰的定義をやってみてください。


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

Name: ぽこ  ..中級者(14,757ポイント)   Date: 2010/06/10(木) 22:05   No:53954     
Title: Re:C言語初心者です。    
> 私が考えていたものはこちらです。

> int power(int x,int y)
> {
>    int a;
>    a = x;

>    if(y == 1){
>      return a;
>    }

>    else{
>    power(x,y-1);
>    }

> 単純にaを返すだけでは全然違うことはわかっているつもりですが
> どう表わしたらいいかがどうしてもわかりませんでした。

惜しい。
power(3,1)って3ですよね?
power(3,2)って3*3ですよね?
power(3,3)って3*3*3ですよね?
power(3,4)って3*3*3*3ですよね?

では、power(3,n)はどうなりますか?


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

Name: MNS  ..プログラマー(35,182ポイント)   Date: 2010/06/10(木) 22:20   No:53955     
Title: Re:C言語初心者です。    
もっと直接的な考えで言うと、

power(x,y) = k * power(x,y-1)

という式で、kの値が何になるかを考えてみると、
この式がそのまま再帰で使えることが分かるはずです。


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

Name: naka  ..ぴよぴよ(469ポイント)   Date: 2010/06/10(木) 22:24   No:53956     
Title: Re:C言語初心者です。    
ありがとうございます。

power(3,n)は・・・
3をn回繰り返してかけていくんですよね・・・
3*3*3*3*3.....

3かけることをn-1回繰り返してます。
せっかく教えていただいたのに申し訳ないです。


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

Name: naka  ..ぴよぴよ(483ポイント)   Date: 2010/06/10(木) 22:57   No:53958     
Title: Re:C言語初心者です。    
> power(x,y) = k * power(x,y-1)

> という式で、kの値が何になるかを考えてみると、
> この式がそのまま再帰で使えることが分かるはずです。



少し考えてみます。
ありがとうございました。


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

Name: box  ..ハッカー(154,470ポイント)   Date: 2010/06/10(木) 23:02   No:53959     
Title: Re:C言語初心者です。    
> 3かけることをn-1回繰り返してます。

この方法にとらわれている限り、for文による繰り返しから
脱却できないでしょう。


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



Name: Ultimate  ..かけだし(2,343ポイント)   Date: 2010/06/10(木) 06:00   No:53851       
Title: 用語・関数の質問(龍神録) 合計3つ    
知らない用語

グローバル変数

知らない関数

extren
unsigned

これは何なのか教えてください。
あと、龍神録で新しく出てきた重要な用語や関数があれば教えてください。

よろしくお願いします。


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


Name: toyo  ..熟練のプログラマー(48,692ポイント)   Date: 2010/06/10(木) 07:02   No:53852     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
C言語ということで
変数には有効範囲があります
有効範囲を示すキーワードの一つがグローバル(大域)です
すべての範囲で有効な変数と考えていいですよ
具体的には関数の外で宣言された変数になります
関数の中で宣言された変数はローカル(局所)変数でその関数の中でしか有効になりません
グローバルとローカルで同じ名前の変数が合った場合ローカル変数が優先されますが同じ名前は使わないのが基本ですね(グローバル変数には頭にgをつけるとかいう命名法はよく見かけますね)
関数ではないexternならこのグローバル変数を別のソースファイル(規約的には翻訳単位といいます)で使うときに使います
グローバル変数の書き方に3種類あります
int global; /* 他の翻訳単位からもextern int global;とすることで使える */
static int global; /* 局所変数のstaticとは意味が違い宣言された翻訳単位のみでしか使えない */
extern int global; /* 別の翻訳単位で宣言された変数を使う場合 */

正負が扱える変数がsigned で正の整数のみ扱う変数がunsignedです
これも関数ではありません

signed short hoge; /* signedは省略可能 16ビットでは-32768 〜 +32767 */
unsigned short hage; /* 0 〜 65535 */
 編集済み


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

Name: シエル  ..入門者(2,556ポイント)   Date: 2010/06/10(木) 08:21   No:53855     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
質問内容がC言語の基礎的な内容ですね。
一度C言語の基礎から勉強しなおした方が良いのでは?

同じような内容の質問が増えると、回答者側もそう思う人が
増えてくると思いますよ。。。


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

Name: 匿名  ..上級者(21,668ポイント)   Date: 2010/06/10(木) 10:23   No:53863     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>シエルさん
その考え方だと
C言語の基礎的な質問は他所で勉強、書籍などで勉強してから質問しろ
ということでしょうか。
言いたいこと、思ってることは大体分かりますが、
C言語何でも質問掲示板のタイトルにそぐわないと思います・・・
質問に対して分からない、または回答するのが書くのが面倒なら回答しない
というのも一つの手だと思います。分かる方が答えればいいのですから
アットホームで温かい回答をしてあげましょうよ


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

Name: シエル  ..入門者(2,614ポイント)   Date: 2010/06/10(木) 10:26   No:53865     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>>匿名さん
私は非常に面倒な質問には回答してません。
そういう質問は他の人に任せてます。
性格的にあまり甘やかすのは好きではないので。
匿名さんも回答してあげてはいかがですか? 編集済み


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

Name: たかぎ [URL]  ..ハッカー(202,306ポイント)   Date: 2010/06/10(木) 10:27   No:53866     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
> アットホームで温かい回答をしてあげましょうよ

シエルさんの指摘は十分アットホームで温かいと思いますよ。
アットホームで温かいというのは、相手を甘やかすことと同義ではありません。


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

Name: 匿名  ..上級者(21,741ポイント)   Date: 2010/06/10(木) 10:38   No:53870     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>アットホームで温かいというのは、相手を甘やかすことと同義ではありません。 

言いかえると、(悪い意味で)まるでtoyoさんは甘やかしてるような言い方ですね。
私はtoyoさんの回答は素晴らしいと思いますけど。


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

Name: Dixq (管理人)  ..ウィザード(1,203,707ポイント)   Date: 2010/06/10(木) 10:40   No:53873     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
質問にあるキーワードはググれば参考になる記事はたくさん出てきますし、
館にも説明がありますよ。

調べてすぐわかる事を質問すると、少しは学ぶ努力をしましょうって話になる事が多いですよね。

まぁ最初は何もかも難しく思えると思いますが
まずはわからない事はググって見てください。

その方が早く解決しますし、解決能力もプログラミングスキルの一つだと思うので頑張って下さい。

ちなみにこの場はどんな質問でもウェルカムです。お気軽に


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

Name: たかぎ [URL]  ..ハッカー(202,565ポイント)   Date: 2010/06/10(木) 11:10   No:53878     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
> 言いかえると、(悪い意味で)まるでtoyoさんは甘やかしてるような言い方ですね。 

単独のやりとりだけを指していっているのではありません。
自分で調べたり勉強する習慣のない人は、ずるずるといくらでも甘えます。
それでは決して本人のためにはなりません。


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

Name: dic  ..比類無きプログラマー(71,890ポイント)   Date: 2010/06/10(木) 12:56   No:53889     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
最近趣味でプログラムを始める方が多いようで
そういう方の傾向として
一緒に誰かと楽しく学びたい
という傾向が強くあると聞きました
そういった方の思考も取り入れていく感じがいいかなと思いました

また、わかりきっていることを他人に説明する力もこちらに
必要になってくるので、お互いに良い関係になっていくものと思ってます


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

Name: toyo  ..熟練のプログラマー(48,813ポイント)   Date: 2010/06/10(木) 13:19   No:53890     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
私も半分は自分の為に回答してます
情けは人のためならずではないのですが自分のあいまいな理解を確認するためであったり
確認のために検索して新たな知識が増えたりすることもありますし
でも他人に教えるのは結構難しいですね
教えて学ぶことも多いです


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

Name: softya [URL]  ..ハッカー(179,307ポイント)   Date: 2010/06/10(木) 14:57   No:53896     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
結局のところ、ちゃんとしたC言語の参考書籍を所持して読んだり読み返したりした方が力が身につきますし、検索する癖をつけた方が速く答えにたどり着けて、その時に様々な関連する情報を見ることで知識が増えます。
その上で分からないことであれば、どんどん質問してもらって良いと思います。まず考えて調べて、その上で聞くと言うのが学習効率のよい方法だと思いますよ。


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

Name: Ultimate  ..かけだし(2,497ポイント)   Date: 2010/06/10(木) 16:32   No:53904 解決!     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
すみませんでした。

一応、質問前に自分では本で調べてみたのですが、載っていないので質問しました。

次からは、本だけではなく、ほかのサイトなども参考にやっていこうと思います。

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


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

Name: softya [URL]  ..ハッカー(179,463ポイント)   Date: 2010/06/10(木) 16:52   No:53905     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>一応、質問前に自分では本で調べてみたのですが、載っていないので質問しました。 

参考にしている書籍に問題があると思いますよ。
良かったら持っている本を教えてください。


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

Name: たかぎ [URL]  ..ハッカー(203,077ポイント)   Date: 2010/06/10(木) 16:58   No:53906     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
グローバル変数というのは正式な用語ではないので、載っていなくても不思議ではありません。
extren関数というのはよくわかりませんが、extern記憶クラス指定子の間違いであれば、載っていないのはおかしいですね(記憶クラス指定子という用語まで出てくるのは、よほどしっかりした入門書だけでしょうが)。
unsigned関数というのはありませんが、型指定子のunsignedのことであれば、それが載っていないような入門書は燃やし尽くしてください。


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

Name: シエル  ..入門者(2,517ポイント)   Date: 2010/06/10(木) 17:03   No:53907     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
私が最初にC言語の勉強を始めた「苦しんで覚えるC言語」というサイトは、
すごい分かりやすくて、良かったですよ。

Ultimateさんが質問されてる内容もすべて載っていた気がします。
一度参考になさってはいかがでしょうか?
頑張って下さいね。


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

Name: たかぎ [URL]  ..ハッカー(203,095ポイント)   Date: 2010/06/10(木) 17:08   No:53909     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
> 私が最初にC言語の勉強を始めた「苦しんで覚えるC言語」というサイトは、 
> すごい分かりやすくて、良かったですよ。 

間違いもそれなりにありますけどね。



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

Name: シエル  ..入門者(2,779ポイント)   Date: 2010/06/10(木) 17:16   No:53911     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>>たかぎさん
え・・・?間違い結構あるんですか・・・?
私のC言語の基礎はあのサイトで学んでしまいました。。。


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

Name: たかぎ [URL]  ..ハッカー(203,161ポイント)   Date: 2010/06/10(木) 17:32   No:53912     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
> え・・・?間違い結構あるんですか・・・? 

私もかなり指摘しましたし、その後も修正されているようなので、ずいぶん改善されたとは思いますが...
(あちこちにあるコラムの多くは、私が指摘した内容に対応していただいた分です)


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

Name: Ultimate  ..入門者(2,586ポイント)   Date: 2010/06/10(木) 17:49   No:53914     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
もう一度読んだら、unsignedはありました。

でも、やっぱりグローバル変数については載っていないようです。

本は「明解 C言語 入門編」です。

苦しんで覚えるC言語でわからない関数や用語があったら調べて見ます。


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

Name: Ultimate  ..入門者(2,692ポイント)   Date: 2010/06/10(木) 17:55   No:53915     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
弾幕の円形ショットを作るのに、調べてみたところ三角関数というものが必要なようだとわかりました。

そこで、初めて三角関数をやりたいと思いますが、

http://www8.plala.or.jp/ap2/suugaku/sankakukansuunoshoho.html

のサイトの内容だけで十分でしょうか?

もし、内容が足りないなら、どの程度の内容がわかればいいのか教えてください。「


補足

放物線などはある程度学校でもやったのでできます。

externも載っていませんでした。 編集済み


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

Name: dic  ..比類無きプログラマー(71,836ポイント)   Date: 2010/06/10(木) 18:24   No:53922     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
>明解 C言語 入門編
その人が書いてる本はほとんどまわりがワッショイしているだけのように見えます
ソフト・・・関係者の本は買わないようにしてます

当たりもまれにありますので、注意して購入しています

あえて言うなら
おそらく制御関係の方ではないでしょうか
ゲームなどのアプリケーション開発者とは思えないです
 編集済み


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

Name: Ultimate  ..入門者(2,744ポイント)   Date: 2010/06/10(木) 18:36   No:53923 解決!     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
普通のC言語については苦しんで覚えるCでやろうと思います。

あと、弾幕の三角関数については内容がだいぶ違うので、新しい質問として投稿します。

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


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

Name: たかぎ [URL]  ..ハッカー(203,407ポイント)   Date: 2010/06/10(木) 18:49   No:53925     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
> 本は「明解 C言語 入門編」です。 

この本は、現存するCの入門書の中では最もよいと思います。
「グローバル変数」というのは俗語ですので(ISO/IEC 9899:1999にも1箇所だけglobal variablesというのが出てきますが...)、Cそのものの解説に出てこなくても不思議ではありません。

正確に理解したいのであれば、次の用語・概念についての理解を深めてください。
・有効範囲
・記憶域期間
・結合

ところで、龍神録などDXライブラリを使う場合はCではなくC++になります。
自分が何を扱っていて、何を学ぶべきかは正確に把握するようにしましょう。
http://www.kijineko.co.jp/node/764


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,204,349ポイント)   Date: 2010/06/10(木) 18:53   No:53927     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
本の好みは人それぞれでしょうが、
私は明解C言語に随分お世話になりましたし、今でも人に勧めています。とても良い本だと思いますよ。
中級や実践、練習問題編みたいな感じでバリエーション豊富なので、他の本も一緒に買うと良いと思います。

さて、Ultimateさんはまだ学校で三角関数を習って無いんですよね?
となると少々難しく感じるかもしれません。
「sinって何?」って疑問が出てきて尤もだと思います。

リンク先を見ただけで十分かと言えばNoですが、完全に理屈を理解する必要はないと思います。
例えばcosに角度を渡せば斜辺に対する水平成分が出てくるんだ・・のように一つの道具のようにsin,cosを扱うと良いと思います。

小学生でSTGを作っている方がいらっしゃいますが、きっと理論を完全に理解しているわけではなく、
関数を道具として捉えることが出来ているのでしょうね。


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

Name: Ultimate  ..入門者(3,358ポイント)   Date: 2010/06/10(木) 19:07   No:53930     
Title: Re:用語・関数の質問(龍神録) 合計3つ    
僕も、ここまで来るまでの間には明解C言語 入門編でやってきました。

あと、三平方の定理はまだやっていませんが、自分で勉強したのである程度使いこなせ、また、平方根はもう習って複雑な計算もできるので理屈まである程度理解できています。

まずは道具として使って、円形ショットが延々と繰り返されるプログラムをまず作ってみようと思います。(その後インベーダーに取り入れようと思います。)

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

この掲示板があってとてもよかったです。


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



Name: さくら  ..かけだし(1,121ポイント)   Date: 2010/06/10(木) 18:12   No:53917       
Title: 『独習C 第3版』 の問題です    
初めて質問します。
独習Cで今、getchar()というところの練習問題が分かりません。
自分なりにプログラムを作り、実行してみたのですが上手くいかず、どこが間違っているのか分かりません。
長文になってしまいますが、よろしくお願いします。

 問題
10個の英字を読み取るプログラムを作成してください。
その中からアルファベット順に並べたとき、最初にくる文字を表示するものとします。

●プログラムコード
#include<stdio.h>
int main(void)
{
    int i;
    char ch1,ch2;
    ch2 = 'z';

    printf("10個の英字を入力してください。\n入力された英字を順番に並べた時、最初にくるものを最期に表示します。\n");
    printf("英字の順番は A,B,…,Z,a,…z です。\n");
    
    for( i=1 ; i<=10 ; i++ ){
        printf("%dつ目の英字を入力してください:",i);
        ch1 = getchar();
        if(ch1<ch2){
            ch2 = ch1;
        }
    }

    printf("入力された英字の中で最初にくる文字は%cです。\n",ch2);

    return 0;
}

●コンパイル結果
h:\C_prog\chapter03\3.01>bcc32 prog01.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
prog01.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

●実行結果
h:\C_prog\chapter03\3.01>prog01
10個の英字を入力してください。
入力された英字を順番に並べた時、最初にくるものを最期に表示します。
英字の順番は A,B,…,Z,a,…z です。
1つ目の英字を入力してください:a
2つ目の英字を入力してください:3つ目の英字を入力してください:b
4つ目の英字を入力してください:5つ目の英字を入力してください:c
6つ目の英字を入力してください:7つ目の英字を入力してください:d
8つ目の英字を入力してください:9つ目の英字を入力してください:e
10つ目の英字を入力してください:入力された英字の中で最初にくる文字は
です。

―――――――――――――――――――――――――――――――――――
このような状態です。今回はa,b,c,d,eと入力しました。
実行すると、2,4,6,8,10個目の英字の入力が飛ばされてしまい、最期に英字も表示できてません。
何がダメなのか分からないので、教えて下さい。
よろしくお願いします。



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


Name: たいちう  ..比類無きプログラマー(93,494ポイント)   Date: 2010/06/10(木) 18:19   No:53919     
Title: Re:『独習C 第3版』 の問題です    
キーワード:getchar バッファ クリア

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

Name: さくら  ..かけだし(1,245ポイント)   Date: 2010/06/10(木) 18:52   No:53926 解決!     
Title: Re:『独習C 第3版』 の問題です    
たいちうさん、早い回答ありがとうございます!
分かりやすいヒントでした。
バッファのクリアについては、後でやると書かれていたので深く考えずにやってしまいました…。
今の段階ではgetcharでやるのは無理そうなので、今回はgetche()でやってみることにします。


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



Name: るー  ..入門者(4,067ポイント)   Date: 2010/06/10(木) 16:24   No:53901       
Title: 息抜きに遊んでいたら    
DrawCircleで半径15の円を出して、その円の座標をGetMouseInput()を使ってマウス座標を繋げて、
マウスをころころ回して遊んでたんですが、
エラー一覧が計算のようなものがばーっと出て最終的にエラーになります。
これはなんなんでしょうかね。
すごく簡単なプログラムなので間違えるわけないし、そもそもデバッグ時にエラーが出ていないので、
原因がわかりません。
大したことではありませんが、原因か分かる方はいますか?


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


Name: ぽこ  ..中級者(14,660ポイント)   Date: 2010/06/10(木) 16:30   No:53903     
Title: Re:息抜きに遊んでいたら    
書かれている内容だけでは、誰も分からないと思いますよ。
状況が再現できるソースコード下さい。


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



Name: 夏ミカン  ..ぴよぴよ(728ポイント)   Date: 2010/06/10(木) 14:27   No:53891       
Title: 双方向リストのソート関数を作ろうと思ってるのですが,    
typedef struct _list{
    struct _list *next;
    struct _list *prev;
    char Student_Number[50];
    char Family_Name[50];
    char First_Name[50];
    char Tel_Number[50];
    char Post_Number[50];
}List;


List *header_Copy;


void Sort(List *p){    //pはheader_Copyを引数としています
    List *q;
    q=(List*)malloc(sizeof(List));
    if(q==NULL) exit(1);

        while(p->next!=header_Copy){
            p=p->next;
            q=p->next;
            while(q->next!=header_Copy){
                if(strcmp(p->Student_Number,q->Student_Number)>0){
                    p->prev->next=q;
                    q->prev=p->prev;
                    q->next->prev=p;
                    p->next=q->next;
                    q->next=p;
                    p->prev=q;
                }
                q=q->next;
            }
                
        }
}


このような感じにしたのですが、うまくいきません

よければ、教えてください

実行結果はheader_Copyの要素が下の時、ループからぬけないです

学籍番号 e
氏 e
名 e
電話番号 e
郵便番号 e

学籍番号 t
氏 e
名 e
電話番号 e
郵便番号 e

header_Copyが下の時

学籍番号 t
氏 e
名 e
電話番号 e
郵便番号 e

学籍番号 e
氏 e
名 e
電話番号 e
郵便番号 e

ソート結果は

学籍番号 t
氏 e
名 e
電話番号 e
郵便番号 e

学籍番号 e
氏 e
名 e
電話番号 e
郵便番号 e

となります、すみません、よろしくお願いします
 編集済み


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


Name: たかぎ [URL]  ..ハッカー(202,891ポイント)   Date: 2010/06/10(木) 14:31   No:53894     
Title: Re:双方向リストのソート関数を作ろうと思ってるのですが,    
質問は何でしょうか?
それとも雑談?


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

Name: 夏ミカン  ..ぴよぴよ(757ポイント)   Date: 2010/06/10(木) 14:34   No:53895     
Title: Re:双方向リストのソート関数を作ろうと思ってるのですが,    
すみません、間違えてえんたーをおして不完全なまま投票されました^^;

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

Name: たいちう  ..比類無きプログラマー(93,398ポイント)   Date: 2010/06/10(木) 15:24   No:53898     
Title: Re:双方向リストのソート関数を作ろうと思ってるのですが,    
デバッグしてみようと思ったけど、header_Copyをどのように使うつもりなのかが判らない。
ループから抜けない、という状況を再現できる完全なソースコードを添付してください。


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



Name: シオン  ..ぴよぴよ(38ポイント)   Date: 2010/06/07(月) 12:04   No:53730       
Title: 指定した行に値を書き込む関数    
指定した行に値を書き込む関数を作っております
DXライブラリを使っております。

// 第一引数 書き込む行、第二以降 書き込む文字列
FileDataSave(int index, ???? );

// 〜処理〜
num = 3;
FileDataSave( 1, "あああ%d", num);
とするとtest.txtの1行目に
"あああ3"と保存する関数を作りたいです。

ファイルに書き込む処理だけならかけるのですが・・・。
FILE    *fp;
fp = fopen( "MapData.txt", "w");
fprintf( fp, "書き込みたい文字列 ");
fclose(fp);


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


Name: たいちう  ..比類無きプログラマー(92,845ポイント)   Date: 2010/06/07(月) 12:54   No:53732     
Title: Re:指定した行に値を書き込む関数    
> とするとtest.txtの1行目に
> "あああ3"と保存する関数を作りたいです。

ファイルを先頭から最後まで全て新しく書き直すのが一番簡単です。

http://www.kouno.jp/home/c_faq/c19.html#0


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

Name: 通りすがり  ..上級者(21,525ポイント)   Date: 2010/06/07(月) 15:02   No:53733     
Title: Re:指定した行に値を書き込む関数    
fopenには様々なモードがあります
ちなみにwの場合は書き込み専用で
指定した名前のファイルがない場合には自動で作成し
既に存在した場合にもそのファイルの内容を全て破棄して
新しく上から書き込むモードです

書き込みたいファイルを一旦読み込んでその中身を保持しておき
新たに書き込みたい内容と保持しておいた内容を続けて書き込めば
1行目に付け足した形になると思います

たとえばファイルの中身が

かきくけこ
さしすせそ
たちつてと

だったとして
1行目にあいうえおを書き込みたい場合

かきくけこ
さしすせそ
たちつてとを一旦保存しておき

あいうえおを書き込んだ後
かきくけこ
さしすせそ
たちつてとを書き込みます

あとはコード化してみましょう


※ちなみに1行目ではなく最後の行に足したいのであれば
fopenのモードをaにすることで達成できます


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

Name: シオン  ..ぴよぴよ(140ポイント)   Date: 2010/06/07(月) 20:20   No:53736     
Title: Re:指定した行に値を書き込む関数    
アドバイスありがとうございます。

書き込む行にすでに文字列があった場合
行をずらすのではなく置きかえる仕様にしたいです。

文字列を読み込み特定の行のみの物を変更すると言ったことがわかりません・・・。
教えては頂けないでしょうか?


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

Name: シオン  ..ぴよぴよ(0ポイント)   Date: 2010/06/07(月) 20:31   No:53737     
Title: Re:指定した行に値を書き込む関数    
何度もすみません。
読み込みは何とかできたみたいなのですが
指定した行の文字列を別の文字に変更する方法がわかりません。

又、自作の関数に"%s"等と設定の仕方がわかりません・・・。
どうか教えては頂けないでしょうか?

    char  buffer[256];

    FILE *fp;
    fp = fopen("test.txt", "r");

    // ファイルオープン失敗か?
    if ( !fp ){
        //printf("ファイルオープンエラー\n");
        //return;
    }

    // 1行ずつ読み込んで表示する
    while( fgets(buffer, 256, fp) ){
        printfDx("%s", buffer);
    }

    // ファイルクローズ
    fclose(fp);



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

Name: シオン  ..ぴよぴよ(224ポイント)   Date: 2010/06/08(火) 01:04   No:53743     
Title: Re:指定した行に値を書き込む関数    
自分なりに色々やってみたのですがイマイチわかりません・・・。


void FileSaveX( int index, char string[256] ){
    
    char  buffer[10][256];
    //int index = 0;

    FILE *r_fp;
    r_fp = fopen("test.txt", "r");

    // ファイルオープン失敗か?
    if ( !r_fp ){
    //printf("ファイルオープンエラー\n");
    //return;
    }

    // 1行ずつ読み込んで表示する
    while( fgets(buffer[index], 256, r_fp) ){
    index++;
    //printfDx("%s", buffer);
    }

    // ファイルクローズ
    fclose(r_fp);
    printfDx("%s", buffer[1]);

    FILE    *w_fp; 
    w_fp = fopen( "MapData.txt", "w"); 
//    fprintf( fp, "書き込みたい文字列 "); 
    fclose(w_fp);
}


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

Name: Ma  ..ハッカー(104,338ポイント)   Date: 2010/06/08(火) 04:23   No:53747     
Title: Re:指定した行に値を書き込む関数    
全部読み込んだら、各行を順番に書きこみます。(追記モードではなく、全消しして新しく書くモードで。)
行がindexと一致したとき、読み込んだ行を書き込むのではなく、関数に引数としてわたらせた文字列をかきこみます。

これは、for文で作ると一番簡単かと思います。
ちょっと考えてコードを作ってみてください。


*追記
今後、他のファイルで使う事も考えて関数の引数にファイル名も渡すといいと思います。
それから、今は10行までしか格納できませんが、書き込まれている行数が不定で10行以上も考えられる場合は
std::vector 等の、可変長リストを使用するといいと思います。 編集済み


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

Name: シオン  ..ぴよぴよ(289ポイント)   Date: 2010/06/10(木) 03:26   No:53849     
Title: Re:指定した行に値を書き込む関数    
連絡が遅くなってしまい申し訳御座いませんでした。
ご回答ありがとうございます。

std::vectorを調べてみたのですが使い方がイマイチわかりません。


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

Name: mila  ..ぴよぴよ(60ポイント)   Date: 2010/06/10(木) 07:21   No:53853     
Title: Re:指定した行に値を書き込む関数    
vectorは使用していませんが、ご参考にどうぞ。
#include <stdio.h>
#include <stdarg.h>
    
int FileSaveX(int index, const char *format, ...)
{
    FILE *rfp, *wfp;
    int i;
    char buf[256];
    va_list arg;

    if ((rfp = fopen("test.txt", "r")) == NULL) {
        return 1;
    }
    if ((wfp = fopen("MapData.txt", "w")) == NULL) {
        fclose(rfp);
        return 2;
    }
    va_start(arg, format);
    for (i = 1;; i++) {
        if (fgets(buf, sizeof(buf), rfp) == NULL) {
            break;
        }
        if (i == index) {
            vfprintf(wfp, format, arg);
            fputc('\n', wfp);
        } else {
            fputs(buf, wfp);
        }
    }
    va_end(arg);
    fclose(wfp);
    fclose(rfp);
    return 0;
}

int main(void)
{
    int num = 3;
    FileSaveX(1, "あああ%d", num);
    return 0;
}


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

Name: バグ  ..ハッカー(197,939ポイント)   Date: 2010/06/10(木) 11:53   No:53885     
Title: Re:指定した行に値を書き込む関数    
久しぶりにC++で書いてみました。
std::vectorではなく、std::listを使ってみました。


#include <string>
#include <list>
#include <fstream>

////////////////////////////////////////////////////////////////////////////////
// 任意の行に文字列を挿入する
//
// 引数
// unsigned int    index    = 挿入される行(1以上の数値)
// const char*    item    = 挿入する文字列
// const char*    path    = ファイルの場所を示すパス
//
// 戻り値
//                true    = 正常終了
//                false    = 以上終了
////////////////////////////////////////////////////////////////////////////////
bool insert_write(unsigned int index, const char* item, const char* path)
{
    // インデックスが1未満の場合はfalseを返す
    if (index < 1)
    {
        return false;
    }

    // 読み込み用ファイルをオープンする
    std::ifstream fin;
    fin.open(path);

    // ファイルオープンに失敗したらfalseを返す
    if (fin.is_open() == false)
    {
        return false;
    }

    // ファイルの終端まで読み込みつつ、リストへ格納していく
    std::string str;
    std::list<std::string> lst;
    while (fin.eof() == false)
    {
        str.clear();
        fin >> str;
        lst.push_back(str);
    }

    // ファイルのクローズ
    fin.close();

    // ファイルの最大行数よりも、指定されたインデックスが大きい場合は末尾へ挿入
    if (index > lst.size())
    {
        index = (unsigned int)(lst.size());
    }

    // イテレータを任意の位置へ進める
    std::list<std::string>::iterator it = lst.begin();
    for (unsigned int i = 1; i < index; ++i, ++it);

    // 文字列を挿入
    lst.insert(it, item);

    // 書き込み用ファイルをオープン
    std::ofstream fout;
    fout.open(path);

    // ファイルオープンに失敗したらfalseを返す
    if (fout.is_open() == false)
    {
        return false;
    }

    // リストの内容をファイルへ書き込む
    for (it = lst.begin(); it != lst.end(); ++it)
    {
        if (it->length() > 0)
        {
            fout << *it << std::endl;
        }
    }

    // ファイルのクローズ
    fout.close();

    // 正常に終了したのでtrueを返す
    return true;
}



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

Name: Justy   Date: 2010/06/14(月) 00:23   No:537301276442638     
Title: Re:指定した行に値を書き込む関数    
 どうしてわざわざ C++で書き直したのかは意図はよくわかりませんが、それ正常に動いていないですよ。

 fin >> strでは空白類の情報がそげ落ちます。
 置き換えるなら getlineでしょう。


>for (unsigned int i = 1; i < index; ++i, ++it);
 おかしくはないですが、普通こういう時って標準関数の advanceを使いませんか? 


>if (it->length() > 0)
 これは変です。オリジナルの行が空行だった場合、その行が出力されなくなります。




Name: たろう  ..上級者(23,228ポイント)   Date: 2010/06/10(木) 10:04   No:53861       
Title: 3Dと2Dについて    
何度も質問すみません。2Dの数学の勉強(アクション、シューティング)が出来ていなければ3Dはできないのでしょうか?
それとも2Dの数学が出来なくても3Dは出来るのでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(202,329ポイント)   Date: 2010/06/10(木) 10:28   No:53867     
Title: Re:3Dと2Dについて    
苦労をいとわないのであれば、できるかどうかでいえば"できます"。


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

Name: たいちう  ..比類無きプログラマー(93,150ポイント)   Date: 2010/06/10(木) 10:39   No:53871     
Title: Re:3Dと2Dについて    
現実問題としては出来ないでしょう。
自由に3Dのゲームを作れる人はそのジャンルの2Dのゲームも作れます。
3Dの数学の方がずっと難しいし、3Dを理解する過程で
最低限の2Dの知識も身につくでしょうし。


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

Name: たろう  ..上級者(23,343ポイント)   Date: 2010/06/10(木) 10:39   No:53872     
Title: Re:3Dと2Dについて    
回答ありがとうございます。やっぱり2Dが出来てないと苦労するのですね。
いきなり3Dやっても2Dやっているときよりも苦労はするけど努力すればできるということでしょうか?


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

Name: たろう  ..上級者(23,382ポイント)   Date: 2010/06/10(木) 10:46   No:53874     
Title: Re:3Dと2Dについて    
たいちうさん回答ありがとうございます。
そうなんですか。
やっぱり2Dができないと3Dは無理ということですね。


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

Name: たかぎ [URL]  ..ハッカー(202,650ポイント)   Date: 2010/06/10(木) 11:12   No:53880     
Title: Re:3Dと2Dについて    
> いきなり3Dやっても2Dやっているときよりも苦労はするけど努力すればできるということでしょうか?

はい。血のにじむような努力が必要でしょうし、2Dを先にやる場合の何倍も努力が必要になるかもしれませんが、不可能ではありません。
もちろん、決してそのような方法はおすすめしません。


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

Name: たろう  ..上級者(23,415ポイント)   Date: 2010/06/10(木) 11:41   No:53884 解決!     
Title: Re:3Dと2Dについて    
わかりました。やはり2Dの数学から勉強するようにします。回答ありがとうございました。

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



Name: Ultimate  ..かけだし(1,645ポイント)   Date: 2010/06/06(日) 12:58   No:53686       
Title: エラー(龍神録の「まずは実行させてみよう」)    
最近、質問が多くてすみません。

龍神録プログラミングの館に行って、http://dixq.net/rp/2.htmlを見てみました。

新しいプロジェクトを用意して、プロジェクトとデフォルトプロジェクトををWindowsアプリケーションに変更し(Visual Studioにはこのような操作はないかもしれませんが)、

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない


        //ココ!!



        ScreenFlip();
    }

    DxLib_End();
    return 0;
}


と丸ごとコピーして貼り付けをしたら、

エラー E2209 C:\Users\侑樹\Desktop\DxLib_BCC\Projects\Danmakurensyuu\danmaku.cpp 2: インクルードファイル '../include/GV.h' をオープンできない
エラー E2268 C:\Users\侑樹\Desktop\DxLib_BCC\Projects\Danmakurensyuu\danmaku.cpp 8: 未定義の関数 'GetHitKeyStateAll' を呼び出した(関数 GetHitKeyStateAll_2(int *) )
エラー E2141 C:\Users\侑樹\Desktop\DxLib_BCC\Projects\Danmakurensyuu\danmaku.cpp 16: 宣言の構文エラー

というエラーが出てしまいました。

なぜでしょうか?

貼り付ける内容が違ったのでしょうか?


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


Name: softya [URL]  ..ハッカー(178,776ポイント)   Date: 2010/06/06(日) 14:23   No:53692     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
GV.hを用意し忘れてませんか?


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

Name: Ultimate  ..かけだし(1,680ポイント)   Date: 2010/06/06(日) 20:39   No:53709     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
GV.hはどこにあるのでしょうか?

場所がよくわかりません。


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

Name: fatens  ..中級者(11,161ポイント)   Date: 2010/06/06(日) 22:37   No:53721     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
>GV.hはどこにあるのでしょうか? 
どこにもありませんので自分で作ってください。

コピーするのはともかくとして、プログラムが何をしているのかは理解しておくべきです。

分からないことがあれば、「この章までのプロジェクトを一括ダウンロード」して、
自分のものと見比べてみるのも良いと思います。


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

Name: Ultimate  ..かけだし(1,757ポイント)   Date: 2010/06/09(水) 16:45   No:53789     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
hファイルを作るとはどういうことでしょうか?

ちなみに、今、パソコンのリカバリー中で、リカバリーが終わったら、Visual Studio 2010 Expressを使ってプロジェクトを一括ダウンロードしてやっていきたいと思います。

今はいつもと別のパソコンで書いています。



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

Name: シエル  ..かけだし(2,174ポイント)   Date: 2010/06/09(水) 16:58   No:53790     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
hのファイルはヘッダーファイルです。。。
分からないのであれば、C言語の基礎を学んできた方がいいと思います。
「この章までのプロジェクトを一括ダウンロード」の中にそのヘッダーファイルは入ってますけど。。。


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

Name: ムンバ  ..熟練のプログラマー(63,375ポイント)   Date: 2010/06/09(水) 17:29   No:53793     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
こんにちは。

シェルさんがおっしゃられてる、一括ダウンロードした中に「GV.h」ファイルがあるはずです。

一括ダウンロード → 解凍 → 何処かに保存(解凍したフォルダ)

そのフォルダを開くと「1章」(他にもたくさんフォルダはありますが)
とりあえず、1章というフォルダがありますので、このフォルダを開いて

mydatフォルダ → includeフォルダ の中に GV.hファイル が
正常にダウンロードかつ解凍されていれば、あるはずです。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,449ポイント)   Date: 2010/06/09(水) 21:20   No:53811     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
手当たりしだいコピーでもいいかもしれませんが、
一つ一つ意味を理解しながらやっていく方が身に付きますよ。

例えば、GV.hを指している場所は、

../ 一つ上のフォルダの
indlue/ includeフォルダの中

となっていますから、そこを見ればいい事が解りますよね。

.hファイルは別に特別な作り方をするわけではありません。
メモ帳などでテキストファイルを作って.hに拡張子を変更してもOKですし、ソリューションエクスプローラーから作ってもOKです。



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

Name: Ultimate  ..かけだし(1,941ポイント)   Date: 2010/06/09(水) 21:40   No:53817     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
ありがとうございました。

リカバリーが終わり、Visual Studio 2010 Expressをインストールしてやってみたらわかりました。

読んでみたら少し難しそうでしたが、1つ1つ理解しながらゆっくり進んでいこうと思います。

(ソースは自分で書かず、コピペで進んでいっていいですよね?)

まだインターネットにつなげないので、別のパソコンで引き続きこれを書いています。

../が1つ前のフォルダとは知りませんでした。

最後に、グローバル関数とは何かを教えてください。

初歩的な質問ですみません。

よろしくお願いします。


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

Name: ムンバ  ..熟練のプログラマー(63,643ポイント)   Date: 2010/06/09(水) 21:47   No:53821     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
Ultimateさん、お疲れ様です。
余計なお世話ですが、ちなみに

./  は、同じフォルダ
../ は、一つ上(外)のフォルダ

になるのですが、二つ上のフォルダは

.../ では無く、
../../ になります。

がんばって下さい!
失礼します。

---編集・追記---

Ultimateさんの、ご質問

<<最後に、グローバル関数とは何かを教えてください。

私では知識が薄いため、どなたか詳しい方いらっしゃれば
宜しくお願い致します。

失礼します。 編集済み


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

Name: Ultimate  ..かけだし(2,076ポイント)   Date: 2010/06/09(水) 21:59   No:53822     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
./など、知らなかったことをたくさん書いてくださってありがとうございました。

まだ、3章に入ったばかりですが、これからもよろしくお願いします。

ゲームプログラミングの館から比べるとだいぶ難しく感じますね。

続きは明日にします。

(見てわかっても、自分でできるようになるのか・・・?Dixqさんはすごいですね。)

とりあえず、Visual Studioも手に入れたので、がんばっていこうと思います。


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

Name: Ultimate  ..かけだし(2,127ポイント)   Date: 2010/06/09(水) 22:57   No:53834     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
追記

externという関数も今まで知りませんでした。

こちらのほうも解説していただけるとうれしいです。

よろしくお願いします。


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

Name: Ultimate  ..かけだし(2,245ポイント)   Date: 2010/06/10(木) 05:53   No:53850 解決!     
Title: Re:エラー(龍神録の「まずは実行させてみよう」)    
この質問のメインの疑問が解決したので、ここで解決にします。

わからない用語については、また新規で質問します。

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


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



Name: ゆとり  ..ぴよぴよ(190ポイント)   Date: 2010/06/09(水) 23:48   No:53837       
Title: 完全初心者です。    
この度東方の影響で弾幕STGを作りたいと思いまして。

正直何一つわからないのでここに書いてあるようにコピペして模倣しようとしました。

すると第7章で
1>c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(17) : error C2065: 'func_state' : 定義されていない識別子です。
1>c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(17) : error C2050: switch 式の結果は、整数値になりませんでした。
1>c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(20) : error C3861: 'first_ini': 識別子が見つかりませんでした
1>c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(21) : error C2065: 'func_state' : 定義されていない識別子です。
1>c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(38) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'c:\documents and settings\owner\デスクトップ\project\1章\mydat\source\main.cpp(12)' で見つかる前に EOF が検出されました。

とエラーが出てしまいました。

正直書かれているままにコピペしてきたので何がエラーなんだかわかりません^^;

どなたかご教授願います。

こんなんじゃ1面作るのも困難ですかね。。


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


Name: シエル  ..かけだし(2,489ポイント)   Date: 2010/06/10(木) 00:03   No:53840     
Title: Re:完全初心者です。    
龍神録プログラミングの館からはじめてませんか?
初心者はゲームプログラミングの館から始めるべきです。

それと、エラーの内容を見てもまったく意味がわかりませんか?
まったく意味が分からないのであれば、C言語の最低限の基礎を
学んできてから、ゲームプログラミングの館で勉強を始めてください。

正直、突っ込みどころがありすぎて、返答に困ります。




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

Name: たかぎ [URL]  ..ハッカー(202,194ポイント)   Date: 2010/06/10(木) 00:57   No:53842     
Title: Re:完全初心者です。    
本当に完全な初心者であれば、「ゲームプログラミングの館」から始めることさえ無理があります。
何でもよいので入門書を1冊用意し、その内容を理解した上で「ゲームプログラミングの館」に進むことをお勧めします。


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



Name: Dixq (管理人) [URL]  ..ウィザード(1,201,410ポイント)   Date: 2010/06/06(日) 18:58   No:53703       
Title: ■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
前から超寒いDixqの黒歴史に残るような動画を作りたいと思っていたのですが、昨日完成しました。(?!)


【C言語】 東方のようなゲームの作り方を カワイく 実況解説 【Dixq】





_
_
_





?!



_
_
_
_
_
_
_
_





※注意

・題名からも解るとおりsuper痛い動画の仕様となっております
・「管理人って変人だったの?!」「このHP来るのは今日で最後だ…」等と思いたくない方はお帰り下さい
・「文字だけの説明ではやる気が起きない。誰か萌え解説してほしい」と思った方、ご覧ください
バッシングコメントを沢山書く事が出来る方ご覧ください
・突然トピックが消えても文句を言わない方、ご覧ください

以上の注意事項をご覧いただいた方は下へお進みください。





_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_







http://www.nicovideo.jp/watch/sm10961652







モデルはデーモン閣下&悪魔の燻製講座 sm5000979


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


Name: ぽこ  ..中級者(14,471ポイント)   Date: 2010/06/06(日) 19:14   No:53704     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
あまりのカワイさに終始頬が緩みっぱなしでした。
Dixq先生の次回作に期待します。。。


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

Name: Tororo [URL]  ..初心者(7,539ポイント)   Date: 2010/06/06(日) 19:19   No:53705     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
とても、面白かったですww
でも痛いところもありますかね?
でも、本当に黒歴史になっちゃいますよ・・w


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

Name: 御津凪 [URL]  ..ハッカー(142,180ポイント)   Date: 2010/06/06(日) 19:47   No:53706     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
痛いというより、紹介動画として見れますね。
途中のカット画像は初めての(特にブログ見てない)方は分からないかと(笑)
後はどこもおかしな所はなかったというべきかな。


あえて言うと…
「どーゆうあれだ」は今後の動画でキャラ付けされそうな予感。


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

Name: あ〜る  ..上級者(20,923ポイント)   Date: 2010/06/06(日) 21:18   No:53713     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
見ました
確かに黒歴史になりそうですねwww
とりあえずキューさんのDXライブラリ大好きさは良くわかりましたw
あとやっぱりリア充は爆発するべきだと思います。


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

Name: Tatu  ..プログラマー(37,418ポイント)   Date: 2010/06/06(日) 22:46   No:53722     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
動画見ました。おもしろかったです。

タイトルを見て「カワイく」とあったので、もっと「この人変態だー」と思ってしまうような
奇妙な動画ではないかと思っていました。
(例えば、いちばん最初になぜか咲夜やアイシャといった女装をした(ただしマスクつき)
Dixqさんの写真がでるとか、裏声とか声を録音しといてあとで音程を高く調整してあるとか)

>>リア充爆発
カメラで撮れば記事にできますね。私自身は邪魔にさえならなければどうでもよいと思っていますが。
パルシィなど嫉妬で有名なキャラのコスプレもいいかもしれない。

>>DXライブラリへの愛
DXライブラリは確かに便利です。すごく便利です。


いつかはこういうゲームの作り方を説明する動画も作るんじゃないかという気はしていましたが
そのときは自作ゲームのキャラクターを使うと思ってました。
ところで龍神録プログラミングの館で村の作り方は扱わないのですか?







ついでにここに書いてしまいますが
土曜日に北海道大学で行われた大学祭のイベントのニコニコボカロ鼎談(ていだんと読む)にいってきました。
午前10時に整理券を配布していましたが意外に人は並んでいませんでした。(最終的には300席全てが埋まりました。)
ブログに書いていないところをみるとDixqさんは来ていなかったようですね。
これにやってきた人は全員アカウントを持っていて、三分の一ほどがプレニアム会員でした。
会場の入り口にはもはやこの手のイベントにはついているものといってもいいだろう
東方キャラクターのコスプレをしている人たちがいました。

会場にいってないし、生放送もみていないという人に簡単に鼎談の内容を紹介すると

前半は
三人それぞれによる
初音ミクを中心としたクリプトン社の紹介
ニコニコ動画についての社内資料公開
ミク人気は不滅。実体化ミクは宇宙人がつくるだろう説

後半は
メインテーマを「2020年」とし、
三つの題
ニコ動大学は作られるか。またそれはどのようなものになるか
初音ミクは(政治などに)出馬できるか
ニコ厨・ミク廃の生き方
について話し合い。

最後に質疑応答。

という感じでした。



現在ステージ選択マップと敵を倒して出てくる経験値をためると
レベルアップするといったものがついたシューティングを作成中。


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

Name: dic  ..比類無きプログラマー(70,944ポイント)   Date: 2010/06/07(月) 16:10   No:53734     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
ニコ動は見ないので大丈夫です

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

Name: array  ..熟練のプログラマー(65,051ポイント)   Date: 2010/06/07(月) 21:03   No:53738     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
人の事言えませんが黒歴史になりそうですねw
DLしておいて、消えたら再うpしておきますね

動画は、とっても楽しいHP宣伝動画でしたw
詳しくは、HP見に来て下さいという投出しっぷり・・・・
DXライブラリを使えばそれなりに大規模なゲームが作れるという雰囲気も伝わりました。


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

Name: Ma  ..ハッカー(104,372ポイント)   Date: 2010/06/08(火) 04:35   No:53748     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
>ところで龍神録プログラミングの館で村の作り方は扱わないのですか? 
だれか、RPGの館を作ればいいとおもうんだ。うん。


追記
忘れてたw
動画見ましたよ。
DXライブラリを使う人がこれで少しでも増えるといいですね^^
なかなか良い動画でしたよ。 編集済み


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

Name: 霧蘭  ..ぴよぴよ(4ポイント)   Date: 2010/06/09(水) 08:21   No:53778     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
マイリス余裕でしたw
DXライブラリがあんな便利なものだとは・・・
もっと多くの人に知ってもらいたいですね


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

Name: sn  ..ぴよぴよ(43ポイント)   Date: 2010/06/09(水) 11:20   No:53782     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
自分はDXライブラリしか使ったことなかったんで、
むしろdirectxのキチガイソースっぷりに発狂しましたw
このライブラリ作ってくれた人すげぇなぁ・・・世界に貢献してますよほんと。


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

Name: asd  ..上級者(20,889ポイント)   Date: 2010/06/09(水) 13:25   No:53784     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
ぉお、これは帰ったら見なくては。
さすがに職場で見る勇気はありませんでした(ノ∀`)

消したら増えますタグを追加しておけばいいですか?(マテ


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,102ポイント)   Date: 2010/06/09(水) 20:53   No:53805     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
意図的に大人しくしていたキューです、こんばんは。


>ぽこさん

需要があればうpとは言ったものの、解説動画を面白くするなんてどうしたらいいのかわかんなくて、
どうしようと思ってます^^;


>Tororoさん

えぇ、意図的に自分から作り出した歴史なので不満はありません(笑


>御津凪さん
>途中のカット画像は初めての(特にブログ見てない)方は分からないかと(笑) 

あ〜確かに誰も突っ込んで無かったですね。
いちいち一時停止するような人いないか^^;
「何故止めたし」的な感じではないですねw


>あ〜るさん

えぇ、愛用のライブラリ制作者様に捧げようと思いますw
私の大学生活はDXライブラリに出会わなければどうなっていたんだろうか・・。


>Tatuさん
>女装

え、してほしいですか?メイクなら出来m・・(ry
まぁそんな事をしたとすればここにはうp出来ないですよ(笑

>ところで龍神録プログラミングの館で村の作り方は扱わないのですか? 

RPGの館みたいなものも作りたいですね。でも時間がなぁ・・。
softyaさんが作って下さる事を期待しますw

>大学祭

なにぃ・・・。
ショック・・・。
そういうことは事前に言xt(ry


>dicさん

大丈夫ですね。


>arrayさん

arrayさん将棋動画でしたっけ?あれ、違ったかな??
動画作るのって難しいですね^^;

>消えたら

Σ
その時は権利者の申し立てを・・w


>Maさん
>だれか、RPGの館を作ればいいとおもうんだ。

同じ事をsoftyaさんも仰っていましたよね〜。誰か期待していますw

>DXライブラリを使う人がこれで少しでも増えるといいですね^^ 

ですね、普及に貢献できれば嬉しいですw


>霧蘭さん

ぐは、霧蘭さんにもみられてしまった^^;
DXライブラリご存知無ければこの機会にいかがでしょう?♪


>snさん
>このライブラリ作ってくれた人すげぇなぁ・・・世界に貢献してますよほんと。

ですよね〜。
山田さんは制作のみならずサポートまで手厚いので本当にすごい人だと思います。
質問にサンプルコードや独自のライブラリに変更したものをアップして答えていらっしゃる姿は本当に神がかっています・・。


>asdさん

えぇ、会社で見たら変人だと思われてしまうので賢明なご判断だと思います(笑

>消したら増えますタグを追加しておけばいいですか?

Σ


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

Name: ひよこ  ..比類無きプログラマー(85,383ポイント)   Date: 2010/06/09(水) 22:54   No:53833     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
いつもこの掲示板にきてます。ひよこです。

こんなに意見があるので投稿しづらかったですが、

DXライブラリはいいですよね。あのDirectXよりも何倍も・・・・いいです。
かわいく==変な動画みたいな感じかなと思っていましたら
動画を見てあんまり変に感じなかったです。
言うとしたら喋り方が特徴的です。(モデルを見ていないからかもしれないですけど。
弾幕の解説はなかったような気がします。
「努力した結果がこれです」みたいなタグがつけられる動画でした。(余計なことを言ってしまいました・)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,701ポイント)   Date: 2010/06/09(水) 23:12   No:53836     
Title: Re:■ Dixqの黒歴史に残る動画を作ってみた ■  【雑談】    
なんか、わざとバッシングコメいっぱい付くだろう動画を作ったはずなのに皆優しいコメントばっかりで・・。
意外というかなんというか、ありがとうございますというか^^;

喋り方は、上にある通り「デーモン閣下&悪魔の燻製講座」がモデルです、あんな渋い声は出せませんでしたけどw


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



Name: jay  ..上級者(16,637ポイント)   Date: 2010/06/09(水) 00:03   No:53769       
Title: スコアを残す    
ゲームの開発中に行き詰ってしまいました、どなたか知恵を貸して下さい。

ゲームの終了時にハイスコアを何らかの形で保存する仕様を実装しようとしたのです。
ハイスコアはプレイヤーキャラの構造体においてint型で格納されています。

最初はファイル操作関数fopenとfcloseを使って
ゲーム起動時にfgetcで記録を読み込み、ゲーム終了時にfputcで書き込み。
それぞれをfor文で必要回数(数値の桁数分)繰り返してtxtファイルに保存しようとしました。

しかしここで問題が発生しました。
上述の通り、ハイスコア(ch.hiscore)はint型で宣言されているのです。
fputcはchar型の文字一つを書き込みする仕様なので、ch.hiscoreの保存が出来ないのです。


具体的に僕がやりたいのは
1、ゲーム起動時に何らかの形で保存されているハイスコアを読み込みch.hiscoreに格納する。
2、ゲーム終了時にch.hiscoreの値を何らかの形で保存して、次回以降に読み込めるようにする。

の2つです。
どなたかいい方法を教えて下さい。



Name: ideyan  ..初心者(5,595ポイント)   Date: 2010/06/09(水) 00:20   No:53770     
Title: Re:スコアを残す    
保存するときにfprintfで書きだしてはどうでしょうか?

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

Name: あ〜る  ..上級者(20,937ポイント)   Date: 2010/06/09(水) 00:21   No:53771     
Title: Re:スコアを残す    
http://dixq.net/g/58.html
これを参考にすれば出来ると思います。


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

Name: シエル  ..かけだし(1,845ポイント)   Date: 2010/06/09(水) 00:24   No:53772     
Title: Re:スコアを残す    
http://dixq.net/g/58.html

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

Name: 匿名  ..上級者(21,314ポイント)   Date: 2010/06/09(水) 17:02   No:53791     
Title: Re:スコアを残す    
途中までで構いませんので
そのプログラムを記してもらえると
より回答しやすいです


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

Name: dic  ..比類無きプログラマー(71,054ポイント)   Date: 2010/06/09(水) 18:23   No:53795     
Title: Re:スコアを残す    
文字列を数値に変換する関数
atoi を知っておくと便利です

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

int main()
{
    char    str[10] = "0123";

    int        score;

    //    文字列0123を数値に変換
    score = atoi(str);

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

    return 0;
}



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

Name: jay  ..上級者(16,708ポイント)   Date: 2010/06/09(水) 22:37   No:53830 解決!     
Title: Re:スコアを残す    
あ〜るさんとシエルさんが教えて下さったページを参考に無事実装することができました。

ありがとうございます。


>dicさん
atoi
atof
atol

これらはセットで覚えておきますね。
使う型に合わせて使い分けが必要ということですね。 編集済み


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +