|
Name: regham ..ぴよぴよ(85ポイント)
Date: 2008/12/31(水) 16:52
No:26263
|
|
Title: 無題
|
|
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,a=0,b=0,c=0;
double x;
for(i=0;i<10000;i++)
{
srand(i);
x = (((double)rand()/(RAND_MAX+1))*2.0);
printf("%f\n",x);
if(x>1.0)
a++;
if(x=1.0)
b++;
if(x<1.0)
c++;
}
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
}
上のようなコードを書きました。
0以上2以下の小数乱数を発生させて1未満、1、1より大きいの出現回数(順にa,b,c)を調べるコードを書いたつもりなのですが、実行結果が
4994 a
10000 b
0 c
なってしまいました。
a+b+cが10000になっていないのと、cが0なので何かしらおかしいと思うのですがどうすればよいでしょうか。
85ポイント を手に入れた。
|
|
|
|
Name: SCI ..入門者(2,935ポイント)
Date: 2008/12/31(水) 16:59
No:26264
|
|
Title: Re:無題
|
|
・コードは>pre<タグで囲んでください。
・srand()はプログラムの開始時に1度だけ呼べばいいです。
・b++をするところのifの条件式が「代入文」になっています。つまり、「常にTRUE」です。
・変数xには誤差が出るので、適当な幅を設ける必要があります。
とりあえず、この辺ですか?
114ポイント を落としてしまった。
|
|
|
|
|
Name: regham ..ぴよぴよ(269ポイント)
Date: 2008/12/31(水) 17:10
No:26267
|
|
Title: Re:無題
|
|
回答ありがとうございます。規約をちゃんと読んでいなくて申し訳ない。
=じゃなくて==でしたね・・・。
>>・変数xには誤差が出るので、適当な幅を設ける必要があります。
この部分がわからないので詳しく教えていただけないでしょうか
現時点コード
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,a=0,b=0,c=0;
double x;
srand(0);
for(i=0;i<10000;i++)
{
x = (((double)rand()/(RAND_MAX+1))*2.0);
printf("%f\n",x);
if(x>1.0)
a++;
if(x==1.0)
b++;
if(x<1.0)
c++;
}
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
}
184ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..入門者(3,016ポイント)
Date: 2008/12/31(水) 17:33
No:26269
|
|
Title: Re:無題
|
|
浮動小数点型実数について補足です。
まず、doubleやfloatにおいても1.0や2.0などの整数値は正確に表現できます。
しかし、0.1などは正確に表現できません。規格で有効数字が決められています。
なので、実数同士で比較をするときは「誤差が出る」前提で行ったほうがいいですね、という意味でした。
56ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(26,085ポイント)
Date: 2008/12/31(水) 18:58
No:26272
|
|
Title: Re:無題
|
|
srand(0) では、seedがいつも同じで、使った意味がありません。
srand((unsigned) time(NULL)) にしましょう。
43ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..入門者(3,084ポイント)
Date: 2008/12/30(火) 09:21
No:26195
|
|
Title: Dixqさんの1,2の問題の答え
|
|
Dixqさん1,2の問題ができたので答えます。
問題
1. 画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
2. 今度は裏画面処理を使って画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
3. Zキーが押されれいる間DrawStringで「押されています」と表示するプログラムを書いて下さい。(裏画面処理使う)
4. Zキーが押された瞬間一度だけ「押されました」とprintfDxで表示するプログラムを書いて下さい。(裏画面処理使う)
5. Aキーが押された瞬間一度だけドの音が鳴るプログラムを書いて下さい。(裏画面処理使う)
(管理人による記事の追加)
1画像が徐々に下へいく
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int i ;
for(i=0;i<300;i++){
LoadGraphScreen( 0 , i , "char.png" , TRUE ); //画像を描画
Sleep(10); //10ミリ秒待つ
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
2裏画面処理で画像が徐々に下へいく
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int i ;
for( i = 0 ; i < 300 ; i ++ )
{
ClearDrawScreen(); // 裏画面のデータを全て削除
LoadGraphScreen( 0, i, "char.png" , TRUE ) ; //裏画面へ画像を描写
ScreenFlip() ; // 裏画面データを表画面へ反映
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
これでいいでしょうか。
780ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(941,337ポイント)
Date: 2008/12/30(火) 14:02
No:26203
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
いいですね。正解です。
でも後一歩で完璧になります。
ゲームプログラミングの館の説明が少し悪かったので13章を少し改善しました。
このプログラムは恐らく画像が移動している時にウィンドウを動かそうとしても出来ないと思います。
ProcessMessageという関数を呼んでいないからです。
また、画像を常に毎回ロードして表示するLoadGraphScreenという関数はゲームプログラムでは使う事はほとんどありません。
ロードしたデータを保存しておき、それを表示する方法を使います。
なので、13c章のプログラムを参考にして下さい。
172ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..入門者(3,603ポイント)
Date: 2008/12/30(火) 18:05
No:26210
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
添削してくださりありがとうございます。
指導してもらったのでソースを改良してきました。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "char.png" ) ; //char.pngのハンドルを代入
int i ;
for( i = 0 ; i < 300 ; i ++ )
{
ClearDrawScreen(); // 裏画面のデータを全て削除
DrawGraph( 0 , i , image , FALSE ) ; //画像を表示
ScreenFlip() ; // 裏画面データを表画面へ反映
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
519ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..入門者(3,628ポイント)
Date: 2008/12/30(火) 18:38
No:26214
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
ProcessMessageってなんですか。よくわかりません。
25ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(28,128ポイント)
Date: 2008/12/30(火) 21:06
No:26219
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
横から失礼します。
ひよこさんはDXライブラリのリファレンスを読まれましたか?
ProcessMessage ()は60分の1秒に1回は呼び出さなければ、システムが不安定になります。
分かりやすく言えば、いつ強制終了してもおかしくない状態になります。
なのでDXライブラリを使用する際の決まり文句として書かなければいけません。
あと、調べれば分かるような事はまず自分で調べてみましょう。
235ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(942,725ポイント)
Date: 2008/12/31(水) 02:26
No:26235
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
上にも書いた通りですが、
お書きになったプログラムは恐らく画像が移動している時にウィンドウを動かそうとしても出来ないと思います。
ProcessMessageという関数を呼んでいないからです。
詳しくはググるか、DXライブラリのリファレンスをご覧になったらいいと思いますが、
メッセージ処理をさせなければなりません。
メッセージ処理の関数の入れ方については13章をご覧下さい。
また、forで回数指定してループさせるより13c章のようにwhileで回した方がいいでしょう。
(forでもwhileでも同じ事は出来ますが)
159ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..入門者(4,232ポイント)
Date: 2008/12/31(水) 11:11
No:26254
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
Dixqさんウィンドウを動かすというのはこういう感じの文でよろしいでしょうか
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "char.png" ) ; //char.pngのハンドルを代入
int i ;
for( i = 0 ; i < 300 ; i ++ )
{
ClearDrawScreen(); // 裏画面のデータを全て削除
DrawGraph( 0 , i , image , FALSE ) ; //画像を表示
ScreenFlip() ; // 裏画面データを表画面へ反映
if( ProcessMessage() == -1 );// メッセージループに代わる処理をする
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
593ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..入門者(3,049ポイント)
Date: 2008/12/31(水) 13:22
No:26256
|
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
ひよこさん
そうです。それで普通のWinアプリみたいな動きをしてくれると思います。
後はループの件ですが、そのコードだと一定時間経つと問答無用で終わるんじゃないですか?
しばらくは描画の更新が続きますが、iの値が300になるとWaitKey()状態になります。
このとき、描画更新処理はされていないはずです。
これを解決するには、上で出ている「whileのお話」を参考にすると良いですよ〜
185ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..入門者(4,279ポイント)
Date: 2008/12/31(水) 16:39
No:26261
| 解決!
|
Title: Re:Dixqさんの1,2の問題の答え
|
|
みなさんいろいろとご指摘ありがとうございます。
またわからなくなったら質問しますのでよろしくおねがいします。
47ポイント を手に入れた。
|
|
|
|
Name: ムンバ ..上級者(19,574ポイント)
Date: 2008/12/31(水) 01:07
No:26226
| 解決!
|
Title: 画像の重なり?について教えて下さい。
|
|
こんばんは。お世話になります。<_ _>
---ここから雑談---
C言語の基礎の勉強はしたのですが、なかなか全部は覚えられませんでした。(涙
ですがっ!けどC言語でゲームを作りたいので、おとといからゲームにも挑戦してしまいました。^^;
これからはゲームを作りながら参考書や、こちらのサイトやその他の参考サイトを参考に
頭の足りない所を、できるだけ埋めて行きたいと思います。
以前、質問させて頂いた時に、とある方にご指導頂いた(ご指導ありがとうございました。)
・じゃんけんゲームのような簡単な遊びをするゲーム
・簡単なアクションゲーム
・チャットをするソフト
私が作りたいゲームの勉強方法を、上記の様にご指導頂きました。
もちろん私の作りたいゲームができなくても、自爆なのでお気にされないで下さい。
自分が作りたいゲームに向かって、勉強してみます。<俺の、青春かい?w
---ここまで雑談(謝---
パソコンと、じゃんけんをするゲームを作ってます。
勝ち負けの判定は、まだです。
キーボードの「1」を押すと、自分は「グー」
キーボードの「2」を押すと、自分は「チョキ」
キーボードの「3」を押すと、自分は「パー」
1〜3のキーを押すと
PCはランダムに「グー・チョキ・パー」の何れかを表示します。
#include "DxLib.h"
#define HAIKEI "img/haikei001.jpg" //背景画像
#define JYANxITI 315
/* 自分側のじゃんけん画像 */
#define MYGOO "img/goo.png"
#define MYTYOKI "img/tyoki.png"
#define MYPAA "img/paa.png"
/* PC側のじゃんけん画像 */
#define PCGOO "img/goo2.png"
#define PCTYOKI "img/tyoki2.png"
#define PCPAA "img/paa2.png"
char keybuf[256];
int mynum, pc_rand, pcnum; //mynum pcnum は勝ち負けの判定に使う予定
void myjyan();
void pcjyan();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); //ウィンドウモードに変更する関数
if (DxLib_Init() == -1) //初期化処理する関数
return -1;
LoadGraphScreen(0, 0, HAIKEI, FALSE); //#define HAIKEI 背景画像
DrawFormatString(520, 463, GetColor(100, 100, 255), "%s", "ムンじゃんけん"); //タイトル表示
while (1){
GetHitKeyStateAll(keybuf); //すべてのキーの状態を得る
if (keybuf[KEY_INPUT_ESCAPE] == 1) //Escキー押すと終了
break;
if (ProcessMessage() == -1) //エラーが起きたら終了
break;
myjyan(); //自分じゃんけん関数
pcjyan(); //PCじゃんけん関数
}
DxLib_End(); //終了処理をする関数
return 0;
}
void myjyan() //自分じゃんけん関数
{
if (keybuf[KEY_INPUT_1] == 1){
LoadGraphScreen(JYANxITI, 390, MYGOO, TRUE); //数字1で自分グー画像
DrawFormatString(JYANxITI, 463, GetColor(100, 100, 255), "%s", "グー"); //自分グー表示
mynum = 1; //勝ち負け判定予定の変数
} else if (keybuf[KEY_INPUT_2] == 1){
LoadGraphScreen(JYANxITI, 390, MYTYOKI, TRUE); //数字2で自分チョキ画像
DrawFormatString((JYANxITI - 10), 463, GetColor(100, 100, 255), "%s", "チョキ"); //自分チョキ表示
mynum = 2; //勝ち負け判定予定の変数
} else if (keybuf[KEY_INPUT_3] == 1){
LoadGraphScreen(JYANxITI, 390, MYPAA, TRUE); //数字3で自分パー画像
DrawFormatString(JYANxITI, 463, GetColor(100, 100, 255), "%s", "パー"); //自分パー表示
mynum = 3; //勝ち負け判定予定の変数
}
}
void pcjyan() //PCじゃんけん関数
{
if (keybuf[KEY_INPUT_1] == 1 || keybuf[KEY_INPUT_2] == 1 || keybuf[KEY_INPUT_3] == 1){
pc_rand = GetRand(2); //PCじゃんけんランダム
Sleep(300); //押しっぱなし対策(1/600秒間)
if (pc_rand == 0){
LoadGraphScreen(JYANxITI, 250, PCGOO, TRUE); //PCグー画像
pcnum = 1; //勝ち負け判定予定の変数
}else if (pc_rand == 1){
LoadGraphScreen(JYANxITI, 250, PCTYOKI, TRUE); //PCチョキ画像
pcnum = 2; //勝ち負け判定予定の変数
}else if (pc_rand == 2){
LoadGraphScreen(JYANxITI, 250, PCPAA, TRUE); //PCパー画像
pcnum = 3; //勝ち負け判定予定の変数
}
}
}
このプログラムを実行して、「1」「2」「3」の何れかの数字をキーボードから入力して
じゃんけんをするのですが、じゃんけんを繰り返すと
自分側の画像も、PC側の画像も重なって表示されてしまいます。
「グー」「チョキ」「パー」の文字も重なります。
2回目以降に、じゃんけんをした時に、画像が重ならない様にしたいのです。
どの様に対処したらいいでしょうか?
ご指導の程お願い致します。
修正・追加<_ _>
ライブラリ:DXライブラリ
PC:Windows VISTA
開発環境:VC++ 2008
1,345ポイント を手に入れた。
|
|
|
|
Name: 木霊 ..プログラマー(28,626ポイント)
Date: 2008/12/31(水) 01:22
No:26228
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
ScreenFlip ()とClearDrawScreen ()の2つを呼んでいないからではないですか?
ループ内でこの2つを呼ぶようにしてください。
詳しい使い方はDXライブラリのリファレンスを見てくださいね。
あとは、グローバル変数を使わないようにしてください。
各関数をvoidではなくintにして返り値で「どの手を出したか」を返せばできると思います。
162ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(19,727ポイント)
Date: 2008/12/31(水) 01:56
No:26229
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
木霊さん、早速のご解説どうもありがとうございます。
>ScreenFlip ()とClearDrawScreen ()の2つ
「ゲームプログラミングの館」の 13a. 裏画面処理をして画像を動かす
もう一度、読み直してみます。
>DXライブラリのリファレンス
ありがとうございます。見てみます。
>あとは、グローバル変数を使わないようにしてください。
関数に void を使ったのは・・・。(汗
ごめんなさい。
今日は寝てしまいますが、明日の夜に勉強再開します。
すみません。(謝
153ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(2,371ポイント)
Date: 2008/12/31(水) 02:04
No:26230
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
>>あとは、グローバル変数を使わないようにしてください。
> 関数に void を使ったのは・・・。(汗
ん、気になりますね。何か重大な秘密があるのでしょうか。
64ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(2,410ポイント)
Date: 2008/12/31(水) 02:07
No:26232
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
あぁ、それから。
LoadGraphScreenをループ毎に実行するのは高負荷なので、LoadGraphを使って予め画像を読み込んでおくと良いでしょう。
39ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(942,250ポイント)
Date: 2008/12/31(水) 02:17
No:26233
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
木霊さんが仰っている事に加え、ちょっと考え方で良くない所があります。
コードをザっと見ただけですが、「今押した瞬間」を考えるため、
途中で
Sleep(300); //押しっぱなし対策(1/600秒間)
していますよね。
こうすると、0.3秒画面が止まってしまいます。
メッセージ処理も出来ませんし、動きも止まってしまうのはよくないです。
0.3秒待機させるときは、カウンタなどによって0.3秒は特定の関数を呼ばないようにするなどの
方法が必要です。
またキーが今押された瞬間かどうかはゲームプログラミングの館の40a章などを参考にして下さい。
最低限呼ばないといけない関数はwhile関数の条件式の中に突っ込んでしまうと便利です。
また、常に読み込みながら描画するLoadGraphScreenはほとんど使う機会の無い関数です。
LoadGraph関数で一度読み込んでから描画して下さい。
詳しくは13c章までよく読んでみて下さい。
まとめると
・メッセージ処理をすること
・裏画面処理をすること
・画像は一回ロードしてから使うこと
・Sleep関数はFPS制御以外に使わないこと
・今押されたかどうかは前のキーボードの状態と今のキーボードの状態を比較して行うこと
この辺に注意してみて下さい。それとSleep(300)は1/600秒ではないですが、その辺はOKですか?
508ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(12,911ポイント)
Date: 2008/12/31(水) 02:55
No:26238
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
キーの押しっぱなし対策としては、bKeyDowningみたいな名前のフラグをつくり、押したらフラグをtrueにし、離したらfalseにします。そしてtrueの間は新しくゲームを始めないようにすれば良いですよ。
88ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..入門者(2,736ポイント)
Date: 2008/12/31(水) 03:07
No:26239
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
もしくは、GetHitKeyStateAll(keybuf)のkeybufをそのまま使うのではなく、
if (keybuf[コード]) key[コード]++;
else key[コード] = 0;
というようにすれば、「押された瞬間」と「押され続けている」をすべてのキーに対して判定できますね。
龍神録3章ではこの実装になっているようです。
もちろん、押された瞬間は「値が1」、押され続けているときは「値が正」ですね。
171ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(20,965ポイント)
Date: 2008/12/31(水) 15:02
No:26259
|
|
Title: Re:画像の重なり?について教えて下さい。
|
|
こんにちは。
仕事が思ったより早く終わったので勉強再開できました。w
木霊さん、SCIさん、管理人さん、lbfuvabさん
ご丁寧なご解説ありがとうございます。
皆さんに、ご意見頂いた内、まだ部分的にですが^^;修正してみました。
#include "DxLib.h"
#define JYANxITI 315
char keybuf[256];
int mynum, pc_rand, pcnum; //mynum pcnum は勝ち負けの判定に使う予定
int img[7];
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); //ウィンドウモードに変更する関数
if (DxLib_Init() == -1) //初期化処理する関数
return -1;
img[0]=LoadGraph("img/haikei001.jpg");
img[1]=LoadGraph("img/goo.png");
img[2]=LoadGraph("img/tyoki.png");
img[3]=LoadGraph("img/paa.png");
img[4]=LoadGraph("img/goo2.png");
img[5]=LoadGraph("img/tyoki2.png");
img[6]=LoadGraph("img/paa2.png");
while (1){
ClearDrawScreen();
DrawGraph(0, 0, img[0], TRUE);
DrawFormatString(520, 463, GetColor(100, 100, 255), "%s", "ムンじゃんけん"); //タイトル表示
GetHitKeyStateAll(keybuf); //すべてのキーの状態を得る
if (keybuf[KEY_INPUT_ESCAPE] == 1) //Escキー押すと終了
break;
if (ProcessMessage() == -1) //エラーが起きたら終了
break;
if (keybuf[KEY_INPUT_1] == 1){
DrawGraph(JYANxITI, 390, img[1], TRUE); //数字1で自分グー画像
DrawFormatString(JYANxITI, 463, GetColor(100, 100, 255), "%s", "グー"); //自分グー表示
mynum = 1; //勝ち負け判定予定の変数
} else if (keybuf[KEY_INPUT_2] == 1){
DrawGraph(JYANxITI, 390, img[2], TRUE); //数字2で自分チョキ画像
DrawFormatString((JYANxITI - 10), 463, GetColor(100, 100, 255), "%s", "チョキ"); //自分チョキ表示
mynum = 2; //勝ち負け判定予定の変数
} else if (keybuf[KEY_INPUT_3] == 1){
DrawGraph(JYANxITI, 390, img[3], TRUE); //数字3で自分パー画像
DrawFormatString(JYANxITI, 463, GetColor(100, 100, 255), "%s", "パー"); //自分パー表示
mynum = 3; //勝ち負け判定予定の変数
}
if (keybuf[KEY_INPUT_1] == 1 || keybuf[KEY_INPUT_2] == 1 || keybuf[KEY_INPUT_3] == 1){
pc_rand = GetRand(2); //PCじゃんけんランダム
Sleep(300); //押しっぱなし対策(ミリ秒)
if (pc_rand == 0){
DrawGraph(JYANxITI, 250, img[4], TRUE); //PCグー画像
pcnum = 1; //勝ち負け判定予定の変数
} else if (pc_rand == 1){
DrawGraph(JYANxITI, 250, img[5], TRUE); //PCグー画像
pcnum = 2; //勝ち負け判定予定の変数
}else if (pc_rand == 2){
DrawGraph(JYANxITI, 250, img[6], TRUE); //PCパー画像
pcnum = 3; //勝ち負け判定予定の変数
}
}
ScreenFlip();
}
DxLib_End(); //終了処理をする関数
return 0;
}
>木霊さん
自作関数は、もう少し勉強してから、もう1度試してみます。(謝
ScreenFlip ()とClearDrawScreen ()を入れてみたらできました。
じゃんけん画像が、その都度消えるのは今後、対処したいと思います。
ご指導ありがとうございました。<_ _>
>SCIさん
>ん、気になりますね。何か重大な秘密があるのでしょうか。
実はですね〜^^;
自作関数は、こちらの「サンプルプログラミングの館」の「ジャンケン」
のソース内の自作関数を真似してみたのです。ごめんなさい。(涙
LoadGraph関数に変更しました。
GetHitKeyStateAll_2関数は、管理人さんのご指導も含めまして
これから勉強して取り入れてみたと思います。
ご指導ありがとうございました。<_ _>
>管理人さん
いつもありがとうございます。^^
>Sleep(300)は1/600秒ではないですが、その辺はOKですか?
ううっ・・・単位はミリ秒ですよね。<全然OKじゃないですね。^^;
おっしゃる通り、Sleep関数は使わないで
GetHitKeyStateAll_2関数でやってみたいと思います。
・メッセージ処理をすること
・Sleep関数はFPS制御以外に使わないこと
・今押されたかどうかは前のキーボードの状態と今のキーボードの状態を比較して行うこと
今から引き続き「館」を参考にさせて頂き、やってみます。w
ご指導ありがとうございました。<_ _>
>lbfuvabさん
参考にさせて頂きます。
ご指導ありがとうございました。<_ _>
皆さん本当にありがとうございました。
また何かありましたらご指導の程宜しくお願い致します。(謝
1,238ポイント を手に入れた。
|
|
|
|
Name: たか ..入門者(2,805ポイント)
Date: 2008/12/30(火) 22:36
No:26223
| 解決!
|
Title: リンク切れの報告
|
|
管理人様製作の「クイックソート解説サプリ」の件で報告です。
ダウンロードページがリンク切れしているようです。
私の環境下では添付したスクリーンショットの用になりました。
2倍のポイントを手に入れた! 172ポイント を手に入れた。
|
|
|
Name: kaiten ..入門者(4,867ポイント)
Date: 2008/12/28(日) 20:35
No:26152
|
|
Title: 関数オブジェクトを配列に入れる
|
|
お久しぶりです。
現在vista+VC++2008EEでプログラミングしているのですが不明な点があったので質問させていただきます。
関数オブジェクトについてなのですが、int型で作った関数オブジェクトを関数ポインタのようにint型の配列に代入して使用することはできないのでしょうか?
試しにやってみたのですが期待どおりの動作をしてくれませんでした。
試したときのソース載せておきます。
//--bullet.h--
#pragma once
#include "header.h"
#include "class.h"
class AroundShot
{
public:
int operator()(int);
};
class Bullet : public Object
{
private:
static const int shot_num=1;
int player;
int power;
int type;
int img;
public:
AroundShot AS;
int Shot_Set[shot_num];
Bullet(){}
Bullet(float x, float y, int lifemax, float angle, int r, float speed, int power, int player);
Bullet(const Bullet ©, const Object &O_copy);
~Bullet();
virtual void Move();
};
extern std::vector<Bullet> bullet;
//--Bulletのコンストラクタ--
Bullet::Bullet(float x, float y, int lifemax, float angle, int r, float speed, int power, int player) :
Object(x, y, lifemax, angle, r, 0), power(power), player(player), type(::player[player].multi), img(Bullet_Img[player][::player[player].multi])
{
/*
this->power=power;
this->player=player;
this->type=::player[player].multi;
this->img=Player_Img[player][::player[player].multi];
*/
Shot_Set[0]=AS(0);
GetGraphSize(img, &w, &h);
this->w/=2;
this->h/=2;
}
//AroundShot
int AroundShot::operator()(int)
{
printfDx("ASop was used");
return(0);
}
while(ProcessMessage() == 0&&GetHitKeyStateAll(key) == 0){
ClsDrawScreen(); //裏画面のデータを全て削除
fps.FPS_Wait();//フレームの待機を計算
//実際の処理を入れる(初期化などを除く
switch(state)
{
case TITLE:
state=SELECT;
break;
case SELECT:
player[0]=Player(0, 0, 100, border_x/2, 400, 100, 0, 3, 5, 3, 0, 0);
player[1]=Player(1, 0, 100, border_x/2, 80, 100, 180, 3, 5, 3, 0, 0);
bullet[0].Move();
bullet[0].Shot_Set[0];
//printfDx("%d",bullet[0].AS(1));
ScreenFlip();
state=MAIN;
break;
}
fps.Draw_FPS();
ScreenFlip(); //裏画面データを表画面へ反映
}
#題名忘れてました。
703ポイント を落としてしまった。
|
|
|
|
Name: Justy ..ハッカー(292,850ポイント)
Date: 2008/12/28(日) 21:31
No:26154
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
>int型で作った関数オブジェクトを関数ポインタのようにint型の配列に代入して使用することはできないのでしょうか
あんまり意味がよくわからないのですが、要するに
「int型を戻り値とする関数オブジェクトを実行して、その戻り値を int型の配列に代入できるか」
ということですか?
そうであるならできます。
>試しにやってみたのですが期待どおりの動作をしてくれませんでした
該当する行は
Shot_Set[0]=AS(0);
でしょうか?
特に問題なく実行できそうな気がしますが、何を期待していたのに
どうなってしまったのでしょうか?
387ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,003ポイント)
Date: 2008/12/28(日) 22:14
No:26155
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
いえ、そうではないんです。
いくつかの関数オブジェクトをまとめて一つの配列のようにしたいんです。配列から関数オブジェクトを呼べるように。
たとえば
Shot_Set[0]=AS(0);
としたら、
bullet[0].Shot_Set[0]とbullet[0].AS(0)が同じ意味になるようにしたいんです。
136ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(295,206ポイント)
Date: 2008/12/29(月) 01:04
No:26167
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
>いくつかの関数オブジェクトをまとめて一つの配列のようにしたいんです。配列から関数オブジェクトを呼べるように
なんとなくやりたいことはわかりました。
>bullet[0].Shot_Set[0]とbullet[0].AS(0)が同じ意味になるようにしたいんです
つまり、関数オブジェクトは AroundShotだけに限らす他のものであるかもしれない、と。
で、int型の引数で int型の戻り値を持つ関数オブジェクトを配列として扱いたい、ということですね?
であれば、boostの functionが使えるのではないでしょうか。
ただ、前者のようにX番目の配列としてアクセスしただけで関数オブジェクトが実行される
ということになりますと単純な配列ではできませんが、配列 operatorを使えば
なんとか近いものが実装できそうです。
(代入は bindに頼っているのでちょっとアレですが)
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <vector>
#include <functional>
class AroundShot1 : public std::unary_function<int, int>
{
int m;
public:
AroundShot1(): m(0) {}
int operator()(int v) { return v * 100 + m++; }
};
class AroundShot2 : public std::unary_function<int, int>
{
public:
int operator()(int v) { return v * 200; }
};
class Hoge
{
typedef std::vector< boost::function<int ()> > func_list_type;
func_list_type funclist;
public:
Hoge(std::size_t arraySize): funclist(arraySize) {}
template <typename Func>
void Set(std::size_t pos, Func f) { funclist.at(pos) = f; }
int operator[](std::size_t pos)
{
func_list_type::value_type &func = funclist.at(pos);
return func? func(): 0;
}
};
class Object { };
class Bullet : public Object
{
static const std::size_t shot_num = 3;
public:
AroundShot1 AS;
Hoge Shot_Set;
public:
Bullet()
: Shot_Set(shot_num)
{
AS(0); // AroundShot1の関数オブジェクトを呼び出す (メンバ mが 1になる)
Shot_Set.Set(0, boost::bind(boost::ref(AS), 1)); // メンバ変数 ASを使う
Shot_Set.Set(1, boost::bind(AroundShot2(), 2)); // 一時変数からコピーして使う
printf("ASop was used 0, %d\n", Shot_Set[0]); // 結果は 101(メンバ ASの mも変化する)
printf("ASop was used 1, %d\n", Shot_Set[1]);
}
};
1,852ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(1,315ポイント)
Date: 2008/12/29(月) 01:05
No:26168
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
関数ポインタ風ということなので、C言語風に書くと
int (*farray[10])(int);
farray[0] = &func;
farray[0](0); /* func(0) と同値 */
というようなことでしょうか?
vector<AroundShot>にpush_backではダメですか?
> bullet[0].Shot_Set[0]とbullet[0].AS(0)が同じ意味
operator[]を使って引数を指定したいということならオーバーロードですが・・・
150ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(1,351ポイント)
Date: 2008/12/29(月) 01:08
No:26169
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
&funcじゃなくてfuncだった。
しかも投稿被った・・・
boostは使ったことないですが、オススメです(何
36ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(295,461ポイント)
Date: 2008/12/29(月) 01:56
No:26170
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
>vector<AroundShot>にpush_backではダメですか?
関数オブジェクトが AroundShotだけならそれもいいですね。
あ、そうだ。
それみて思いつきましたが、オーソドックスに AroundShotなどは operator()を仮想関数にした
インターフェースクラスから継承して作り、インターフェースへのポインタと引数をセットにして
vectorに入れればAroundShot以外であってもいけそうです。
あれ? 関数オブジェクトで有る必要が無くなってしまった……。
255ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(295,826ポイント)
Date: 2008/12/29(月) 02:22
No:26171
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
ちょっと追加。
Hogeのメンバ関数に
template <typename Func>
void Set(std::size_t pos, const Func &f, int arg)
{
funclist.at(pos) = boost::bind(f, arg);
}
というのがを加えておくと、設定するときに
Shot_Set.Set(0, boost::ref(AS), 1);
Shot_Set.Set(1, AroundShot2(), 2);
のようになりますので使うときに bindが消えるので楽になります。
365ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(1,503ポイント)
Date: 2008/12/29(月) 02:26
No:26172
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
はい、私も書き込んだ後に思いました。
なので、私も(引数セットではないですが)インターフェイスへのポインタをvectorに入れて・・・は考えました。
確かに、これだと関数ポインタと変わらないですね・・・
一説によると、最適化でインラインになるから関数呼び出しオーバーヘッドよりちょっと速くなるという噂は聞いたことがありますが(笑)
152ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,203ポイント)
Date: 2008/12/29(月) 08:42
No:26177
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
寝てる間にこんなにレスが……本当にありがとうございます。
口下手ですみません。でも何とか通じたようでよかったです。
STLのアルゴリズムで関数オブジェクトが必要なものがあるから、といった理由で使おうとしていたのですが、よく考えると関係ないですね。単に関数オブジェクトを挟めばいいだけ……
簡単なことだろうと思ってたので自分の技量を書いてなかったんですが予想よりはるかに高い山のようで……
しかし、Boostですか。まだSTLもロクに使えないんで敬遠してたのでちょっとビビってますw
今の自分に出来そうなのはインターフェースクラスから作ることでしょうかねぇ……試してみます。
200ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(296,219ポイント)
Date: 2008/12/29(月) 14:36
No:26186
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
SCIさん
>一説によると、最適化でインラインになるから関数呼び出しオーバーヘッドよりちょっと速くなる
関数オブジェクトをを使った方が、ということですか?
間接呼び出しで無くなる分はそうですね。
kaitenさん
>今の自分に出来そうなのはインターフェースクラスから作ることでしょうかねぇ
関数ポインタは、戻り値と引数が一致すれば別の関数でも型は同じになりますが、
関数オブジェクトは呼び出し方は同じでも別々になるので単純な配列化は難しいです。
実際 AroundShotの役割が判っていないので、それがベストなのか判りませんが
インターフェースを使う方法が一番楽かもしれません。
357ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(300,311ポイント)
Date: 2008/12/29(月) 14:39
No:26187
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
(あんまり検証していないませんが)boost無しで書くとこんな感じになります。
まだちょっと敷居が高いかもしれませんが、雰囲気だけでも参考にということで。
class FuncObject
{
struct BaseHolder
{
virtual ~BaseHolder() {}
virtual BaseHolder * Clone() const = 0;
virtual int Execute() = 0;
};
template<typename Func>
class Holder : public BaseHolder
{
public:
Holder(const Func & func_, int arg_) : func(func_), arg(arg_) {}
virtual BaseHolder * Clone() const { return new Holder(func, arg); }
virtual int Execute() { return func(arg); }
private:
Func func;
int arg;
Holder & operator=(const Holder &);
Holder(const Holder& other);
};
template<class T> class RefWrapper
{
T* p;
public:
explicit RefWrapper(T& t): p(&t) {}
int operator()(int v) { return (*p)(v); }
};
BaseHolder * func_holder;
public:
FuncObject() : func_holder() {}
FuncObject(const FuncObject& other)
: func_holder(other.func_holder ? other.func_holder->Clone() : 0) {}
~FuncObject() { delete func_holder; }
template<typename ValueType>
FuncObject & operator=(const FuncObject & other)
{
delete func_holder;
func_holder = 0;
func_holder = other.func_holder->Clone();
return *this;
}
template<typename Func>
void Set(const Func &f, int arg)
{
func_holder = new Holder<Func>(f, arg);
}
template<typename Func>
void SetRef(Func &f, int arg)
{
func_holder = new Holder< RefWrapper<Func> >(RefWrapper<Func>(f), arg);
}
int Execute()
{
if(func_holder) return func_holder->Execute();
else return 0;
}
};
class Hoge2
{
typedef std::vector< FuncObject > func_list_type;
func_list_type funclist;
public:
Hoge2(std::size_t arraySize): funclist(arraySize, FuncObject()) {}
template <typename Func>
void Set(std::size_t pos, const Func &f, int arg) { funclist.at(pos).Set(f, arg); }
template <typename Func>
void SetRef(std::size_t pos, Func &f, int arg) { funclist.at(pos).SetRef(f, arg); }
int operator[](std::size_t pos)
{
func_list_type::value_type &func = funclist.at(pos);
return func.Execute();
}
};
で、使うときはこうなります。
Shot_Set.SetRef(0, AS, 1);
Shot_Set.Set(1, AroundShot2(), 2);
printf("ASop was used 0, %d\n", Shot_Set[0]);
printf("ASop was used 1, %d\n", Shot_Set[1]);
2倍のポイントを手に入れた! 4,092ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(77,748ポイント)
Date: 2008/12/29(月) 16:15
No:26188
|
|
Title: Re:関数オブジェクトを配列に入れる
|
|
Boost C++ Librariesを使ってよいのであれば、次のようにすればもっと簡単になるかもしれません。
#include <iostream>
#include <boost/any.hpp>
class function
{
boost::any f_;
int (*call_)(const boost::any&, int);
template <class F>
static int call(const boost::any& f, int arg)
{
return boost::any_cast<F>(f)(arg);
}
public:
function() : call_(0) {}
template <class F>
function(F f) : f_(f), call_(&call<F>) {}
int operator()(int arg) const { return (*call_)(f_, arg); }
};
int foo(int arg)
{
return arg + 1;
}
int main()
{
function a[10];
a[0] = &foo;
for (int i = 0; i < 3; i++)
std::cout << a[0](i) << std::endl;
}
Boost.Functionより理解しやすいかと思いますが、いかがでしょうか?
328ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,322ポイント)
Date: 2008/12/30(火) 10:20
No:26196
| 解決!
|
Title: Re:関数オブジェクトを配列に入れる
|
|
関数オブジェクトの形は諦めてインターフェースクラスを使う方法で期待道理の動作になったのでとりあえず解決とさせていただきます。
教えていただいたBoostなどの方法はもっとC++やSTLを理解してから再度チャレンジしてみようと思います。
皆さまのおかげで解決できました。ありがとうございます。
119ポイント を手に入れた。
|
|
|
|
Name: みかんのかわ ..ぴよぴよ(166ポイント)
Date: 2008/12/27(土) 20:34
No:26095
|
|
Title: 角度の出し方について
|
|
C言語で、今画面上に3つの点をランダムで出し、その点を結んで
直角三角形を描画し、その角度を求めるということをしようとしています。
(各点はランダムで出しますが必ずどこかひとつの角が直角になるようにします。)
三角形の2辺の長さと直角ということを利用し、残りの角のひとつを出したいと考えています。
やり方として、三平方の定理で角度を出す、「COSθ=b/a」(b,aは三角形の辺の長さです)
を使用してやろうと考えております。
その角度θを今プログラム的に求めたいと考えているのですが、やり方がよくわかりません。
θをどのようにもとめればよいでしょうか?
(COSθ=b/aからθ=の式にうまく直せないというか)
説明がしずらくわかりずらくなってしまったかもしれませんが、よろしくお願いいたします。
166ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(132,702ポイント)
Date: 2008/12/27(土) 21:07
No:26096
|
|
Title: Re:角度の出し方について
|
|
> やり方として、三平方の定理で角度を出す、「COSθ=b/a」(b,aは三角形の辺の長さです)
どの2辺のことかを言わないと、その式が成立するかどうかはわかりません。
仮に、2辺a,bが斜辺と他の1辺のことだとすると、
acosという標準関数を使えばθが求まります。
80ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,653ポイント)
Date: 2008/12/27(土) 21:14
No:26097
|
|
Title: Re:角度の出し方について
|
|
画像の計算式が分かっていれば求まると思いますが
どこにつまづいているのでしょうか?
31ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(25,669ポイント)
Date: 2008/12/27(土) 22:27
No:26099
|
|
Title: Re:角度の出し方について
|
|
意味がよくわかりませんので質問を。
> C言語で、今画面上に3つの点をランダムで出し、その点を結んで
> 直角三角形を描画し、その角度を求めるということをしようとしています。
直角三角形を描画したいと考えていいですよね。
角度を求めるのは、その後ということで。
> 三角形の2辺の長さと直角ということを利用し、残りの角のひとつを出したいと考えています。
まず、2点を乱数で発生させ、もう1点を直角三角形になる場所に発生させたいと考えて
よろしいでしょうか?
> やり方として、三平方の定理で角度を出す、「COSθ=b/a」(b,aは三角形の辺の長さです)
> を使用してやろうと考えております。
これは、3点目の頂点を出すためではなく、描画した後の角度を求めるためなのでしょうか?
> その角度θを今プログラム的に求めたいと考えているのですが、やり方がよくわかりません。
> θをどのようにもとめればよいでしょうか?
> (COSθ=b/aからθ=の式にうまく直せないというか)
この部分だけなら、boxさんが言われるようにアークコサイン(acos)という関数があります。
「みかんのかわ」さんは、高校生以上ですよね。
さて、3点目の頂点を発生させる方法は、できているのでしょうか?
こっちの方が難しいのでは?
137ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(19,524ポイント)
Date: 2008/12/27(土) 22:40
No:26100
|
|
Title: Re:角度の出し方について
|
|
> C言語で、今画面上に3つの点をランダムで出し、その点を結んで
> 直角三角形を描画し、その角度を求めるということをしようとしています。
> (各点はランダムで出しますが必ずどこかひとつの角が直角になるようにします。)
そもそもこの方針が間違いなのではないかと。
一般的にランダムの3つの点が作る三角形は直角三角形ではないですよ。
ランダムな直角三角形がほしいなら次の2つの方法をお勧めします。
(1)力任せ
while (1) {
// ランダムで三角形を作成
// 判定(内積を使うと良いでしょう)
if (直角三角形か?) break;
}
(2)直角三角形を直接作る(∠BACが直角)
// ランダムで点Aを決める
// ランダムで点Bを決める
// ランダムでACの長さを決める
-AB <= |AC| <= ABの範囲が良いかな。なんとなく。
符号によってCをABから見てどちら側にするかを決める。
// Cを計算で求める
ABの傾きをatan2で角度にして、Aを基準に三角関数でCの座標を求める。
力任せの方法は簡単ですが、内積の判定に幅を持たせないと使い物にならないでしょう。
直角三角形を直接作る方法は一例です。目的に合わせたより良い方法があるならば
それを使ってください。
254ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(25,873ポイント)
Date: 2008/12/27(土) 23:01
No:26101
|
|
Title: Re:角度の出し方について
|
|
方法1は問題外
方法2はいいけど、乱数を向きと長さの2つを発生させなきゃいけないし、
式も結構面倒かな。2点を通る直線の式からそれに直交する式を求めることになる。
その後、長さから座標を求める。大変だ。
また、軸に平行な場合を、場合分けしなきゃいけなくなる。
そこで、方法3として、
まず、2点の乱数を発生させ、この2点を直径とする円の方程式を求め、円周上の
点を角度0〜2πで乱数発生させたほうが簡単だと思う。
204ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(19,756ポイント)
Date: 2008/12/28(日) 13:38
No:26127
|
|
Title: Re:角度の出し方について
|
|
方法1が問題外なのは同意。半分ネタです。
> 方法2はいいけど、乱数を向きと長さの2つを発生させなきゃいけないし、
> 式も結構面倒かな。2点を通る直線の式からそれに直交する式を求めることになる。
> その後、長さから座標を求める。大変だ。
> また、軸に平行な場合を、場合分けしなきゃいけなくなる。
それほど大変じゃないですよ。
2点を通る直線の式も直交する直線の式も求める必要はありません。
ABの角度は引き算とatan2で求まるので、ACの角度はこれにπ/4を足すだけ。
x座標については、cx = ax + (ACの長さ)*cos(ACの角度)となります。
ACの長さに負の範囲もあるし、atan2なので、場合分けも要りません。
方法3は私も思いついていましたが(負け惜しみ)、
こっちの方がよほど簡単ですね。深く考えませんでした。
152ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(25,994ポイント)
Date: 2008/12/28(日) 15:26
No:26133
|
|
Title: Re:角度の出し方について
|
|
> ABの角度は引き算とatan2で求まるので、ACの角度はこれにπ/4を足すだけ。
> x座標については、cx = ax + (ACの長さ)*cos(ACの角度)となります。
> ACの長さに負の範囲もあるし、atan2なので、場合分けも要りません。
なるほど、それなら、大変じゃないですね。
しかし、本人からはRESがないので、何がわからないのか、定かでないですね。
37ポイント を手に入れた。
|
|
|
|
|
Name: みかんのかわ ..ぴよぴよ(237ポイント)
Date: 2008/12/29(月) 13:08
No:26181
| 解決!
|
Title: Re:角度の出し方について
|
|
書き込みが遅くなって申し訳ありません。
>boxさん
>dicさん
説明が足らず申し訳ありませんでした。
dicさんの載せてくださった図をお借りしていうと、
辺c,a(斜辺とθに接する他の一辺)がわかっているときの角度θを求めたかったのです。
cos(θ);系の関数がある事は知っていましたがacos(θ);があることを
知りませんでした。ありがとうございます。
>nonさん
>たいちうさん
こちらも説明不足ですみませんでした。
実際は、二点をランダムで出し、その二つの点(仮にA,Bとします)を直線で結び、
その後直角となるような三点目を出す
(先に出したAを通り、かつy軸に平行な線を出し、その線上の点からランダム決める)、というやり方をしておりました。
>Dixq (管理人)さん
atan2のやり方ですが、確かにそれでもできるかもしれませんが、少し面倒な感じがしますかね。
>たかぎさん
確かに三辺の長さを求めて角度を出すということもありかもしれません。
acos(θ);から求めたい角度が出せるとわかりましたので解決させていただきます。
みなさん解答ありがとうございました。
71ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(941,417ポイント)
Date: 2008/12/29(月) 13:24
No:26184
|
|
Title: Re:角度の出し方について
|
|
いやいや、全然メンドクサクなんてないですよ。
例えば(0,0),(1,0),(1,1)の3点からなる45°2つの直角三角形の角度を計算してみます。
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
typedef struct{double x,y;}pt_t;
int main(){
pt_t pt[3]={{0,0},{1,0},{1,1}};
for(int i=0; i<3; i++){
double angle1=atan2(pt[(i+1)%3].y-pt[i].y,pt[(i+1)%3].x-pt[i].x);
double angle2=atan2(pt[(i+2)%3].y-pt[i].y,pt[(i+2)%3].x-pt[i].x);
printf("角度 = %.3f[rad] %.1f[°]\n",angle2-angle1,(angle2-angle1)/PI*180);
}
}
実行結果
角度 = 0.785[rad] 45.0[°]
角度 = 1.571[rad] 90.0[°]
角度 = 0.785[rad] 45.0[°]
こんな感じで角度を計算したら成す各を引き算で表示したらいいだけです。
%使ってるのでちょっとややこしく見えるかもしれませんが、要は
angle1 = 2つ目の点 と 1つ目の点との角度
angle2 = 3つ目の点 と 1つ目の点との角度
で、angle2 - angle1 で成す角が出るわけです。
atan2は最初の問題もすぐ解決出来るでしょう
2点をランダムで作り、その角度をatan2で調べ(角度angleとする)、そのangleを+PI/2したら直角ですから、
どちらかの点からangleの方向にランダムな長さで引っ張ってやればいいと思います。
void EnterPt(pt_t pt[3]){
/* ここでpt[0]とpt[1]に-10〜10のランダムな数を入れる */
double angle = atan2(pt[1].y-pt[0].y,pt[1].x-pt[0].x) + PI/2;
double length = (double)rand()/RAND_MAX*20-10;
pt[2].x = pt[0].x+cos(angle)*length;
pt[2].y = pt[0].y+sin(angle)*length;
}
普段シューティングばかり作ってるのでいつも考えがシューティングになってしまいますが・・。
こんな感じでどうでしょう。ランダムな数を入れる部分は簡単なので、注釈にしておきました。
後は座標pt[0]とpt[1]から直角になるようにpt[2]を計算する処理です。
長さも-10〜10のランダムになるようになっています。
角度、元の座標、距離が決まれば移動先の座標はcosとsinでわかりますよね。
pt[0]からその長さその角度で飛んでいけばいいのです。
776ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(12,823ポイント)
Date: 2008/12/30(火) 04:59
No:26192
|
|
Title: Re:角度の出し方について
|
|
解決したみたいなのでnonさんの方法3を実装してみました。(私的に一番好みだったので)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define sqr(a) ((a)*(a))
#define PI 3.14159265
typedef struct{
double x,y;
} Point_t;
void main(void){
Point_t pt[3],o; //oは円の中心
double r,angle,angle2; //rは半径、angleは3点目決定に使う角度、angle2は各角の角度算出用
int i;
srand(time(NULL));
for(i=0;i<2;i++){
pt[i].x=(rand()/(double)RAND_MAX)*50;
pt[i].y=(rand()/(double)RAND_MAX)*50;
}
o.x=(pt[0].x+pt[1].x)/2;
o.y=(pt[0].y+pt[1].y)/2;
r=sqrt(sqr(pt[0].x-o.x)+sqr(pt[0].y-o.y));
angle=(rand()/(double)RAND_MAX)*PI*2;
pt[2].x=o.x+(cos(angle)*r);
pt[2].y=o.y+(sin(angle)*r);
for(i=0;i<3;i++){
angle2=
atan2(pt[(i+1)%3].y-pt[i].y, pt[(i+1)%3].x-pt[i].x)-
atan2(pt[(i+2)%3].y-pt[i].y, pt[(i+2)%3].x-pt[i].x)
;
if(angle2<0.0)
angle2+=PI*2;
if(angle2>PI)
angle2=PI*2-angle2;
printf(
"%8.3f%8.3f%8.3f\n",
pt[i].x,
pt[i].y,
angle2*180/PI
);
}
}
2倍のポイントを手に入れた! 1,048ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..かけだし(2,198ポイント)
Date: 2008/12/29(月) 10:13
No:26178
|
|
Title: エラーが出るのですが
|
|
昨日教えてもらったようにして簡単な鍵盤を作ったのですが。DxLib.exe の実行中に途中から 0x00558bb8 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しましたって出てきて動かなくなるのですが。下のプログラムなんですが。どうすればいいのでしょうか。プログラムは画像を使わないと何にも起きないのですが。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモード
if( DxLib_Init() == -1 ) return -1; // 初期化
char KeyBuf[ 256 ] ;
//音符
int Sound ;
Sound = LoadSoundMem( "do.ogg" ); //wavファイルを読み込み、ハンドルをint型変数へ格納
int Sound1 ;
Sound1 = LoadSoundMem( "re.ogg" );
int Sound2 ;
Sound2 = LoadSoundMem( "mi.ogg" );
int Sound3 ;
Sound3 = LoadSoundMem( "fa.ogg" );
int Sound4 ;
Sound4 = LoadSoundMem( "so.ogg" );
int Sound5 ;
Sound5 = LoadSoundMem( "ra.ogg" );
int Sound6 ;
Sound6 = LoadSoundMem( "si.ogg" );
int Sound7 ;
Sound7 = LoadSoundMem( "do2.ogg" );
while( 1 ){
GetHitKeyStateAll(KeyBuf ) ; // すべてのキーの状態を得る
if(KeyBuf[KEY_INPUT_A]==1) {
if(CheckSoundMem(Sound)==0) //現在音が再生されていなければ
PlaySoundMem(Sound,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_B]==1) {
if(CheckSoundMem(Sound1)==0) //現在音が再生されていなければ
PlaySoundMem(Sound1,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_C]==1) {
if(CheckSoundMem(Sound2)==0) //現在音が再生されていなければ
PlaySoundMem(Sound2,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_D]==1) {
if(CheckSoundMem(Sound3)==0) //現在音が再生されていなければ
PlaySoundMem(Sound3,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_E]==1) {
if(CheckSoundMem(Sound4)==0) //現在音が再生されていなければ
PlaySoundMem(Sound4,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_F]==1) {
if(CheckSoundMem(Sound5)==0) //現在音が再生されていなければ
PlaySoundMem(Sound5,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_G]==1) {
if(CheckSoundMem(Sound6)==0) //現在音が再生されていなければ
PlaySoundMem(Sound6,DX_PLAYTYPE_BACK); //音を再生する
}
if(KeyBuf[KEY_INPUT_H]==1) {
if(CheckSoundMem(Sound7)==0) //現在音が再生されていなければ
PlaySoundMem(Sound7,DX_PLAYTYPE_BACK); //音を再生する
}
//音符
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "background0.png" ) ; //char.pngのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //画像を表示
if(KeyBuf[KEY_INPUT_ESCAPE]==1)
break ;
if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
1,638ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..かけだし(2,246ポイント)
Date: 2008/12/29(月) 11:22
No:26180
|
|
Title: Re:エラーが出るのですが
|
|
Load系もよくわからないのですが、
ではどうすればいいのでしょうか。
2倍のポイントを手に入れた! 48ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(940,641ポイント)
Date: 2008/12/29(月) 13:13
No:26182
|
|
Title: Re:エラーが出るのですが
|
|
まず沢山書かずに少しずつ考えて見ましょう。
あれからゲームプログラミングの館はご覧になったでしょうか?
まず、
1. 画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
2. 今度は裏画面処理を使って画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
3. Zキーが押されれいる間DrawStringで「押されています」と表示するプログラムを書いて下さい。(裏画面処理使う)
4. Zキーが押された瞬間一度だけ「押されました」とprintfDxで表示するプログラムを書いて下さい。(裏画面処理使う)
5. Aキーが押された瞬間一度だけドの音が鳴るプログラムを書いて下さい。(裏画面処理使う)
この5問を解いていけば自然に実装出来るはずです。
まずは館を見ながらやってみて、つまったらどこで詰まったか具体的に教えて下さい。
詰まっていなくても、回答を載せてもらったら添削しますよ。
358ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(1,770ポイント)
Date: 2008/12/29(月) 13:16
No:26183
|
|
Title: Re:エラーが出るのですが
|
|
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) return -1;
char KeyBuf[256];
int Sound;
Sound = LoadSoundMem("do.ogg");
int image;
image = LoadGraph("background0.png");
while (1)
{
GetHitKeyStateAll(KeyBuf);
if (KeyBuf[KEY_INPUT_A] == 1)
if (CheckSoundMem(Sound) == 0) PlaySoundMem(Sound, DX_PLAYTYPE_BACK);
DrawGraph(0, 0, image, FALSE);
if (KeyBuf[KEY_INPUT_ESCAPE] == 1) break;
if (ProcessMessage() == -1) break;
}
DxLib_End();
return 0;
}
とりあえず、音を1つに減らしてLoadGraphをループ外に引っ張り出しました。
BCC 5.5 でコンパイル・動作確認して正常でした。
このコードをコンパイル・実行してみてください。
267ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..かけだし(2,304ポイント)
Date: 2008/12/29(月) 13:36
No:26185
| 解決!
|
Title: Re:エラーが出るのですが
|
|
コンパイル・実行できました。SCIさんありがとうございます。
Dixqさん問題ができたら解答します。よろしくおねがいします。
58ポイント を手に入れた。
|
|
|
|
Name: 紫苑 ..ぴよぴよ(566ポイント)
Date: 2008/12/28(日) 23:11
No:26160
|
|
Title: 無題
|
|
2回目のくだらない質問ですorz
すべて初めてなもんで。。
少しのことで感動です;へ;
でわ本題に
lcc ←?
このタグでコンパイラ?できない?んです。
ソースファイルをエディタで作ってから、
clangディレクトリに保存して。。。
コンパイルを実行したいんですが。。
できません;;
visualC++2008をつかってるんですが。。。
lccコマンドが使えないらしく。。
わからなくなってしまいました。。。
助けてくださいお願いします;;
コンパイラしたいいです。
148ポイント を手に入れた。
|
|
|
|
Name: SCI ..かけだし(1,165ポイント)
Date: 2008/12/29(月) 00:46
No:26166
|
|
Title: Re:無題
|
|
> lcc
これは LSI C-86 (だったか?)のコマンドでしょう。
今までこれを使っていたんですか?
Visual C++ 2008 はこれとはまったく違った方法でコンパイルします。
コマンドライン操作(CUI)とかクリックとか(GUI)の違いなんですけど、とにかくVC++の使い方を覚えるしかないです(笑)
88ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(649ポイント)
Date: 2008/12/29(月) 08:02
No:26175
|
|
Title: Re:無題
|
|
LSI C-86 使ってわなかったんですが、知っていた?みたいなもんですb
VC++の使い方か。。。コンパイラにもいろいろあるんですね;
がんばります。ありがとうございました。
71ポイント を手に入れた。
|
|
|
|
Name: O.N ..ぴよぴよ(933ポイント)
Date: 2008/12/28(日) 22:36
No:26157
|
|
Title: externについて
|
|
いつもお世話になっています。「龍神録のプログラミング」の第六章におきまして、
不明な箇所がありましたので、質問させていただきます。
(前略)
//メインループ
while(ProcessLoop() == 0){
switch(func_state){
case 0:
load(); //データロード
first_ini(); //初回の初期化
func_state = 100;
break;
case 100:
graph_main(); //描画メイン
break;
default:
printfDx("不明なfunc_state\n");
break;
}
(略略・・・)
ここの部分なのですが、
このswitch(func_state)の制御文に当たる func_stateは
どこを見ても初期化されていなかった(様に見えた)のですが、なぜか初期値に0が入っています。
(case 0を実行しているので、おそらく0が代入されているのでしょうが…)
func_stateは ヘッダーファイルで、extern int func_state; と宣言されているだけです。
extern宣言されたものは、勝手に初期値0が入るということでも起こっているのでしょうか?
ご返答よろしくお願いします。
451ポイント を手に入れた。
|
|
|
|
Name: SCI ..かけだし(1,077ポイント)
Date: 2008/12/29(月) 00:39
No:26165
|
|
Title: Re:externについて
|
|
確か、グローバル変数は0で初期化されることがC言語の規格で保証されていたはずです。
それはC++でも同じだと思います。詳しいことはC/C++言語仕様を参照してください。
72ポイント を手に入れた。
|
|
|
|
|
Name: O.N ..かけだし(1,107ポイント)
Date: 2008/12/29(月) 03:08
No:26174
| 解決!
|
Title: Re:externについて
|
|
SCI様、御返答ありがとうございます。
そうだったのですか。やはり、といった感じですね。
実行結果からいえば、それ以外は考えられなかったですが・・・
コメント通りにC/C++言語仕様をネットでもって見てみます。
こんな遅くに返答していただき、ありがとうございました。m(_ _)m
2倍のポイントを手に入れた! 174ポイント を手に入れた。
|
|
|
|
Name: Logic ..ぴよぴよ(333ポイント)
Date: 2008/12/28(日) 11:46
No:26114
|
|
Title: サンプルプログラムで、終了時にエラー
|
|
初めまして、今日からCを学び始めようと思う初心者です。
ゲームプログラミングの館を初めから読んで進めているのですが、
プログラムをコンパイルして実行すると、説明通り正常に起動できても終了時にエラーが出ます。
ソースには「WaitKey() ;//何か入力があるまで待つ関数」と書いてあるのでエンターキーを押して終了させましたが、
DxLib.exe の 0x024d3645 で初回の例外が発生しました: 0xC0000005: 場所 0xfeeeff6a を読み込み中にアクセス違反が発生しました。
DxLib.exe の 0x024d3645 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeeff6a を読み込み中にアクセス違反が発生しました。
というエラーが表示され、以降よく分からない状態になってしまいます。
DXライブラリの設定がどこか間違っているのでしょうか?
333ポイント を手に入れた。
|
|
|
|
Name: Logic ..ぴよぴよ(603ポイント)
Date: 2008/12/28(日) 12:56
No:26119
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
返信ありがとうございます。
現時点で読み終えているのは入門編の8までです。
ですが、全てのコードにおいて、実行すると同じエラーが発生します。
もちろん、DXライブラリの使い方説明に載せられているコード
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
をそのままコピーして実行しても、終了時に上記のエラーが発生します。
未熟な説明ですが、もし分かるのでしたらどうか教えてください。
270ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..かけだし(1,005ポイント)
Date: 2008/12/28(日) 13:18
No:26124
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
使用しているコンパイラなどを記述すると回答が得やすいのでは?
30ポイント を手に入れた。
|
|
|
|
|
Name: Logic ..ぴよぴよ(726ポイント)
Date: 2008/12/28(日) 13:53
No:26128
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
返信ありがとうございます。
今回初めて導入しましたので、VisualC++2008 Express Editionをインストールし、使用しています。
ちなみに、入門編11での「キーを入力すると終了する」をして終了させても、同様のエラーが発生してしまいます。
DXライブラリの設定を見直していますが、まだ解決していません。
他に確認すべき事項がありましたら御助言よろしくお願いします。
123ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(939,366ポイント)
Date: 2008/12/28(日) 15:20
No:26132
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
今まで正常に動作したプログラムコードはありますか?
実際にプロジェクトに入っているソースと、プログラムを書いているソースのファイルが違うのではないでしょうか?
プロジェクトのファイルは、プロジェクトの中に存在(関連付け)しているファイルに書かないとコンパイルできません。
ひょっとして、VC++の画面にソースファイルか何かをドラッグアンドドロップしただけなんじゃないでしょうか。
すると、いくらソースを書いても変化ありません。
DXライブラリのリファレンスにあるサンプルをどれでもいいのでやってみて下さい。
どれをやっても同じエラーが出る場合、その可能性が高いです。
225ポイント を手に入れた。
|
|
|
|
|
Name: Logic ..ぴよぴよ(760ポイント)
Date: 2008/12/28(日) 17:18
No:26146
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
返信ありがとうございます。
>今まで正常に動作したプログラムコードはありますか?
全て同じエラーが出ます。
説明されている事が全く理解できないのですが、
>VC++の画面にソースファイルか何かをドラッグアンドドロップしただけ
というのは、(DXライブラリ 使い方説明のページにおいて)Source Fileの中にDrawPixel.cppを作成し、設定をしてからそこに
−−−
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
−−−
を入力、デバッグ→デバッグ開始を行うだけでは不十分だということでしょうか?
34ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,695ポイント)
Date: 2008/12/28(日) 17:26
No:26147
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
WaitKey()か
DxLib_End()か
return 0;のところか
どこで例外が発生しているのかを明確にしないと
答えようがないかと思います
42ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(940,245ポイント)
Date: 2008/12/28(日) 17:26
No:26148
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
Vc++のソリューションエクスプローラーの欄にそのソースファイルはありますか?
ソリューションエクスプローラーが解らない時はゲームプログラミングの館の0章をご覧下さい。
ソリューションエクスプローラーのソースファイルをダブルクリックして出てきたファイルにソースを書いて下さい。
それでも解決しない時はこちらにプロジェクトのあるフォルダごとzipファイルか何かに圧縮して送って下さい。
どこが悪いのか見てみます。
dixqhp@gmail.com
188ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(292,684ポイント)
Date: 2008/12/28(日) 17:50
No:26149
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
何かしらの不整合が発生しているようにも見えますね。
>デバッグ→デバッグ開始を行うだけでは不十分だということでしょうか?
ではその状態でアクセスエラーが出たときの「呼び出し履歴」の状態は
どうなっていますでしょうか?
呼び出し履歴ウインドウはデバッグメニューのウインドウの中にあります。
この情報を見ると、どの関数の中に問題があるのか判る可能性があります。
もし管理人さんに見てもらうので有れば、ソースコードなどの
プロジェクト一式(使っているDXライブラリも含めて)だけでなく
止まった時の状態を再現するためにエラーが出た時の状態のダンプも
一緒に付けておくといいでしょう。
ダンプは「デバッグメニュー」の「名前を付けてダンプを保存」で保存できます。
375ポイント を手に入れた。
|
|
|
|
|
Name: Logic ..ぴよぴよ(966ポイント)
Date: 2008/12/28(日) 19:17
No:26151
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
>WaitKey()か
>DxLib_End()か
>return 0;のところか
>どこで例外が発生しているのか
すみません、それよく理解できていなくて……。
>送って下さい。
実行ファイルは送れないようになっていたため、それ以外のprojectとDXライブラリをzipファイルにまとめて送りました。
>呼び出し履歴
デバッグでの終了時に現れた呼び出し履歴は以下の通りです。
RFVibraPS.dll!010d3645()
[下のフレームは間違っているか、または見つかりません。RFVibraPS.dll に対して読み込まれたシンボルはありません。]
RFVibraPS.dll!010d3c96()
kernel32.dll!76224911()
ntdll.dll!776be4b6()
ntdll.dll!776be489()
これが初歩的な問題なのかどうかなのかすらわからず(多分初歩的なものだと思いますが)、ここにいる方皆に迷惑をかけてしまい、本当にすみません。
206ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(292,463ポイント)
Date: 2008/12/28(日) 21:15
No:26153
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
>デバッグでの終了時に現れた呼び出し履歴は以下の通りです
なるほど。
エラーが出たときのアドレス 0x024d3645と呼び出し履歴の位置が一致していない
ということは別のところですね。
うーん、ちょっと弱りましたね。
掲示板で解決するのはだんだん難しくなってきました。
・ dicさんが書いていますが、どこで落ちているのかをみるため、
DxLib_End()の後に、
MessageBoxA(0, "END <DxLib_End>", "Success", MB_OK);
の1行を入れて、実行してみて下さい。
メッセージボックスは表示されますか?
・ デバッグメニューのウインドウの中にある「スレッド」ウインドウの
中身はどうなっていますか?
221ポイント を落としてしまった。
|
|
|
|
|
Name: Logic ..かけだし(1,705ポイント)
Date: 2008/12/28(日) 22:22
No:26156
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
> DxLib_End()の後に、
>MessageBoxA(0, "END <DxLib_End>", "Success", MB_OK);
> の1行を入れて、実行してみて下さい。
入れて実行してみましたが、結果は入れる前と何も変化はありませんでした。
メッセージボックスは表示されません。
>「スレッド」ウインドウの中身
0 4328 メインスレッド メインスレッド WinMain 標準 0
0 5780 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 3444 RPC スレッド RPC コールバック スレッド 774a9a94 標準 0
0 192 RPC スレッド RPC コールバック スレッド 774a9a94 標準 0
0 2224 ワーカー スレッド ProcessMessageThreadFunction 774a9a94 標準 0
0 1788 ワーカー スレッド Win32 スレッド 02803645 標準 0
0 620 ワーカー スレッド Win32 スレッド 774a9a94 最高 0
0 3172 ワーカー スレッド Win32 スレッド 774a9a94 タイム クリティカル 0
0 5960 ワーカー スレッド Win32 スレッド 774a9a94 タイム クリティカル 0
0 4232 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 1636 ワーカー スレッド Win32 スレッド 774a9a94 -3 0
0 5584 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 388 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
以上の通りです。
WinMainを除いて、何故か一つだけ場所が774a9a94でない物があります。
黄色い→が付いているので、これがおかしなところなのでしょうか?
管理人様にアップローダへのアドレスを送りましたが、こちらでも公開します。
http://uproda11.2ch-library.com/src/11144875.zip.shtml
DL Key:vc
です。
掲示板汚しですみません。
739ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(293,102ポイント)
Date: 2008/12/28(日) 22:59
No:26159
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
>WinMainを除いて、何故か一つだけ場所が774a9a94でない物があります
なるほどなるほど。
大分絞れてきました。
スレッドの状況とメッセージボックスが出ないこと、
WaitKey()まで実行できていたこと、合わせて考えると、
全ての情報が DxLib_End()の中で問題が起きていることを指し示しています。
さらに Log.txtの状況からみるに、ジョイパッドかキーボードのデバイスの解放関連で
コケているようにもみえます。
しかし残念なことに私の環境では再現しないようです。
添付されていた実行ファイルを実行しても特に問題なく終了できましたので、
何かの環境に起因するものだと思われます。
ひょっとして PCに何かジョイパッドが刺さっていませんか?
もし刺さっていたらちょっと抜いてから実行して試してみて下さい。
252ポイント を手に入れた。
|
|
|
|
|
Name: Logic ..かけだし(2,021ポイント)
Date: 2008/12/28(日) 23:17
No:26162
| 解決!
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
> PCに何かジョイパッドが刺さっていませんか?
私はパソコンでよくゲームをしているのでジョイパッドはいつも差しっぱなしです。
>抜いてから実行
抜いてもう一度実行してみたところ、エラーが消え、すんなりと何の問題もなく終了しました。
ということは、ジョイパッドを差したまま実行するとエラーが出るのですね。よくわかりました。
>この場を作って頂いた管理人様、解答を頂いたJusty様及び助言をしてくださった方々
こんな超がつく初心者の私を見捨てず付き合っていただき、本当にありがとうございました。
できればまたここにのこのこと質問に来るようなことは避けたいですが、もしそうなったとしても、もう少し知識を付けていられるようになりたいと思います。
本当にありがとうございました。
2倍のポイントを手に入れた! 316ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(293,354ポイント)
Date: 2008/12/28(日) 23:35
No:26163
|
|
Title: Re:サンプルプログラムで、終了時にエラー
|
|
>抜いてもう一度実行してみたところ、エラーが消え、すんなりと何の問題もなく終了しました。
それは良かったです。
さっきの呼び出し履歴のところで RFVibraPS.dllとあり、これが関連しているか
そのときはちょっと自信が無かったのですが、やはりそのあたりだったようです。
>ということは、ジョイパッドを差したまま実行するとエラーが出るのですね。
本来は問題ないはずなのですが、(ドライバーか何かと)相性が悪いのかも
しれませんね。
252ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..中級者(9,762ポイント)
Date: 2008/12/25(木) 15:58
No:26026
|
|
Title: 実行ファイルの解析
|
|
ゲーム作りをやっていたパソコンがウイルスで使えなくなってしまって、プログラムも取り出せなくなってしまったのですが、ほかのパソコンに初期の実行ファイルを送っておいたので、一から作り直すよりはやりやすいので実行ファイルからプログラムを取り出せないでしょうか?
2倍のポイントを手に入れた! 136ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(35,900ポイント)
Date: 2008/12/25(木) 16:25
No:26028
|
|
Title: Re:実行ファイルの解析
|
|
無理です。
高級言語で書かれたプログラムは、コンパイルという作業の過程で
機械語と呼ばれるCPUが直接理解できる数字の羅列に変換されます。
そのときに元のソースの情報は失われてしまうので、元に戻すことはできません。
73ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(9,800ポイント)
Date: 2008/12/25(木) 21:57
No:26048
|
|
Title: Re:実行ファイルの解析
|
|
データ復旧ソフト!そんな物があるのですか、その辺を詳しく教えてくれませんか。
38ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(898ポイント)
Date: 2008/12/25(木) 22:03
No:26049
|
|
Title: Re:実行ファイルの解析
|
|
「データの削除」とは、アクセス経路の遮断をして見えなくしているだけで、データを抹消しているわけではありません。
つまり、データが上書きされずに残っている場合があるのです。
経過時間やデータ更新頻度によって復元率は低下しますが、何もしないよりはいいのでは。
残念ながら私は具体的なソフトを知っているわけではありませんが、一般的なユーティリティなので検索すれば出てくるかと。
34ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(9,840ポイント)
Date: 2008/12/25(木) 23:03
No:26054
|
|
Title: Re:実行ファイルの解析
|
|
確かに色々ありそうですね。ところでOSの再インストールはどうやればいいのでしょうか?
40ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(934,749ポイント)
Date: 2008/12/25(木) 23:07
No:26055
|
|
Title: Re:実行ファイルの解析
|
|
ググった方が解り易いと思いますが、
OSのディスクを入れてインストールしなおせばOKです。
もしOSディスクを入れてもすぐOSの起動画面に行ってしまう場合は、ブートの順番がHDD優先になっているので、
ブートの優先順位を変える必要があります。
マザーボードの説明書にブートの優先順位を変える方法が載ってると思います。
普通起動してDelキーか何か押していれば設定画面に飛びます。
そこでブートの優先順位をDVDドライブを1番にして下さい。
しかしウィルスにかかったというのはどういう状態なんでしょうか?
起動しないとかの場合、ホントにウィルスのせいなんでしょうか?
後、OSを再インストールした後できちんとファイルが出てくる可能性は高くないと思います。
また、データが書き換わってしまわないように、そのOSを使って何かファイルをダウンロードしたり作業をするのは必要最低限にしたほうがいいです。
247ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(11,748ポイント)
Date: 2008/12/26(金) 06:23
No:26067
|
|
Title: Re:実行ファイルの解析
|
|
OS再インストールするなら、
KNOPPIXなどのCDから起動できるOSを使ってバックアップを取ってからの方がいいと思いますよ。
37ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,622ポイント)
Date: 2008/12/26(金) 17:49
No:26077
|
|
Title: Re:実行ファイルの解析
|
|
バックアップファイルがすでに感染している可能性も否めないので
ウィルス対策ソフトの導入を検討した方がいいでしょう
2倍のポイントを手に入れた! 60ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(9,873ポイント)
Date: 2008/12/28(日) 22:44
No:26158
| 解決!
|
Title: Re:実行ファイルの解析
|
|
よく分りました、地道に頑張ってみます。どうもありがとうございます。
33ポイント を手に入れた。
|
|
|
|
Name: kuro ..ぴよぴよ(28ポイント)
Date: 2008/12/28(日) 15:38
No:26139
|
|
Title: リネーム
|
|
お世話になります。
DXライブラリのSaveDrawScreen関数で保存したファイルを
日付にリネームする関数はないのでしょうか?
yyyymmdd.bmp のような感じです。
日付は DATEDATA Date で取得しています。
vc++2008ee,dx ver2.24c を使用しています。
よろしくお願いします。
28ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(292,309ポイント)
Date: 2008/12/28(日) 16:06
No:26142
|
|
Title: Re:リネーム
|
|
>日付にリネームする関数はないのでしょうか
直接日付にリネームするものは標準にはありませんが、
WinAPIの MoveFile()でリネームすることができますし、
"yyyymmdd.bmp"のようなファイル名は sprintfあたりで作ればいいかと思います。
でも、SaveDrawScreen()は保存するファイル名を指定できるはずですが、
何故保存する前に指定の名前にしてから保存しないのでしょう?
94ポイント を手に入れた。
|
|
|
|
|
Name: kuro ..ぴよぴよ(51ポイント)
Date: 2008/12/28(日) 16:29
No:26145
| 解決!
|
Title: Re:リネーム
|
|
sprintfを使ったらできました。
SaveDrawScreenでファイル名を日付にしても出来なかったので、
MoveFile()などで変えるのかと思ってました。orz
ありがとうございました。
23ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..ぴよぴよ(521ポイント)
Date: 2008/12/28(日) 15:17
No:26131
|
|
Title: ボタンを押すと消えてしまうんですが
|
|
ボタンを押すたびに音を鳴らそうと思うんですけど下のようなプログラムだとZを一回押すと終了してしまうのですがどうすればいいでしょうか。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモード
if( DxLib_Init() == -1 ) return -1; // 初期化
char KeyBuf[ 256 ] ;
while( 1 ){
GetHitKeyStateAll(KeyBuf ) ; // すべてのキーの状態を得る
int Sound ;
Sound = LoadSoundMem( "test.wav" ); //wavファイルを読み込み、ハンドルをint型変数へ格納
if(KeyBuf[KEY_INPUT_Z]==1) {
if(CheckSoundMem(Sound)==0) //現在ショット音が再生されていなければ
PlaySoundMem(Sound,DX_PLAYTYPE_BACK); //ショット音を再生する
break;}
if(KeyBuf[KEY_INPUT_ESCAPE]==1)
break ;
if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
521ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(43,168ポイント)
Date: 2008/12/28(日) 15:29
No:26136
|
|
Title: Re:ボタンを押すと消えてしまうんですが
|
|
理由は
if(KeyBuf[KEY_INPUT_Z]==1)
の時breakしているからです。
breakは繰り返しwhile,forから抜けてしまいます。
breakするとwhile(1)から抜けます。ゆえに終了してしまいます。
改善するためにはbreakをとってください。
あと、LoadSoundMemは一回だけ読み込めばいいので、
whileから出したほうが良いです。
あと規約のとおり、次回からはコードをpreタグで囲むようにしてください。
197ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..ぴよぴよ(532ポイント)
Date: 2008/12/28(日) 16:00
No:26141
|
|
Title: Re:ボタンを押すと消えてしまうんですが
|
|
ありがとうございます。
whileからだしたら見事に成功しました。
しかし今おもったんですけど、そしたら whileはどういうときにつかえばいいでしょうか。
11ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..ぴよぴよ(560ポイント)
Date: 2008/12/28(日) 16:09
No:26144
| 解決!
|
Title: Re:ボタンを押すと消えてしまうんですが
|
|
ありがとうございます。よくわかりました。
またわからなくなったらここに来ますのでよろしくお願いします。
28ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(42,824ポイント)
Date: 2008/12/28(日) 12:24
No:26115
|
|
Title: [雑談]ある整数から下x桁の整数を返す関数作成について
|
|
お邪魔します。
題名の通りある整数から下x桁の整数を返す関数作成についてなのですが、
どのようにやるのが(効率が)いいか悩んでいます。
関数作成においての条件・詳細は以下のとおりです。
引数:(int)ある整数 , (int)x桁
戻り値:(int)x桁の整数
例えばこの関数名をfuncとすると、
func(12345 , 3)
の戻り値は345です。
自分はこの関数の中でsprintfでまず数値を文字列化し、
残りの引数を使って返したい値の文字列をatoiで整数の戻す
というようにやっています。
特に質問というわけではないですが、
皆さんだったらどのようにこの関数を実現しますか?
よろしくお願いします。
(雑談アイコン消しちゃったんですね^^;)
337ポイント を手に入れた。
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(68,114ポイント)
Date: 2008/12/28(日) 12:35
No:26117
|
|
Title: Re:[雑談]ある整数から下x桁の整数を返す関数作成について
|
|
そうたいした事ではないのですが、負の数を渡したときはうまく動いていますか。
私だったら余りを使うと思います。
48ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..熟練のプログラマー(42,971ポイント)
Date: 2008/12/28(日) 13:01
No:26120
|
|
Title: Re:[雑談]ある整数から下x桁の整数を返す関数作成について
|
|
記述し忘れました。。
今回は負は考えていません。
確かにsprintfは「-」はご法度ですね。
可搬性が低くなってしまいますね。。
・・・
なんで余りが思い浮かばなかったんでしょうか・・・w
早速実装してきます。
86ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(3,213ポイント)
Date: 2008/12/28(日) 13:08
No:26121
|
|
Title: Re:[雑談]ある整数から下x桁の整数を返す関数作成について
|
|
(第1引数)%(10の(第2引数)乗)
19ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(975ポイント)
Date: 2008/12/28(日) 13:12
No:26122
|
|
Title: Re:[雑談]ある整数から下x桁の整数を返す関数作成について
|
|
ちなみに、ある桁の数字のみを取り出すというようなことも同様にできます。
int n = 1234;
n %= 100;
n /= 10;
とすると、nには3が入ります。
なぜ「100」や「10」が出てくるのかを考えてみるといいかも知れませんね。
77ポイント を手に入れた。
|
|
|
|
Name: dame ..ぴよぴよ(120ポイント)
Date: 2008/12/26(金) 02:16
No:26065
|
|
Title: 指定した座標の色の取得
|
|
DXライブラリを使ってRPGのゲームを作成したいと考えています。
背景画像とキャラクタの絵を用意し、背景画像の上をキャラクタがドット単位で移動できるようにしたいのですが、そのとき、移動可能なエリアと進入不可能なエリアを作りたいと思います(例えば背景画像が海のところは移動できない)
進入不可能なエリアであるかどうかの判定をしなければならないのですが、最初は、背景画像に合わせて0と1で移動できるか、できないかのデータを2次元配列などに格納しておくことを考えたのですが、ドット単位でやろうと考えると、量が多すぎて自力でデータを作るのは難しい気がします。
そこで、背景画像が特定の色のところには進入できない、というような方法を考えたのですが、指定した座標の色を取得することは可能なのでしょうか?あるいは、この問題を解決するのに、もっと適切な方法があるようでしたら、教えていただけないでしょうか。お願いします。
120ポイント を手に入れた。
|
|
|
|
Name: dame ..ぴよぴよ(218ポイント)
Date: 2008/12/27(土) 23:32
No:26102
| 解決!
|
Title: Re:指定した座標の色の取得
|
|
bodomcrossさん、Dixqさん、ありがとうございます。
とても助かりました。
Dixqさんの言われたように、画像を二枚使う方法で試してみたいと思います。
また困ったことがあったら相談させてください。よろしくお願いします。
98ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(291,935ポイント)
Date: 2008/12/28(日) 00:55
No:26107
|
|
Title: Re:指定した座標の色の取得
|
|
実際のところ移動の可・不可だけならどっちでもいいんですけど、本格的に作り始めると
そのうちマップに附随する付加情報……例えば床の素材から来る足音の変化とか、
フラグによって移動可能範囲を変えたいとかあるかと思うので、
容量的に厳しいとか特に制限がなければカラーのままでもいいかと思います。
まぁ、それ毎にマップを用意する、という手も有りますが……。
126ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(938,856ポイント)
Date: 2008/12/28(日) 07:25
No:26110
|
|
Title: Re:指定した座標の色の取得
|
|
確かに足音変わるやつありますね。
こういうときプロはこうやって実装してるっていう何か主流な方法とかあるんですかね?
ただ、1画面ずつ固定で画面の切り替わるタイプのRPGならいいですけど、
FFやドラクエみたいに画面スクロールで切り替わっていく奴だと処理がめんどくさそうですね。
1万x1万位のビットマップ用意したらそれだけで数百メガ行きますし、
必要な部分をリアルタイムで読み込むとしても・・・。
そう考えるとある程度いくつか地形パターンのあるチップを並べた方がよさそうな気もします。
143ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(292,215ポイント)
Date: 2008/12/28(日) 14:20
No:26129
|
|
Title: Re:指定した座標の色の取得
|
|
>確かに足音変わるやつありますね。
コリジョンデータの中にアトリビュート(属性)の1つとして埋め込むことが
多いですね。
コリジョンをとると同時に属性を取得できると何かと楽ですし。
>画面スクロールで切り替わっていく奴だと処理がめんどくさそうですね
>1万x1万位のビットマップ用意したらそれだけで数百メガ行きますし、
>必要な部分をリアルタイムで読み込むとしても・・・。
そうですね。
そこは質問者さんがどういうゲームにしたいのかによるのですが、
自分のいる画面とその周辺の画面分はメモリに保持、移動したら裏で
ストリーミングで読み込むっていうのはよくある話です。
3Dだとカメラの向きに依っては遠くが見通せてしまったりして、
それなりにいろいろと工夫が必要になることもあるのですが
2Dならそんなこともないので、普通に実装できるかと。
>ある程度いくつか地形パターンのあるチップを並べた方がよさそうな気もします
ごもっともw
280ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(939,141ポイント)
Date: 2008/12/28(日) 15:15
No:26130
|
|
Title: Re:指定した座標の色の取得
|
|
なるほど。
3Dゲームのデータをリアルタイムで読み込むのは大変そうですね・・。
そして、今までの議論を無意味にする提案ですが、
地形データすらなくても、移動は1ピクセル単位で移動可能であっても、
実際にいけるところ、いけないところは昔のRPGのように32x32の区間単位で実装してもいいような気がします。
斜めとかは確かにギザギザになると思いますが、アクションゲームの地面じゃないので、そこまで厳密に実現する意味はあまり無いのでは無いかと思います。
昔作ったスーパーボムマンも1ピクセル単位で移動出来るが、いけるところ、いけないところは32x32の区間単位で制御してます。
あれはまた違うかもしれませんが・・。
285ポイント を手に入れた。
|
|
|
|
Name: リマー ..ぴよぴよ(652ポイント)
Date: 2008/12/27(土) 15:35
No:26089
|
|
Title: このソートは?
|
|
配列 x[10] に入っている数値をソートするプログラムで、
for ( i = 1 ; i < 10 ; i + + )
for ( j = 0 ; j < i ; j + + )
if ( x [ i ] < x [ j ] ) { tmp = x [ i ] ; x [ i ] = x [ j ] ; x [ j ] = tmp ; }
このソート法は世間一般に何と呼ばれているソート法なのでしょう?
「バブルソート」で合ってますか?
165ポイント を手に入れた。
|
|
|
|
Name: ibis ..上級者(16,459ポイント)
Date: 2008/12/27(土) 16:49
No:26090
|
|
Title: Re:このソートは?
|
|
交換ソートかな。
バブルソートはこんな感じです。
for(i = 0; i < 10; i ++)
for(j = 0; j < 9 - i; j ++)
if(x[j] < x[j + 1]){tmp = x[j] ; x[j] = x[j + 1] ; x[j + 1] = tmp ;}
バブルソートには「単純交換ソート」という別名がありますが、
"単純"というのはつまり、ある要素とその隣の要素(上の例ではx[j]とx[j+1])のみを比較する、ということです。
これは隣の要素ではなくて、無関係な要素とも比較してますから単純交換ソートではないですね。
4ポイント を手に入れた。
|
|
|
|
|
Name: リマー ..ぴよぴよ(661ポイント)
Date: 2008/12/28(日) 10:48
No:26113
| 解決!
|
Title: Re:このソートは?
|
|
ありがとうございます。
単純というのはそういった意味もあるのですね。
すっきりしました^^
9ポイント を手に入れた。
|
|
|
|
Name: 激しい便意 ..ぴよぴよ(13ポイント)
Date: 2008/12/24(水) 18:08
No:25981
|
|
Title: DxLib.slnについて(初歩です)
|
|
DXライブラリのVisualC++用とVisualC++2008のダウンロード後、
サイトの案内に従ってサンプルプログラム実行用フォルダ内のDxLib.slnを
実行したいのですが、同じファイル名のものがありませんでした。
似たようなものでDxLib_VC2008_and_2005用.slnというものがあったので
実行してみましたが応答がありません・・
何かこちらの設定が間違っているのか教えていただきたいです。
13ポイント を手に入れた。
|
|
|
|
Name: 激しい便意 ..ぴよぴよ(51ポイント)
Date: 2008/12/24(水) 19:11
No:25983
| 解決!
|
Title: Re:DxLib.slnについて(初歩です)
|
|
そちらの手順で次に進めました。
先は長そうですが色々悩みながらやっていこうと思います。
ありがとうございました。
38ポイント を手に入れた。
|
|
|
|
|
Name: サキスケ ..ぴよぴよ(39ポイント)
Date: 2008/12/27(土) 14:21
No:26088
|
|
Title: Re:DxLib.slnについて(初歩です)
|
|
僕も 質問者さんと 同じ事が起こりました。
回答者さん(管理人さん)有り難う御座いました。
39ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(138,367ポイント)
Date: 2008/12/27(土) 08:45
No:26083
|
|
Title: 【雑談】ドクターマリオもどきを作成中です
|
|
とりあえず、プロトタイプが出来たので、とりあえず暫定画面をアップしてみます。
ファミコン版をベースにしたのですが、操作性の向上の為にテトリスのような転がしや、スーパーローテーションを実装しようかと思っています。
バランス調整やBGM、SEなんかはこれからなので、もう少し時間が掛かりそうですが…(^_^;)
134ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(138,540ポイント)
Date: 2008/12/27(土) 10:08
No:26086
|
|
Title: Re:【雑談】ドクターマリオもどきを作成中です
|
|
いえ、言語はC#ですが、DXライブラリは一切使用していません(^_^;)
ちなみに、前回のテトリスも同じです。
エフェクトは…今回も大人しいです(笑)
なぜなら、テトリスのソースをかなり使いまわしましたんで♪(爆)
ドクターマリオは、ぷよぷよ+コラムス+αみたいなルールですね。面クリア型なので、エンドレスタイプの落ち物パズルとは少し感じが違いますんで、最初はちょっと戸惑うかもしれませんが、やればやるほど味の出てくるゲームです。
ちなみに最新作はWiiウェア(ダウンロード専売)で発売されています。
詳しいルールは下記URLを参照ください。
http://www.nintendo.co.jp/n02/dmg/vua/index.html
173ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(42,429ポイント)
Date: 2008/12/27(土) 12:50
No:26087
|
|
Title: Re:【雑談】ドクターマリオもどきを作成中です
|
|
なつかしーww
やりましたなー。っといっても保育園ぐらいだったと思いますが・・・w
マリオという響きだけで飛びついてた気がします^^;
出来上がったら是非やってみたいです^^
あ、まだドクターマリオが家にあるかも・・・
冬休みに入ったんでやっとプログラミング専念できます^^;
・・・
朝から晩まで画面前にいるような・・・orz
178ポイント を手に入れた。
|
|
|
|
Name: O.N ..ぴよぴよ(262ポイント)
Date: 2008/12/25(木) 18:34
No:26036
|
|
Title: タイプミス?
|
|
C言語〜ゲームプログラミングの館〜
17、画像を分割して読み込む
/*
まずいつも使っているchar.pngは1個のキャラが(32 x 32)ピクセルの画像が横4個、縦4個あつまった計16個の画像の集まりです。
分割するための関数はLoadDivGraphを使います。この関数の引数はこうなっています。
int LoadDivGraph( char *FileName , int AllNum , int XNum , int YNum , int XSize , int YSize , int *HandleBuf ) ;
パッと見難しそうに見えますが、見たら簡単なんでまず見てください。
FileName : 分割読み込みする画像ファイル文字列のポインタ
AllNum : 画像の分割総数
XNum ,YNum : 画像の横向きに対する分割数と縦に対する分割数
SizeX ,SizeY : 分割された画像一つの大きさ
HandleBuf : 分割読み込みして得たグラフィックハンドルを保存するint型の配列へのポインタ
*/
・・・となっているのですが、
int XSize, int YSizeと
説明文のSizeX ,SizeYが明らかに異なった名前なのですが、
これは、なにか作者様が意図しているものなのか、
はたまた、ただのタイプミスなのでしょうか?
ご返答をよろしくお願いします。
262ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(290,957ポイント)
Date: 2008/12/25(木) 20:50
No:26046
|
|
Title: Re:タイプミス?
|
|
単純なミスだと思います。
館だけじゃなく、ライブラリの公式リファレンスからしてそうなっています。
ひょっとすると昔は引数が SizeX/SizeYだったのかもしれませんね。
80ポイント を手に入れた。
|
|
|
|
|
Name: O.N ..ぴよぴよ(482ポイント)
Date: 2008/12/27(土) 02:29
No:26082
| 解決!
|
Title: Re:タイプミス?
|
|
Justy様、管理人Dixq様、ご返信ありがとうございます。
そうでしたか、ミスでしたか。ホッとしました。
なにぶんC言語歴1年と浅はかなものでして、まだまだ右も左も
わからないのですが・・・
このサイトでC言語を勉強させていただいております。
プログラミングとは不思議なもので、やればやるほど難しく、
知れば知るだけ自分の理解力のなさを痛感する今日この頃。
まぁ、気長にやっていくしかないのでしょうが・・・
これからも、もし機会がありましたらぜひ質問させていただきます。
その時は生温かい目で、見てやってください。
御二人とも、お早い返事ありがとうございました。
それではまた。
220ポイント を手に入れた。
|
|
|
|
Name: J ..上級者(16,060ポイント)
Date: 2008/12/20(土) 22:44
No:25886
|
|
Title: s2. サウンドノベル風文字列表示法1
|
|
s2. サウンドノベル風文字列表示法1とありますが2は存在するのでしょうか?
気になったので書き込んでおきます。
関係ないですが・・・
トップページの背景は目の錯覚に微妙になってるんですかね?
ジーと見てるとだんだん変わってゆくように見えます(笑
117ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(930,139ポイント)
Date: 2008/12/20(土) 23:32
No:25888
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
その2は2列で表示できるようにし、
その3では表示範囲を指定するとその枠内に自動的に入るように表示するサンプルにするつもりでしたが、
思ったよりコードが長くなったので、もう少し簡単にならないかな〜と思っているうちに忘れていました^^;
時間を見つけて追加しておきますm(_ _)m
トップページの背景、そう言われるとそう見えますね。段々違う色に・・。
トップページの背景は青に見えるのに、掲示板の背景は緑に見える・・(違
186ポイント を落としてしまった。
|
|
|
|
|
Name: J ..上級者(16,366ポイント)
Date: 2008/12/21(日) 18:57
No:25895
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
分かりました
返答ありがとうございました
錯覚というのは、だんだん青い球体が小さくなっていくように見えたと言うことです。
暗い部屋でみるとわかるかもしれません。
2倍のポイントを手に入れた! 104ポイント を手に入れた。
|
|
|
|
|
Name: J ..上級者(16,712ポイント)
Date: 2008/12/25(木) 18:46
No:26041
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
こんにちは。
この表示方法を応用してFileRead〜関数を用いて外部のファイルから文字列を読み取って表示したいのですが、
この表示方法で「一定の数を越えたら改行する」という風にするにはどうすればよいでしょうか?
うまくいきそうでうまくいきません。ご返答、お願いします
101ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(46,706ポイント)
Date: 2008/12/25(木) 19:47
No:26045
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
一文字ごとのサイズを計算して、表示幅からあふれた文字を次の行へ移るように
すると良いでしょう。
で、その計算ですが、
文字幅が固定(等幅フォント)であれば文字数×文字幅で簡単に文字列幅を求められますが、
プロポーショナルフォント(等幅じゃないフォント)の場合は、文字ごとに幅が違うので、
Win32API の GetCharWidth32 関数等を使って文字幅を取得すると良いでしょう。
(私の構築しているライブラリでは GetCharWidth32 等を使って表示幅を決めて処理しています)
管理人さんの言う、コードが長くなるところは GetCharWidth32 で
表示範囲を計算する所でしょうね。
(等幅フォントならある程度短いですが)
表示方法については、左から一文字ずつ描画して、
表示幅を超えたら一段下げて左から一文字ずつ描画する方法と、
あらかじめ文字幅を計算し、文字列内に改行文字を挿入しておく方法があります。
(もし、読み込み文章が不変ならば、手作業で改行を入れておくほうがラクです)
418ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(291,216ポイント)
Date: 2008/12/25(木) 21:15
No:26047
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
御津凪さんが書かれているとおり、一文字の表示サイズと文字間隔の情報から
どこまで1行で書けるかを調べて区切るのが基本です。
DXライブラリならや GetDrawStringWidth() や GetDrawFormatStringWidth() などを使って
求めるのもいいかと思います。
ただ日本語の場合、文字コードに注意して区切りを入れる必要があります。
サンプルの「s2. サウンドノベル風文字列表示法1」では2バイト固定の文字コードであることを
前提としていますが、それ以外の文字コードが使われていたり……例えば 1バイト文字が
混ざる場合などはその判定もしなければなりません。
又、適当に表示上の長さだけで行を区切ってしまうと、句読点や括弧終了などが先頭に
来てしまったり、反対に行末に括弧開始などが来たり、或いは連続した数字が行を
跨いでしまったりとおかしな表示になってしまうことがあります。
表示内容次第ですが、そういう場合の処理(禁則処理)も入れておいた方がいいかも
しれません。
#事前に元テキストの方で切っておくのが楽かと。
259ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(936,469ポイント)
Date: 2008/12/26(金) 00:01
No:26057
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
とりあえず3行にわけて表示するサンプル作ってみました。
すごいやっつけです^^;
Zキーで読み進めて下さい。
サンプルは
http://dixq.net/g/#41
これに、文字列計算するためのCalcShowStrなる関数と後チョットつけたしただけです。
#include "DxLib.h"
#define ShowN 25
int Key[256];
typedef struct{
int State;
int count;
int pos;
char str[3][ShowN];
}ShowStr_t;
ShowStr_t ShowStr;
int WordsPos1,WordsPos2;
char Words[10][ShowN*3-2]={
{"今日1月1日は元旦です!! 元旦なので、家に帰ってます。"},
{"家に帰った時位"},
{"修論の事は忘れたいものですが(´〜`;)、そうもいかないみたいです;"},
{"1月のこのくそ忙しい時に姉貴が結婚するので、その準備で、"},
{"忙しさが更に倍増ですorz 本当に卒業できるのだろうかDixq。"},
{"卒業できなかったら発狂して‥・・&\"'(#!)\\.+:@[]りそう。"},
{"そうならないようにナントカシマス。"},
{"終わり。"},
};
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;
}
void CalcShowStr(){
if(Key[KEY_INPUT_Z]==2){//Zキー押されたら次のワードに進んでShow初期化
WordsPos2=0;
WordsPos1++;
ShowStr.pos=0;
ShowStr.State=0;
ShowStr.count=0;
ShowStr.str[2][0]=ShowStr.str[1][0]=0;
}
switch(ShowStr.State){
case 0:
case 1:
case 2://1,2,3行目の時、
if(ShowStr.count%4==0){//4カウントに1回処理
//1文字とってくる
ShowStr.str[ShowStr.State][ShowStr.pos++] = Words[WordsPos1][WordsPos2++];
//とってきた文字がマイナスなら
if(ShowStr.str[ShowStr.State][ShowStr.pos-1]<0){
//もう一文字取ってくる
ShowStr.str[ShowStr.State][ShowStr.pos++] = Words[WordsPos1][WordsPos2++];
}
//とりあえずそこまでを文字列とする
ShowStr.str[ShowStr.State][ShowStr.pos]=0;
//今の位置がそろそろ終わりなら
if(ShowStr.pos>=ShowN-3){
//位置情報0にして次の行へ
ShowStr.pos=0;
ShowStr.State++;
}
//データワードが終わりなら
if(Words[WordsPos1][WordsPos2]==0){
//ステータスを終了に
ShowStr.State=-1;
}
}
ShowStr.count++;
break;
default:
break;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int White = GetColor( 255,255,255 );
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
CalcShowStr();
DrawFormatString(0, 0,White,"%s",ShowStr.str[0]);
DrawFormatString(0,20,White,"%s",ShowStr.str[1]);
DrawFormatString(0,40,White,"%s",ShowStr.str[2]);
ScreenFlip();
}
DxLib_End();
return 0;
}
皆さん仰っているように文字列の長さはかって改行するのが一番だと思います。
後、全角かどうか判定する方法がいまいちわからなかったので、勝手にマイナスなら全角だろうということにしてます。
C言語って全角文字使う事とか前提にされてないんですかね・・。
http://www.geocities.co.jp/SiliconValley-Bay/7437/c/is.htm
この辺参考にしたら全角か判定出来るのかな?
(ちなみにクイックソート解説アプリとかのはマイナスなら全角だろうということで作りました)
このままじゃ顔文字とかがそのまま区切れてしまうので、離れて欲しくない文字列はスペースで区切るなど何か対策立てたほうがいいかもしれません。
1,720ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(291,451ポイント)
Date: 2008/12/26(金) 01:21
No:26064
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
>全角かどうか判定する方法がいまいちわからなかったので
char型と負の比較というのはちょっと問題があります。
DXライブラリを使うなら MultiByteCharCheck()なんて関数があるので、
そちらを使うというのも1つの手です。
あと、全角・半角というのは文字の見た目によるもので、それが何バイトなのかは
決められないので1バイト文字・2バイト文字とかの表現の方がいいかと思います。
>勝手にマイナスなら全角
Shit-JISだとすると半角カタガナが・・・。
235ポイント を手に入れた。
|
|
|
|
|
Name: J ..上級者(16,780ポイント)
Date: 2008/12/26(金) 08:31
No:26068
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
うひゃあ
すみません、すっかり質問したことを忘れていました。。
こんなこと初めてです。。疲れてるのかなぁ
みなさん色々アドバイスありがとうです
管理人さんので試してみます
それにしても全角・半角とあるおかげで判定が大変ですね〜
68ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(937,009ポイント)
Date: 2008/12/26(金) 16:24
No:26075
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
おぉ、そのような関数があるとは。
Justyさんよく非公開関数沢山ご存知ですね。
せっかく見易いように用意されているヘッダファイル、たまには端から見てみないといけませんね^^;
しかしMultiByteCharCheckで2バイト文字かどうかチェックできるということは自力でも出来るはずですよね?
半角カタカナ以外のマイナスの文字コードは2バイト文字なんでしょうか?
>半角カタカナ
そうなんですよね・・。
なので、半角カタカナは使わない方向で対処しました^^;
「半角カタカナは使うな」みたいなことが多いので抵抗は無かったんですが・・。
半角カタカナで起こるバグはこういうことに起因してるんですかね。
294ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(291,809ポイント)
Date: 2008/12/26(金) 22:40
No:26080
|
|
Title: Re: s2. サウンドノベル風文字列表示法1
|
|
>しかしMultiByteCharCheckで2バイト文字かどうかチェックできるということは自力でも出来るはずですよね?
勿論です。
そうでないと、文字を扱うソフトが全滅してしまいます!
初級C言語Q&A(15)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa15.html#Q4
>半角カタカナ以外のマイナスの文字コードは2バイト文字なんでしょうか?
Shift-JISにおいて 1文字目を unsignedにキャストして 0x80以上は
ほとんど2バイト文字ですが、半角系の。「」、も1バイト文字になりますね。
>Justyさんよく非公開関数沢山ご存知ですね。
DXライブラリ自体ほとんど使わないのに何故でしょうねぇw
質問に答えているうちに自然と、ってところでしょうか。
358ポイント を手に入れた。
|
|
|
|
Name: VARIO ..入門者(3,663ポイント)
Date: 2008/12/22(月) 15:26
No:25941
|
|
Title: 2次元配列から線形計画法の制約式を作る方法
|
|
いつもお世話になっています。
今、グループスタイナーという問題のアルゴリズムを実装していまして、グラフの隣接行列に基づいた線形計画法の制約式を作成するC言語のプログラムを考えているのですが、行き詰ってしまいました。
まず、頂点数Cのグラフの隣接行列を与えます。
#define C 6
int c[C+1][C+1]={{0,0,0,0,0,0,0},
{0,0,1,M,1,M,1},
{0,1,0,1,M,1,M},
{0,M,1,0,1,M,1},
{0,1,M,1,0,1,0},
{0,M,1,M,1,0,1},
{0,1,M,1,M,1,0}};
例えば、c[1][3]が1というのは、頂点@と頂点Bが繋がっている、という意味で、0とMは繋がっていない、
という意味です。
加えて、頂点の分割の情報
V0={1,2}
V1={3,4}
V2={5,6}
を与えます。これは頂点を@AのグループとBCのグループとDEのグループに分けるという意味です。
またこのグループに依存した変数
H(V0)=4
H(V1)=3
H(V2)=2
を与えます。
このとき、H(Vk)が一番大きいグループに属する頂点r(この場合では@とA)に関して、それぞれ制約式を作ります。
制約式は、一般化すると、
Σ{(Vkに属する頂点以外+頂点r)の頂点集合に"出入り"する辺}>=H(Vk)
(この場合、k=1or2※0は除く)と書けます。"(Vkに属する頂点以外+頂点r)の頂点集合"は様々なパターンがあるので、場合分けをしなければなりません。
具体的にはrが@の場合は、
(k=1)(@) x1_2+x1_4+x1_6>=3;
(@A) x1_6+x1_4+x2_5+x2_3>=3;
(@D) x1_2+x1_4+x1_6+x2_5+x4_5+x5_6>=3;
(@E) x1_2+x1_4+x3_6+x5_6>=3;
(@AD) x1_4+x1_6+x2_3+x4_5+x5_6>=3;
(@AE) x1_4+x2_3+x2_5+x3_6+x5_6>=3;
(@DE) x1_2+x1_4+x3_6+x2_5+x4_5>=3;
(@ADE)x1_4+x2_3+x3_6+x4_5>=3;
(k=2)(A) x1_2+x1_4+x1_6>=2;
(A@) x1_6+x1_4+x2_5+x2_3>=2;
(AB) x1_2+x1_4+x1_6+x2_3+x3_6+x3_4>=2;
(AC) x1_2+x1_6+x3_4+x4_5>=2;
(A@B) x1_6+x1_4+x2_5+x3_4+x3_6>=2;
(A@C) x1_6+x2_3+x2_5+x3_4+x4_5>=2;
(ABC) x1_2+x1_6+x2_3+x3_6+x4_5>=2;
(@ABC)x1_6+x2_5+x3_6+x4_5>=2;
となります。要は、この右側の部分が書き出せればいいのですが、どのように情報をインプットさせて、どのようにループさせていけばいいのか全くわかりません。自分でやってみたのは、
k=1;
for(i=1;i<=C;i++){
if(i==r){
for(j=1;j<=C;j++){
if(c[i][j]>0&&c[i][j]!=M){
if(i<j)
printf("+x%d_%d",i,j);
if(i>j)
printf("+x%d_%d",j,i);
}
}
printf(">=%d;\n",HVk[k]);
}
}
for(i=1;i<=C;i++){
if(i!=r&&i!=3&&i!=4){
for(j=1;j<=C;j++){
if(c[r][j]>0&&c[r][j]!=M&&i!=j){
if(r<j)
printf("+x%d_%d",r,j);
if(r>j)
printf("+x%d_%d",j,r);
}
if(c[i][j]>0&&c[i][j]!=M&&r!=j){
if(i<j)
printf("+x%d_%d",i,j);
if(i>j)
printf("+x%d_%d",j,i);
}
}
printf(">=%d;\n",HVk[k]);
}
}
のようなほぼ全列挙のような形なのですが、これだと頂点数が増えたときに場合分けが多すぎてどうしようもなくなってしまうと思います。
何かうまい方法はないでしょうか?ちなみに環境はVista/VisualC++2008です。
つたない説明で意図が伝わるかどうか怪しいですが・・・何卒よろしくお願いします。
1,493ポイント を手に入れた。
|
|
|
|
Name: non ..プログラマー(25,507ポイント)
Date: 2008/12/24(水) 10:34
No:25969
|
|
Title: Re:2次元配列から線形計画法の制約式を作る方法
|
|
グループスタイナーなんてのはわかりませんが、誰からもRESがなさそうなので・・・
たぶん、必要なのは組み合わせパターンを求めることではないかと思いました。
要するにn個の中からr個を重複無しで取り出すこと(nCr)ではないでしょうか。
ここで、r=1からr=nまですべてを表示すれば良いと思いサンプルを作ってみました。
たぶん、もっと良い方法があるような気がします。まだ、よく考えていないのでとりあえず。
#include <stdio.h>
int v[]={1,2,5,6};
int check(int r)
{
for(int i=1;i<r-1;i++)
if(v[i]>v[i+1])
return 1;
return 0;
}
void disp(int r)
{
int i;
for(i=0;i<r;i++)
printf("%d ",v[i]);
printf("\n");
}
void swap(int *a,int *b)
{
int tmp=*a;*a=*b,*b=tmp;
}
void nCr(int n,int r,int i)
{
if (i < r) {
for (int j = i; j < n; j++) {
swap(v+i,v+j);
nCr(n,r,i+1);
swap(v+i,v+j);
}
}
else
if(!check(r))
disp(r);
}
void pairing(int n)
{
for(int r=1;r<=n;r++)
nCr(n,r,1);
}
int main(void)
{
pairing(4);
return 0;
}
ここでは、1,2,5,6の場合(先頭は変更しない)で表示するように作りました。
実行結果は
1
1 2
1 5
1 6
1 2 5
1 2 6
1 5 6
1 2 5 6
になります。
また、int v[]={2,1,3,4};にして実行すると
2
2 1
2 3
2 4
2 1 3
2 1 4
2 3 4
2 1 3 4
になります。
724ポイント を手に入れた。
|
|
|
|
|
Name: VARIO ..入門者(3,634ポイント)
Date: 2008/12/26(金) 17:51
No:26078
| 解決!
|
Title: Re:2次元配列から線形計画法の制約式を作る方法
|
|
返事遅くなりすみません。
自己解決しました。nonさんありがとうございました。
29ポイント を落としてしまった。
|
|
|
|
Name: ざこ ..中級者(10,168ポイント)
Date: 2008/12/26(金) 11:29
No:26070
|
|
Title: ジャンケン
|
|
MFCでジャンケンプログラムを作ってます。
そこで相手がランダムにグーチョキパーのいずれかを出すというのができません。
私の考えではrandで1~3の間の数をランダムに出しif文で1だったらグーのiconを2だったらチョキ、3だったらパー
という具合がよろしいかと考えましたがうまくいきません。
CStatic *p;
p=(CStatic *)GetDlgItem(IDC_STATIC1);
int n;
n=rand();
if(n<1||3<n)return;
if(n==1){
HICON a;
a=AfxGetApp()->LoadIcon(IDI_ICON1);
p->SetIcon(a);
}
という風になってます。教えて下さい。
157ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(46,838ポイント)
Date: 2008/12/26(金) 11:38
No:26072
|
|
Title: Re:ジャンケン
|
|
> n=rand();
> if(n<1||3<n)return;
rand 関数は 0から65535までのランダムな値を返しますので、
if 文のところでほぼ return が呼ばれてしまいます。
この場合、
n=rand()%3; // 0〜2の三つの値のどれかを格納
とすると良いでしょう。
2倍のポイントを手に入れた! 132ポイント を手に入れた。
|
|
|
|
Name: kokoro ..入門者(4,679ポイント)
Date: 2008/12/25(木) 15:24
No:26022
|
|
Title: GAに関する課題
|
|
問題
1から8までの数字をいくつか選び、その合計が20になるようにするにはどのように
選べばよいか?選ぶ数字は1種類につき1つまでとする。
という問題を解くGA(個体数8)のプログラムを作り、その結果を報告する。
適応度fは、合計値をsとして、次の式で求めるものとする。
s (s≤ 20)
f={
2*20-s (s > 20)
どうやってプログラムを書いたらさっぱりわかりません。
どなたかアドバイスをお願いします。
os:windows
コンパイラ名:bcc
153ポイント を手に入れた。
|
|
|
|
Name: abc ..かけだし(2,421ポイント)
Date: 2008/12/25(木) 15:42
No:26024
|
|
Title: Re:GAに関する課題
|
|
質問1〜8の数字をいくつでも選べる??
例、3選ぶ、4選ぶ、8選ぶ、合計は15なので、5を足せば20になることを教える?
逆に合計23の場合はー3すれば20になることを教える?
90ポイント を手に入れた。
|
|
|
|
|
Name: abc ..かけだし(2,448ポイント)
Date: 2008/12/25(木) 15:46
No:26025
|
|
Title: Re:GAに関する課題
|
|
−3は考えなくていい見たいですね、GAがいまいち分からないので調べて見ます。
前の投稿はスルーで
27ポイント を手に入れた。
|
|
|
|
|
Name: abc ..入門者(2,512ポイント)
Date: 2008/12/25(木) 16:00
No:26027
|
|
Title: Re:GAに関する課題
|
|
アルゴリズム見たんですが、いまいち分かりませんでした笑
結局a[8] = {1,2,3,4,5,6,7,8};
いれてループで一個ずつ見ればいいのでは?
間違ってることを言ってる可能性65%なので読み流しでOK
64ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(4,735ポイント)
Date: 2008/12/25(木) 17:33
No:26035
|
|
Title: Re:GAに関する課題
|
|
GAについては何となくわかっているという感じです。
プログラムをどうやって書けばいいのかわかりません。
1から8までをランダムにすることぐらいしか…。
56ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(36,267ポイント)
Date: 2008/12/25(木) 18:43
No:26038
|
|
Title: Re:GAに関する課題
|
|
いきなりプログラムを書こうとせずに、処理の流れを文章で書いてみるのがいいと思います。
既にできているというのであればそれを見せてください。(で、以下は無視してください)
参考に出したHPの書き方を真似ると(途中まで)
1.初期集団の生成
1〜8までの数字で構成される個体を8個生成する。
このとき、同じ数字を2回使用している個体は除く。
2.適応度の評価
各個体の数字の合計を計算し適応度を求める。
合計が20となるパターンが一つだけ判ればいいのであれば、20になる個体があれば終了。
3.選択
ランダムに2個の個体を選択する。
このとき、適応度の高い個体は選択されやすく、低い個体は選択されにくくする。
・
・
・
この問題はGAでよくみられるナップサック問題の亜種ですので、その辺でググられるといろいろ勉強になると思います。
367ポイント を手に入れた。
|
|
|
|
|
Name: mats ..ぴよぴよ(792ポイント)
Date: 2008/12/25(木) 18:46
No:26040
|
|
Title: Re:GAに関する課題
|
|
最初の世代はランダムに選びます.
ここでは1〜8の数字を高々1回しか使わないので、各個体は8つのフラグ(遺伝子)を持てばいいことになります.
フラグが1ならその数字を使う,フラグが0なら使わないという感じです.
それを個体数だけ用意します.
後はGAの基本的な流れに沿って評価,次世代の決定を繰り返せばいいかと
Wikipedia の「遺伝的アルゴリズム」のページにある,SGAというのが参考になるかもしれません.
115ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(19,270ポイント)
Date: 2008/12/26(金) 11:57
No:26073
|
|
Title: Re:GAに関する課題
|
|
アドバイスが少し錯綜気味なので、まとめのつもりで書きます。
プログラムの流れとしては、Mistさんの説明の通りでよいと思います。
ただし初期集団の生成において、このままでは、全ての個体の適応度が
4(1〜8までの合計を評価式に代入)になってしまいます。
遺伝子の表現はmatsさんの形式のものが最もシンプルだと思います。
(その他のパターンとしては、0〜8までの値を取りうる配列要素を8つ持つ遺伝子で、
0以外の数値は重複不可とか。)
> GAについては何となくわかっているという感じです。
ナップサック問題等を授業で習い、課題としてこの問題が出たのでしょうか?
基本をある程度理解する前に応用問題に取り組んでも時間の無駄だと思います。
まずは、授業で説明のあった基本的な問題について、プログラムを作れるようになって下さい。
そのような説明はなかったよーという場合は、ナップサック問題がお勧めです。
最も易しいし、この問題の原型でもあるので。
アルゴリズムを理解しているかどうかの判定の目安の1つですが、
理解できたと思ったら、本を閉じて、自分でプログラムを1から書いてみてください。
Cの文法や関数の使い方が分からない場合にリファレンスを見るのは良いですが、
それ以外のカンニングは禁止です。
よほど記憶力の良い人は別ですが、当たり前のようにこれができるならば、
そのアルゴリズムを十分理解しているとみなして良いでしょう。
慣れてくれば、本を読むだけでアルゴリズムのアイデアを理解し、
数ヶ月後や数年後に思い出してプログラムを書けますよ。
残念ながら書けない事も少なくないですが。
理解度の判定のより良い目安は、応用できるかどうか、というものです。
しかし応用問題を考えないといけなくて、簡単すぎたら無意味だし、
難しすぎたら手に負えないし、一人では難しい場合も多いでしょうね。
704ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(10,011ポイント)
Date: 2008/12/25(木) 11:14
No:26017
|
|
Title: MFC
|
|
pDC->SetViewportExt(r.right,-r.bottom);
pDC->SetViewportOrg(r.right/4,r.bottom+200);
というのが何やってるかがわかりません。大雑把にはビューポートの原点と範囲を指定してるのはわかります。
pDC->SetViewportExt(r.right,r.bottom);とすると原点を中心にするってのはしらべました。
pDC->SetViewportExt(r.right,-r.bottom)とpDC->SetViewportExt(r.right,r.bottom)の違いがイマイチわからないです。両方実行して見ると前者だとうまいこといきますが後者だとグチャグチャの図形になってしまいます。
基本的なことで申し訳ないですが教えて下さい。
226ポイント を手に入れた。
|
|
|
Name: kokosan60 ..ぴよぴよ(345ポイント)
Date: 2008/12/24(水) 03:28
No:25960
|
|
Title: 新・AA動画の作り方について
|
|
上のプログラムは正常に実行できましたが、
下のプログラムはエラーがでて実行できませんでした。
こちらで何か設定を変えなければならないことがあるのでしょうか。
環境
コンパイラ:Visual Studio 2005
OS:Windows XP SP2
エラーメッセージ
1>リンクしています...
1>dispAA.obj : error LNK2019: 未解決の外部シンボル "void __cdecl draw_setumei(int,int,int,int)" (?draw_setumei@@YAXHHHH@Z) が関数 _WinMain@16 で参照されました。
1>dispAA.obj : error LNK2019: 未解決の外部シンボル "void __cdecl draw_fps(int,int,int,int)" (?draw_fps@@YAXHHHH@Z) が関数 _WinMain@16 で参照されました。
1>dispAA.obj : error LNK2019: 未解決の外部シンボル "void __cdecl fps_wait(void)" (?fps_wait@@YAXXZ) が関数 _WinMain@16 で参照されました。
1>dispAA.obj : error LNK2019: 未解決の外部シンボル "void __cdecl check_key(char * const)" (?check_key@@YAXQAD@Z) が関数 _WinMain@16 で参照されました。
1>C:\Documents and Settings\PC User\デスクトップ\dispAA\Debug\dispAA.exe : fatal error LNK1120: 外部参照 4 が未解決です。
345ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(930,717ポイント)
Date: 2008/12/24(水) 04:10
No:25961
|
|
Title: Re:新・AA動画の作り方について
|
|
あら・・、今見てみたところ、
extern void fps_wait();
extern void draw_fps(int,int,int,int);
extern void check_key(char Key[]);
extern void draw_setumei(int font, int color, int size, int contrast);
この4つの関数の正体がありませんね。
きっと他のファイルの内容でしょうけど、記載し忘れてしまったのかもしれません。
fps_waitとdraw_fpsは基本的に龍神録プログラミングの館の43章と同じです。
draw_fpsの引数が4つなのは座標データのほかにfont,colorのデータを持たせているためです。
check_keyはhttp://dixq.net/g/#40この関数を呼んでいるだけだったと思います。
draw_setumeiは、動画の下にサイズやコントラストの表示がしてあったと思いますが、
その表示を行っている関数です。
引数をDrawFormatStringなどで下に表示してやる関数です。
この4つの関数を追加してやれば動くと思います。
パソコンを再インストールしたので、前のプログラムデータが無いのです。ごめんなさい・・。
257ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..かけだし(1,669ポイント)
Date: 2008/12/25(木) 01:51
No:26006
|
|
Title: Re:新・AA動画の作り方について
|
|
修正をしたのですが、今度は別のエラーが出てしまいました。
また、一部の関数はどのように書いて(変更して)いいのかわからずコメントアウトしています。
エラー
1>c:\documents and settings\pc user\デスクトップ\dispaa\dispaa.cpp(37) : error C2040: 'color' : 'int' は 'int [20]' と間接操作のレベルが異なります。
1>c:\documents and settings\pc user\デスクトップ\dispaa\dispaa.cpp(192) : error C2440: '=' : 'DWORD' から 'int [20]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。
ソースコード
#include "DxLib.h"
#include "GV.h"
/* convAAで設定したMAXと同じ数値をいれる。 */
#define MAX 8825
/* ビットマップの横サイズ */
#define BMP_YOKO 640
/* ビットマップの縦サイズ */
#define BMP_TATE 480
/* AAデータを入れるための構造体 */
typedef struct{
unsigned char cont;
int col;
}AAimg_t;
/* 直前のAAデータを記憶するための構造体 */
typedef struct{
unsigned char num,cont;
}rem_img_t;
/* 縦サイズ */
#define TATE 5
/* 横サイズ */
#define YOKO 3
#define FLAME 60
//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
int font,font2,color,size,cnt,contrast;
char Key[256];
char input[15][27]={
{"HMNRW"},
{"DKUhkHMNRW"},
{"$BEGOPQX\\b08"},
{"#@ACFJVYZ[]234569dfntwヲオセヒ"},
{"%&LSTa17jpuアカサホル"},
{"I/egiloqsxz{|}ォウキクケチナムモヤリレ"},
{"?crvyャイシトハミヨロ"},
{"!<>()ァョッエコスタテヌネノメユラ"},
{"ィゥソツフマワン"},
{"=*ェニ"},
{"+ュヘ"},
{":;"},
{"\"^_-~"},
{"'."},
{",`"},
};
//char input_n[15]={2,2,5,2,3,4,8,19,13,26,16,26,12,10,5};
char input_n[15]={5,10,12,26,16,26,13,19,8,4,3,2,5,2,2};
AAimg_t AAimg[BMP_TATE/TATE+1][BMP_YOKO/YOKO+1];
void fps_wait();
//void draw_fps(int,int,int,int);
void check_key(char Key[]);
//void draw_setumei(int font, int color, int size, int contrast);
int check_key(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
void fps_wait(){
int term,i,gnt;
static int t=0;
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();
if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
1,324ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..入門者(4,194ポイント)
Date: 2008/12/25(木) 01:53
No:26007
|
|
Title: Re:新・AA動画の作り方について
|
|
プログラム続き
/*void draw_fps(int x, int y){
if(ave!=0){
DrawFormatString(x, y,color[0],"[%.1f]",1000/ave);
}
return;
}*/
/* AAデータの表示0 */
void draw_AA0(){
int cont,num;
int xtm=3+(size-5)*2/5,ytm=5+(size-5)*2/5;
DrawBox(0,0,640,480,color,TRUE);
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=0;j<BMP_YOKO/YOKO+1;j++){
cont=AAimg[i][j].cont+contrast;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatString(xtm*j-(size-5)*30,ytm*i-(ytm-5)*30,AAimg[i][j].col,"%c",input[cont][num]);
}
}
}
/* AAデータの表示 */
/* フォントデータを使って右画面だけアップに出来る */
void draw_AA(){
int cont,num;
int xtm=3+(size-5)*2/5,ytm=5+(size-5)*2/5;
DrawBox(0,0,640,480,color,TRUE);
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=0;j<(BMP_YOKO/YOKO+1)/2;j++){
cont=AAimg[i][j].cont;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatStringToHandle( 3*j , 5*i , AAimg[i][j].col ,font2 ,"%c",input[cont][num] ) ;
}
}
int st=(BMP_YOKO/YOKO+1)/2-1, end=BMP_YOKO/YOKO+1;
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=st;j<end;j++){
cont=AAimg[i][j].cont+contrast;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatString(3*j+(size-5)*(j-st)*2/5,ytm*i-(ytm-5)*30,AAimg[i][j].col,"%c",input[cont][num]);
}
}
}
/* convAAでコンバートしたAAデータを読み込む */
int read_draw(FILE *fp){
if(cnt>=MAX){
fseek(fp, 0L, SEEK_SET);
cnt = 0;
}
fread( AAimg, sizeof(AAimg_t), (BMP_TATE/TATE+1)*(BMP_YOKO/YOKO+1), fp );
draw_AA();
cnt++;
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
FILE *fp;
SetGraphMode( 640, 480 , 16 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
/* 裏画面描画 */
SetDrawScreen( DX_SCREEN_BACK );
SetFontSize(5);
/* 描画領域を画面内に */
SetDrawArea( 0,0,640,480 ) ;
fp = fopen( "../convAA/AAdat.dat" , "rb" );
if( fp == NULL ){
printfDx( "見つかりません。" );
return -1;
}
size = 5;
font = CreateFontToHandle( "HGPゴシックE" , 18 , 2 , DX_FONTTYPE_ANTIALIASING_EDGE);
font2 = CreateFontToHandle( NULL , 5 , -1 , DX_FONTTYPE_NORMAL);
color = GetColor(255,255,255);
contrast=0;
int count=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key )){
check_key(Key);
{
if(Key[KEY_INPUT_S]>0){
if(Key[KEY_INPUT_LEFT]==2){
size--;
if(size<5)size=5;
if(size>=24)size-=4;
SetFontSize(size);
}
if(Key[KEY_INPUT_RIGHT]==2){
if(size>=20)size+=4;
SetFontSize(size);
size++;
}
}
}
read_draw(fp);//読み込んで描画
fps_wait();//FPS制御
//draw_fps(0,0,font,color);//FPS表示
//draw_setumei(font, color, size, contrast);//説明表示
if(Key[KEY_INPUT_ESCAPE]==1)break;
ScreenFlip();
count++;
}
DxLib_End();
fclose(fp);
return 0;
}
2,525ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..初心者(6,648ポイント)
Date: 2008/12/25(木) 11:15
No:26018
|
|
Title: Re:新・AA動画の作り方について
|
|
修正をしたのですが、また別のエラーが出てしまいました。
エラー
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_packet_iskeyframe が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_comment_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_info_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_info_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_comment_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_header が関数 "int __cdecl TheoraDecode_ReadHeader(struct tagDECODE_THEORA *)" (?TheoraDecode_ReadHeader@@YAHPAUtagDECODE_THEORA@@@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_YUVout が関数 "unsigned long __stdcall TheoraDecode_Thread(void *)" (?TheoraDecode_Thread@@YGKPAX@Z) で参照されました。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_packetin が関数 "int __cdecl _TheoraDecode_IncToFrame(int,int)" (?_TheoraDecode_IncToFrame@@YAHHH@Z) で参照されました。
1>C:\Documents and Settings\PcUser\デスクトップ\新しいフォルダ\Debug\dispAA.exe : fatal error LNK1120: 外部参照 10 が未解決です。
ソースコード
#include "DxLib.h"
#include "GV.h"
/* convAAで設定したMAXと同じ数値をいれる。 */
#define MAX 8825
/* ビットマップの横サイズ */
#define BMP_YOKO 640
/* ビットマップの縦サイズ */
#define BMP_TATE 480
/* AAデータを入れるための構造体 */
typedef struct{
unsigned char cont;
int col;
}AAimg_t;
/* 直前のAAデータを記憶するための構造体 */
typedef struct{
unsigned char num,cont;
}rem_img_t;
/* 縦サイズ */
#define TATE 5
/* 横サイズ */
#define YOKO 3
#define FLAME 60
//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
int font,font2,color[20],size,cnt,contrast;
char Key[256];
char input[15][27]={
{"HMNRW"},
{"DKUhkHMNRW"},
{"$BEGOPQX\\b08"},
{"#@ACFJVYZ[]234569dfntwヲオセヒ"},
{"%&LSTa17jpuアカサホル"},
{"I/egiloqsxz{|}ォウキクケチナムモヤリレ"},
{"?crvyャイシトハミヨロ"},
{"!<>()ァョッエコスタテヌネノメユラ"},
{"ィゥソツフマワン"},
{"=*ェニ"},
{"+ュヘ"},
{":;"},
{"\"^_-~"},
{"'."},
{",`"},
};
//char input_n[15]={2,2,5,2,3,4,8,19,13,26,16,26,12,10,5};
char input_n[15]={5,10,12,26,16,26,13,19,8,4,3,2,5,2,2};
AAimg_t AAimg[BMP_TATE/TATE+1][BMP_YOKO/YOKO+1];
void fps_wait();
//void draw_fps(int,int,int,int);
void check_key(char Key[]);
//void draw_setumei(int font, int color, int size, int contrast);
void check_key(char KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
}
void fps_wait(){
int term,i,gnt;
static int t=0;
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();
if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
/*void draw_fps(int x, int y){
if(ave!=0){
DrawFormatString(x, y,color[0],"[%.1f]",1000/ave);
}
return;
}*/
2,454ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..初心者(8,818ポイント)
Date: 2008/12/25(木) 11:16
No:26019
|
|
Title: Re:新・AA動画の作り方について
|
|
プログラム続き
/* AAデータの表示0 */
void draw_AA0(){
int cont,num;
int xtm=3+(size-5)*2/5,ytm=5+(size-5)*2/5;
DrawBox(0,0,640,480,*color,TRUE);
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=0;j<BMP_YOKO/YOKO+1;j++){
cont=AAimg[i][j].cont+contrast;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatString(xtm*j-(size-5)*30,ytm*i-(ytm-5)*30,AAimg[i][j].col,"%c",input[cont][num]);
}
}
}
/* AAデータの表示 */
/* フォントデータを使って右画面だけアップに出来る */
void draw_AA(){
int cont,num;
int xtm=3+(size-5)*2/5,ytm=5+(size-5)*2/5;
DrawBox(0,0,640,480,*color,TRUE);
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=0;j<(BMP_YOKO/YOKO+1)/2;j++){
cont=AAimg[i][j].cont;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatStringToHandle( 3*j , 5*i , AAimg[i][j].col ,font2 ,"%c",input[cont][num] ) ;
}
}
int st=(BMP_YOKO/YOKO+1)/2-1, end=BMP_YOKO/YOKO+1;
for(int i=0;i<BMP_TATE/TATE+1;i++){
for(int j=st;j<end;j++){
cont=AAimg[i][j].cont+contrast;
if(cont>=15)
cont=14;
if(cont<0)
cont=0;
num =GetRand(input_n[cont]-1);
DrawFormatString(3*j+(size-5)*(j-st)*2/5,ytm*i-(ytm-5)*30,AAimg[i][j].col,"%c",input[cont][num]);
}
}
}
/* convAAでコンバートしたAAデータを読み込む */
int read_draw(FILE *fp){
if(cnt>=MAX){
fseek(fp, 0L, SEEK_SET);
cnt = 0;
}
fread( AAimg, sizeof(AAimg_t), (BMP_TATE/TATE+1)*(BMP_YOKO/YOKO+1), fp );
draw_AA();
cnt++;
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
FILE *fp;
SetGraphMode( 640, 480 , 16 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
/* 裏画面描画 */
SetDrawScreen( DX_SCREEN_BACK );
SetFontSize(5);
/* 描画領域を画面内に */
SetDrawArea( 0,0,640,480 ) ;
fp = fopen( "../convAA/AAdat.dat" , "rb" );
if( fp == NULL ){
printfDx( "見つかりません。" );
return -1;
}
size = 5;
font = CreateFontToHandle( "HGPゴシックE" , 18 , 2 , DX_FONTTYPE_ANTIALIASING_EDGE);
font2 = CreateFontToHandle( NULL , 5 , -1 , DX_FONTTYPE_NORMAL);
*color = GetColor(255,255,255);
contrast=0;
int count=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key )){
check_key(Key);
{
if(Key[KEY_INPUT_S]>0){
if(Key[KEY_INPUT_LEFT]==2){
size--;
if(size<5)size=5;
if(size>=24)size-=4;
SetFontSize(size);
}
if(Key[KEY_INPUT_RIGHT]==2){
if(size>=20)size+=4;
SetFontSize(size);
size++;
}
}
}
read_draw(fp);//読み込んで描画
fps_wait();//FPS制御
//draw_fps(0,0,font,color);//FPS表示
//draw_setumei(font, color, size, contrast);//説明表示
if(Key[KEY_INPUT_ESCAPE]==1)break;
ScreenFlip();
count++;
}
DxLib_End();
fclose(fp);
return 0;
}
2,170ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..初心者(8,899ポイント)
Date: 2008/12/25(木) 18:35
No:26037
|
|
Title: Re:新・AA動画の作り方について
|
|
GV.hは龍神録プログラミングの館の43章のfps.cppでincludeしてありましたので
そのヘッダーと関連するヘッダーを追加してincludeしました。
不要ということなので、GV.hをincludeせずに行ったのですが、同じエラーメッセージが出てしまいました。
81ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(36,602ポイント)
Date: 2008/12/25(木) 18:50
No:26042
|
|
Title: Re:新・AA動画の作り方について
|
|
提示のプログラムをこちらでコンパイルしてみましたが、コンパイルエラーがあってリンクまで行かないですね。
1>------ すべてのリビルド開始: プロジェクト: TestProgram, 構成: Debug Win32 ------
1>プロジェクト 'TestProgram'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>TestProgram.cpp
1>c:\work\temp\testprogram\testprogram.cpp(44) : error C2117: 'input' : 指定された配列には、初期化子が多すぎます。
1> c:\work\temp\testprogram\testprogram.cpp(40) : 'input' の宣言を確認してください。
1>c:\work\temp\testprogram\testprogram.cpp(44) : error C2078: 初期化子の数が多すぎます。
1>c:\work\temp\testprogram\testprogram.cpp(46) : error C2117: 'input' : 指定された配列には、初期化子が多すぎます。
1> c:\work\temp\testprogram\testprogram.cpp(40) : 'input' の宣言を確認してください。
1>c:\work\temp\testprogram\testprogram.cpp(48) : error C2117: 'input' : 指定された配列には、初期化子が多すぎます。
1> c:\work\temp\testprogram\testprogram.cpp(40) : 'input' の宣言を確認してください。
1>ビルドログは "file://c:\Work\temp\TestProgram\Debug\BuildLog.htm" に保存されました。
1>TestProgram - エラー 4、警告 0
335ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(36,658ポイント)
Date: 2008/12/25(木) 18:52
No:26043
|
|
Title: Re:新・AA動画の作り方について
|
|
で、input[15][50]と変えてコンパイルしたところ問題なくビルドできました。
DXライブラリのlibファイルへのパス設定が間違っていたりしませんか?
56ポイント を手に入れた。
|
|
|
|
|
Name: kokosan60 ..初心者(8,907ポイント)
Date: 2008/12/26(金) 01:04
No:26063
|
|
Title: Re:新・AA動画の作り方について
|
|
inputの部分を修正し、"DxLib.h"を<DxLib.h>に変更したら正常に動きました。
ただ、コメントアウトしている関数や書いていない関数があり、
新・AA動画の作り方の動画のように表示することができません。
ですので、その関数のプログラムを教えていただけないでしょうか。
また、修正したプログラムに間違いがありましたらそちらも教えてください。
8ポイント を手に入れた。
|
|
|
|
Name: yu ..入門者(4,749ポイント)
Date: 2008/12/26(金) 00:01
No:26056
|
|
Title: 画像で円を描画
|
|
また分からないことがあったので質問させていただきます;
自分ではどうしても考えつきませんでした・・・
元は直線だった画像を添付した画像のように円で描画するにはどのようにすると良いですか?
円の半径を変数で扱って大きさを変化させたいのですが・・・
C++でDXライブラリを使用しています。
プログラムでは難しくなるようでしたら、
ペイントソフトでこのように画像を変形することができるものはありますか?
Gimp2使っているのですが扱いが下手なもので・・・
ご教授よろしくお願いします m(_ _)m
69ポイント を手に入れた。
|
|
|
|
Name: yu ..入門者(4,867ポイント)
Date: 2008/12/26(金) 00:48
No:26062
| 解決!
|
Title: Re:画像で円を描画
|
|
迅速な返信ありがとうございます。
フィルターの辺りを自分で一つ一つ見ていたのですが
極座標は使い方が分からなくてスルーしていました;
今一度試したところ、
正方形のキャンバスの下のほうに画像を横に置いて変形してやればできました。
おかげで解決しました。
本当に助かりました m(_ _)m
管理者様度々ありがとうございます。
118ポイント を手に入れた。
|
|
|
|
Name: hyoma ..ぴよぴよ(100ポイント)
Date: 2008/12/25(木) 16:30
No:26029
|
|
Title: ヒストグラム
|
|
現在256×256画像から要素を抽出し、ヒストグラムを作成しようと思っています。
ただ2次元画像から1次元画像の配列に格納する方法はわかったのですが、それを
ヒストグラムとして画像に抽出するプログラムの書き方がわかりません。
ぜひアドバイスをお願いします。
100ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(933,617ポイント)
Date: 2008/12/25(木) 17:24
No:26033
|
|
Title: Re:ヒストグラム
|
|
ビットマップデータから赤のヒストグラムを表示するサンプルを作ってみました。
#include <stdio.h>
#include <stdlib.h>
/* ビットマップの横 */
#define YOKO 256
/* ビットマップの縦 */
#define TATE 256
/* ビットマップのヘッダサイズ */
#define HEAD 54
/* トータルサイズ */
#define TOTAL (YOKO*TATE*3+HEAD)
typedef struct{
//[0]青 [1]緑 [2]赤
unsigned char Col[3];
}Color_t;//色の構造体
/* ビットマップデータを読み込む */
int ReadBmp(char *name, unsigned char data[]){
FILE *fp;
fp = fopen( name , "rb" );
if( fp == NULL ){
printf( "%sが見つかりません。",name);
exit (1);
}
fread( data, TOTAL, 1, fp );
fclose(fp);
return 0;
}
/* ビットマップデータを扱いやすいようPixelDataに変換する */
void ConvPixelData( Color_t PixelData[ YOKO ][ TATE ], unsigned char BmpData[] ){
int t=HEAD;
int x,y,c;
for(y=TATE-1; y>=0; y--){
for(x=0; x<YOKO; x++){
for(c=0; c<3; c++){
PixelData[y][x].Col[c]=BmpData[t];
t++;
}
}
}
}
/* 赤の出現頻度をカウントする */
void CalcRed( Color_t PixelData[ YOKO ][ TATE ], int iRed[] ){
int x,y;
for(y=TATE-1; y>=0; y--){
for(x=0; x<YOKO; x++){
iRed[ PixelData[y][x].Col[2] ]++;
}
}
}
/* 赤の出現頻度を表示する */
void ShowRed( int iRed[] ){
int i,n;
printf("赤の分布\n");
for(i=0; i<256; i+=10){
printf("%3d:",i);
for(n=0; n<iRed[ i ]/10; n++){
printf("*");
}
printf("%d\n", iRed[ i ]);
}
}
int main(){
int iRed[ 256 ]={0,};
Color_t PixelData[ YOKO ][ TATE ];
unsigned char BmpData[TOTAL];
ReadBmp( "pict.bmp", BmpData );//読み込んで
ConvPixelData( PixelData, BmpData );//変換して
CalcRed( PixelData, iRed );//計算して
ShowRed( iRed );//表示
}
実行結果
赤の分布
0:*15
10:*18
20:******65
30:**********************227
40:********************************325
50:*************************************375
60:********************************************443
70:**************************************************500
80:********************************************442
90:**********************************************462
100:**********************************************463
110:******************************************427
120:****************************************400
130:**************************************385
140:*************************************379
150:***********************************354
160:****************************283
170:***************************274
180:**********************220
190:**************141
200:******65
210:*****52
220:****43
230:**26
240:**22
250:**************148
2倍のポイントを手に入れた! 2,340ポイント を手に入れた。
|
|
|
|
|
Name: hyoma ..ぴよぴよ(220ポイント)
Date: 2008/12/25(木) 17:27
No:26034
|
|
Title: Re:ヒストグラム
|
|
形式はpgmです。
画像データがどのようになっているかの理解はできていると思います。
しかし、画像を出力せよと言われたら出来ないです。
ヒストグラムはそのURL先にあるようなものを作成したいと思っています。
アドバイスをもらいやってみましたがやはりうまく出力はできませんでした。
120ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(934,502ポイント)
Date: 2008/12/25(木) 23:01
No:26053
|
|
Title: Re:ヒストグラム
|
|
とりあえず適当な四角形を書き出すサンプル書いてみました。
サンプルのプログラムは上のサンプルを利用して作りました。
関数を呼ぶ順番と中身が少し変わっているだけです。
ファイルはbmpですがpgmも無圧縮だと思うので、恐らく同じ要領で出来ると思います。
以下のプログラムで作った画像が添付画像です。
bmpのヘッダはあえて、既存のファイルからコピーする方法を取りました。
まずはコピーでやってみて、出来たらヘッダファイルの構造体を用意し、
ちゃんと画像サイズなども指定出来るようにしてみて下さい。
#include <stdio.h>
#include <stdlib.h>
/* ビットマップの横 */
#define YOKO 256
/* ビットマップの縦 */
#define TATE 256
/* ビットマップのヘッダサイズ */
#define HEAD 54
/* トータルサイズ */
#define TOTAL (YOKO*TATE*3)
typedef struct{
//[0]青 [1]緑 [2]赤
unsigned char Col[3];
}Color_t;//色の構造体
/* ビットマップデータのヘッダ部分を読み込む */
int ReadBmpHead(char *name, unsigned char BmpHead[]){
FILE *fp;
fp = fopen( name , "rb" );
if( fp == NULL ){
printf( "%sが開けません。",name);
exit (1);
}
fread( BmpHead, HEAD, 1, fp );
fclose(fp);
return 0;
}
/* ビットマップデータを書き出す */
int WriteBmp(char *name, unsigned char BmpHead[], unsigned char BmpData[]){
FILE *fp;
fp = fopen( name , "wb" );
if( fp == NULL ){
printf( "%sがエラーっす。",name);
exit (1);
}
fwrite( BmpHead, HEAD, 1, fp );
fwrite( BmpData, TOTAL, 1, fp );
fclose(fp);
return 0;
}
/* ビットマップデータをPixelDataからBmpDataに変換する */
void ConvToBmpData( Color_t PixelData[ YOKO ][ TATE ], unsigned char BmpData[] ){
int t=0;
int x,y,c;
for(y=TATE-1; y>=0; y--){
for(x=0; x<YOKO; x++){
for(c=0; c<3; c++){
BmpData[t]=PixelData[y][x].Col[c];
t++;
}
}
}
}
/* 画像に赤と青の四角形を書き込む */
void WriteColor( Color_t PixelData[ YOKO ][ TATE ] ){
int x,y;
for(y=100; y<180; y++){
for(x=100; x<180; x++){
PixelData[y][x].Col[2] = 255;
}
}
for(y=120; y<200; y++){
for(x=120; x<200; x++){
PixelData[y][x].Col[0] = 255;
}
}
}
int main(){
Color_t PixelData[ YOKO ][ TATE ]={0,};
unsigned char BmpData[TOTAL];
unsigned char BmpHead[HEAD];
ReadBmpHead( "pict.bmp", BmpHead );//ヘッダを読みんで
WriteColor( PixelData );//ピクセルデータを書き込んで
ConvToBmpData( PixelData, BmpData );//変換して
WriteBmp( "pict2.bmp", BmpHead, BmpData);//書き込む
}
731ポイント を手に入れた。
|
|
|
|
|
Name: hyoma ..ぴよぴよ(262ポイント)
Date: 2008/12/26(金) 00:41
No:26060
|
|
Title: Re:ヒストグラム
|
|
なんとか完成できました。
アドバイスありがとうございました。
また何か疑問に思いわからないことがあれば利用させてもらいます。
42ポイント を手に入れた。
|
|
|
|
Name: きらりん ..ぴよぴよ(670ポイント)
Date: 2008/12/24(水) 23:06
No:25989
|
|
Title: ファイル分割時のヘッダ部分について
|
|
はじめまして。
早速なんですが質問させてください;
ヘッダ部分のグローバル関数を GV.h なんかに分割してみたんですが
1>main.obj : error LNK2001: 外部シンボル ""int random" (?random@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int nrandom" (?nrandom@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int a" (?a@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int b" (?b@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * piece" (?piece@@3PAHA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * npiece" (?npiece@@3PAHA)" は未解決です。
みたいなエラーが出ます。
一応ぐぐって同じグローバル変数を二度定義してしまうのがいけないことで、
それをexternで回避できることがわかった後だったりします。
それでRyuJinのコード見ながら真似事で
#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif
を上に書いて
GLOBAL int a,b;
GLOBAL int piece[BLK_NUMBER * BLK_NUMBER]; //現在のブロックタイプを記憶
GLOBAL int random; //現在のブロックタイプ
GLOBAL int npiece[BLK_NUMBER * BLK_NUMBER]; //次のブロックタイプを記憶
GLOBAL int nrandom;
てな感じです。
ちなみに
GLOBAL int hitkeyframe = 0; //左右下に動かすための制御フレーム
GLOBAL int hitturnframe =0; //回転させるための制御フレーム
GLOBAL int count =0;
なんかではエラーが出ません。初期化してるのが違いなのかなーっとか思って
int a=0とかにしてみても変わりなかったです。
長くなってしまってすいません;
わかる人いたら教えて下さいm(_ _)m
コード出した方がいい場合はコードも出します。(プログラム初心者なんですごい汚いですが;)
670ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(931,028ポイント)
Date: 2008/12/24(水) 23:36
No:25990
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
=0
にしているので、エラーになります。
この書き方では宣言と同時に格納は出来ません。
GLOBAL が空白に置き換わっているときだけ、格納し、externの時は空白になるようにしないといけません。
・・しかし、宣言と同時に格納というのはあまりしない方がいいです。
初期化する時は、初期化関数を用意するなどして格納してあげて下さい。
そうしないと、ゲームのリセットボタンなどを押した時、
変数を全て初期化するということが難しくなるからです。
なお、グローバル変数は宣言すると同時に0が入るので、0を入れる必要はありません。
101ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(931,233ポイント)
Date: 2008/12/24(水) 23:39
No:25991
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
やろうと思えばこんな風に出来ます。
(例)
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#define GLOBAL_VAL(v) =(v)
#define GLOBAL_ARR2(a,b) ={a,b}
#else
#define GLOBAL extern
#define GLOBAL_VAL(v)
#define GLOBAL_ARR2(a,b)
#endif
GLOBAL int black GLOBAL_VAL(1);//1を格納
GLOBAL int color[2] GLOBAL_ARR2(2,3);//[0]に2,[1]に3を格納
こうすればGLOBALが空白の時、括弧内の値を格納し、externの時空白に出来ます。
205ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..プログラマー(26,416ポイント)
Date: 2008/12/24(水) 23:39
No:25992
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
CとC++を混ぜたりしていませんか?
そうであれば,
・CとC++を混ぜない
これが一番簡単な解決方法です。
つまり,全ての.cを.cppに置き換えてください。
# もちろん,C/C++の非互換によるエラーは起きるかもしれませんが。
C/C++
両方から使えることが前提なら (そもそもそういう時に外に出す大域変数があるかはともかく),
__cplusplusでextern "C"の使用の有無を切り分けることになります。
192ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(13ポイント)
Date: 2008/12/24(水) 23:43
No:25993
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
そもそもDirectXを使用するプログラムで.cを使うのはよっぽどの理由がない限り避けるべきです。
13ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..ぴよぴよ(917ポイント)
Date: 2008/12/25(木) 00:08
No:25994
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
後、GV.h 内で 「GLOBAL int 変数名 = 初期値;」は宜しくないです。
CV.h 内では変数の宣言だけをしてあげて、
どこかに関数を作ってその中で初期化した方が宜しいかと思います。
自分もサンプルを載せておきます。
[GV.h]
// ヘッダを二回読まないようにしています(インクルードガード)
#ifndef _GLOBALSET_
#ifndef GLOBAL
#define EXTRN extern
#else
#define EXTRN
#endif
// 変数を書く所
GLOBAL int random; // 現在のブロックタイプ
GLOBAL int nrandom;
・
・
・
// ここまでがインクルードガード
#else
#define _GLOBALSET_
#endif
[main.c か main.cpp]
#define GLOBAL
#include "GV.h"
void main(void)
{
〜〜〜
}
508ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(78ポイント)
Date: 2008/12/25(木) 00:17
No:25995
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
BEMANIさん
それはコンパイル確認・動作確認をしたのですか?
私には、とてもコンパイルが通りそうに無いように思えるのですが
65ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(265ポイント)
Date: 2008/12/25(木) 00:37
No:25996
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
具体的に「なぜか」を言わなければなりませんね、すみません・・・
#ifndef _GLOBALSET_
:
:
#else
#define _GLOBALSET_
#endif
インクルードガードになっていますか?C言語っぽく書くと
(もちろんはじめは x == FALSE という前提ですね)
if (!x)
{
// 処理
}
else
{
x = TRUE;
}
これではxがTRUEになりえませんね。
また、
GLOBAL int ... ;
のGLOBALはEXTRNの誤記でしょう。
さらに、「main.c か main.cpp」は「main.cpp」でしょう。
なぜそうなるかは分かりますよね。
187ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..ぴよぴよ(857ポイント)
Date: 2008/12/25(木) 00:52
No:25998
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
@@
今教えてもらったことを読みながら作業中です。
今返事できる範囲で .c は使っていません。
あと初期化をmain内に書き換えてみたんですけどやっぱり
1>main.obj : error LNK2001: 外部シンボル ""int count" (?count@@3HA)" は未解決です。
てな感じのエラーが出ます。今までグローバル内で初期化していたやつをすべて初期化しなくしたのですべてこれがでるようになりました。
きっとexternの範囲ですよね。がんばります;w;
後でちゃんと返事書きますー><
頑張ってきます
187ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..かけだし(1,010ポイント)
Date: 2008/12/25(木) 01:09
No:25999
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>>SCIさん
>GLOBAL int ... ;
>のGLOBALはEXTRNの誤記でしょう。
確かに、GLOBAL は EXTRNです。すいませんでした・・・。
一応ファイルを添付してみました。
93ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(77,129ポイント)
Date: 2008/12/25(木) 01:12
No:26001
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
そもそもGLOBALマクロの類は使うべきではありません。
グローバル変数を使うには細心の注意を払う必要があります。
にもかかわらず、グローバル変数を安易に使うのに便利なマクロを用意するのは根本的におかしいのです。
24ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(489ポイント)
Date: 2008/12/25(木) 01:23
No:26002
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
BEMANIさん
まぁ、そこだけではないのですが(笑)
添付ファイル見ましたが、根本的な勘違いがあるようなので補足しておきます。
まずインクルードガードについて。
#ifndef マクロ
#define マクロ
:
:
#endif
が定石でしょうね。先の例ですと、_GLOBALSET_は自分でdefineしない限り永久に定義されません。
実際に
#include "Global.h"
#include "Global.h"
としてみてください。
あとはたかぎさんの言うとおりで、グローバル変数を多用する場合は注意が必要です。
便利マクロを活用するのも(一貫していれば)いいですが、まずはグローバル変数を減らすことに努めるべきでしょう。
224ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(77,406ポイント)
Date: 2008/12/25(木) 01:33
No:26003
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
もう少し補足すると、C++でグローバル変数(より厳密には非局所オブジェクト)を使うと、初期化のタイミングの問題も絡んでくるので、非常に扱いが難しくなります。
コンストラクタからの例外に対しても、まったくの無防備になります。
お勧めの方法は、グローバル変数的に使いたいものをクラスにまとめて、関数経由でアクセスする方法です。
具体的には、
struct global_type
{
int a;
double b;
...
};
global_type& global()
{
static global_type g;
return g;
}
これでかなりの問題が解消されます。
あるいは、
boost::any& global(const std::string& name)
{
static std::map<std::string, boost::any> m;
return m[name];
}
でも、まるっきりのグローバル変数よりはずっとましです。
277ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..かけだし(1,104ポイント)
Date: 2008/12/25(木) 01:42
No:26004
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>>SCIさん
>>#include "Global.h"
>>#include "Global.h"
・・・とやってみました。
外部シンボル ""int ABC" (?ABC@@3HA)" は未解決です。 と表示されました。
80ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(523ポイント)
Date: 2008/12/25(木) 01:47
No:26005
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
BEMANIさん
それはなぜだか分かりますか?
マクロによって二重インクルード防止ができていればそのエラーは出ないはずです。
34ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..かけだし(1,277ポイント)
Date: 2008/12/25(木) 01:54
No:26008
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
皆さん、こんな短時間で多くのレス有難うございます><
なのですが解決できませんでしたorz
未解決という文字がトラウマになりそうです(((
今日はもう寝てまた明日頑張ります。一応GV.hだけ貼ってみるので、もしよかったら見てください。
グローバル変数を使用していること自体が問題なのか・・・、マクロが間違っているのか・・・orz
一応僕のスペックは今年大学に入って、後期から今までCを習った程度の知識しかないです;
すみません。。。一応ゲームプログラマー志望で個人的にゲーム作成を頑張っています。
>>Dixq (管理人) 様
こんな書き方もあるんですね!勉強になりました。
>>SCI 様
.cファイルは使ってないです。ですが、Cの知識しか持ってないのでclassとかは使ってないです。
>>BEMANI 様
ファイルまで容易してくれて本当に有難うございます><
マクロについてちょっとわかった気がします。
>>たかぎ 様
そうですよね;
しかし自分の実力ではなかなかグローバル変数を減らすのが大変だったので、これでも減らした方だったりますorz
まだC++についてほぼ無知なんですが、これを機会に勉強してみるのもいいかもしれませんね!
しかし、その前にやり始めたこのマクロで一回コンパイルを通したいですorz
420ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..ぴよぴよ(864ポイント)
Date: 2008/12/25(木) 02:10
No:26010
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
GV.hだけを見ると特に問題はなさそうですが・・・
もちろん、GV.hはプロジェクトのすべてのファイルから見えて(includeされて)いるんですよね?
だとしたら普通にアクセスできるはずですが・・・
インクルードガードをしていないみたいなので、「変数〜〜が未解決です」のほかに
「エラー:複数の宣言が見つかった」「エラー:重複宣言」「エラー:一つ前の定義位置」
とか、こんな感じのがあったら、多重インクルードの疑いアリです。
ファイル数が増えてくると思わず二回インクルードしてたってのはありそうですし。
あ、
>classとかは使ってないです。
DxLib(と、当然その向こうのDX8も)が内部でC++の構文をとっているので、
DxLib.hをインクルードしたソースファイルをCでコンパイルするとエラーが大量に出ると思います。
って意味です。今回は問題ないみたいなのでスルーで大丈夫です。
341ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..かけだし(1,277ポイント)
Date: 2008/12/25(木) 02:14
No:26011
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>>SCIさん
御丁寧にありがとうございます。
今まで使い回してきたものなので、何とも思ってなかったですが、
SCIさんの仰る通り、確かに自分で定義しなければ else 側に通らず、
また、インクルードガードできていませんでした・・・。
実際そのように見えていただけだった・・・ようです。
間違ってるのに気付かずそのまま行ってしまいそうでした。
SCIさん有難う御座います。
173ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(931,324ポイント)
Date: 2008/12/25(木) 03:02
No:26012
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
もしどうしてもおかしい所が発見出来なければ、
私の方に送っていただければこちらで確認しますよ。
→ dixqhp@gmail.com
プロジェクトに関連するファイルは〜.vcprojと〜.slnだけで結構です。
もし必要最低限のファイルがよくわからない時は、〜.ncbファイルと「Debug」もしくは「Release」フォルダを消して、プロジェクトのあるフォルダをごっそりzipか何かに圧縮して送って下さい。
92ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..かけだし(1,962ポイント)
Date: 2008/12/25(木) 03:11
No:26013
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>>SCI 様
>>>インクルードガードをしていないみたいなので
やってみたんですが、コンパイル通らなかったんで余計なことは後にしようと思いまして・・・
>>>もちろん、GV.hはプロジェクトのすべてのファイルから見えて(includeされて)いるんですよね?
一応今のところmainファイルしか作っていません。以前分割しようとしたときに多重定義で詰まったんで先にグローバル変数をどうにかしようっということで今に至ります。
なので今はmainファイルから
#include "GV.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
....
てな感じなのがあるだけです。(もちろん後々ファイル分割するつもりです。)
ちなみにエラーを全部書くと
1>リンクしています...
1>main.obj : error LNK2001: 外部シンボル ""int random" (?random@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int nrandom" (?nrandom@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int count" (?count@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int hitkeyframe" (?hitkeyframe@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int a" (?a@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int (* ColorDef)[3]" (?ColorDef@@3PAY02HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int (* fColor)[18]" (?fColor@@3PAY0BC@HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int (* field)[18]" (?field@@3PAY0BC@HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int b" (?b@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int hitturnframe" (?hitturnframe@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""struct tagPOINT location" (?location@@3UtagPOINT@@A)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * piece" (?piece@@3PAHA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int (* BlkDef)[9]" (?BlkDef@@3PAY08HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * npiece" (?npiece@@3PAHA)" は未解決です。
1>C:\Documents and Settings\natume\デスクトップ\サンプルプログラム実行用フォルダ\Release\DxLib_VC2005用.exe : fatal error LNK1120: 外部参照 14 が未解決です。
てな感じです。プロジェクト全体をアップしたほうがわかりやすそうならアップしますが、汚すぎて読めないかもですorz
685ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..かけだし(1,997ポイント)
Date: 2008/12/25(木) 03:15
No:26014
|
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>>Dixq (管理人)
是非お願いしたいです!かなりお手上げ状態なんで・・・orz
ファイル用意して送ります。
35ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..かけだし(2,317ポイント)
Date: 2008/12/25(木) 04:16
No:26016
| 解決!
|
Title: Re:ファイル分割時のヘッダ部分について
|
|
>> Dixq (管理人) 様
メールの方で丁寧に説明して頂き有難うございました!
ほんとにしょうもないミスですみません・・・。知らなかったので直し様がなかったのですが;
>>>最初はわからないことも多いと思うので、また何か解らなかったら遠慮なく聞いて下さい^^
本当に有難うございます><
一人でやってるとわからないことがでてくると何日間も止まっちゃうので助かります;
>>レスしてくれた皆様
夜遅くまで付き合って頂いて本当に有難うございました!
今回はミス以外にもマクロについて色々と学べてよかったと思います><
またこれを機会にグローバル部分だけでもクラスを使って見たいと思います。
本当に感謝しています。お礼できないのが心苦しいです;
有難うございました!
320ポイント を手に入れた。
|
|
|
|
Name: スライク ..ぴよぴよ(179ポイント)
Date: 2008/12/24(水) 20:42
No:25984
|
|
Title: 関数について
|
|
まだ始めた初心者なのですが、行き詰ってしまいました・・・・。
まわりに聞ける人がいないので力を貸してください。
90min=1h30m
を関数を使って表示させなさいと参考書には書いてあるんですが回答をプログラミングしてもエラーになって表示されません。
どうやったら表示させられるのか教えてください。
#include<stdio.h>
void mtoh(int a)
{
printf("%dmin = %dh%dm\n",a,(a\60),(a%60));
}
int main(void)
{
int a;
a=90;
mtoh(a);
return 0;
}
179ポイント を手に入れた。
|
|
|
|
Name: dic ..初心者(8,562ポイント)
Date: 2008/12/24(水) 21:13
No:25986
|
|
Title: Re:関数について
|
|
ibisさんがおっしゃっているのをソースにすると
以下のようになります
#include <stdio.h>
void mtoh(int a)
{
printf("%dmin = %dh%dm\n",a,(a/60),(a%60));
}
int _tmain(int argc, _TCHAR* argv[])
{
int a;
a=90;
mtoh(a);
a = 150;
mtoh(a);
return 0;
}
ですね
167ポイント を手に入れた。
|
|
|
|
Name: へたれ ..ぴよぴよ(550ポイント)
Date: 2008/12/24(水) 14:29
No:25974
|
|
Title: 無題
|
|
教えていただきたいのですが、
#define O 10000
といった感じにOに10000の容量をとるのは分かるのですが、
この確保できる容量は、各PCによって違うものなのでしょうか?それとも共通で決まっているものなのでしょうか?
72ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(46,214ポイント)
Date: 2008/12/24(水) 15:04
No:25976
|
|
Title: Re:無題
|
|
#define はマクロ定義文です。
簡単に言えば、
#define O 10000
の場合、 O を 10000 に置き換えてくれるものです。
#define N 10
int main(){
int i;
for(i=0;i<N;i++){ // N回繰り返す(この場合は10回)
printf("i = %d\n",i);
}
return 0;
}
主に固定値や簡単な共通処理などに使われます。
上記の例で、 10 を 100 に代えれば、 N は 100 に置き換わり、
100 回ループします。
本題ですが、その O が何を意味しているかで意味合いが変わります。
(固定値、最大数、など)
「容量」という単語から、何かの量を表すものでしょうか?
255ポイント を落としてしまった。
|
|
|
|
|
Name: lbfuvab ..中級者(11,711ポイント)
Date: 2008/12/24(水) 16:06
No:25978
|
|
Title: Re:無題
|
|
英語でdefineは「定義する」と言う意味がありますので、
#define A 1000
を「Aを1000と定義する」と考えるといいと思いますよ。
54ポイント を手に入れた。
|
|
|
|
|
Name: へたれ ..ぴよぴよ(757ポイント)
Date: 2008/12/24(水) 16:11
No:25979
|
|
Title: Re:無題
|
|
皆様、回答本当にありがとうございます。
まず質問の説明が不十分だったことを誤ります。
今回のdefineの使い方としてはDixg様の言うとおり大きな配列に当てようとし、困っていました。
staticをつけてグローバル変数にして解決することが出来ました。
ざこ様
サイトの紹介ありがとうございます。これから参考にしていきたいと思います。
御津凪様
丁寧な説明でありがとうございます。
Dixg様
説明不測の質問ですいませんでした。また回答ありがとうございました。
207ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(9,664ポイント)
Date: 2008/12/24(水) 13:28
No:25971
|
|
Title: プログラム
|
|
先日オセロのプログラムについてご質問させていただきました。
また1つ問題がでまして、ちょっと自分用に改善したので修正しましたので新しくスレッドをたてさせていただきました。
int COseroDlg::count(int stone)
{
int x,y;
int count = 0;
for(x=0;x<MASU_NUM;x++) //MASU_NUMはマス数で今回の場合8
for(x=0;y<MASU_NUM;y++)
if(m_Board[x][y]==stone)//m_Board[x][y]はマス目
count++;
return(count);
}
void COseroDlg::End()
{
int num1=0,num2=0;
if(countALL==4){ //countALLは打った回数
if(Frag)//Fragは黒か白のフラグを決めるBOOL変数。TRUEのときは黒、FALSEのときは白になってます。
num1=count(BLACK_STONE);
else
num2=count(WHITE_STONE);
if(num1>num2)
Messagebox("黒の勝ちです");
else if(num1<num2)
MessageBox("白の勝ちです");
else
MessageBox("引き分けです");
}
}
内容はテストの為打った回数を敢えて短くしてますが本来は8x8マスのオセロですから60回(countALL)打って石の多い方が勝者となるプログラムです。今回はその判定の仕方がまずいらしくうまくいきません。
num1に黒の個数をいれnum2に白の個数をいれ判別しています。
これを実行するとエラーはでませんが黒の方が多いはずなのに白の勝ちとでたり、引き分けなはずなのに白の勝ちとでたりします。それでデバッグで変数の中覗いてみるとnum1は正確ですがnum2は0になっていることがわかりました。
交互に黒と白を打ち、ひっくり返すという作業はちゃんとできてますので上の2つの関数のどっかで間違ってる
と思います。教えて下さい。
423ポイント を手に入れた。
|
|
|
|
Name: YuO ..プログラマー(26,224ポイント)
Date: 2008/12/24(水) 13:32
No:25972
|
|
Title: Re:プログラム
|
|
num1とnum2の片方しかcount関数が呼ばれていません。
結果,Frag (flagのtypo?) に選ばれた方だけがカウントされ,そちらの勝利となっています。
if (Frag)とそれに付随するelseを削除して, num1=count(BLACK_STONE);
num2=count(WHITE_STONE); としてしまえばよいのではないでしょうか。
76ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(9,730ポイント)
Date: 2008/12/24(水) 13:57
No:25973
| 解決!
|
Title: Re:プログラム
|
|
成る程、ちゃんとなりました。ずっとわからなかったです。ありがとうございました。
2倍のポイントを手に入れた! 66ポイント を手に入れた。
|
|
|
|
Name: 紫苑 ..ぴよぴよ(32ポイント)
Date: 2008/12/21(日) 17:54
No:25892
|
|
Title: リンカについて?
|
|
Cについて勉強し始めた ド 初心者です。
リンカってなんですが?
まったくわからなくて。。。
詰まってます・・。
どんなものか簡単におねがいしますm(. . )m
32ポイント を手に入れた。
|
|
|
|
Name: たいちう ..上級者(17,794ポイント)
Date: 2008/12/21(日) 20:37
No:25902
|
|
Title: Re:リンカについて?
|
|
"リンカ"でググればいろいろ見つかるでしょう。
http://e-words.jp/w/E383AAE383B3E382AB.html
簡単に書くと、、、
C言語のプログラムから、マシン語のプログラムの断片を作るのがコンパイラ。
作業の名前はコンパイル。
他の断片やライブラリと組み合わせて、実行ファイルを作るのがリンカ。
作業の名前はリンク。
文脈によっては、リンクがコンパイルに含まれることもあります。
「プログラムをコンパイルして実行ファイルを作る」とか。
あと、dicさんのお薦めのK&Rは、良い本だとは思いますが、
かなり気合の入った初心者向けだと思います。
一般の初心者さんにとっては、もっと易しめの本の後の方が良いのではないかと。
218ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(11,578ポイント)
Date: 2008/12/21(日) 22:31
No:25908
|
|
Title: Re:リンカについて?
|
|
ソースをそのまま機械語に直したのがオブジェクトファイル(*.obj)で
それらのオブジェクトファイルとライブラリを合体させて実行ファイル(*.exe)にするのがリンカです。
・・・・と私は理解しています。
71ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(18,071ポイント)
Date: 2008/12/21(日) 22:35
No:25909
|
|
Title: Re:リンカについて?
|
|
こんばんは。
C言語の勉強を始めて3ヶ月弱という初心者です。(汗
・プログラムを実行するまでの過程
ソースファイルの作成→コンパイル→リンク→実行
ソースファイル→コンパイラ→オブジェクトファイル
オブジェクトファイル
+ (←リンカ) → 実行可能ファイル
ライブラリ
実行可能ファイル→デバッガ→プログラム
ソースファイル:自分で作るプログラムファイル。
ライブラリ:予め用意されているプログラムファイル。
オブジェクトファイル:ソースファイルをコンパイルしたファイル。
コンパイル:人間語を機械語に変換する作業。変換するツールは、コンパイラ。
リンク:オブジェクトファイルとライブラリを結合する作業。結合するツールは、リンカ。
デバッガ:実行可能ファイルを実行させて、正しく動作するかを確認するツール。
http://www.bk1.jp/product/02916069?partnerid=02goo03
↑
この本に、こんな感じで解説されてます。
宣伝するつもりは無いです。(笑
私はこの本で、実行ファイルができる仕組みを知りました。
(修正 lbfuvabさんと、書き込みかぶってしまいました。申し訳御座いません。<謝)
310ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(18,158ポイント)
Date: 2008/12/22(月) 12:52
No:25933
|
|
Title: Re:リンカについて?
|
|
失礼しました。
たかぎさんのサイトでもC言語の勉強できるのですね?
覗いて見ました。知らなかったのです。
ぜひ、そちらでも勉強させて頂きます。
76ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(77,035ポイント)
Date: 2008/12/22(月) 17:42
No:25942
|
|
Title: Re:リンカについて?
|
|
> たかぎさんのサイトでもC言語の勉強できるのですね?
もしかして有料コンテンツだと思ってました?
さすがにそんな"せこい"ことはしません。
一応営利事業なので、アフィリエイト広告だけは貼っています。
気に入った方は、投げ銭だと思って協力してもらえると嬉しいですが、何ら強制しませんし、懇願するものでもありません。
103ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(18,229ポイント)
Date: 2008/12/22(月) 18:05
No:25944
|
|
Title: Re:リンカについて?
|
|
はい。思ってました。^^;
すみません。でも、せこいとは思ってませんので。(笑
今の私の知識では正直、難しいですが
もう少し勉強を進めて、たかぎさんのサイトで勉強できたらと思います。
その節は宜しくお願いします。
失礼しました。(謝
71ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(77,105ポイント)
Date: 2008/12/22(月) 18:40
No:25947
|
|
Title: Re:リンカについて?
|
|
> 今の私の知識では正直、難しいですが
確かにちょっと難しい内容が多くなっています。
入門者レベルの内容というのは他のサイトでもいろいろありますので、それ以外となると、どうしてもマニアックな内容になってしまいます。
いまさらポインタがどうとかいうサイトをもう一つ作っても仕方がありませんので。
70ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(92ポイント)
Date: 2008/12/22(月) 20:34
No:25952
| 解決!
|
Title: Re:リンカについて?
|
|
いろいろなことありがとうございます。
これから頑張ります。
ホントに詳しく教えてもらって心から感謝です!
60ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(231ポイント)
Date: 2008/12/24(水) 09:12
No:25964
|
|
Title: Re:リンカについて?
|
|
もう一ついいですか?
さきほどはほんとありがとうですm(. . )m
コンパイラについいてです。
コンパイラをダウンロードしようとしてるんですが。。。
C言語のコンパイラが欲しいのに。。。
C++のコンパイラばっかりで。。。
どうしたらいいんですか?
できればフリーのソフトがいいんでが。
言い過ぎですかね。。
139ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(35,548ポイント)
Date: 2008/12/24(水) 09:18
No:25965
|
|
Title: Re:リンカについて?
|
|
現在一般に広まっているC言語(C90)コンパイラでいいのであれば、C++は互換性がありますのでソースファイルの拡張子を.cとすればCでコンパイルできますよ。
54ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(252ポイント)
Date: 2008/12/24(水) 09:22
No:25966
|
|
Title: Re:リンカについて?
|
|
C90。。。
一般に広まってるかわからないんですが。。
いっかいやってみます^^
ダメもとですし 笑
21ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(362ポイント)
Date: 2008/12/24(水) 09:28
No:25967
|
|
Title: Re:リンカについて?
|
|
あ。もう一つだけ。。 ←「だけ」になるかわからないですが 笑
みなさんわどんなコンパイラとリンカを使ってるんですか?
2倍のポイントを手に入れた! 110ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(35,708ポイント)
Date: 2008/12/24(水) 09:48
No:25968
|
|
Title: Re:リンカについて?
|
|
私は用途に合わせていっぱい使ってます(^^;
・BCC 5.5 ちょっとしたコンソールアプリ作る用
・VC++2008EE DXライブラリでゲーム作る用
・CBC6.0 Windowsなツールなんか作る用
・HEW 仕事用
・GCC 仕事用
初めてであればVC++2008EEがいいと思いますよ。
ダウンロードもインストールもそんなに手間じゃないですし、ググればいろいろ情報がありますし。
160ポイント を手に入れた。
|
|
|
|
|
Name: 紫苑 ..ぴよぴよ(418ポイント)
Date: 2008/12/24(水) 11:04
No:25970
| 解決!
|
Title: Re:リンカについて?
|
|
教えてくれてありがとうございます^^
じゃぁ、VC++2008EEをダウンロードします。
本当にありがとうございましたm(. . )m
56ポイント を手に入れた。
|
|
|
|
Name: dic ..初心者(7,897ポイント)
Date: 2008/12/22(月) 18:00
No:25943
|
|
Title: シューティングにおける敵の動きについての雑談
|
|
また、失礼します
今回は雑談なのですが
一通り動くだけのシューティングゲームはできたのですが、
敵の動きがぎこちなくて
市販されているような、プレイヤーめがけて動いて、微妙に複雑な動きをして
上に帰るような、複雑な動きの実装方法について雑談したく思いました。
現在私の動く元となるエンジンの変数は速度v、角度angle、加速度a、時間t、で
構成されていますが、直線、円を描くぐらいしか動きがあまり実装できません、
昔から探しているのですが、ニューラルネットワークで組めば簡単と言われたのですが
ニューラルネットワークは私には難しすぎで
これに似た動きを実現する方法などないでしょうか?
私が考えているものは指定された位置に指定した数で移動する
自動制御システムですが、ちょっと数学の方がおいつかず
どのようにして、おもしろい、もしくはリアルな動きを実現するのでしょうか?
273ポイント を手に入れた。
|
|
|
|
Name: array [URL] ..熟練のプログラマー(42,339ポイント)
Date: 2008/12/22(月) 19:23
No:25948
|
|
Title: Re:雑談
|
|
> 現在私の動く元となるエンジンの変数は速度v、角度angle、加速度a、時間t、で
> 構成されていますが、直線、円を描くぐらいしか動きがあまり実装できません、
これだけの変数があれば、大抵の動きは実現できると思うのですが、あまりにも複雑だと無理なんですかね^^;
私には市販されてるような、プレイヤーめがけて動いてってのが想像できないのですが
複雑な動きをして、上に帰るような・・・
だったら龍神録の館でも、ウロチョロして上に帰るサンプルがあったと思いますよ〜
ニューラルネットワークと聞くと私にも難しすぎて一歩引いてしまいますが、プレーヤーの位置に柔軟に
対応して、敵も(考えてる様に)動くイメージなんですかねw
まぁしかし、dicさんが敵の動きのどんな部分にぎこちなさを感じてるのか知りたいです。
180ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(930,456ポイント)
Date: 2008/12/22(月) 19:36
No:25951
|
|
Title: Re:雑談
|
|
私はニューラルネットワークと聞くと人工知能の分野で問題に対する最適解を導き出すようなイメージしか沸きません・・。
敵の軌道にも使えるんですかね?
--
私もそれだけ変数があれば大抵の動きは出きると思いますよ。
館のコードでよければ「こんな動き」と詳しく教えてもらったらサンプル作ってみます。
その敵の動きが見れるプレイ動画とかありませんかね?
なければペイントとかで書いてもらってもいいですけど。
よほど難解な動きじゃなかったら簡単な計算式の組み合わせで実現出来ると思います。
22ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(290,877ポイント)
Date: 2008/12/22(月) 21:57
No:25953
|
|
Title: Re:雑談
|
|
>プレイヤーめがけて動いて、微妙に複雑な動きをして
>上に帰るような、複雑な動きの実装方法
「微妙に複雑な動き」というのがよくわかりませんが、
これくらいなら出現時にその時点でのプレイヤーの位置を元に、
移動パスを設定してあげれば、さっくりと出来そうです。
通過させたい座標を決めて、あとは線形補完するなりスプライン補完するなりする、と。
或いは、ホーミングアルゴリズムを流用した、仮想ターゲット方式でもいいですね。
仮想ターゲットとは表示はされない、プログラム内部だけの目標オブジェクトで、
敵はその仮想ターゲットをただひたすら追いかけるように動かします。
で、仮想ターゲットは最初プレイヤーの付近に配置しておいて、敵が近づいたら
上の方に逃げていくように設定すれば、敵はそれを追っていくので概ね望み通りの
動きになります。
その際、ホーミングするからといって常にプレイヤーの方を向き進むのではなく、
1回あたりの回転量をある程度制限して、緩やかに追従をさせると良い感じになるかと。
その制限の度合いと仮想ターゲットの動き次第で、面白い動きをさせることが
できるはずです。
>私が考えているものは指定された位置に指定した数で移動する
>自動制御システムですがちょっと数学の方がおいつかず
単純に横に並べて移動するだけなら簡単そうですが、
数学的に問題があるというとどういう状況なのでしょうか?
集団制御的なものでしょうか?
編隊にリーダがいて、そのリーダの飛行ルートをなぞるように
且つ各々がぶつからないようにフロッキングしながら飛ぶ、みたいな。
余談
>ニューラルネットワーク
私も詳しくはないのですが、シューティングゲーム等の AIとして
ニューラルネットワークを使うというのは最近ちらほら聞きますね。
といっても実験段階のものがほとんどですが。
ニューラルネットワークは何でも勝手に学習してくれる夢の技術ではないですし、
デバッグもし辛くある意味運も必要で、ゲームとして調整して形にするまでに結構な時間が
かかるので、誰もが簡単に使えるほど実用段階にはなっていないようです。
276ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,162ポイント)
Date: 2008/12/23(火) 10:21
No:25955
|
|
Title: Re:雑談
|
|
そうですねぇ
やはりみなさん良い学校を出られてるんですね
私は専門ですが、金払えば誰でも入れる学校だったんで
しかもろくに勉強もしてこなかったので
今、しっぺ返しをくらってますよ
複雑な動きというのが伝わらないのでYouTubeに上げました
http://jp.youtube.com/watch?v=UiTepP87hk4
ニコニコが推薦のようですが、なぜか私ははじかれるので・・・(謎
たしかに速度、角度、加速度、時間だけでもちょっとした動きはできるのですが
ソースコードの量は半端なく増えるのでどうしたものかと
考えているところです
265ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(42,575ポイント)
Date: 2008/12/23(火) 16:05
No:25956
|
|
Title: Re:雑談
|
|
確かに敵の出現数を多くすると、複雑になり、イメージ通り動きを管理するのも面倒になってきますね〜
動画を見た感じ、敵の動きはそんなに複雑ではないんじゃないでしょうか
もしかしたら、艦隊(?)としてグループごとに制御してるのかもしれませんが
個人的には、面倒だと思うので出現位置をずらしてるだけに見えます。
あとは、動きですが、動きなんかも管理人さんが解説して下さってる、シューティングの館の敵の動きを
組み合わせるだけでも、大丈夫そうです。
http://dixq.net/s/
236ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,356ポイント)
Date: 2008/12/23(火) 16:18
No:25957
|
|
Title: Re:雑談
|
|
なるほど、リンク先参考になりました
一応補足ですが艦隊としては管理してません
常に一匹一匹で管理してます
ただ単に出現する数を8体で数フレームずつずらして出現させているだけで
そのように映ったのかもしれません
しかし、case文に100間隔で管理されているところを見ると
N88-BASICを思い出させます
敵の動きにこるよりも
敵の弾のだし方にこった方がいいかもしれませんね
194ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(930,460ポイント)
Date: 2008/12/23(火) 18:02
No:25958
|
|
Title: Re:雑談
|
|
全く難しくないと思いますよ。
右に進むだけの奴は、
.角度 = 0;
.速さ = 1;
とやれば速さ1で右に進みますし、
200カウントで回転する動きは
.角度 = 円周率*2 / 200 * カウンタ;
でokです。
youtubeの動画を見ながら動きを再現してみました。
http://dixq.net/zip/bbs/project_dic.zip
龍神録プログラミングの館のコードで作りました。「dic章」にある、プロジェクトを開き、実行してみて下さい。
内容は50章のプログラムです。変更した箇所には全て「dicさん用変更箇所」のように書いておきましたので、
Ctrl + Fで対象を「現在のプロジェクト」にし、検索ワード「dicさん」で検索していけば、どこを変えたかわかります。
敵の動きは
enemy_act_pattern.cpp
にある関数を追加していくだけです。
敵に行動させたい行動パターンはエクセルで指定します。
dat\csv\dic\にあるエクセルファイルも確認しておいて下さい。ここに書かれたとおりに敵が出現します。
館の基本的なコードについての説明はここでは割合します。
何かわからないことがあれば聞いて下さい
4ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,395ポイント)
Date: 2008/12/24(水) 07:20
No:25963
| 解決!
|
Title: Re:雑談
|
|
おお、なんとシンプルな!
管理人さんサンプルありがとうございます
キリがないんで解決押しときます
39ポイント を手に入れた。
|
|
|
|
Name: くろ丸 ..ぴよぴよ(466ポイント)
Date: 2008/12/22(月) 18:05
No:25945
|
|
Title: 判別プログラムについて
|
|
標準入力で打ち込んだ文字列から識別子を判別して出力するプログラムを作りました。
このプログラムでは、 ( ) ; = といった4種類のトークンも判別することが可能なのですが、実行してもこれらのトークンを判別してくれません。なぜ実行されないのでしょうか。教えてください。
ちなみに、普通の文字列ではきちんと実行できます。
#include <stdio.h>
#include <ctype.h>
/* 識別子を構成する一文字目か? */
int isIdentFirstChar(int c)
{
return isalpha(c) || c == '_';
}
/* 識別子を構成する文字か? */
int isIdentChar(int c)
{
return isalpha(c) || isdigit(c) || c == '_';
}
/* 数値を構成する一文字目か? */
int isIntFirstChar(int c)
{
return isdigit(c);
}
/* 数値を構成する文字か? */
int isIntChar(int c)
{
return isdigit(c) || c == '_';
}
/*
識別子に属さない最初の文字へのポインタを返す
※ 一文字目は識別子の文字であることは仮定している
*/
char *getIdent(char *input)
{
while (isIdentChar(*++input)) /* empty */;
return input;
}
/*
数値文字列に属さない最初の文字へのポインタを返す
※ 一文字目は数値を構成する文字であることは仮定している
*/
char *getInt(char *input, int *pv)
{
int c;
*pv = isdigit(c = *input) ? c - '0' : 0;
while (isIntChar(c = *++input)) if (isdigit(c)) *pv = 10 * *pv + c - '0';
return input;
}
/* 空白類をスキップ(ただし、改行で止まる) */
char *skipSpaces(char *s)
{
while (isspace(*s) && *s != '\n') ++s;
return s;
}
int lex(char *input)
{
int num_of_tokens = 0;
while (*(input = skipSpaces(input))) {
char *endp;
int c, v;
if (isIdentFirstChar(*input)) {
c = *(endp = getIdent(input));
*endp = '\0';
printf("識別子: %s (%d文字)\n", input, (int)(endp - input));
*(input = endp) = c;
} else if (isIntFirstChar(*input)) {
endp = getInt(input, &v);
printf("整数定数: %d (%d文字)\n", v, (int)(endp - input));
input = endp;
} else {
switch (c = *input++) {
case '+': case '-': case '*': case '/':
printf ("演算子:%c\n", c);
break;
case '(': case ')': case ';': case '=':
printf ("区切子:%c\n", c);
break;
default:
if (c == '\n') printf("改行\n");
else printf("エラー:%cは不正な文字\n", c);
continue;
}
}
++num_of_tokens;
}
return num_of_tokens;
}
int main(int argc, char* argv[])
{
if (argc != 2) {
fprintf(stderr, "使いかた: %s '一行のテキスト'\n", argv[0]);
return 1;
}
printf("トークン数は%d個!\n", lex(argv[1]));
return 0;
}
(実行結果)
$./conp abc
$識別子:abc(3文字)
$トークン数は1個
$./conp abc(12)
$bash: syntax error near unexpected token'('
$
466ポイント を手に入れた。
|
|
|
|
Name: くろ丸 ..かけだし(1,309ポイント)
Date: 2008/12/22(月) 18:32
No:25946
|
|
Title: Re:判別プログラムについて
|
|
タグを付け忘れました。申し訳ございません。
また、使用しているOSはLunixです。よろしくお願いいたします。
#include<stdio.h>
#include<ctype.h>
//識別子を構成する一文字目か判断
int isIdentFirstChar(int c)
{
return isalpha(c) || c == '_';
}
//識別子を構成する文字か判断
int isIdent Char(int c)
{
return isalpha(c) || isdigit(c) || c == '_';
}
//数値を構成する一文字目か判断
int isIntFirstChar(int c)
{
return isdigit(c);
}
//数値を構成する文字か判断
int isIntChar(int c)
{
return isdigit(c) || c == '_';
}
//識別子に属さない最初の文字へのポインタを返す
char *getIdent(char *input)
{
while(isIdentChar(*++input));
return input;
}
//数値文字に属さない最初の文字へのポインタを返す
char *getInt(char *input, int *pv)
{
int c;
*pv = isdigit(c = *input) ? c - '0' : 0;
while(isIntChar(c = *++input))if(isdigit(c))*pv = 10 **pv + c - '0';
return input;
}
//空白を読み飛ばす
char *skipSpaces(char *s)
{
while(isspace(*s)&& *s != '\n')++s;
return s;
}
int lex(char *input)
{
int num_of_tokens = 0;
while(*(input = skipSpaces(input))){
char *endp;
int c,v;
if(isIdentFirstChar(*input)){
c=*(endp = getIdent(input));
*endp = '\0';
printf("識別子:%s(%d文字)\n",input,(int)(endp - input));
*(input = endp) = c;
}else if(isIntFirstChar(*input)){
endp = getInt(input,&v);
printf("整数:%d(%d文字)\n",v,(int)(endp - input));
input = endp;
}else{
switch(c = *input++){
case '+':case'-':case'*':case'/':
printf("演算子:%c\n",c);
break;
case'(':case')':case';':case'=':
printf("区切子:%c\n",c);
break;
default:
if(c == '\n')printf("改行\n");
else printf("エラー:%cは不正\n",c);
continue;
}
}
++num_of_tokens;
}
return num_of_tokens;
}
int main(int argc, char *argv[])
{
if(argc != 2){
fprintf(stderr,"使い方:%s '一行のテキストを入力'\n",argv[0]);
return 1;
}
printf("トークンは%d個\n",lex(argv[1]));
return 0;
}
843ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(24,783ポイント)
Date: 2008/12/23(火) 19:54
No:25959
|
|
Title: Re:判別プログラムについて
|
|
マルチポストかどうかはともかく、
>このプログラムでは、 ( ) ; = といった4種類のトークンも判別することが可能なのですが、
>実行してもこれらのトークンを判別してくれません。なぜ実行されないのでしょうか。教えてください。
どうなれば、期待通りの結果なのでしょうか?
試した結果は
(2+3)*4=100/5;TEST を入力した場合
区切子:(
整数:2(1文字)
演算子:+
整数:3(1文字)
区切子:)
演算子:*
整数:4(1文字)
区切子:=
整数:100(3文字)
演算子:/
整数:5(1文字)
区切子:;
識別子:TEST(4文字)
トークンは13個
で、期待通りだと思うのですが。どういうこと?
178ポイント を手に入れた。
|
|
|
|
Name: nayo ..入門者(3,713ポイント)
Date: 2008/12/22(月) 03:12
No:25924
|
|
Title: クラスの相互参照
|
|
現在C++でクラスの練習にゲームを作っているのですがつまづいてしまいました
というのも
クラスAがクラスBのメンバを参照したい
クラスBがクラスAのメンバを参照したい
という状況なのですが試しに両方のヘッダにお互い相手側のヘッダをインクルードしたところ
無限にインクルードし続けたのかインクルードファイルが多すぎますと怒られてしまいました
相互参照、循環参照というらしいのですが
色々調べてもはっきりとした答えが得られず悩んでいるところです
年末の忙しい時期ですがどなたかご回答お願いします
開発環境は Visual C++ 2008 Express Edition です
181ポイント を手に入れた。
|
|
|
|
Name: dic ..初心者(7,624ポイント)
Date: 2008/12/22(月) 07:19
No:25929
|
|
Title: Re:クラスの相互参照
|
|
マクロで何重にもインクルードされない方法もあります
// ---
// a.h
#ifndef A_H_
#define A_H_
ここにクラスを宣言
#endif
//----
// b.h
#ifndef B_H_
#define B_H_
ここにクラスを宣言
#endif
110ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(138,233ポイント)
Date: 2008/12/22(月) 08:36
No:25931
|
|
Title: Re:クラスの相互参照
|
|
たしか、クラスのプロトタイプ宣言みたいなのができるんじゃなかったでしたっけ?
class B;
class A
{
};
こんな感じでいけたような気がするんだけど…?
18ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..入門者(3,748ポイント)
Date: 2008/12/22(月) 19:32
No:25949
|
|
Title: Re:クラスの相互参照
|
|
皆様ありがとうございます
元々dicさんの方法で作っていたのですが
#include "○○"
を#ifndefの外側に記述していたために無限にインクルードされていたようです
こちらは内側に記述する事で解決しました
そこで問題の部分を解決すべく先行宣言や不完全型を調べてみたのですが
バグさんの紹介してくれたようなものが載っていました
しかし色々と制限があるらしく実際にclass A{};の前にclass B;と記述したところ
>静的でないメンバ関数の呼び出しが正しくありません
といったエラーが出てしまいました
まだクラスについて初心者なのでそもそもこのような相互参照するようなクラス設計に問題がありそうです
もう少し設計を考えてみます
35ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..入門者(3,877ポイント)
Date: 2008/12/22(月) 23:24
No:25954
| 解決!
|
Title: Re:クラスの相互参照
|
|
もう一度見直しているうちにAのクラスは別にBのクラスを参照する必要性はないと分かりました
そこでBクラスにAの特定関数をフレンドで宣言したところ無事自分の行いたいことができました
まだ色々と不慣れなので少しずつオブジェクト指向プログラミングの考え方に慣れていこうと思います
129ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(9,239ポイント)
Date: 2008/12/22(月) 14:34
No:25935
|
|
Title: AI
|
|
先日五目並べを作成しているということでご質問させていただき簡素ですができました。
これにAI?というのでしょうか、自動で自分が打った後コンピューターが打つという機能をつけたいのですが
難しいと聞きます。どのような手順で組まれるプログラムなのでしょうか?さっぱり検討がつきません。
わかりやすいサイトもあれば教えてください。
140ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(35,494ポイント)
Date: 2008/12/22(月) 14:47
No:25936
|
|
Title: Re:AI
|
|
ミニマックス(MinMax)法もしくはNegaMax法でググるといろいろHITします。
多くはオセロについてですが、五目並べでも局面評価を考慮するだけなので応用可能です。
とりあえず調べてみてわからないところがあればまた質問してください。
80ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..初心者(7,701ポイント)
Date: 2008/12/22(月) 15:06
No:25938
|
|
Title: Re:AI
|
|
α-β法でも引っかかりましたよ。
余力があればこちらもググってみてください。
ちなみに思考アルゴリズムとソースコードを
見付けましたので、よかった参考程度に。
思考アルゴリズム
ttp://www.sm.rim.or.jp/~shishido/gomokuprog.html
ソースコード
ttp://www.sm.rim.or.jp/~shishido/src/gomoku.txt
73ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(930,434ポイント)
Date: 2008/12/22(月) 15:10
No:25939
|
|
Title: Re:AI
|
|
試行錯誤してみる→既存の方法を試してみる
という方法も良いかと思います。
あくまで個人的なやり方ですが、私ならまず自分で出来る限り試行錯誤しながら実装してみます。
というのも、プログラムは自分で考えて実装することこそ面白みを感じる事が出来ると思いますし、
もしかしたら試行錯誤しているうちに、現在もっとも効率よいと言われている方法と同じ方法が考え出せるかもしれません。
自分で考え出したものは何年たっても忘れませんし、すごく自分の力となります。
試行錯誤した後で、既存の方法について勉強し、更に知識アップを図れば更に成長出来るのでは無いかと思います。
私は、HPでもプレイ動画紹介しているぷよ○よもどきゲーム作成中、コンピュータvsコンピュータの戦いが初めてまともに出来た時、
嬉しくて1時間位ひたすら眺めていました。
こういう「喜び」を感じながら学んでいく事も、勉強に大事な事じゃないかなと思います。
五目並べのAIは試行錯誤ではなかなか難しいかもしれませんが、
もし時間があれば、もう少し簡単なAIの実装にトライしてみるのもいいかもしれません。
ちなみに私が初めて作ったゲームのAIはノットワンハンドレットならぬノット17でした。
(1から互いに1つ〜3つまでカウントアップ出来、17を言った人が負けという奴です。)
330ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(9,241ポイント)
Date: 2008/12/22(月) 15:17
No:25940
|
|
Title: Re:AI
|
|
アドバイスありがとうございます。ただ今回はアルゴリズムすら理解できていなかったのもありますので
まずそこからですね。
31ポイント を落としてしまった。
|
|
|
|
Name: 猿 ..かけだし(1,151ポイント)
Date: 2008/12/22(月) 02:11
No:25918
|
|
Title: 無題
|
|
どなたかプログラムの得意な人におねがいします
どんな仕様でもいいのでVC++2008&DXライブラリを使ってサッカーげーむを作ってみてください
簡単なものでいいのでソースコードもお願いします。
83ポイント を落としてしまった。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(929,802ポイント)
Date: 2008/12/22(月) 03:05
No:25921
|
|
Title: Re:無題
|
|
目的が何かわからないですが、人に作ってもらったのでは力も付かず、面白くも無いと思います。
「いや卒業制作や課題だから別に力も付かなくていいし、面白くもなくていいんだ」という場合もあるでしょうが、
それなら余計に自分の力でやるべきことですよね。
今、プログラムは難しいものだと、自分にはわからないものだと、思ってしまっているのかもしれません。
確かに難しいものですが、解るところから少しずつやっていけば、必ずわかりますし、ゲームを作る楽しさも解ると思います。
先日のトピを拝見すると、DXライブラリを勉強されているようですね。
DXライブラリの基本はおわかりでしょうか?
もし基本的なことがわかっていないなら、ゲームプログラミングの館をご覧になるか、
もしC言語のもっと基本的なことからわからないなら「C言語 入門」で出てくるサイトを参考にしながらまず学んでみるか、
ある程度わかっているのならサンプルプログラミングの館などを参考にするか、
または自分で少しずつゲームを作ってみてはどうでしょう。
今どこで詰まっていらっしゃるのかわからないので適確なアドバイスが難しいですが、
どのような段階にいらっしゃったとしても、解るところから少しずつやっていけばプログラミングの楽しさは解ると思います。
時間が無いなら、サンプルプログラミングの館にあるコードを引用してもらっても構いませんし、
解るところから少しずつやってみませんか?
まず、今どの辺がわからず困っていらっしゃいますか?
427ポイント を落としてしまった。
|
|
|
|
|
Name: s-rush ..初心者(7,628ポイント)
Date: 2008/12/22(月) 12:41
No:25932
|
|
Title: Re:無題
|
|
私も今ゲームを作っていますが、やっぱり自分でプログラムを書かないことには
始まらないと思います。
自分で作っていると必ずと言ってもいいほど、分からないことが出てくると思います。
実際私も分からないことだらけで四苦八苦してます^^;
ですが、分からないことを自分で調べたり、分かる人に教わるなどして、
力がついていくものだと思ってます。
最初から誰かに作ってもらう他力本願ではなく、まずは御自分で作ってみてはどうですか?
158ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(21,000ポイント)
Date: 2008/12/22(月) 14:29
No:25934
|
|
Title: Re:
|
|
私は今VC++勉強中なので作れませんし、勉強のため作っても配布する気はありませんが、
管理人さんのじゃんけんゲームを応用して、PK戦という設定で簡単なゲームを
作ってはいかがでしょう?
もし、ちゃんとしたサッカーゲームが作りたいのであれば、
勉強するか、もしくはlbfuvabさんのおっしゃるとおり、依頼しましょう。
142ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(930,104ポイント)
Date: 2008/12/22(月) 03:12
No:25923
|
|
Title: Re:ファイルの数値との演算
|
|
ファイルからとってきた数値であれ、キーボードからとってきた数値であれ、予め変数に格納しておいた数値であれ、
演算の仕方は同じです。
今、どのような状態で困っていらっしゃるかもっと詳しく書いていただければより適確なアドバイスが出来るかもしれません。
ファイルから読み込んだデータで、すぐには計算できなさそうな状況と言うと・・・。
文字列にデータが入っているような状態でしょうか?
もし文字列にはいっているデータを数値データに変換するなら、
atoi関数やatof関数を使います。
文字コードについて理解していれば、この関数は簡単に作れるので、もし余力があれば実装してみて下さい。
以下、そのサンプルです。
#include <stdio.h>
#include <stdlib.h>
int main(void){
char *str = "100";
int num;
num = atoi(str);
num += 100;
printf( "%d\n", num );
return 0;
}
もともと100は文字列だったデータですが、int型に変換したことで、さらに100を足して200と表示出来ます。
302ポイント を手に入れた。
|
|
|
|
|