C言語何でも質問掲示板


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

規約と使い方

 
   タスク処理を使ったら ....   
     ・[11648] Justy 
     ・[11649] りょうちん 
   CPU使用率の削減   
     ・[11639] バグ 
     ・[11647] ibis 
   画像が...   
     ・[11637] 雷 
   リテラルを使わないで ....   
     ・[11615] Justy 
     ・[11621] てつ 
     ・[11622] GPGA 
     ・[11623] YuO 
     ・[11624] てつ 
     ・[11625] てつ 
     ・[11626] てつ 
     ・[11627] GPGA 
     ・[11629] てつ 
     ・[11632] ま〜く 
     ・[11633] てつ 
   ゲームプログラミングの ....   
     ・[11618] 管理人 
     ・[11630] 銀猫 
   タスク処理の記述につ ....   
     ・[11616] Justy 
     ・[11619] りょうちん 
   無題   
     ・[11603] うさぎ 
     ・[11604] うさぎ 
     ・[11605] うさぎ 
     ・[11610] box 
   またまた質問です。。 ....   
     ・[11599] box 
     ・[11600] y 
     ・[11601] y 
     ・[11606] たかぎ 
     ・[11608] y 
   エラーの解決方法を教 ....   
     ・[11595] box 
     ・[11597] りょうちん 
   DxLibを継承したいので ....   
     ・[11592] tkmakwins15 
     ・[11593] りょうちん 
     ・[11596] tkmakwins15 
   数値に対応した描画に ....   
     ・[11590] バグ 
   BM法   
     ・[11584] 雷 
     ・[11585] 大工 
   簡単な閾値処理   
     ・[11541] けるびん 
     ・[11543] 雷 
     ・[11545] 雷 
     ・[11547] 雷 
     ・[11548] miyaza 
     ・[11549] 雷 
     ・[11551] けるびん 
     ・[11552] miyaza 
     ・[11553] フリオ 
     ・[11554] けるびん 
     ・[11555] けるびん 
     ・[11556] 雷 
     ・[11582] けるびん 
   無題   
     ・[11572] 管理人 
     ・[11573] りょうちん 
   プログラムの追加につ ....   
     ・[11528] 管理人 
     ・[11567] 見習い 
   CSVのファイルを・・・ ....   
     ・[11542] miyaza 
     ・[11544] miyaza 
     ・[11564] たまー 
   ClearDrawScreenについ ....   
     ・[11437] tkmakwins15 
     ・[11439] 管理人 
     ・[11562] 自由の天使 
   ヒープソート   
     ・[11557] 雷 
     ・[11558] box 
     ・[11561] ark 
   条件式に関して   
     ・[11505] ibis 
     ・[11507] Justy 
     ・[11509] たかぎ 
     ・[11517] ibis 
     ・[11518] ibis 
     ・[11521] たかぎ 
     ・[11559] ibis 
     ・[11560] ibis 
   4人対戦型ゲームにおけ ....   
     ・[11527] 管理人 
     ・[11550] anonymous 
   ポインタで…   
     ・[11520] box 
     ・[11529] ドラ 
     ・[11531] バグ 
     ・[11539] ドラ 
   DXによるマウス操作に ....   
     ・[11338] \n 
     ・[11341] C.P.P 
     ・[11346] tkmakwins15 
     ・[11348] Justy 
     ・[11370] C.P.P 
     ・[11371] 管理人 
     ・[11378] C.P.P 
     ・[11379] Justy 
     ・[11396] C.P.P 
     ・[11416] Justy 
     ・[11534] C.P.P 
     ・[11537] C.P.P 
   ウインドウベースのソ ....   
     ・[11536] Y 
   スクリプタを作りたい ....   
     ・[11532] バグ 
   内部ハッシュ法につい ....   
   数値の取得   
   数字を3桁ごとにカン ....   
     ・[11464] たかぎ 
     ・[11467] ゴールドマン 
     ・[11469] たかぎ 
     ・[11475] box 
     ・[11477] box 
     ・[11499] ゴールドマン 
     ・[11512] GPGA 
     ・[11514] ゾン兵衛 
   こんばんわ   
     ・[11506] ibis 
     ・[11513] バグ 
   音楽を再生するプログ ....   
     ・[11463] miyaza 
     ・[11465] tkmakwins15 
     ・[11466] miyaza 
     ・[11470] バグ 
     ・[11471] miyaza 
     ・[11510] ぱそぴ 
   マップ作成について   
     ・[11322] TKSZ 
     ・[11323] TKSZ 
     ・[11324] TKSZ 
     ・[11347] ど素人 
     ・[11351] 雷 
     ・[11508] ど素人 
   サイトについての質問   
     ・[11498] tkmakwins15 
     ・[11500] マクまく 
     ・[11501] tkmakwins15 
     ・[11502] マクまく 
   続: ファイルからの ....   
     ・[11489] バグ 
     ・[11490] AISU 
     ・[11491] AISU 
     ・[11492] バグ 
     ・[11493] AISU 
     ・[11495] バグ 
   メモリの動的読み込み   
     ・[11409] miyaza 
     ・[11410] miyaza 
     ・[11411] box 
     ・[11413] miyaza 
     ・[11442] guronn 
     ・[11478] yoh2 
     ・[11484] guronn 
     ・[11486] 組木紙織 
     ・[11487] たかぎ 
     ・[11494] guronn 
   SQL呼び出し   
   プロのプログラム   
     ・[11485] tkmakwins15 
   DXライブラリについて   
     ・[11317] よっつん 
     ・[11318] 新米 
     ・[11328] tkmakwins15 
     ・[11330] バグ 
     ・[11331] よっつん 
     ・[11332] tkmakwins15 
     ・[11334] GPGA 
     ・[11353] 新米 
     ・[11354] tkmakwins15 
     ・[11355] 新米 
     ・[11357] tkmakwins15 
     ・[11387] よっつん 
     ・[11389] 新米 
     ・[11445] 新米 
     ・[11448] Justy 
     ・[11483] 新米 
   javaに関することなの ....   
   数値の演算について   
     ・[11474] box 
   数独について   
     ・[11415] K-I 
     ・[11420] 雷 
     ・[11421] 雷 
     ・[11422] K-I 
     ・[11430] 雷 
     ・[11432] K-I 
     ・[11434] 雷 
     ・[11435] K-I 
     ・[11441] K-I 
     ・[11444] 雷 
     ・[11446] 雷 
     ・[11451] K-I 
     ・[11472] K-I 
   選択肢について   
     ・[11450] 悪戦苦闘している大学生 
     ・[11452] バグ 
     ・[11468] 悪戦苦闘している大学生 
   Cygwinの環境変数   
     ・[11454] たかぎ 
     ・[11455] ぺけ 
     ・[11457] toyo 
     ・[11458] ぺけ 
     ・[11460] たかぎ 
     ・[11461] ぺけ 
   質問です。   
     ・[11440] 管理人 
     ・[11443] よっつん 
     ・[11459] ひろっち 
   再起:数独用 の確認 ....   
   音楽を多重起動するに ....   
     ・[11406] parapara 
     ・[11407] ibis 
     ・[11423] parapara 
     ・[11424] バグ 
     ・[11428] parapara 
     ・[11438] ibis 
   ウィンドウを別々に制 ....   
     ・[11376] tkmakwins15 
     ・[11384] 雷 
     ・[11386] tkmakwins15 
     ・[11388] 雷 
     ・[11419] 雷 
     ・[11425] tkmakwins15 
     ・[11426] tkmakwins15 
     ・[11429] 雷 
     ・[11431] tkmakwins15 
     ・[11433] 雷 
   バッファから作成でき ....   
     ・[11402] たかぎ 
     ・[11403] GPGA 
     ・[11405] GPGA 
     ・[11418] たかぎ 
     ・[11427] GPGA 
   DXライブラリでの弾の ....   
     ・[11404] やそ 
     ・[11408] ibis 
     ・[11417] C.K 
   クリックイベントにつ ....   
   ファイルからの値の読 ....   
     ・[11373] バグ 
     ・[11375] tkmakwins15 
     ・[11377] AISU 
     ・[11381] box 
     ・[11383] toyo 
     ・[11390] AISU 
     ・[11391] AISU 
     ・[11392] バグ 
     ・[11393] AISU 
     ・[11394] バグ 
     ・[11395] AISU 
     ・[11397] バグ 
   質問なんですが・・・   
     ・[11270] tkmakwins15 
     ・[11271] リク 
     ・[11272] 管理人 
     ・[11273] 管理人 
     ・[11274] 管理人 
     ・[11278] リク 
     ・[11279] リク 
     ・[11281] tkmakwins15 
     ・[11282] リク 
     ・[11283] リク 
     ・[11284] リク 
     ・[11285] tkmakwins15 
     ・[11287] 管理人 
     ・[11288] 管理人 
     ・[11289] リク 
     ・[11290] 管理人 
     ・[11291] tkmakwins15 
     ・[11292] リク 
     ・[11293] 管理人 
     ・[11297] リク 
     ・[11349] リク 
     ・[11359] リク 
     ・[11362] バグ 
     ・[11363] リク 
     ・[11385] リク 

Name: りょうちん  ..ぴよぴよ(468ポイント)   Date: 2007/11/10(土) 03:39   No:11645       
Title: タスク処理を使ったらエラーが・・    
以前にここでタスク処理について教えていただき、やっとの思いで完成したのですが、
しばらく実行していると

卒研家用.exe の 0xbaadf00d でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xbaadf00d を読み込み中にアクセス違反が発生しました。

というエラーメッセージがでて中断されてしまうようになってしまいました。
申し訳ないのですがどなたか原因を教えてください。お願いします(ノω・、)

プレイキャラクターは普通の処理で弾だけタスク処理にしました。
必要なのかもわからないのですがタスク処理のコードかきます。

#define WORK_SIZE 512
#define NUM_TASKS 128
#define PI 3.1415926


// タスクリストの初期化
void InitTaskList() {

// タスク用メモリの確保
TASK* task=new TASK[NUM_TASKS+2];

// アクティブタスクリストの初期化
ActiveTask=&task[0];
ActiveTask->Prev=ActiveTask->Next=ActiveTask;

// フリータスクリストの初期化
FreeTask=&task[1];
for (int i=1; i<NUM_TASKS+1; i++)
task[i].Next=&task[i+1];
task[NUM_TASKS+1].Next=FreeTask;
}

// タスクの実行
void RunTask() {
for (TASK *task=ActiveTask->Next, *next;
next=task->Next, task!=ActiveTask; task=next)
(*task->Func)(task);
}

typedef void (*FUNC)(TASK* task);
// タスクの生成

TASK* CreateTask(FUNC func) { //この関数を呼び出されたときの引数が処理関数

// フリータスクリストが空ならば生成を中止する
if (FreeTask->Next==FreeTask) return NULL;

// フリータスクを1個取り出す
TASK* task=FreeTask->Next;
FreeTask->Next=task->Next;

// 処理関数と前後タスクへのポインタを設定する
task->Func=func;
task->Prev=ActiveTask->Prev;
task->Next=ActiveTask;

// 前後タスクのポインタを変更する
task->Prev->Next=task;
task->Next->Prev=task;

// 生成したタスクを返す
return task;
}

// タスクの削除
void DeleteTask(TASK* task) {

// アクティブタスクリストからタスクを削除する
task->Prev->Next=task->Next;
task->Next->Prev=task->Prev;

// 削除したタスクをフリータスクリストに挿入する
task->Next=FreeTask->Next;
FreeTask->Next=task;
}

void FuncBullet(TASK* task) {

// assertを使って構造体のサイズをチェックする
assert(sizeof(Bullet_WORK)<=WORK_SIZE);
// 弾のワークエリア構造体へのポインタにキャストする
Bullet_WORK* work=(Bullet_WORK*)task->Work;

work->T=work->T+1;
if(work->T == 60) //1秒間進んだら弾が消える
DeleteTask(task);

work->X=work->X+cos(PI*(work->Z*0.001))*6.0;
work->Y=work->Y+sin(PI*(work->Z*0.001))*6.0;

DrawRotaGraph((int)work->X,(int)work->Y, 1 ,PI*(work->Z*0.001)+PI/2, img_player_shot[0], TRUE ) ;
 if(work->Y < 15.0 || work->X < 10.0 || work->X > 409.0 || work->Y > 465.0)
DeleteTask(task);


}

void CreateBullet(double x, double y, double z) {

TASK* task=CreateTask(FuncBullet);
if (!task) return;

// ワークエリアへのポインタをキャストする
assert(sizeof(Bullet_WORK)<=WORK_SIZE);
Bullet_WORK* work=(Bullet_WORK*)task->Work;

work->X=x;
work->Y=y;
work->Z=z;
work->V=1.0;
work->T=1;
}





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


Name: Justy  ..ハッカー(169,909ポイント)   Date: 2007/11/10(土) 11:40   No:11648     
Title: Re:タスク処理を使ったらエラーが・・    
というエラーメッセージがでて中断されてしまうようになってしまいました。
申し訳ないのですがどなたか原因を教えてください。お願いします(ノω・、)

 再現できるだけのコードがないので、正確にはわかりませんが、
多分、確保されていないメモリ(未初期化のポインタとか配列の要素以上に読み書きしたとか)に
アクセスしたのでしょう。

 デバッガを使っているなら、その中断されたソースの場所がわかると思います。
 そこから調べてみて下さい。


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

Name: りょうちん  ..ぴよぴよ(509ポイント)   Date: 2007/11/10(土) 15:54   No:11649     
Title: Re:タスク処理を使ったらエラーが・・    
ありがとうございました。デバッガの使い方がよくわからないので、
覚えてそこから調べてみます。


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



Name: ibis  ..かけだし(1,881ポイント)   Date: 2007/11/09(金) 20:46   No:11638       
Title: CPU使用率の削減    
windowsプログラムに関してです。

常にウィンドウメッセージの検出と処理を繰り返しているとCPU使用率が高くなりますが、
CPU使用率が常に90%代などというプログラムは、タスクマネージャを見た限りほぼありませんよね。
まぁSystem Idle Processは別として。
どうすればCPU使用率を下げられるのですか?
それから、CPU使用率を下げる必要はあるでしょうか?


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


Name: バグ  ..比類無きプログラマー(63,935ポイント)   Date: 2007/11/09(金) 21:16   No:11639     
Title: Re:CPU使用率の削減    
Sleep関数を使用するとよいですよ。


while (1)
{
/* なんらかの処理 */

Sleep(10); /* 10ミリ秒間処理を止める */
}


こんな感じですね。


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

Name: ibis  ..かけだし(1,905ポイント)   Date: 2007/11/10(土) 11:02   No:11647 解決!     
Title: Re:CPU使用率の削減    
sleepですか。
ありがとうございます。


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



Name: sinnyassss [URL]  ..ぴよぴよ(98ポイント)   Date: 2007/11/09(金) 19:42   No:11636       
Title: 画像が...    
ゲームプログラミング講座でLoadGraphScreen関数を使っているのに、画像が表示されません。ちゃんとこのように書いています。↓
LoadGraphScreen( 0, 0 ,"char.png", TRUE );
どうしてなのでしょうか。


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


Name:  ..上級者(16,897ポイント)   Date: 2007/11/09(金) 20:21   No:11637     
Title: Re:画像が...    
画像はある?
過去ログ見ました?


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



Name: てつ [URL]  ..かけだし(1,057ポイント)   Date: 2007/11/09(金) 01:30   No:11614       
Title: リテラルを使わないでロード    
質問です。

今現在DXライブラリでゲームを作っているのですが、例えば効果音をロードする時

int hSE = LoadSoundMem("push.wav");
.
.
.
.
.
などと一つずつ記述すると、後からデータが追加されたらまたコンパイルしなくては
いけません。これは余り宜しい事ではないと思います。なのでテキストファイルに
効果音名を書き、それを読み込む事でロードすれば良いと考えたのですが、それが
出来ません。何故か読み込みエラーになります。以下はそのプログラムの重要な部分を
簡略化したもの。修正願います。



//file_list.txt/////////////////////////////////////////////////////////////////
"push.wav"

//main.cpp//////////////////////////////////////////////////////////////////////
#include "DxLib.h"
#include<stdio.h>

int hSE;

//効果音ロード------------------------------------------------------------------------------------
void LoadSe(void)
{
FILE *fp = fopen("file_list.txt", "r");
char file_name[256];

fgets(file_name, 255, fp);

hSE = LoadSoundMem(file_name); //ここがおかしいようです

fclose(fp);
}

//ゲームメイン関数--------------------------------------------------------------------------------
void GameMain(void)
{
LoadSe();

while(!ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE)) //ESCで終了
{
PlaySoundMem(hSE, DX_PLAYTYPE_BACK); //再生されない。読み込みエラー
}
}

//メイン関数-------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

ChangeWindowMode(TRUE); //ウインドウモード

if(DxLib_Init() == -1) //DXライブラリ初期化処理
{
return -1; //エラーが起きたら直ちに終了
}


GameMain(); //ゲームメイン関数

DxLib_End() ; //DXライブラリ使用の終了処理

return 0 ; //ソフトの終了
}


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


Name: Justy  ..ハッカー(169,187ポイント)   Date: 2007/11/09(金) 02:05   No:11615     
Title: Re:リテラルを使わないでロード    
> 何故か読み込みエラーになります
 読みとった文字列の最後に改行コードが入っているからでは?


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

Name: てつ [URL]  ..かけだし(1,841ポイント)   Date: 2007/11/09(金) 14:40   No:11621     
Title: Re:リテラルを使わないでロード    
Justyさん、お返事ありがとうございます。

>読みとった文字列の最後に改行コードが入っているからでは?

それは私も考えました。ですが改行コードを入れなくても、やはり
思った通りに動きません。以下に上記のプログラムを更に改良した
ソースを書きます。出来れば皆さんのパソコンでも実行してみて下さい。


//file_list.txt///////////////////////////////////////////////////////////////////////////////////
"push.wav"


//main.cpp////////////////////////////////////////////////////////////////////////////////////////
//テキストファイルから効果音ファイル名を読み込み
//効果音をロードし再生するプログラム
#include "DxLib.h"
#include<stdio.h>
#include<string.h>

int hSE; //効果音ハンドル
char FileName[256]; //効果音ファイル名
int Length; //効果音ファイル名文字列長

//効果音ロード------------------------------------------------------------------------------------
void LoadSe(void)
{
FILE *fp = fopen("file_list.txt", "r"); //ファイルリストオープン


fgets(FileName, 255, fp); //ファイルから一行読み込む
Length = strlen(FileName); //文字列長を得る
FileName[Length] = '\0'; //文字列の終わりは'\0'

hSE = LoadSoundMem(FileName); //効果音ロード

fclose(fp); //ファイルを閉じる
}

//ゲームメイン関数--------------------------------------------------------------------------------
void GameMain(void)
{
LoadSe(); //初期化処理

while(!ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE)) //ESCで終了
{
ClearDrawScreen(); //画面を初期化
PlaySoundMem(hSE, DX_PLAYTYPE_BACK); //再生されない。効果音ファイルは指定の場所にあります
printfDx("hSE :%d\n", hSE); //何故か-1
printfDx("FileName:%s\n", FileName); //ファイル名は正常に読み込めているみたい
printfDx("Length :%d\n", Length); //"push.wav"の文字列長は10。間違いない
ScreenFlip(); //裏画面の内容を表画面に反映
}
}

//メイン関数--------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); //ウインドウモード

if(DxLib_Init() == -1) //DXライブラリ初期化処理
{
return -1; //エラーが起きたら直ちに終了
}

SetDrawScreen(DX_SCREEN_BACK); //描画先画面を裏にする

GameMain(); //ゲームメイン関数

DxLib_End() ; //DXライブラリ使用の終了処理

return 0 ; //ソフトの終了
}


細心の注意を払って書いたつもりですが、思い通りに動きません。
何とかコンパクWeb第9回までに作品を完成させたいのですがこれでは・・・・・。
どなたか助けて下さい。宜しくお願いします。


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

Name: GPGA  ..プログラマー(38,850ポイント)   Date: 2007/11/09(金) 14:51   No:11622     
Title: Re:リテラルを使わないでロード    
パスはあっているのでしょうか?
例えば読み込むリソースが実行ファイルに対して res/push.wav の位置にある場合、
LoadSoundMem("res/push.wav");
としないと読み込めないと思うのですが・・・。


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

Name: YuO  ..上級者(15,005ポイント)   Date: 2007/11/09(金) 14:57   No:11623     
Title: Re:リテラルを使わないでロード    
> Length = strlen(FileName); //文字列長を得る
> FileName[Length] = '\0'; //文字列の終わりは'\0'
これは何がしたいのですか?
FileName[strlen(FileName)]は常に0ですが。
# FileNameの範囲をオーバーして未定義動作になる場合を除く。

デバッガで上記のあたりにブレイクポイントを置いて,FileNameやLengthが本当に正しいのかウォッチしてみるとよいでしょう。
# おそらく,FileName[Length - 1] = '\0;なのだと思いますが……。


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

Name: てつ [URL]  ..かけだし(2,024ポイント)   Date: 2007/11/09(金) 15:01   No:11624     
Title: Re:リテラルを使わないでロード    
GPGAさん、お返事ありがとうございます。

パスはあってます。自分はゲームを作る時、効果音は
materialフォルダ内のseというフォルダ内に入れています。
なのでロードする時は

hSE = LoadSoundMem("./material/se/push.wav");

のように記述しています。間違いは無いと思います。
私のパソコンがおかしいのでしょうか?一応2台のパソコンで
試したのですが・・・・・。とにかくコピーして実行してみて下さい。


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

Name: てつ [URL]  ..かけだし(2,186ポイント)   Date: 2007/11/09(金) 15:09   No:11625     
Title: Re:リテラルを使わないでロード    
YuOさん

>FileName[strlen(FileName)]は常に0ですが。

0とは\0のことですか?素人で良く分からないので念のため
ファイル名の末端に\0を入れました。

>デバッガで上記のあたりにブレイクポイントを置いて〜
すみません。VisualC++はビルドボタンくらいしか使わないので
デバッガとかブレイクポイントなんてのは分かりません。
よろしければサンプルコードを頂けませんか?


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

Name: てつ [URL]  ..かけだし(2,220ポイント)   Date: 2007/11/09(金) 15:28   No:11626     
Title: Re:リテラルを使わないでロード    
追伸
FileName[Length - 1]をprintfDxで表示させたら何も出ませんでした。
これは何を意味するのでしょう。分かりません。


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

Name: GPGA  ..プログラマー(39,246ポイント)   Date: 2007/11/09(金) 15:32   No:11627     
Title: Re:リテラルを使わないでロード    
ファイル名を読み込んだ際FileNameの中には
FileName[0] == 'p'
FileName[1] == 'u'
FileName[2] == 's'
FileName[3] == 'h'
FileName[4] == '.'
FileName[5] == 'w'
FileName[6] == 'a'
FileName[7] == 'v'
FileName[8] == '\n'
FileName[9] == '\0'
となっています。
このときに
Length = strlen(FileName); //文字列長を得る
を行うと、Lengthに9が入ります。
FileName[Length] = '\0'; は FileName[9] = '\0'; となるため
意味のない処理になってしまいます。

これを
FileName[Length - 1] = '\0';
とすることで、\0を改行文字の上に上書きしてなくすことができます。

ちなみにprintfDxで改行コードを表示しようとしても、何もでません。


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

Name: てつ [URL]  ..かけだし(2,246ポイント)   Date: 2007/11/09(金) 16:53   No:11629     
Title: Re:リテラルを使わないでロード    
すみません、事情により返事は暫く後になります。

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

Name: ま〜く  ..入門者(4,432ポイント)   Date: 2007/11/09(金) 17:31   No:11632     
Title: Re:リテラルを使わないでロード    
テキストデータに"(ダブルクォート)が入っているからじゃないんですか?

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

Name: てつ [URL]  ..かけだし(2,405ポイント)   Date: 2007/11/09(金) 17:56   No:11633 解決!     
Title: Re:リテラルを使わないでロード    
ま〜くさん

>テキストデータに"(ダブルクォート)が入っているからじゃないんですか?
それですよ、それ!皆様のアドバイスをもとに色々試していたのですが
上手くいかず、どうしても分からないので、昔通っていた専門学校の先生に
質問のメールを書いていたところでした(自分は専門学校の落ちこぼれでして
ゲーム会社に就職できず、仕方ないので個人でやってやろうと思ってたりします。
かなり無謀ですが)。文字列はダブルクォートで括らないといけないという
思い込み。怖いですねぇ。


何とか問題解決できました。皆様ありがとうございました。


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



Name: 銀猫  ..ぴよぴよ(114ポイント)   Date: 2007/11/09(金) 01:30   No:11613       
Title: ゲームプログラミングの館の導入で    
サンプルプログラム実行用フォルダを開いた後の
DxLib.sln を開きます。すると、VC++が起動します。
ここで2005を使っている人は「変換しますか?」のようなウィンドウが出ますので、指示に従って変換してください。
というところで、実際やってみると以下のようになってしまいます。



「現在開いているソリューションまたはプロジェクトは旧バージョンのVisual Studioで作成されたものです。このバージョンで使用される形式に変換してください。」

と、でるのでそのまま変換すると、

「すべてのプロジェクトは」正常に変換されましたが、いくつかの警告がありました。」

と表示されます。その後そのままビルドすると

「fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory」
「BSCMAKE: error BK1506 : : No such file or directory」


という二つのエラーがでてしまいビルドできないのですが、どうすればいいのでしょうか?
どなたか教えてください。
C言語自体が初心者なので、初歩的な質問かもしれませんがよろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(439,496ポイント)   Date: 2007/11/09(金) 11:44   No:11618     
Title: Re:ゲームプログラミングの館の導入で    
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2005express.html
ここの1番に当たるものが足りないのだと思います。


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

Name: 銀猫  ..ぴよぴよ(138ポイント)   Date: 2007/11/09(金) 17:10   No:11630     
Title: Re:ゲームプログラミングの館の導入で    
できました^^
ありがとうございます!


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



Name: りょうちん  ..かけだし(1,175ポイント)   Date: 2007/11/09(金) 00:16   No:11612       
Title: タスク処理の記述について    
たびたびすいません。いつもお世話になっています。
シューティングゲームの弾の処理にタスクリストを使いたいのですが、参考にしている本を読むと

構造体の処理関数へのポインタに

void (*Func)(TASK* task);

のように書かれているのですが、これはどういった意味なのでしょうか?
借りているC/C++等の辞典にものってなくて困っております。
意味と使い方等を、できたら詳しく教えてください。お願いします


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


Name: Justy  ..ハッカー(169,585ポイント)   Date: 2007/11/09(金) 02:16   No:11616     
Title: Re:タスク処理の記述について    
> void (*Func)(TASK* task);
> これはどういった意味なのでしょうか
 TASK型のポインタを引数とし戻り値なしの関数へのポインタです。
 引数と戻り値が一致した関数なら、そのポインタをそのメンバ Funcに代入することができます。

#include <stdio.h>


struct TASK
{
int val;
void (*Func)(TASK* task);
};

void TestTask(TASK *task)
{
if(task)
printf("task->val = %d\n", task->val);
}

int main()
{
TASK task;
task.val = 2;
task.Func = &TestTask;
(*task.Func)(&task);
return 0;
}




> 使い方等を、できたら詳しく教えてください
 使い方に関しては、タスクシステムはいろんな種類(私も2種類作ったことがあります)が
存在するので、ソース開示して頂かないとこれ以上は判りません。


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

Name: りょうちん  ..かけだし(1,207ポイント)   Date: 2007/11/09(金) 12:49   No:11619 解決!     
Title: Re:タスク処理の記述について    
分かりやすい例まで載せていただいて、本当にありがとうございます。


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



Name: usagi  ..ぴよぴよ(27ポイント)   Date: 2007/11/08(木) 22:33   No:11602       
Title: 無題    
顧客マスタファイルを作っています。ポイントカードがあり、発行した日から一年間有効なものにしています。発効日と期限日は構造体を使用しています。うるう年の場合の計算も入れたつもりです。ポイントカードの期限が切れたら、顧客コードは変えずに新規発行するシステムです。コードはcushファイルのc_codeと比較して、なかったら新規発行にしています。ポイントは別なファイルで処理し、そこから持ってきます。(cushファイルのc_pointに入っています)作り方がまったく分からなく、ここから進めません。よろしかったら教えてください。

/*顧客マスタファイル cust.dat*/

#include <stdio.h>
#include <time.h>

int date(int );

void main()
{
struct kokyaku
{
int k_code;
short h_nen,h_tsuki,h_hi;
short k_nen,k_tsuki,k_hi;
}kokyaku;

FILE *cf;

int k_point=0;
int dt,year,month,day;

printf("今日の日付を入力(YYYY MM DD):");
scanf("%d %d %d",&kokyaku.h_nen,&kokyaku.h_tsuki,&kokyaku.h_hi);

year=kokyaku.h_nen;
month=kokyaku.h_tsuki;
day=kokyaku.h_hi
dt=date(int year,int month,int day);
}

int date(int year,int month,int day)
{
int k_year,k_month,k_day,pt;

kokyaku.k_nen=(kokyaku.h_nen)+1;

if((kokyaku.h_tsuki==3) && (kokyaku.h_hi==1)){
if((kokyaku.k_nen%4==0) && (kokyaku.k_nen%100!=0)){
kokyaku.k_tsuki=kokyaku.h_tsuki-1;
kokyaku.k_hi=29;
}else{
kokyaku.k_tsuki=kokyaku.h_tsuki-1;
kokyaku.k_hi=28;
}
}else if(kokyaku.h_hi==1){
kokyaku.k_tsuki=kokyaku.h_tsuki-1;
kokyaku.k_hi=kokyaku.h_hi;
}

cf=fopen("../datafile/cush.dat","r");

while((kokyaku.k_code) == c_code){
if((kokyaku.k_code)!=EOF){
dt=date();
}else if((kokyaku.k_nen) < (kokyaku.h_nen) || (kokyaku.k_tsuki) < (kokyaku.h_tsuki) || (kokyaku.k_hi) < (kokyaku.h_hi))
k_point=0;
}
}
k_year=kokyaku.k_nen;
k_month=kokyaku.k_tsuki;
k_day=kokyaku.k_hi;
pt=k_point;
return (k_year,k_month,k_day,pt);
}



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


Name: うさぎ  ..ぴよぴよ(12ポイント)   Date: 2007/11/08(木) 22:53   No:11603     
Title: Re:無題    
レジファイルはこれです。
/*レジファイル cush.dat*/

#include <stdio.h>

void main()
{
FILE *smf,*stf,*cuf,*cf;

int c_code;

int gokei=0;
int money;

smf=fopen("../datafile/s_mast.dat","r+");
cuf=fopen("../datafile/cush.dat","w");
cf=fopen("../datafile/cust.dat","r+");

while(scanf("%d",&c_code)!=NULL){
while(c_code==s_code){
gokei+=tanka;
zaiko-=1;
}
}

fseek(smf,0L,0);


printf("合計は%d円です",gokei);
scanf("%d",&money);
money-=gokei;
printf("おつりは%d円です",money);

k_point=gokei*(0.05);
printf("今回のポイントは%dポイントです",k_point);
}




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

Name: うさぎ  ..ぴよぴよ(292ポイント)   Date: 2007/11/08(木) 22:55   No:11604     
Title: Re:無題    
商品マスターはこれです。

/*商品マスタファイル s_mast.dat*/

#include <stdio.h>

void main()
{

FILE *smf1,*smf2;
char s_name[20];
int tanka,zaiko;
int s_code=1;

printf("データを入力してください。(商品名、単価、在庫数)\n");

smf1=fopen("../datafile/s_mast.txt","a+");

while(scanf("%s %d %d",s_name,&tanka,&zaiko)!=EOF){
fprintf(smf1,"%d %s %d %d\n",s_code,s_name,tanka,zaiko);
s_code+=1;
}

fclose(smf1);
/*ファイル内容表示*/
printf("ファイルからデータを読み込みます。\n");

printf("商品コード 商品名 単価 在庫数 \n");

smf2=fopen("../datafile/s_mast.txt","r");

while(fscanf(smf2,"%d %s %d %d",&s_code,s_name,&tanka,&zaiko) != EOF)
printf("%d %s %d %d\n",s_code,s_name,tanka,zaiko);

fclose(smf2);
}


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

Name: うさぎ  ..ぴよぴよ(62ポイント)   Date: 2007/11/08(木) 22:56   No:11605     
Title: Re:無題    
商品コード保存ファイルです。
いちおこれですべてのプログラムです。

/*商品コード保存ファイル*/

#include <stdio.h>

void main()
{
FILE *ssf,*smf;

int code;
int s_code;
char s_name[20];
int tanka,zaiko;

ssf=fopen("../datafile/s_stock.txt","w+");
smf=fopen("../datafile/s_mast.txt","r");

while(fscanf(smf,"%d %s %d %d",&s_code,s_name,&tanka,&zaiko)!=EOF);
code=s_code;
fprintf(ssf,"%d",code);

fclose(smf);
fclose(ssf);
}


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

Name: box  ..比類無きプログラマー(91,532ポイント)   Date: 2007/11/09(金) 00:00   No:11610     
Title: Re:無題    
プログラミングより前のシステム設計段階の話として、
マスターファイルがデータベースでなくてよいのでしょうか?

根本から見直した方がいいように思えてしまうのですけれど。

# 思い過ごしかなぁ…。


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



Name: y  ..ぴよぴよ(3ポイント)   Date: 2007/11/08(木) 20:56   No:11598       
Title: またまた質問です。。。    
AとBというファイルがあるとします。
AのファイルからBのファイルにあるものを読み出すときはどのようなプログラムを作ったらよいのでしょうか?教えてください!!


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


Name: box  ..比類無きプログラマー(91,636ポイント)   Date: 2007/11/08(木) 21:12   No:11599     
Title: Re:またまた質問です。。。    
Aのファイルとは何でしょうか?
Aのプログラムの実行中に、という意味でしょうか?


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

Name: y  ..ぴよぴよ(13ポイント)   Date: 2007/11/08(木) 21:50   No:11600     
Title: 無題    
Aのプログラムでコードを

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

Name:  ..ぴよぴよ(75ポイント)   Date: 2007/11/08(木) 21:52   No:11601     
Title: 無題    
Aのプログラムでコードを使い、それをBのプログラムで保存します。そのコードをBからAに読み込んで使用するやり方がわかりません。

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

Name: たかぎ [URL]  ..上級者(17,356ポイント)   Date: 2007/11/08(木) 23:21   No:11606     
Title: Re:無題    
> Aのプログラムでコードを使い

ここでいうコードとは?
そもそも環境は?


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

Name:  ..ぴよぴよ(135ポイント)   Date: 2007/11/08(木) 23:53   No:11608     
Title: Re:無題    
無題で最終投稿者が「うさぎ」というところに、作ったすべてのプログラムを入れました!お願いします!

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



Name: りょうちん  ..かけだし(1,048ポイント)   Date: 2007/11/08(木) 17:45   No:11594       
Title: エラーの解決方法を教えてください    
何度もすいません。
現在シューティングゲームの館の 6. 先ほどのプログラムを分割してみる 
をやってみて、読んだまま作ってビルドしてみたのですが、
「現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、
ファイルを Unicode 形式で保存してください。」
というエラーがでてうまくいきません。
環境はVS2005です。
どうすれば解決できるのか教えてください。よろしくお願いします。


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


Name: box  ..比類無きプログラマー(91,616ポイント)   Date: 2007/11/08(木) 18:47   No:11595     
Title: Re:エラーの解決方法を教えてください    
何という名前のソースファイルの何行目で、
そのエラーが出ていますか?


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

Name: りょうちん  ..ぴよぴよ(975ポイント)   Date: 2007/11/08(木) 20:01   No:11597     
Title: Re:エラーの解決方法を教えてください    
background.cpp(4)
fps.cpp(4)
img_sound_load.cpp(4)
mmreg.h
dxlib.h(1529)
player.cpp(4)
等ですめぼしいもの全部です。何かの設定が間違っているのでしょうか・・。



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



Name: りょうちん  ..ぴよぴよ(832ポイント)   Date: 2007/11/08(木) 15:53   No:11591       
Title: DxLibを継承したいのですが    
現在C++を使って開発をしているのですが、
DxLibクラス化し、継承させてゲーム全体で使用する事ってできますか?
もしできるなら詳しいやりかたを教えてください。
よろしくお願いします。


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


Name: tkmakwins15 [URL]  ..プログラマー(36,967ポイント)   Date: 2007/11/08(木) 17:15   No:11592     
Title: Re:DxLibを継承したいのですが    
出来なくはないのですが、基本的にDXライブラリはCベース(関数中心)のライブラリなので、
その関数群を包み込むという風な感じになります。

とりあえずグラフィックを扱う部分のクラスだけ参考に添付します。


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

Name: りょうちん  ..ぴよぴよ(863ポイント)   Date: 2007/11/08(木) 17:38   No:11593 解決!     
Title: Re:DxLibを継承したいのですが    
回答ありがとうございました。
クラスの有効な使い道とかまだよくわかってないのですが
がんばってみます。


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

Name: tkmakwins15 [URL]  ..プログラマー(37,024ポイント)   Date: 2007/11/08(木) 19:33   No:11596     
Title: Re:DxLibを継承したいのですが    
クラスの考え方はデータとその動きを関連付けようということです。そのクラスの場合、グラフィックハンドルとそのグラフィックの制御をまとめています。

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



Name: souji  ..ぴよぴよ(315ポイント)   Date: 2007/11/08(木) 13:56   No:11589       
Title: 数値に対応した描画について    
計算値に対応して、針が動く(速度に対応したスピ−ドメーター)を描画したいのですが、
この場合、どのようなプログラムを組めばよいのでしょうか?

ゲームプログラミンギの館のサンプルプログラムを参考にして、針を動かすことはできたのですが、ただ時間経過にあわせて針が回転する『時計』しか作ることができませんでした。
どうかアドバイスお願いします。


#include "DxLib.h"
#define PI 3.1415926

int image0,image1,image2,count=0;
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );

image0 = LoadGraph( "計器.dds" ) ;//計器盤の画像を読み込む
image1 = LoadGraph( "長針.dds" ) ;//速度計の長針の画像を読み込む
image2 = LoadGraph( "短針.dds" ) ;//速度計の短針の画像を読み込む



while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){

LoadGraphScreen( 0 , 0 , "計器.dds" , FALSE ) ;//計器盤を描画
DrawRotaGraph2 ( 155 , 155 , 13 , 97 , 1.0 , (double)count*0.1, image1 , TRUE) ;//長針を回転描画
DrawRotaGraph2 ( 155 , 155 , 11.5 , 56 , 1.0 , (double)count*0.01 , image2 , TRUE) ;//短針を回転描画
DrawCircle ( 155 , 155 , 2 , GetColor(255,0,0) ) ;//中心点を描画

count++;
ScreenFlip();
}
DxLib_End();
return 0;
}


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


Name: バグ  ..比類無きプログラマー(63,856ポイント)   Date: 2007/11/08(木) 14:16   No:11590     
Title: Re:数値に対応した描画について    
例えば、半円状の盤に速度を表示するような形のメーターならば…

針の角度=180×(現在速度÷最高速度)

で求める事ができますね。

時計の針を表示させる事ができるならば、それほど難しくはないと思いますよ。がんばってください♪


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



Name: 大工  ..プログラマー(25,816ポイント)   Date: 2007/11/08(木) 01:16   No:11581       
Title: BM法    

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

#define NOMATCH -1

void makenext(unsigned char *p, int *next);
int bm(char *p, char *t);

int main() {

char text[] = "ABCXDEZCABACABAC";
char pattern[] = "ABAC";
int result;

result = bm(pattern, text);

if(-1 == result) printf("NOMATCH\n");
else printf("MATCH, MATCHING POINT FROM %d\n", result + 1);

return 0;
}
int bm(char *p, char *t) {

int plen = strlen(p);
int tlen = strlen(t);
int next[256];

int i = 0, j = 0;

makenext(p, next);

i = plen - 1;

while(i < tlen) {

j = plen - 1;
while(t[i] == p[j]) {

printf("\nwhile: t[%d] = %c, p[%d] = %c\n", i, t[i], j, p[j]);
printf(" plen - j = %d\n", plen - j);
printf(" plen = %d\n", plen);
printf(" j = %d\n", j);
printf(" i = %d\n", i);
printf(" next[i] = %d\n", next[i]);
printf(" next[ t[i] ] = %d\n\n", next[ t[i] ]);

if(j == 0) return i;
--i; --j;
}

if(next[i] > plen - j) {

printf("\nif: t[%d] = %c, p[%d] = %c\n", i, t[i], j, p[j]);
printf(" plen - j = %d\n", plen - j);
printf(" plen = %d\n", plen);
printf(" j = %d\n", j);
printf(" i = %d\n", i);
printf(" next[i] = %d\n", next[i]);
printf(" next[ t[i] ] = %d\n\n", next[ t[i] ]);

i += next[ t[i] ];
}
else {

printf("\nelse : t[%d] = %c, p[%d] = %c\n", i, t[i], j, p[j]);
printf(" plen - j = %d\n", plen - j);
printf(" plen = %d\n", plen);
printf(" j = %d\n", j);
printf(" i = %d\n", i);
printf(" next[i] = %d\n", next[i]);
printf(" next[ t[i] ] = %d\n\n", next[ t[i] ]);

i += plen - j;
}
}

return NOMATCH;
}
void makenext(unsigned char *p, int *next) {

int n, k;

n = strlen(p);

for(k = 0; k < 256; k++) {

next[k] = n;
}

for(k = 0; k < n - 1; k++) {

next[ p[k] ] = n - k - 1;
}

return;
}


上記のプログラムでif(next[i] > plen - j)のplen - j は何を表しているのでしょうか?

また, このプログラムでtextとpatternを色々いじっているときに無限ループに入ってしまいました. このときのtextとpatternをメモしとけばよかったのですが・・・・確かちょうど, 上記のif文で next['A'(65)]あたりからおかしくなっていました. next['A'(65)]の値がそのpattern の長さではなかったです.


ご協力ねがいます. このソースで2日なやんでていいかげん寝たいです^^;


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


Name:  ..上級者(16,797ポイント)   Date: 2007/11/08(木) 03:33   No:11584     
Title: Re:BM法    
なりえないけど、もし例外的なものが入っていても処理できるようにしているのでは無いでしょうか?

if(next[i] > plen - j) {

if(next[i] < plen - j) {
にしても、全く問題がなかったので、多分ですが、移動への分岐みたいなものではないのでしょうか?
どちらの時もきちんと右に移動しているので…

plen - jは i += next[ text[i] ]; の計算で右に行くための条件なのでは無いでしょうか?

適当な推測ですみません。


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

Name: 大工  ..プログラマー(25,911ポイント)   Date: 2007/11/08(木) 03:44   No:11585     
Title: Re:BM法    
追記です。

else の中に入るのはpatternの先頭文字だけが一致しなかったときにのみ, そこにいくようです.

この時, j == 0となりnext[i] == plen - jとなっています.

ですが, nextの添字が65:'A'などの文字部分になったときになにか不具合がでないでしょうか?


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



Name: けるびん  ..入門者(3,419ポイント)   Date: 2007/11/06(火) 20:12   No:11540       
Title: 簡単な閾値処理    
いつもお世話になっています。今、下のような課題が出されたのですが。


【実行の流れ】
1.コマンドラインから配列の縦(横)の値(2≦N≦10)と閾値(1≦th≦9)を与える.

2.入力されたNの値に従って,N×Nの配列を生成する.

3.1〜9までの乱数を発生させ、配列の全ての要素に値を代入し,その結果を表示する.

4.コマンドラインから入力した閾値の値よりも,配列の各要素が大きければ"1"を,小さければ"0"を代入し,結果を再び表示する.

(例)
配列の行(列)数:N = 4、閾値:threshold = 5のとき

乱数を配列の各要素ごとに代入
┌─┬─┬─┬─┐
│2│7│2│9│
├─┼─┼─┼─┤
│6│5│6│7│
├─┼─┼─┼─┤
│1│3│8│6│
├─┼─┼─┼─┤
│4│3│3│5│
└─┴─┴─┴─┘

    ↓

5以上の値は"1"に,5より小さい値は"0"になる.
┌─┬─┬─┬─┐
│0│1│0│1│
├─┼─┼─┼─┤
│1│1│1│1│
├─┼─┼─┼─┤
│0│0│1│1│
├─┼─┼─┼─┤
│0│0│0│1│
└─┴─┴─┴─┘

課題1では配列処理で、課題2ではポインタもしくはポインタのポインタを使った処理を実行するようなプログラムを作成しなければいけないんです。

配列処理のほうはできたので、課題2は課題1の入力部分をポインタ(またはポインタのポインタ)にすればいいかという考えでいたんですが、セグメンテーション違反になってしまい、実行できません。

先生が言うには、アドレス操作にfor文を使うと危ないと言うので、試行錯誤したんですがなかなかできません。

この配列処理のどこをどう工夫すればポインタ(またはポインタのポインタ)で表現できるのでしょうか?教えてください。

また、セグメンテーション違反の原因はどういうことが考えられるのか教えてください


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


Name: けるびん  ..入門者(3,424ポイント)   Date: 2007/11/06(火) 20:19   No:11541     
Title: Re:簡単な閾値処理(追伸)    
プログラムです

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

Name:  ..上級者(15,447ポイント)   Date: 2007/11/06(火) 21:00   No:11543     
Title: Re:簡単な閾値処理(追伸)    
まず確認します。
このプログラムはCまたはC++ですよね?
違いましたら以下の文章は無視してください。

…このプログラムは実行できましたか?
僕の方はコンパイルが通らなかったので^^;
配列はこういう制御が不可能だったと思うのですがどうでしょうか?

セグメンテーションという単語は僕は分からないのですが、配列の設定ミスのことでは無いんですよね?


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

Name:  ..上級者(15,590ポイント)   Date: 2007/11/06(火) 21:08   No:11545     
Title: Re:簡単な閾値処理(追伸)    
まず確認します。
このプログラムはCまたはC++ですよね?
違いましたら以下の文章は無視してください。

…このプログラムは実行できましたか?
僕の方はコンパイルが通らなかったので^^;
配列はこういう制御が不可能だったと思うのですがどうでしょうか?

セグメンテーションという単語は僕は分からないのですが、配列の設定ミスのことでは無いんですよね?

もう一つ、このプログラムを実行した結果を載せてください。
配列の方も完成はしていません。
きちんと実行して確認してください。

このままだと課題を適当にやっているだけで、丸投げと変わらないです。


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

Name:  ..上級者(15,625ポイント)   Date: 2007/11/06(火) 21:09   No:11547     
Title: Re:簡単な閾値処理(追伸)    
すいません、編集のつもりでミスをしました。
一つ目の方を無視してください。


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

Name: miyaza  ..中級者(10,903ポイント)   Date: 2007/11/06(火) 21:15   No:11548     
Title: Re:簡単な閾値処理(追伸)    
int array[N][N];
とありますがプログラム中で配列の要素数を変更することは出来ません。
ただ、GCCは出来るそうですが、よく知りません。


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

Name:  ..上級者(15,759ポイント)   Date: 2007/11/06(火) 21:24   No:11549     
Title: Re:簡単な閾値処理(追伸)    
一様ポインターの方も出来ました。
ただ、
>先生が言うには、アドレス操作にfor文を使うと危ない
が、理解できていないので、無視して行っています。

それで良く、そちらが実行可能なものをアップしていただければ、
こちらもアップしたいと思っています。
(.cppファイルですが.cの方がよい時は少しいじれば思った動きになるはずです。)


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

Name: けるびん  ..入門者(3,808ポイント)   Date: 2007/11/06(火) 21:56   No:11551     
Title: Re:簡単な閾値処理(追伸)    
返信ありがとうございます。
どうやら、与える情報が少なかったようです。失礼しました。
プログラムはC言語で、gcc〜といった感じでコンパイルします。
OSはLINUXでKNOPPIXを使っています

int array[N][N];

の部分はやってみた結果、問題ありませんでした。
あと、コンパイルも問題なくできました。

実行した結果は

配列の行(列)数:N = 4、閾値:th= 4のとき

┌─┬─┬─┬─┐
│2│7│2│9│
├─┼─┼─┼─┤
│6│5│6│7│
├─┼─┼─┼─┤
│1│3│8│6│
├─┼─┼─┼─┤
│4│3│3│5│
└─┴─┴─┴─┘
   ↓
┌─┬─┬─┬─┐
│0│1│0│1│
├─┼─┼─┼─┤
│1│1│1│1│
├─┼─┼─┼─┤
│0│0│1│1│
├─┼─┼─┼─┤
│1│0│0│1│
└─┴─┴─┴─┘

というふうになります。
2値化が分かりやすいようにしているつもりです。

プログラムはもう少し考えてからUPさせてもらいます。
こちらではコンパイルできるのに雷様の場合できないというのは明らかにおかしいので。

こちらがおかしいということを前提に考えますので、もう少し待ってもらえませんか?
もし、できた場合はUPを御願いします


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

Name: miyaza  ..中級者(10,835ポイント)   Date: 2007/11/06(火) 22:05   No:11552     
Title: Re:簡単な閾値処理(追伸)    
>プログラムはC言語で、gcc〜といった感じでコンパイルします。
GCCを使用されていたようですね。
それならint array[N][N];
でエラーしないのもわかります。


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

Name: フリオ  ..中級者(14,218ポイント)   Date: 2007/11/06(火) 22:08   No:11553     
Title: Re:簡単な閾値処理(追伸)    
 
 式文の途中での変数の宣言、配列の宣言時での要素数の変数の使用
が標準になるのは、C99からだったはずなので、こちらで試したところ、

OSは、Windows2000 SP4、

BCC32 5.5.1では、当然、
 エラー E2140 test001.c 19: ここでは宣言はできない(関数 main )
 エラー E2313 test001.c 19: 定数式が必要(関数 main )
 エラー E2313 test001.c 19: 定数式が必要(関数 main )
で、コンパイルできず。

gcc 3.4.4(cygwin)では、コンパイル、実行、共に問題無しでした。

一応、私が考えたものを載せておきます。

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

int **Make(int n)
{
int **array, i;

if(!(array = malloc(sizeof(int *) * n))) return NULL;
for(i = 0; i < n; i ++){
if(!(array[i] = malloc(sizeof(int) * n))){
while(i --) free(array[i]);
free(array);
return NULL;
}
}
return array;
}

void Init(int **array, int n)
{
int i, j;

srand(time(NULL));
for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) array[i][j] = rand() % 9 + 1;
}
}

void Threshold(int **array, int n, int th)
{
int i, j;

for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) array[i][j] = (array[i][j] >= th);
}
}

void Print(int **array, int n)
{
int i, j;

for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) printf("%d ", array[i][j]);
putchar('\n');
}
}

void Free(int **array, int n)
{
int i;

for(i = 0; i < n; i ++) free(array[i]);
free(array);
}

int main(void)
{
int **array, n, th;

scanf("%d %d", &n, &th);
if(!(array = Make(n))) return 1;
Init(array, n);
Print(array, n);
putchar('\n');
Threshold(array, n, th);
Print(array, n);
Free(array, n);
return 0;
}


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

Name: けるびん  ..入門者(3,923ポイント)   Date: 2007/11/06(火) 22:12   No:11554     
Title: Re:簡単な閾値処理(実行結果)    
やはり、ちゃんとコンパイルできました。
謎が深まるばかりです。
OSの違いでしょうか?

あまり詳しくないので良く分かりませんが、
友達はWINDOWSでコンパイルするのと
KNOPPIXでコンパイルするのでは、コンパイルが通るときと通らないときがあるとか。

謎です


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

Name: けるびん  ..入門者(4,008ポイント)   Date: 2007/11/06(火) 22:17   No:11555     
Title: Re:簡単な閾値処理    
やはり、malloc関数が使ってありますか。
またこれも、「malloc使ってもいい」と先生に言われていたんですが、
よく分からなかったので使っていませんでした。

プログラムの流れはよく分かるんですが、できればmalloc関数について
詳しく教えていただきませんか?




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

Name:  ..上級者(15,849ポイント)   Date: 2007/11/06(火) 22:21   No:11556     
Title: Re:簡単な閾値処理(実行結果)    
すいません。
こちらはBCCでやっていました。
GCCと言うものを知らず、申し訳ありませんでした。

一様UPしておきますが、ポインタは適当に代入しちゃっています。
して良いことかどうかは分かりませんが、、、
見当違いな発言、すいませんでした。


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

Name: けるびん  ..入門者(4,023ポイント)   Date: 2007/11/08(木) 01:21   No:11582 解決!     
Title: Re:簡単な閾値処理(お礼)    
返信ありがとうございました。
いろいろ調べてみます。


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



Name: りょうちん  ..ぴよぴよ(211ポイント)   Date: 2007/11/07(水) 17:35   No:11570       
Title: 無題    
質問です。アクションゲームを作っていてキャラクターの画像を
 右キーで右に回転 左キーで左に回転 上キーで向いている角度方向に直進
という動きをさせたいのですが、回転はするのですが直進しません。

DrawRotaGraph関数の引数に
x座標に[現在のx座標 + 上キーフラグ * cos(角度) * 速さ]
y座標に[現在のy座標 + 上キーフラグ * sin(角度) * 速さ]
みたいな感じで書いたのですが、これではだめでした。

詳しい方教えてください。よろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(439,494ポイント)   Date: 2007/11/07(水) 20:54   No:11572     
Title: Re:無題    
具体的な仕様がよくわかりませんが、単に進む方向ということだけでお答えすると、

上キーを押した時、角度がπ/2になるようにすれば、x座標の増分は0になり、y座標の増分は速さそのものになります。

どうだめだったのでしょう?


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

Name: りょうちん  ..ぴよぴよ(757ポイント)   Date: 2007/11/07(水) 21:36   No:11573     
Title: Re:無題    
返信ありがとうございます。まずタイトルが無題だったに気づきませんでした、ごめんなさい。
分かりにくい質問になってしまったのも申し訳ありませんでした。
理由はわからないのですが、問題解決できました。
勉強のため、よろしければなぜこれでできたのか教えてください(泣
(上キーを押さなくても自動で進むように変更しました)
こちらのHPを参考にして

if(KeyBuf[ KEY_INPUT_RIGHT] == 1){
ch.z=ch.z+10;
}
if(KeyBuf[KEY_INPUT_LEFT] == 1 ){
ch.z=ch.z-10;
}
rawRotaGraph((int)ch.x+cos(PI*(ch.z*0.001)),(int)ch.y+sin(PI*(ch.z*0.001)),
        1 ,PI*(ch.z*0.001)+PI/2, image, TRUE ) ;

こんな感じで組んだところ回転はするのですが、直進しませんでした。
これを

if(KeyBuf[ KEY_INPUT_RIGHT] == 1){
ch.z=ch.z+10;
}
if(KeyBuf[KEY_INPUT_LEFT] == 1 ){
         ch.z=ch.z-10;
}
ch.x=ch.x+cos(PI*(ch.z*0.001));
ch.y=ch.y+sin(PI*(ch.z*0.001));
DrawRotaGraph((int)ch.x,(int)ch.y, 1 ,PI*(ch.z*0.001)+PI/2, image, TRUE ) ;

に変更したらうまくいきました。ch.zは0で初期化してます。
はじめ、cosやsinの値は1未満の数値だからDouble型をInt型にしたときに0になるため、こう変更して
解決したと思ってたのですが。よく考えたらch.zの初期値0ならばcosの値1になるはずだから
変にでも動くはずですよね・・。という事でなぜ解決したかわかりませんでした。


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



Name: 見習い  ..ぴよぴよ(104ポイント)   Date: 2007/11/05(月) 15:14   No:11516       
Title: プログラムの追加について    
1つのソリューソンが1つのプログラムとして完成しているとき、そこからさらに新しく計算させたいプログラムを付け足したいときは、そのソリューソンの中に新しくソースファイルとヘッダーファイルを作成してそこにプログラムを書けばいいんですか? その場合、ビルド,デバックに影響しますか?

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


Name: 管理人 [URL]  ..伝説のハッカー(438,677ポイント)   Date: 2007/11/06(火) 04:24   No:11528     
Title: Re:プログラムの追加について    
それはVC++ですか?
付け足したい時、というのは、main関数以外のほかの関数を付け足したい時ですよね?
でしたらその時はソースファイルを追加する事で勝手に分割コンパイルしてくれます。
もちろんソースコードを変更すればビルド、デバッグに影響します。
その時、main文のあるソースファイルでextern宣言をしてください。
新しく関数を他のファイルに作っただけじゃ、どこに関数があるのかわからないので、教えてあげる必要があります。


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

Name: 見習い  ..ぴよぴよ(82ポイント)   Date: 2007/11/07(水) 13:39   No:11567 解決!     
Title: Re:プログラムの追加について    
Visual C++です。
管理人さん、ありがとうございました。


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



Name: たまー  ..かけだし(1,600ポイント)   Date: 2007/11/06(火) 18:56   No:11538       
Title: CSVのファイルを・・・・    
CSVのファイルの中に整数のデータが
横に7個"," が整数の間にあります。(CSVなので当たり前なのかも><)
その整数を構造体A B C D E に 順番にいれていくとしたら、
どういった形になりますでしょうか?
よろしくお願いします。


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


Name: miyaza  ..中級者(10,836ポイント)   Date: 2007/11/06(火) 20:55   No:11542     
Title: Re:CSVのファイルを・・・・    
>構造体A B C D E に 順番にいれていくとしたら
整数を入れることができるメンバを持った構造体を7個使うという意味ですよね?

csvといってもその実態はテキストファイルなので
fopen()で開いてfscanf()やfgets()などで読み込んでやればいいと思います。

例えば、以下のソースはfgets()で一行分読み込んでstrtok()でトークン分解しそれをatoi()でint型に変換して
構造体に入れたものです。

7個の整数をcsvから読み取る前提で作ってあります。


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

typedef struct DATA{
int num;
}DATA;

#define CON 7
#define CS ","

int main(int argc,char *argv[]){

DATA data[CON];
FILE *fp;
char str[512], *ist;
int i;

if(argc>2) return -1;
fp=fopen(argv[1],"r");
if(!fp) exit(1);

if(fgets(str,sizeof(str),fp)==NULL) exit(1);

for(i=0;i<CON;i++){
if(i==0) ist=strtok(str,CS);
else ist=strtok(NULL,CS);
if(ist==NULL) exit(1);
data[i].num=atoi(ist);
}

for(i=0;i<CON;i++) printf("data[%d].num=%d\n",i,data[i].num);

fclose(fp);
return 0;
}

結構おおざっぱに作ってありますが動くと思います。


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

Name: miyaza  ..中級者(10,864ポイント)   Date: 2007/11/06(火) 21:01   No:11544     
Title: Re:CSVのファイルを・・・・    
すみません
>if(argc>2) return -1;
if(argc<1) return -1です。


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

Name: たまー  ..かけだし(1,660ポイント)   Date: 2007/11/07(水) 02:47   No:11564 解決!     
Title: Re:CSVのファイルを・・・・    
miyazaさん早い回答ありがとうございます><
思った感じでできております^^
やっぱりそのやり方がいいんですね〜^^
すごく参考になりあmした^^


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



Name: 自由の天使  ..ぴよぴよ(12ポイント)   Date: 2007/11/01(木) 18:56   No:11436       
Title: ClearDrawScreenについて・・・・    
C言語〜ゲームプログラミングの館〜でのプログラム説明で『ClearDrawScreen()』関数がありますが、ボーランドC++で実行した結果、未定義の関数が呼び出されたとエラーが出ました。

私なりに調べさせていただいたのですが、『clsDrawScreen()』ではないのでしょうか?


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


Name: tkmakwins15 [URL]  ..プログラマー(36,775ポイント)   Date: 2007/11/01(木) 19:03   No:11437     
Title: Re:ClearDrawScreenについて・・・・    
最新版のDxライブラリを使っていますか?

clsDrawScreen()は旧バージョンの関数です。


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

Name: 管理人 [URL]  ..伝説のハッカー(438,371ポイント)   Date: 2007/11/01(木) 19:58   No:11439     
Title: Re:ClearDrawScreenについて・・・・    
古いバージョンをお使いでしたらおっしゃる関数をお使い下さい。
新しいバージョンをお使いになるのでしたら紹介している関数をお使い下さい。


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

Name: 自由の天使  ..ぴよぴよ(37ポイント)   Date: 2007/11/07(水) 00:11   No:11562 解決!     
Title: Re:ClearDrawScreenについて・・・・    
分かりました!!
どうも、ありがとうございました。


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



Name: ark  ..ぴよぴよ(268ポイント)   Date: 2007/11/06(火) 21:09   No:11546       
Title: ヒープソート    
初めましてよろしくお願いします。

今C言語でソートのところを勉強していてヒープソートを作ろうとおもったのですが
どうにもうまくいきません


#include <stdio.h>

#define HMAX 50

int uu=0;

struct heap{
int box[HMAX];
int size;
};

void swap(int *u,int *v){
int tmp;
tmp = *u;
*u=*v;
*v=tmp;
}

void create(struct heap *h){
h->size=0;
}

void insert(struct heap *h, int item){
int i;
i=++h->size;
h->box[i]=item;

while(i>1 && h->box[i] < h->box[i/2]){

swap(&h->box[i] , &h->box[i/2]);
i/=2;
}

}

int findmin(struct heap *h){
return(h->box[1]);
}

void deletemin(struct heap *h){
int i,k;
i=1;
h->box[1] = h->box[h->size];
--h->size;
while(2*i <= h->size){
k=2*1;
if(k < h->size && h->box[k] > h->box[k+1]){
k++;
}
if(h->box[i] <= h->box[k]){
break;
}
swap(&h->box[i],&h->box[k]);

i=k;
}
}


int main(void){

struct heap b;
int no,ans,ape;

printf("要素挿入?yes...1 no...0");fflush(stdout);
scanf("%d",&ans);

if(ans==1){

while(ans==1){
create(&b);
printf("\nどんな数値を入力しますか?\n");fflush(stdout);
scanf("%d",&no);
insert(&b,no);
printf("続行?yes...1 no...0");fflush(stdout);
scanf("%d",&ans);
uu++;
}

for(ape=1;ape<=uu;ape++){
b.box[ape] = findmin(&b);
printf("%d ",b.box[ape]);fflush(stdout);
deletemin(&b);

}

printf("Heap sort is over.");fflush(stdout);
}

return 0;
}




デバッグするとdeleteminがおかしいと思うのですが、何が間違っているのかわかりません。
どうか教えていただけないでしょうか、お願いします。


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


Name:  ..上級者(16,217ポイント)   Date: 2007/11/06(火) 22:30   No:11557     
Title: Re:ヒープソート    
えっと、質問です。
fflush();
って何で使っているのでしょうか?
良く分からなかったので…

とりあえず、
b.box[ape] = findmin(&b);
のとき、b.box[0]には何が入っているんでしょうか?
無視しても良いみたいですが…不思議です。

void insert(struct heap *h, int item){
int i;
i=++h->size;
h->box[i]=item;

while(i>1 && h->box[i] < h->box[i/2]){

swap(&h->box[i] , &h->box[i/2]);
i/=2;
}

}
これのwhileは実行されているのでしょうか?
i=1でi>1ですよね?

実行はきちんとされているかと思います。
ただ、配列へのデータの受け渡しがうまく思った通りにいっていないのでは?
そう思います。
どうやって代入しているかいまいち良く分からなかったので、指摘出来ませんが…



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

Name: box  ..比類無きプログラマー(91,609ポイント)   Date: 2007/11/06(火) 22:47   No:11558     
Title: Re:ヒープソート    
deletemin()の
k=2*1;
は、
k = 2 * i;
が正しいでしょうか?
「イチ」ではなくて「アイ」だと思うのですけれど。

それから、main()のwhile文の中で毎回
create()
を実行しているのは正しいのでしょうか?
ヒープの情報を毎回初期化しているように見えるのですけれど。


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

Name: ark  ..ぴよぴよ(437ポイント)   Date: 2007/11/07(水) 00:00   No:11561     
Title: Re:ヒープソート    
>>雷様

fflushはprintfの次にscanf等がきた場合に実行したときになにかしら文字などをいれてからでないと表示んさかったことがあり、それが嫌なのでつけるようにしています。

iはh->sizeをインクリメントしているので1ではないです。
配列の代入などがかなり曖昧にしかわかっていないのでエラーがでないようにしただけです^^;

>>box様

おっしゃるとおりiの書き間違えでした…見落としてました・・・
あとcreateもwhileの中にいれても結果同じだと思うのですが、聞いてみるとなんかそんな感じもするので、box様のとおり考えてみます。

お二方ありがとうございました。
考えてきます!


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



Name: ibis  ..かけだし(1,218ポイント)   Date: 2007/11/04(日) 19:50   No:11503       
Title: 条件式に関して    
以下のソースで例外が投入されるのですが。


//初期化
string str = static_cast<char>(0);

...

//問題箇所
if(*(str.c_str())){
...
//ここで例外投入
}


これを以下のようにして試しましたが、結果は同じ。


//問題箇所
if(!(*(str.c_str()))){
...
//ここで例外投入
}


ちなみに以下のソースでは例外は発生しない。


//問題箇所
if(*(str.c_str())){
/* ... */
//ここで例外投入
}


!演算子に関わらずif文が実行されているようですが、どういうことでしょう?
ポインタの用法が間違ってますか?
或いはstringの用法が間違ってるのでしょうか?
それから、0をchar型にキャストしたものは偽になると思ってますが、これは合ってますか?


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


Name: ibis  ..かけだし(1,485ポイント)   Date: 2007/11/04(日) 21:37   No:11505     
Title: Re:条件式に関して    
説明不足でしたが、if文の中の処理は、strの値が偽なら例外が投入されます。


以下のソースコードでは普通に動作しました。

//問題箇所
//if(*str.c_str){
無関係な処理
//...
//ここで例外投入
//}


このコードでは例外が発生しました。

//問題箇所
if(*str.c_str){
無関係な処理
//...
//ここで例外投入
}


条件式を戻り値が偽の別の関数に置き換えてみても例外が投入されます。
条件を定数(false)にしたら例外は投入されません。

例外が投入されるのは以下の条件だと推察します。
・条件が定数でなくて、条件と処理が共にコメントアウトされていない場合
・if文の中の処理が例外を投入(これは意図された処理ですが)
どういうことですかねぇ?
ここまで考えたところで意味不明なんですが。


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

Name: Justy  ..ハッカー(169,153ポイント)   Date: 2007/11/04(日) 22:29   No:11507     
Title: Re:条件式に関して    
 環境がわからないですし、string型が std::stringのことなのか
それとも何か自作・多作の型なのかわかりませんが、
とりあえず std::stringだと仮定します。

 その謎の 0による stringクラスの初期化を止めて下さい。
 それでどうなりますか?


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

Name: たかぎ [URL]  ..上級者(17,273ポイント)   Date: 2007/11/05(月) 09:14   No:11509     
Title: Re:条件式に関して    
string が std:string の意味であるなら...

> string str = static_cast<char>(0);

は、

string str(string(NULL));

の意味です。
結果的に未定義の動作を引き起こしています。


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

Name: ibis  ..かけだし(1,527ポイント)   Date: 2007/11/05(月) 18:59   No:11517     
Title: Re:条件式に関して    
std::stringです。

そうですね。
0での初期化はミステイクでした。
等式や不等式演算子に慣れないのでそうしましたが、
よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

ちょっと試してみます。


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

Name: ibis  ..かけだし(1,584ポイント)   Date: 2007/11/05(月) 20:14   No:11518     
Title: Re:条件式に関して    
残念ながら解決できず。

条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても
何故か異常終了するのですが。

環境はBCCで、WIN32APIを使用しています。


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

Name: たかぎ [URL]  ..上級者(17,338ポイント)   Date: 2007/11/05(月) 22:39   No:11521     
Title: Re:条件式に関して    
> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?

> 条件を別の関数(デバッグ済みで、戻り値はbool型のfalse)に変えても

変えたプログラムを補足していただかなければ、何ともいえません。


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

Name: ibis  ..かけだし(1,734ポイント)   Date: 2007/11/06(火) 22:52   No:11559     
Title: Re:条件式に関して    
>> よく考えたら0での初期化をせずにempty関数を使えば済むんですよね。

>empty は、文字列が空かどうかを判定するメンバ関数ですが、別の認識をしていませんか?

言葉足らず。
空で初期化しておいて、ということです。


いろいろとやってたら解決しました。
Justyさん、たかぎさん、ありがとうございました。


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

Name: ibis  ..かけだし(1,767ポイント)   Date: 2007/11/06(火) 22:54   No:11560 解決!     
Title: Re:条件式に関して    
すみません、「解決!」マーク付け忘れました。
アイコンも「質問」になってますし。


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



Name: anonymous  ..ぴよぴよ(360ポイント)   Date: 2007/11/05(月) 23:44   No:11522       
Title: 4人対戦型ゲームにおける画面4分割の方法    
初めまして。初投稿になります。
マリオカート64やスターフォックス64等のような画面4分割方式での4人対戦型ゲームを作ろうと思っているのですが、画面分割のうまい方法が分かりません。単純に一画面640×480を4分割することも考えたのですが、その場合、画像の表示やスクロールなどの処理が煩雑になってしまい、効率が良くない気がします。もし、座標系を4画面分別々に独立に管理する方法があるのならば、教えていただきたいと思い、質問しました。また、ご存知の方がいましたら、実際にこのような4画面分割型の対戦ゲームを製作する場合、一般にはどのように4画面を管理しているのかを教えていただけると嬉しいです。

なお、私の開発環境は次の通りです。

・Microsoft社製 VisualStudio2005ExpressEdition
・Windows Platform SDK
・Microsoft DirectX SDK
・DXライブラリ VisualC++用(Ver2.23)

C/C++しての一般的な知識はあります。どうぞ宜しくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(438,473ポイント)   Date: 2007/11/06(火) 04:20   No:11527     
Title: Re:4人対戦型ゲームにおける画面4分割の方法    

うまく関数化してやれば、複雑になることも無いと思います。
例えば

typedef struct{
int x,y;
}ch_t;

ch_t ch[4];

void draw_line(int x, int y){
x,yから45度、20の距離線を引く;
}

main(){
//中略
draw_line(ch[0].x, ch[0].y);
draw_line(ch[1].x, ch[1].y);
draw_line(ch[2].x, ch[2].y);
draw_line(ch[3].x, ch[3].y);
}

上記は単なる例なので、このようには描かないと思いますが、
4つのキャラの情報をキレイに構造体に収めてやり、関数に値を渡して計算する事で、
キャラが沢山になることを苦に思わずに作れると思います。

関数を作るとき、なるべく「汎用的」な関数になるように心がける事が近道になると思います。

キャラのもつ座標の情報は全て同じ種類の座標とし、描画する時にだけ、位置をわけてやればいいんです。
キャラ1もキャラ2も(100,50)という座標を持っていたとしても、描画する時に4つにわけてやれば、重なる事もありません。

描画可能領域は変更可能ですので
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R4N3
この関数を使うとうまく分割して描画出来ます。
頑張ってください。


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

Name: anonymous  ..ぴよぴよ(418ポイント)   Date: 2007/11/06(火) 21:55   No:11550 解決!     
Title: Re:4人対戦型ゲームにおける画面4分割の方法    
管理人様。アドバイスありがとうございます。
管理人様から頂いたアドバイスを元に、色々と試行錯誤してみます。


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



Name: ドラ  ..ぴよぴよ(400ポイント)   Date: 2007/11/05(月) 20:37   No:11519       
Title: ポインタで…    
実行例
数値(0:END):2
現在までの合計:2
一つ前の合計:0
a=2, b=0
数値(0:END):5
現在までの合計:7
一つ前の合計:2
a=2, b=7
数値(0:END):7
現在までの合計:14
一つ前の合計:7
a=14, b=7
数値(0:END):9
現在までの合計:23
一つ前の合計:14
a=14, b=23
数値(0:END):3
現在までの合計:26
一つ前の合計:23
a=26, b=23
数値(0:END):0

↑のようになるようにポインタでやっているんですけど条件式とかがわかりません。
#include <stdio.h>
#include <stdlib.h>

int main() {
int a=0, b=0;
int *now, *prev;
do{
printf("数値(0:END):");
scanf("%d",&a);
now=&a;
prev=&b;
printf("現在までの合計:%d\n一つ前の合計:%d\n", *now, *prev);
printf("a=%d, b=%d\n", a, b);

}while(a!=0);

}

今はこんな感じです…


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


Name: box  ..比類無きプログラマー(91,520ポイント)   Date: 2007/11/05(月) 20:53   No:11520     
Title: Re:ポインタで…    
実行例では、aとbの大小関係がところどころ逆転していますが、
間違いなくそういう風に出力したいのでしょうか?


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

Name: ドラ  ..ぴよぴよ(406ポイント)   Date: 2007/11/06(火) 05:44   No:11529     
Title: Re:ポインタで…    
そうです。

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

Name: バグ  ..比類無きプログラマー(62,677ポイント)   Date: 2007/11/06(火) 11:54   No:11531     
Title: Re:ポインタで…    
正直、情報が少なすぎて、何をしたいのかよく意味が分からないですが…。
ポインタを使用するという事ですので、こういうことでしょうか?
一応、ドラさんの意図するような表示になるかと思いますが、かなり推測して作ったので、中身は全然違う事をやっているかもしれません…m(__)m


#include <stdio.h>

void main(void)
{
int a, b, c;
int *now, *prev, *buf;

/* 変数の初期化 */
a = 0; // 入力値
b = 0; // 現在までの合計
c = 0; // 1つ前の合計

/* ポインタの初期化 */
now = &b;
prev = &c;
buf = NULL;

/* メイン処理ループ */
while (1)
{
// 数値入力
printf("数値(0:END) : ");
scanf("%d", &a);

// 入力された値が0ならばループを抜ける
if (a == 0)
{
break;
}

// 合計値
b += a;

// 表示
printf("現在までの合計 : %d\n", b);
printf("一つ前の合計 : %d\n", c);
printf("a = %d, b = %d\n", *now, *prev);

// 一つ前の合計値を保持
c = b;

// ポインタをスワップする
buf = now;
now = prev;
prev = buf;
}
}


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

Name: ドラ  ..ぴよぴよ(425ポイント)   Date: 2007/11/06(火) 20:08   No:11539     
Title: Re:ポインタで…    
バグさんありがとうございます。

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



Name: C.P.P  ..入門者(3,713ポイント)   Date: 2007/10/29(月) 11:51   No:11337       
Title: DXによるマウス操作について    
こちらのページではいつも丁寧に教えていただいて、大変助かっております。
以前は構造体の質問をさせていただいたのですが、大変親切にご指導いただきましてありがとうございました。

さて、今回はマウスを使った関数についての質問です。

現在、Borland C++とBCCデベロッパーを用いて、簡単なアプリケーションソフトを作成しております。
自分自身で組んだプログラムを実行しますと、左上にDrawBoxで描いた画像が出てきます。その画像をマウスでクリックするとDrawLine,DrawBox,DrawTriangleで描いた家の画像が出てきます。
その画像をマウスによって動かしたいのですが、何かいい関数や、他の関数の応用などはありませんでしょうか?

出来るだけ自分自身で、組んでみたのですが、どう頑張っても出来ませんでした・・・
ヒントやコツ等でもぜんぜん助かりますので、どなたか教えていただけないでしょうか??

宜しくお願いいたしますm(v_v)m


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


Name: \n  ..ぴよぴよ(108ポイント)   Date: 2007/10/29(月) 12:50   No:11338     
Title: Re:毎度お世話になっております。    
回答ではないです。

質問に関係あるタイトルをつけれませんか?

お世話になっているとか、わからないとかは本文に書けばいいです。
もっと重要な「なにについての質問なのか」ということが分かるようにタイトルをつけましょう。


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

Name: C.P.P  ..入門者(3,784ポイント)   Date: 2007/10/29(月) 14:43   No:11341     
Title: Re:毎度お世話になっております。    
分かりました。
こちらの不手際で気分を害してしまいまして申し訳ございません。
これから気をつけます。

また、タイトル変更までしていただきましてありがとうございました。

回答ではありませんでしたが、今後為になる指摘でした。
ありがとうございました☆


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

Name: tkmakwins15 [URL]  ..プログラマー(34,380ポイント)   Date: 2007/10/29(月) 18:12   No:11346     
Title: Re:毎度お世話になっております。    
マウスによってグラフィックを動かしたいのですよね?
見当違いかもしれませんが、マウスに四角形がついていくプログラムのサンプルコードを載せます。

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int x=320-16,y=240-16;
int moux,mouy;

ChangeWindowMode(TRUE);
SetMainWindowText("sample");
SetOutApplicationLogValidFlag(FALSE);
if(DxLib_Init()==-1)return -1;
SetDrawScreen(DX_SCREEN_BACK);

while(ProcessMessage()!=-1&&CheckHitKey(KEY_INPUT_I)==0){

DrawBox(x,y,x+32,y+32,GetColor(0,0,255),FALSE);

ScreenFlip();
ClearDrawScreen();

GetMousePoint(&moux,&mouy);
x=moux;
y=mouy;

}
DxLib_End();
return 0;
}

プログラム実行中に[i]キーを押すと終了します。


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

Name: Justy  ..ハッカー(168,016ポイント)   Date: 2007/10/29(月) 20:11   No:11348     
Title: Re:毎度お世話になっております。    
 マウスによるドラッグ処理ですね。
 やらなければならない要素はいくつもあり、ちょっと大変です。

 一応前回投稿されていたときには、オブジェクト(箱状)とマウスのクリックが
接触した状態の検出までは出来ていました。


 ここから、そのまま押しっぱなしになっている状態でマウスが移動したら、
それに合わせてオブジェクトを移動させ、マウスを離したらそこでオブジェクトの
移動を止める、という処理を加えます。

 つまり、マウスがどういう状態にあるかを毎フレームチェックして、
状態が変化したことを検出する必要があります。

 これには家の情報に「今オブジェクトがドラッグされているかどうか」のフラグを
追加して下さい。
 ドラッグされていない状態で、マウスのクリックがオブジェクトに接触していたら
ドラッグ開始なので、そのフラグを立てます。
 反対にドラッグされているフラグがついているのに、マウスが押されていなければ
そこでドラッグ終了ということで、フラグを下ろします。

 ドラッグされているフラグが立っているなら、マウスの動きに追わせて、
オブジェクトの位置を変更します。


 ここで注意が必要なのですが、マウスの位置とオブジェクトの位置を同じに
してしまうと、マウスを押した瞬間にオブジェクトが移動してしまいます。

 接触の判定を点と点でやっているわけでなく箱と点でやっている為、
マウスの位置と箱の(管理上の)位置にはずれがあります。
 そのずれを無視して、位置を同じにしてしまうと瞬時にズレが発生するというわけです。

 そこで、そのずれがどれだけあるかをクリックされた時に調べて、オブジェクトを
移動させるときにそのずれの分だけずらして、オブジェクトの位置を設定しなければ
なりません。

 ここまでやって、普通のドラッグ処理は完成します。


 サンプルを添付しました。

・ drag_test1.cpp
 C.P.Pさんのコードの改良版
 マウス中央ボタンで表示・非表示の切り替え

・ drag_test2.cpp
 クラス版
 左ドラッグで複数のオブジェクトをドラッグ
 右ドラッグで1つのオブジェクトをドラッグ


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

Name: C.P.P  ..入門者(4,151ポイント)   Date: 2007/10/30(火) 17:38   No:11370     
Title: ご指導ありがとうございます。    
tkmakwins15さん、Justy さん本当に助かりました☆
丁寧にサンプルプログラムまで書いていただき、ありがとうございます。

> tkmakwins15さん
全くもって見当外れなんかではありません☆
今まで全くもってマウスを用いた座標移動上手く行かなかった私に大変助かる助け舟です☆
大変参考にさせていただきました♪ありがとうございます。

>Justy さん
またまた、丁寧なサンプルプログラムありがとうございます☆
しかも私が以前載せさせていただいたプログラムから、サンプルを作っていただけるなんて♪
ちょっと感動してしまいました☆
現在、そのプログラムの中身を理解しようと必死です。
本当にありがとうございます。

さて、Justy さんのサンプルプログラムを勉強してる中で、家を描写するプログラム

DrawBox
(
home->disp_pos.x+home->scale*1, home->disp_pos.y+home->scale*3,
home->disp_pos.x+home->scale*9, home->disp_pos.y+home->scale*11,
home->is_dragging? Yellow: White, TRUE
);

(これは、白い四角い四角形の塗りつぶしの描写)
というのがあるんですけど、今まで私がやってきました描写関数では全く理解が出来ませんでした↓

まだ、たいしたプログラム能力もありませんで申し訳ございません↓
お手数おかけしますが説明、ご指導お願いします・・・

よろしくお願いします☆


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

Name: 管理人 [URL]  ..伝説のハッカー(438,338ポイント)   Date: 2007/10/30(火) 17:57   No:11371     
Title: Re:ご指導ありがとうございます。    
中身のプログラムは見ていないのですが、
いつも使っていらっしゃるドローボックス関数と同じです。
引数の描き方がちょっと特殊なだけで。
第四引数までの理解はOKでしょうか?第五引数は三項演算子が使われているようです。
こちらで勉強してみてください。

http://www5c.biglobe.ne.jp/~ecb/java/05_08.html


(条件式) ? @ : A

 

とかく事で、if文を使わずに条件分岐させる事が出来ます。
具体的には
home->is_dragging
の値によって黄色にするか白にするか決めているようです。
条件式 にあたる部分はべつに式でなくてもよく、

if(1){
@;
}

if(0){
A;
}

でどのような処理が行われるかと考えたらわかるとおり、真か偽かを示せばOKです。


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

Name: C.P.P  ..入門者(4,405ポイント)   Date: 2007/10/30(火) 18:55   No:11378 解決!     
Title: ありがとうございます。    
返信ありがとうございます。
さっそくURL内で勉強させていただきました。

if文の他にもこんな関数があるとは・・・
まだまだ勉強が全然足りないみたいですね↓すいません。

しかし、おかげさまで描写関数のほう理解できました☆ありがとうございます♪

まだまだ分からないところが多すぎて、質問ばかりしてしまいます。
本当にご迷惑かけまして申し訳ございません。

また分からないとき質問させてください。どうぞよろしくお願いします☆

今回は、tkmakwins15さん、Justyさん、管理人さん、本当にありがとうございました♪


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

Name: Justy  ..ハッカー(168,233ポイント)   Date: 2007/10/30(火) 20:19   No:11379     
Title: Re:ありがとうございます。    
現在、そのプログラムの中身を理解しようと必死です
 実は微妙に挙動がおかしいのですが、まぁそこは中身が出来次第修正してみて下さい。


DrawBox
 基本的に管理人さんが書かれている通りです。
 少しだけ補足すると、第1〜第4引数が複雑になっているのは、
動的に表示位置などを決めなければならない(直接数値を埋め込んでしまうと
移動できない!)からです。

 加えて、実はマウスのホイールを回すと「家」のスケールが変わるようになっています。
 その為、home->disp_pos.x+home->scale*3のような複雑な式になっています。


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

Name: C.P.P  ..初心者(5,100ポイント)   Date: 2007/10/31(水) 13:33   No:11396     
Title: マウスクリックによる処理について・・・    
ありがとうございます☆

確かに、ホイールを回すと大きさが変わりました♪
凄いですね!いつか私も自身でこんなプログラム作れるように勉強頑張ります!

さて、またまた質問なんですが申し訳ございません・・・
WinMain関数の中の部分

for(;;)
{
// 画面を消す
if(ProcessMessage()== -1) break;

// マウス情報更新
MouseInfo_Update(&mouseInfo);

haikei ();

if((0<=MouseX && MouseX<32) && (0<=MouseY && MouseY<32) && (( MouseInput &&
     MOUSE_INPUT_LEFT ) != 0)){

// ホーム情報更新・描画
React_Update(&react, &mouseInfo);
React_Draw(&react);

}

// 位置情報表示
DrawStatus_String(&mouseInfo, &react);

// フレーム更新
FrameUpdate();
}

Destroy();
return 0;
}

でマウスによってクリックした際に、家の画像が出てその画像をマウスによって移動する(このマウスによって移動する処理は教えていただきました部分です)処理を付け加えたいので、

if((0<=MouseX && MouseX<32) && (0<=MouseY && MouseY<32) &&
               (( MouseInput && MOUSE_INPUT_LEFT ) != 0)){ホーム情報更新・描画  }

という処理を付け加えたのですが、クリックしても画像が出てきません・・・

以前マウス移動処理が分からない時に、上記処理を使っていましたら画像は出てきたのですが・・・
なにか、マウス移動処理を行うことによって、違う処理方法でなければ処理できなくなってしまったのでしょうか?

ご教授お願いいたしますm(v_v)m


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

Name: Justy  ..ハッカー(169,013ポイント)   Date: 2007/10/31(水) 23:31   No:11416     
Title: Re:マウスクリックによる処理について・・・    
以前マウス移動処理が分からない時に、上記処理を使っていましたら画像は出てきたのですが

 前のプログラムとの大きな違いは毎フレーム全画面消去を行っているかどうか、です。
 今回の私のサンプルでは毎回ループを繰り返す度に全画面を消しています。

 つまり、条件を満たしたときだけ処理をしたのでは、その時の一瞬しか表示されません。

 なので、Home_Update()/Home_Draw()は if文の中から外し、通常通りの処理に戻して下さい。

 その上で、Home構造体の表示の状態を表すメンバ is_displayのデフォルトを FALSEにし、
起動時には非表示になるようにします。
 で、特定の場所で条件を満たしたら、is_displayを TRUEにして下さい。
 これで表示されます。

 つまり、処理の流れとしては

if(条件)
{
 表示するようリクエストする(フラグを立てる)
}

if(表示フラグが立っているなら)
{
 表示
}

 という流れになります。

 この中で、「if((表示フラグが立っているなら)〜表示」の処理は Home_Draw()で
既に行っているので、実際には条件に応じて「表示するようリクエストする」だけで
いいと思います。


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

Name: C.P.P  ..入門者(4,827ポイント)   Date: 2007/11/06(火) 14:24   No:11534     
Title: ありがとうございます。    
返信遅くなりまして大変申し訳ございません・・・
ここ2〜3日風邪ひいてまして、なかなかPCに触れ合う機会がありませんで↓

Justy さん返信ありがとうございます。
今日から復活しましたので早速書き換えて実行してみたところ巧くいきました☆

大変助かりましたありがとうございます☆

さて、またまた質問です。
何度も質問して申し訳ないのですが・・・

// 家を囲む箱の一片の半分の長さ
const int rangeX = home->scale * 10 / 2, rangeY = home->scale * 11 / 2;

と、いう部分があるではないですか?この部分の10/2みたいな数値は何を表しているのですか?
大きさですか?それとも座標でしょうか?

ご教授お願いいたしますm(>_<)m


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

Name: C.P.P  ..入門者(4,933ポイント)   Date: 2007/11/06(火) 18:22   No:11537 解決!     
Title: Re:ありがとうございます。    
申し訳ございません・・・
なんとか自主解決いたしました☆おそらく・・・

今までたくさんのアドバイスをくれた方々、本当にありがとうございました♪

また、何か分からなくて質問すると思います(^o^;
その際には宜しくお願いいたします!

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


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



Name: Y  ..ぴよぴよ(169ポイント)   Date: 2007/11/06(火) 16:59   No:11535       
Title: ウインドウベースのソフトにするには    
導入のVisualC++ 2005 Express Edition でウインドウベースのソフトを作成できるようにする際に
corewin_express.vsprops の 8行目の

AdditionalDependencies="kernel32.lib" />

 という部分を

AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" />

 に変更して保存
と書いてあるのですが保存しようとパスおよびファイル名が正しいか確認してください
と出ます。
どうすれば保存できますか?もしご存知の方いらっしゃいましたら教えてください


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


Name: Y  ..ぴよぴよ(187ポイント)   Date: 2007/11/06(火) 17:46   No:11536 解決!     
Title: Re:ウインドウベースのソフトにするには    
お騒がせしました。解決しました

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



Name: にゃむ  ..かけだし(1,162ポイント)   Date: 2007/11/06(火) 11:25   No:11530       
Title: スクリプタを作りたいのですが……    
はじめまして。
現在こちらのシューティングゲームの館を参考にしながら、シューティングゲームを作成しようとしているプログラミング初心者です。
館に載っていた分は目を通したのですが、ひとつ知りたかったことで載っていないため、わからないことがあり質問をお願いさせていただきます。

質問の内容は、敵の発生に関してなのですが、敵の発生を外部のテキストファイルに1行目から順に1行ずつ、

[敵が発生するカウント値],[発生する敵の画像種類のフラグ値],[発生する敵の移動速度のX方向設定値],[発生する敵の移動速度のY方向設定値],[発生する敵の攻撃パターン],[発生する敵の初期X座標],[発生する敵の初期Y座標],[倒された時に出すアイテムの種類フラグ],\n

と記述しておき、
本体のプログラムの方ではcounterの値が1増える間に、counter==[敵が発生するカウント値] の行のデータだけを外部テキストファイルから読み取って、","で区切られた文字列ごとに、事前に本体プログラムの中に定義しておいた敵構造体、

typedef struct enemy_kouzou{
   int enemy_starttime;
int enemy_type_flag;
double enemy_speed_x;
double enemy_speed_y;
int enemy_atacck_type;
double enemy_syoki_x;
double enemy_syoki_y;
int item_type;
int flag;
}enemy_k

の中に、counter==[敵が発生するカウント値] の敵データをそれぞれ読み込ませて発生させる、というプログラムを作成したいのですが……
こういったモノを作りたい場合、
1外部テキストファイル内の行数を1000までに制限しておくとして、

手順@
enemy_k enemy[1000];
int enemy_No = 0;
でenemy_k構造体を1000個用意する&初期値0の変数enemy_Noを作成。

手順A
初期化時に、fopen関数で敵データの入った対象の外部テキストファイルの読み込み→while(1)でループ開始→fgets関数で外部テキストファイルから1行読み込む→読み込んだ行のデータを","ごとに区切って構造体enemy[enemy_No]に代入→if文で読み込んだ行の末端が\0ならbreak;を行ってwhileから脱出。\nならenemy_No++ で次のenemy構造体への準備→whileで戻る。

としておき、
あとはゲーム進行中に、敵の発生ルーチン部でwhile文とif文とを組み合わせて、条件が
count==enemy[enemy_No].enemy_starttime
となった場合には、そのenemy_Noの敵が発生する。
というようにプログラムを行えばいいのでしょうか?


長文で質問内容が判りづらくなってしまっていたらすみません。
ようはシューティングゲームとしての基本機能は本体プログラムに定義しておき、敵が発生するタイミングや発生する敵がどのタイプなのかについての情報は別ファイルに用意しておいて、
その別ファイルの部分で発生する敵のタイミングやタイプについての値を変えたり、その別ファイルを複数用意して入れ替えるだけで
敵の出現パターンや内容を簡単に変化させられるようにしたいのです。
よろしくおねがいします。


あ、あとできましたら、「読み込んだ行のデータを","ごとに区切って構造体へと代入」する方法についても、どなたかサンプルプログラムなどを見せていただけないでしょうか……





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


Name: バグ  ..比類無きプログラマー(63,694ポイント)   Date: 2007/11/06(火) 13:37   No:11532     
Title: Re:スクリプタを作りたいのですが……    
こんな感じでしょうか?


#include <stdio.h>

typedef struct enemy_kouzou
{
int enemy_starttime;
int enemy_type_flag;
double enemy_speed_x;
double enemy_speed_y;
int enemy_atacck_type;
double enemy_syoki_x;
double enemy_syoki_y;
int item_type;
int flag;
} enemy_k;


// 構造体の読み込み処理
// 戻り値 0 = NG : 1 = OK
int load_struct(FILE* fp, enemy_k* buf)
{
int check;

check = fscanf(fp, "%d, %d, %lf, %lf, %d, %lf, %lf, %d, %d\n",
&buf->enemy_starttime,
&buf->enemy_type_flag,
&buf->enemy_speed_x,
&buf->enemy_speed_y,
&buf->enemy_atacck_type,
&buf->enemy_syoki_x,
&buf->enemy_syoki_y,
&buf->item_type,
&buf->flag);

if (check != 9 || check == EOF)
{
return 0;
}

return 1;
}

void main(void)
{
int i;
FILE* fp = NULL;
enemy_k ek[1000];

if ((fp = fopen("EnemyData.txt", "rt")) == NULL)
{
printf("File Open Error!!\n");
return;
}


for (i = 0; i < 1000; i++)
{
if (load_struct(fp, &ek[i]) == 1)
{
printf("Index[%04d]\n", i);
printf("enemy_starttime = %d\n", ek[i].enemy_starttime);
printf("enemy_type_flag = %d\n", ek[i].enemy_type_flag);
printf("enemy_speed_x = %f\n", ek[i].enemy_speed_x);
printf("enemy_speed_y = %f\n", ek[i].enemy_speed_y);
printf("enemy_atacck_type = %d\n", ek[i].enemy_atacck_type);
printf("enemy_syoki_x = %f\n", ek[i].enemy_syoki_x);
printf("enemy_syoki_y = %f\n", ek[i].enemy_syoki_y);
printf("item_type = %d\n", ek[i].item_type);
printf("flag = %d\n", ek[i].flag);
printf("\n");
}
else
{
break;
}
}

fclose(fp);
}


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



Name: 大工  ..プログラマー(25,547ポイント)   Date: 2007/11/06(火) 02:08   No:11525       
Title: 内部ハッシュ法について    
内部ハッシュ法のプログラムを作成している時, 教授に「挿入において, deletedがあってもemptyを探すようにしなさい」といわれました.

ご存知だとおもいますが, deletedは過去にデータが蓄えられていたが削除されたもの

emptyは1度もデータがたくわえられたことがないものをあらわしています.

理由は同じものがないか挿入の前に探索を行う際にdeletedの状態のセルに入力してしまうと同じ値をもつセルが2つ出来てしまう可能性が出てしまうからなんですが、、、

このdeletedはいつ再利用されるのでしょうか?

表がいっぱいになった状態(deletedとoccupy)?それともすべてがdeleted?


ご協力おねがいします.


※occupyはデータがもうすでに入力されている状態を表します.


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




Name: TS  ..ぴよぴよ(185ポイント)   Date: 2007/11/05(月) 14:56   No:11515       
Title: 数値の取得    
 C++以外のアプリケーション(私はMATLABというソフトを使っています)で計算された値をC++のプログラムに使用できるようにしたいのですが、他アプリケーションに保存されている数値を取得するにはどういったプログラムを組めばいいのか教えてください。
 
 似たようなプログラムを見つけたのですが、いまいちわかりません。
 
 error = DS_get_var_addr(board_index, "Xe", &Xe);
if (error != DS_NO_ERROR)
return false;

 計算値はData Storeというものに保管されているようなので、上のプログラムでいうとDS_getとい記述がData Storeからデータを持ち出すみたいなことで、その中から"Xe"という数値を選択して読み込むということなのかなと考えていますがどうなのでしょうか


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




Name: ゴールドマン  ..ぴよぴよ(74ポイント)   Date: 2007/11/02(金) 15:44   No:11462       
Title: 数字を3桁ごとにカンマ付文字列に変換する    
数字を、文字列の変換するために sprintf関数でできることは知っていますが、文字列内に3桁毎にカンマを付加しなくてはならなくなりました。(マイナス記号も表示できるようにする)

sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?


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


Name: たかぎ [URL]  ..上級者(16,967ポイント)   Date: 2007/11/02(金) 16:18   No:11464     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
> sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?

処理系不明の状況では、拡張などあり得ません。


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

Name: ゴールドマン  ..ぴよぴよ(230ポイント)   Date: 2007/11/02(金) 17:42   No:11467     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
失礼いたしました。開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。


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

Name: たかぎ [URL]  ..上級者(16,990ポイント)   Date: 2007/11/02(金) 18:47   No:11469     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
> 開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。

無理です。自分で機能を実装してください。


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

Name: box  ..比類無きプログラマー(91,461ポイント)   Date: 2007/11/02(金) 21:51   No:11475     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    

ほんのちょっとした例です。


#include <stdio.h>

void addComma(int num, int mod, int d)
{
int m = num / 10, n = num % 10;

if (num == 0 && d != 0)
return;
addComma(m, n, d + 1);
printf("%d%s", m == 0 ? n : n < 0 ? -n : n, d && d % 3 == 0 ? "," : "");
}

int main(void)
{
int i;

for (i = -100000; i <= 100000; i += 100)
addComma(i, 0, 0), putchar('\n');
return 0;
}


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

Name: box  ..比類無きプログラマー(91,471ポイント)   Date: 2007/11/02(金) 23:16   No:11477     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
addComma()の第2引数は不要でありました。

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

Name: ゴールドマン  ..ぴよぴよ(394ポイント)   Date: 2007/11/04(日) 14:53   No:11499 解決!     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
おお、サンプルコードありがとうございます。比類無きプログラマーさま。
論理は理解しました。
自分なりに組みなおしてみました。
void AddCmm(int num,char *buf) {
int xx = num;
int pp = 0;
int qq = 0;
do{ xx/=10; pp++;} while(xx);
pp += (pp-1) / 3;
buf[pp]=0x00;
while (pp>0){
buf[--pp] = (num % 10) + 0x30;
num /= 10;
if(++qq==3){
buf[--pp] = ',';
qq = 0;
}
}
}
問題、解決しました。


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

Name: GPGA  ..プログラマー(38,235ポイント)   Date: 2007/11/05(月) 11:02   No:11512     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
上記のコードですが、マイナスの値を入れると表示がおかしくなります。
また、ちょうど3桁の場合、エラーが発生しますが大丈夫でしょうか?


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

Name: ゾン兵衛  ..ぴよぴよ(775ポイント)   Date: 2007/11/05(月) 14:51   No:11514     
Title: Re:数字を3桁ごとにカンマ付文字列に変換する    
 
 表示のみと文字列変換、二通り考えてみました。


#include <stdio.h>

#define LEN_MAX 32

void addComma(int n)
{
int p = n / 1000, q = n % 1000;

if(!p){
printf("%d", n);
return;
}
addComma(p);
printf(",%03d", q < 0 ? -q : q);
return;
}

char *saddComma(char *s, int n, size_t l)
{
int p = n / 1000, q = n % 1000;

if(!p){
size_t i;

for(i = 0; n /= 10; i++) ;
i += 1 + (q < 0);
if(l <= i) return NULL;
sprintf(s, "%d", q);
return s + i;
}
if(!(s = saddComma(s, p, l - 4))) return NULL;
sprintf(s, ",%03d", q < 0 ? -q : q);
return s + 4;
}

int main(void)
{
int n;
char s[LEN_MAX];

scanf("%d", &n);
addComma(n);
putchar('\n');
if(!saddComma(s, n, LEN_MAX)) puts("Area is not enough.");
else puts(s);
return 0;
}


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



Name:  ..ぴよぴよ(21ポイント)   Date: 2007/11/04(日) 21:10   No:11504       
Title: こんばんわ    
今レジの精算ファイルについて課題を行っています。その日の日付をプログラムに使うにはどのようにつかったらよいのでしょうか。

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


Name: ibis  ..かけだし(1,510ポイント)   Date: 2007/11/04(日) 21:44   No:11506     
Title: Re:こんばんわ    
http://www.kumei.ne.jp/c_lang/intro/no_26.htm
このサイトとかどうでしょう。


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

Name: バグ  ..比類無きプログラマー(63,163ポイント)   Date: 2007/11/05(月) 13:12   No:11513     
Title: Re:こんばんわ    
http://www.bohyoh.com/CandCPP/FAQ/index.html

C言語であれば、ここにサンプルが載ってますよ(^-^)


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



Name: ぱそぴ  ..ぴよぴよ(251ポイント)   Date: 2007/11/02(金) 10:53   No:11456       
Title: 音楽を再生するプログラムについて    
はじめまして。私は卒業制作でDXライブラリを使ってゲームを作ろうと考えている短期大学2年生です。
「C言語〜ゲームプログラミングの館〜」というページはとても参考になっています。

質問なのですが、「C言語〜ゲームプログラミングの館〜」の#15、「音楽を流す」という項目でつまずいてしまっています。
mp3ファイルをPlayMusic関数で再生すると正常に動作するのですが、PlaySound関数でmp3ファイルを再生しようとすると、動作が異常に重くなり、DXライブラリからの応答がなくなってしまいます。
また、音楽も再生する事が出来ません。
ファイルをメモリに読み込んで再生する事も出来ませんでした。


原因がよく分からないので、かなり初歩的なことかもしれませんが、どなたか助言をお願いします。



ちなみに、私のパソコンの環境は、
windowsXP、Pentium(R)4 CPU2.0GHz、メモリ512MB
開発環境は、
borland C++、BCCDeveloper
です。


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


Name: miyaza  ..中級者(10,394ポイント)   Date: 2007/11/02(金) 16:12   No:11463     
Title: Re:音楽を再生するプログラムについて    
PlaySound関数はWAV再生専用だった気がします。

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

Name: tkmakwins15 [URL]  ..プログラマー(36,811ポイント)   Date: 2007/11/02(金) 16:53   No:11465     
Title: Re:音楽を再生するプログラムについて    
PlaySoundはmp3もいけます。出来ればその戻り値を調べてみてください。

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

Name: miyaza  ..中級者(10,420ポイント)   Date: 2007/11/02(金) 17:05   No:11466     
Title: Re:音楽を再生するプログラムについて    
>PlaySoundはmp3もいけます。
あれ、そうでしたか。
すみません勘違いしてました。


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

Name: バグ  ..比類無きプログラマー(62,162ポイント)   Date: 2007/11/02(金) 19:24   No:11470     
Title: Re:音楽を再生するプログラムについて    
>>miyazaさん
Win32APIのPlaySound関数はwav専用ですが、DxLibのPlaySound関数は様々な形式に対応しているようですよ。


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

Name: miyaza  ..中級者(10,488ポイント)   Date: 2007/11/02(金) 20:01   No:11471     
Title: Re:音楽を再生するプログラムについて    
>Win32APIのPlaySound関数はwav専用ですが、DxLibのPlaySound関数は様々な形式に対応しているようですよ。
APIと同じだと思ってました。
どうもありがとうございます。


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

Name: ぱそぴ  ..ぴよぴよ(302ポイント)   Date: 2007/11/05(月) 10:23   No:11510     
Title: Re:音楽を再生するプログラムについて    
返信が遅くなってすみません。
回答ありがとうございます。

音楽再生のプログラムについてなのですが、別のパソコンで同じプログラムを実行させたところ、何故か音楽が再生されました。おそらく、最初にPleySound関数を使ったパソコンに何らかのトラブルがあったかもしれません。

お騒がせしてすみませんでした。


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



Name: ど素人  ..ぴよぴよ(18ポイント)   Date: 2007/10/28(日) 15:21   No:11315       
Title: マップ作成について    
いつもこのサイトにお世話になっています。

初心者なんですが、今RPG用にマップを作成しようと思っています。
それで、下から順に
1.地面
2.建物
3.人物
という風に3層に分けて作りたいのですがどういう風にしたらいいのでしょうか?


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


Name: TKSZ  ..ぴよぴよ(183ポイント)   Date: 2007/10/28(日) 20:53   No:11322     
Title: Re:マップ作成について    
>>それで、下から順に
>>1.地面
>>2.建物
>>3.人物
>>という風に3層に分けて作りたいのですがどういう風にしたらいいのでしょうか?

そのままプログラムすればいいと思いますよ。
レイヤーという概念を知っておくといいかもです。
いや、別にレイヤー知らなくてもいいですが…(汗
*プログラムは、上から下へ順番に実行されていきます。
ですから、上の方のコードに地面を描画する関数を配置し、
次に建物を描画する関数を配置し、最後に人物を描画する関数を配置
すれば、いいわけです。

while(1)
{
DrawMapAboutGround();
DrawMapAboutBuilding();
DrawMapAboutHuman();
//後は適当な処理をババッ(?)とやればできます。
}


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

Name: TKSZ  ..ぴよぴよ(203ポイント)   Date: 2007/10/28(日) 21:07   No:11323     
Title: Re:マップ作成について    
すいません、サイズが大きかったみたいです。
今度は貼れるかな(汗…


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

Name: TKSZ  ..ぴよぴよ(294ポイント)   Date: 2007/10/28(日) 21:10   No:11324     
Title: Re:マップ作成について    
マップデータを作るには、上記のようなマップエディタを作るといいですよ。
いちいち、
int MapData01[300][300]={0,0,0,0,1,2,3,4,5…};

と作っていたら気が遠くなります。

以前、VB + C++ + DXライブラリでSTGを作ったときのマップエディタです。
何かの参考になれば幸いです。


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

Name: ど素人  ..ぴよぴよ(109ポイント)   Date: 2007/10/29(月) 19:29   No:11347     
Title: Re:マップ作成について    

返信ありがとうございます。

それと今更なんですが、
そのマップではフリーのチップの素材を使わせてもらおうと思ってるんですが、
チップを使ってマップを作るのはどうやったらいいのでしょうか?



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

Name:  ..中級者(10,800ポイント)   Date: 2007/10/29(月) 22:03   No:11351     
Title: Re:マップ作成について    
map[][]{
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
};

の様に配列で指定して、番号によって表示するものを決定すれば良いのではないかと思っていますが、
どうでしょうか?
もちろんこれをフィールドとして、その上に動作するものを表示すると考えます。
それよりも、MAPはBMPとかで読み込んだほうが確実に早くてらくだと思いますが・・・・。
TKSZさんの言うようにマップエディタを作るのが良いと思うのですが、僕自身がやろうとしていて成功していないので、なんともいえません。
なので、
マップはBMPなどを読み込む。
二次元は配列で行動可能場所を決定する。
その上に人を描画する。
マップエディタには番号をはじき出すのもあるかと思いますので、それを探して利用しても良いかもしれません。
参考になれば良いかと思い居ます。
間違っているところがあればご指摘お願いします。


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

Name: ど素人  ..ぴよぴよ(140ポイント)   Date: 2007/11/05(月) 04:01   No:11508 解決!     
Title: Re:マップ作成について    

数々の回答ありがとうございます。

頑張ってみますね。



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



Name: マクまく  ..ぴよぴよ(23ポイント)   Date: 2007/11/04(日) 05:03   No:11497       
Title: サイトについての質問    
マークアップ言語やビジュアル系言語を使わずにC言語でのゲーム作成を学ぼうと思うのですが
http://dixq.net/g/
上記のサイトでは全てC言語で説明されているのでしょうか?

超初歩的な質問で申し訳ありませんがよろしくお願いします。


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


Name: tkmakwins15 [URL]  ..プログラマー(36,853ポイント)   Date: 2007/11/04(日) 07:11   No:11498     
Title: Re:サイトについての質問    
基本はC言語ですがソースファイルの拡張子はcppにしてください。

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

Name: マクまく  ..ぴよぴよ(0ポイント)   Date: 2007/11/04(日) 16:39   No:11500 解決!     
Title: Re:サイトについての質問    
回答ありがとうございます。
これで心置きなく作成に取り組めそうです。


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

Name: tkmakwins15 [URL]  ..プログラマー(36,896ポイント)   Date: 2007/11/04(日) 18:20   No:11501     
Title: Re:サイトについての質問    
余談ですが、実際に使う言語はC++(Cの拡張なのでもちろんC言語としても使える)なので、拡張部分を遣うということも出来ますよ。

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

Name: マクまく  ..ぴよぴよ(46ポイント)   Date: 2007/11/04(日) 19:02   No:11502 解決!     
Title: Re:サイトについての質問    
いい機会なのでC++も勉強しながら作成したいと思います。
詳しい解説どうもありがとうございましたm(__)m


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



Name: AISU  ..かけだし(1,287ポイント)   Date: 2007/11/03(土) 12:26   No:11481       
Title: 続: ファイルからの値取得    
先日、ファイルからの値取得の課題について質問をさせていただきましたものです。
おかげさまで、バグ様をはじめ皆様のご助言のもと何とか無事プログラムを組みあげることができました。
ありがとうございました。

さて、またしても皆様のお力添えを受けたい問題にぶつかってしまったのですが、
ご助言の程いただけないでしょうか、、、、。


A,B,C,Dの動きをシュミレーションして、毎秒ごとのA,B,C,Dの位置と衝突する秒数を画面に表示しなさい。
ただし衝突した場合、対象の物体は衝突判定の対象外となるようにする。

A,B,C,Dの初期位置関係の図(添付ファイル)

ただし、プログラムは下記の仕様を満たすこと。
・各矩形の初期位置及び大きさ、移動速度は任意の場所にあるtxtファイルに記述されているものとし、
ファイルから読み込んで設定できるものとする。
・物体の数の増減はファイルに記述されているデータ数で設定できる。
(ファイルにデータを追加すれば数が増える)
・物体は上下左右だけではなく、斜めにも移動できる。

環境は前回同様、コンパイラはVisual C++ 2005 Express Editionで、
パソコンのOSはXPです。
前回の課題を終えて、現在は、ファイルからの値の取得の方法自体は理解しているつもりです。
また前回、矩形の位置や大きさは左上の頂点と、幅、高さをファイルから値取得することで全頂点の位置を決定できることにしました。
これは、今回も変えずにいきたいと思います。
速度については本当に任意の値で構わないそうですが、あまりに衝突速度が早すぎて通り抜けた場合の対処は、かなり難しいので今回は考えなくていいそうです。

以上、長々と書きましたがなにとぞご協力の程よろしくお願いします。



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


Name: バグ  ..比類無きプログラマー(62,554ポイント)   Date: 2007/11/03(土) 19:34   No:11489     
Title: Re:続: ファイルからの値取得    
図を見る限り、今回はX軸上だけの動きではなく、Y軸の動きもプラスされるみたいですね。

という事は前回にもありましたが、『絶対に衝突しない』という場合が出てきますよね。そういう場合の処理はどうするのでしょうか?無限ループに陥ってしまうのはあまり好ましいとは言えないと思うのですが…。

今回の課題で必要な値は各矩形ごとに、前回の課題に使った物に加えて『衝突したかどうかの判定用の変数』、『X軸の移動量』、『Y軸の移動量』の3つが追加される事になります。これらをまとめて構造体で管理すると分かり易いのではないでしょうか?

@矩形の左上のX座標
A矩形の左上のY座標
B矩形の幅
C矩形の高
D1秒辺りのX軸の移動量
E1秒辺りのY軸の移動量
F衝突したかどうかの判定用変数

構造体のメンバ変数は上記の7つが必要になると思います。


それから、ファイルから読み込むデータ数によって矩形の数が変わるという事は、動的にメモリを確保しなければいけません。

ここまでは理解できますか?


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

Name: AISU  ..かけだし(1,328ポイント)   Date: 2007/11/03(土) 19:43   No:11490     
Title: Re:続: ファイルからの値取得    
バグ様、早速のご返答ありがとうございます。
今回もお世話になります;;

はい、今のところのご説明は理解できます。


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

Name: AISU  ..かけだし(1,356ポイント)   Date: 2007/11/03(土) 19:59   No:11491     
Title: Re:続: ファイルからの値取得    
今回は、どの矩形とも他の矩形と一度も衝突しないという場合は除外して考えても良いかと思います。

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

Name: バグ  ..比類無きプログラマー(63,038ポイント)   Date: 2007/11/03(土) 20:03   No:11492     
Title: Re:続: ファイルからの値取得    
まず、ファイルに中に書き込まれている構造体に格納するためのデータ数を知る事が必要になりますよね。
一番分かり易いと思われる方法は、fscanf関数の戻り値を利用して、ファイルの終端かエラー値が返ってくるまで空読みをさせて、成功した回数だけ構造体用の領域をmalloc関数を使って確保し、もう一度改めてファイルのデータを読み直す…というのが分かり易いのではないかと思います。

いきなりこの課題の中で一番の難関かと思いますが、まずは、ここまでの流れを自身でコーディングして、ここに投稿してみてください。

一気に終わらせようとすると混乱しますので、1ステップずつこなして行きましょう!!


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

Name: AISU  ..かけだし(1,597ポイント)   Date: 2007/11/03(土) 20:32   No:11493     
Title: Re:続: ファイルからの値取得    
ありがとうございます。
私、今学校におりまして、今日はもう自宅に帰らねばなりません。
しかし、自宅ではネットに接続できる環境がございませんので、
明日、今解説していただいたところまでのコーディングを何とかしてみて、
明日またこちらに書き込みたいと思います。

もし、バグ様にお時間がおありでしたら、
明日までにできる限り自宅でコーディングしたいですので、
私のメールアドレス宛てに、今後すべき最後までの手順を送っていただけたらありがたいです;;
メールでしたら携帯からでも拝見できますので、、
よろしくお願いします。


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

Name: バグ  ..比類無きプログラマー(63,114ポイント)   Date: 2007/11/04(日) 00:10   No:11495     
Title: Re:続: ファイルからの値取得    
明日は時間が取れないので、申し訳ないですがサンプルを載せておきます。
細かくコメントを入れておきましたので、参考にしてください。
急いで作ったので、テストもロクにしてませんし、どこか間違っているかもしれませんので、あくまでもコーディングの流れを見る参考程度にとどめておいてくださいm(__)m


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



Name: guronn  ..ぴよぴよ(381ポイント)   Date: 2007/10/31(水) 19:08   No:11400       
Title: メモリの動的読み込み    
1つ目のプログラム

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

int main(void)
{
FILE*fp;
fp = fopen("random.dat","w");
if(fp==NULL){
return 1;
}
int count;
int a=100;
fprintf(fp,"%d\n",a);
srand((unsigned int)time(NULL));
for(count=0; count<a; count++){
fprintf(fp,"%d\n",rand()%10+1);
}
fclose(fp);
return 0;
}


2つ目

#include <stdio.h>

int main(int argc,char *argv[])
{
FILE *fp;
fp = fopen("random.dat", "r");
int j,total,num;
int count = 100;
for (total = j = 0; j < count; j++) {
fscanf(fp, "%d", &num);
total += num;
}
printf("AVE=%d\n", total / count);
fclose(fp);
return 0;
}

1つ目のプログラムで100個の1〜10の乱数をrandom.datに出力させ、
2つ目のプログラムでそのファイルを読み込み、合計値と平均値を出力するプログラムなのですが、

2つ目のプログラムで、malloc関数を使ってメモリを動的に読み込むようにすること。
読み込むメモリはrandom.datの先頭の数字を読み込むこと(この場合は100)。
random.datはプログラム内から読み込むのではなく、コマンドラインから読み込むこと。

と、この3つをやらなくてはなりません。
自分でも頑張ってみたのですが、時間の余裕があまりなく、ここに書き込ませていただきました。
ご助力お願いします。


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


Name: miyaza  ..中級者(9,865ポイント)   Date: 2007/10/31(水) 20:55   No:11409     
Title: Re:メモリの動的読み込み    
例えばこんな感じでどうでしょう

一つ目のプログラム


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

#define KNUM 100 /*乱数の個数*/

int main(void){
int num[KNUM],count,knum = KNUM;
FILE *fp;
fp=fopen("random.dat","wb");
if(!fp) return -1;
fwrite(&knum,sizeof(knum),1,fp); /*乱数の数を先頭に書き込み*/
srand((unsigned int)time(NULL));
for(count=0;count<KNUM;count++) num[count]=rand()%11;
fwrite(num,sizeof(num),1,fp); /*乱数の書き込み*/
fclose(fp);
return 0;
}


二つ目のプログラム

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

int main(int argc,char *argv[]){
int knum,count,total;
int *num;
FILE *fp;

fp=fopen(argv[1],"rb");
if(!fp) return -1;
fread(&knum,sizeof(knum),1,fp); /*乱数の数を取得*/
printf("データの数 : %d\n",knum);
num=(int *)malloc(knum*sizeof(int)); /*動的メモリの確保*/
fread(num,sizeof(knum*sizeof(int)),knum,fp); /*乱数を取得*/
for(count=total=0;count<knum;count++) total+=num[count];
printf("合計 : %d\n",total);
printf("平均 : %d\n",total/knum);
fclose(fp);
free(num);
return 0;
}


たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、テキスト形式でなければいけないのですか?


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

Name: miyaza  ..中級者(9,945ポイント)   Date: 2007/10/31(水) 20:58   No:11410     
Title: Re:メモリの動的読み込み    
>たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、テキスト
ミスりました。

たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、
テキスト形式じゃないとだめですかね?


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

Name: box  ..比類無きプログラマー(91,206ポイント)   Date: 2007/10/31(水) 21:14   No:11411     
Title: Re:メモリの動的読み込み    
ファイルの中身と実行結果とを比べやすくするという観点から、
テキストファイルへの読み書きをおすすめします。
バイナリファイルを使う必然性があまり感じられないです。

テキストファイルに書き込んでおけば、エディタで開いて
中身が一目瞭然という大きな利点があります。


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

Name: miyaza  ..中級者(10,414ポイント)   Date: 2007/10/31(水) 21:55   No:11413     
Title: Re:メモリの動的読み込み    
>ファイルの中身と実行結果とを比べやすくするという観点から、
テキストファイルへの読み書きをおすすめします。
バイナリファイルを使う必然性があまり感じられないです。

確かにそうですよね。
なんで、バイナリでつくったのか・・・・・

一応テキスト版も

書き込み


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

#define KNUM 100 /*乱数の個数*/

int main(void){
int count;
FILE *fp;
fp=fopen("random2.dat","wt");
if(!fp) return -1;
fprintf(fp,"%d\n",KNUM); /*乱数の数を先頭に書き込み*/
srand((unsigned int)time(NULL));
for(count=0;count<KNUM;count++) fprintf(fp,"%d\n",rand()%11); /*乱数の書き込み*/
fclose(fp);
return 0;
}



読み取り


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

int main(int argc,char *argv[]){
int knum,count,total;
int *num;
FILE *fp;

fp=fopen(argv[1],"r");
if(!fp) return -1;
fscanf(fp,"%d\n",&knum); /*乱数の数を取得*/
printf("データの数 : %d\n",knum);
num=(int *)malloc(knum*sizeof(int)); /*動的メモリの確保*/
if(!num) return -1;
for(count=total=0;count<knum;count++){
fscanf(fp,"%d\n",&num[count]);
total+=num[count];
}
printf("合計 : %d\n",total);
printf("平均 : %d\n",total/knum);
fclose(fp);
free(num);
return 0;
}


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

Name: guronn  ..ぴよぴよ(389ポイント)   Date: 2007/11/01(木) 21:51   No:11442 解決!     
Title: Re:メモリの動的読み込み    
どうもありがとうございました。
とても参考になりました。


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

Name: yoh2  ..ぴよぴよ(120ポイント)   Date: 2007/11/03(土) 01:15   No:11478     
Title: Re:メモリの動的読み込み    
マルチポストっぽいです。
チャット式C言語入門 フォーラム: malloc関数
まあ、特に目新しい情報はないのですが、向こうで関わったので報告しておきます。


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

Name: guronn  ..ぴよぴよ(397ポイント)   Date: 2007/11/03(土) 14:51   No:11484     
Title: Re:メモリの動的読み込み    
すみません
いろいろな人の話を参考にしたかったので書き込んでしまいました。
これからは注意させていただきますので、お許し下さい。


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

Name: 組木紙織  ..上級者(23,162ポイント)   Date: 2007/11/03(土) 17:18   No:11486     
Title: Re:メモリの動的読み込み    
<失礼にならないマルチポストの方法>

マルチポストしていることを明記する。
他にマルチポストしたページ(サイト)のURLを明示する。(回答者が回答を書き込む前に、すでに同一内容の返答がないか等を確認できるようにするため。ただし質問掲示板の多くは類似する他の掲示板へのリンクを貼る事自体、ルール違反、マナー違反とされる場合がほとんどである)
問題が解決した場合はマルチポストした全てのページに問題解決の報告を行う。

<Wikipedia マルチポストより>


私は他の掲示板はほとんど見ないのでマルチポストは気になりませんが、
気にする方は凄く気にするので、気をつけたほうが良いと思います。

#同時にするからマルチポストになるのであって時間をずらしたらマルチポストになるのかな?
#と最近思っています。


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

Name: たかぎ [URL]  ..上級者(17,213ポイント)   Date: 2007/11/03(土) 18:44   No:11487     
Title: Re:メモリの動的読み込み    
> いろいろな人の話を参考にしたかったので書き込んでしまいました。

それは無理です。

まず、ネット上の掲示板やメーリングリストで回答している人は限られています。マルチポストをしても、回答してくれる人はそう多くはならないのです。

次に、マルチポストの良し悪しはともかく、それを嫌う人がいる以上、限られた回答者が更に減ることになります。

さらに、マルチポストでは話の流れが分散するため、質問者の受け答えに一貫性がなくなることが多々あります。そんな状況にまともに付き合う人はそう多くありません。

> #同時にするからマルチポストになるのであって時間をずらしたらマルチポストになるのかな?

上記のことを考えれば、おのずと答えは出るはずです。

最後にアドバイスです。
本気で多くの人の意見を聞きたいのであれば、英語のサイトで全世界の人を相手にする方が得策です。


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

Name: guronn  ..ぴよぴよ(428ポイント)   Date: 2007/11/03(土) 20:50   No:11494     
Title: Re:メモリの動的読み込み    
>組木紙織さん
>たかぎさん

貴重なご意見ありがとうございます。
こういったところに書き込むことが今までなかったために、失礼をしてしまいました。
これからはご意見を参考に書き込みをさせていただきます。


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



Name: KANSAI  ..ぴよぴよ(391ポイント)   Date: 2007/11/03(土) 18:50   No:11488       
Title: SQL呼び出し    
以下の文でSQLServer2005のストアドプロシジャの呼び出しを行うと
「カーソルの状態が正しくありません」のエラーになりうまく動きません。
SQLServerでパラメータを指定して実行すると正しく動作します。
わけがわからずに困っています。どなたかわかる方お願いします。

VC側
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
CString strSql;

//実行SQL生成
CString strCon = Dll_GetDefaultDatabase();
CDatabase db;
//接続
db.OpenEx( _T( strCon ), CDatabase::noOdbcDialog );
//実行
CRecordset rs( &db );
strSql.Format("{call PROC_EKonyu('%d', '%d', 1)}", y-1, y-2);

try {
rs.Open( CRecordset::snapshot, strSql);
}
catch(CDBException* e) {
CString Msg = e->m_strError;
AfxMessageBox(Msg);
return;
}

rs.Close();
db.Close();

ストアドプロシジャ
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
PROCEDURE [PROC_EKonyu]
@m_stYear varchar(4),
@m_edYear varchar(4),
@m_Syori int

As
SET NOCOUNT ON

IF @m_Syori = 1 BEGIN
delete from dEKonyu where Ed_Year = @m_stYear
delete from dEKonyu where Ed_Year = @m_edYear
END


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




Name: 大工  ..プログラマー(25,329ポイント)   Date: 2007/11/03(土) 11:12   No:11480       
Title: プロのプログラム    
最近の課題では教授がサンプルを載せているので無駄のないプログラムを書く上で勉強になっているんですが・・・

こういったプロの技(コーディングの仕方などなど)に触れる機会が少なく思い残念に思います。

もっとプロの技を盗みたいんですが。。。。

いいサイトとかあったらおしえてください><。






不適切なら削除ねがいます。


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


Name: tkmakwins15 [URL]  ..プログラマー(36,835ポイント)   Date: 2007/11/03(土) 16:09   No:11485     
Title: Re:プロのプログラム    
僕自身プロではないのですが、参考になるサイトはあります。

Cプログラミング診断室

ここはちょっと逆説的かもしれませんが、ダメなところを直すというところで技が見られます。


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



Name: 新米  ..ぴよぴよ(0ポイント)   Date: 2007/10/28(日) 12:54   No:11309       
Title: DXライブラリについて    
Borland C++コンパイラーとDXライブラリにて下記のプログラムをメイクし実行しました。
しかしウインドウは開くのですが何もキーを入力していないにもかかわらず勝手にウインドウが閉じてしまいます。
なぜだかまったく分かりません。どなたか教えていただけないでしょうか?使用OSはWindows98です。
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了



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


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


Name: よっつん  ..入門者(3,030ポイント)   Date: 2007/10/28(日) 15:37   No:11317     
Title: Re:DXライブラリについて    
こんにちは。
私の環境でもWaitKey()は上手く動きません。
以前は普通につかえていたのですが、最近、キー入力しても認識しなくなりました。
(余談ですが他にも、表画面に描画しても反映されないとかもあります。)
環境依存なのかなと推測していますが、よくわかりません(汗

while( CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){WaitTimer(100);}

などで代用してみるのも手かもしれません。
(コードを訂正しました。)


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

Name: 新米  ..ぴよぴよ(4ポイント)   Date: 2007/10/28(日) 16:09   No:11318     
Title: Re:DXライブラリについて    
ご回答ありがとうございます。よっつんさんに教えていただいた通り入力してみましたが
やっぱりだめでした。もしかしたらDXライブラリ初期化時に何かエラーが起こっているの
かとも考えられるんですが。


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

Name: tkmakwins15 [URL]  ..プログラマー(33,880ポイント)   Date: 2007/10/28(日) 23:57   No:11328     
Title: Re:DXライブラリについて    
> while( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){WaitTimer(100);}

このコードだとどうやっても止まらないような気がします。押すまでループを回したい訳ですので、
CheckHitKey(KEY_INPUT_ESCAPE)の戻り値が0(押されていない)だと真に、1(押されている)だと偽になるように条件式を書く必要があります。
そこで、1のところを0にするといいかもしれません。

どうしても解決しない場合、Dxライブラリ管理人の山田 巧氏に報告するのがいいと思います。


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

Name: バグ  ..比類無きプログラマー(60,374ポイント)   Date: 2007/10/29(月) 00:32   No:11330     
Title: Re:DXライブラリについて    
Windows98という事ですが、DirectXのバージョン違いとかいう可能性はありませんか?

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

Name: よっつん  ..入門者(3,047ポイント)   Date: 2007/10/29(月) 00:53   No:11331     
Title: Re:DXライブラリについて    
間違ったコードで申し訳ありません
m(__)mご指摘ありがとうございます。


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

Name: tkmakwins15 [URL]  ..プログラマー(33,939ポイント)   Date: 2007/10/29(月) 01:53   No:11332     
Title: Re:DXライブラリについて    
バグさんの回答に補足

Dxライブラリの最低保障環境はWindows98となっています。なので、OS自体に問題はないと思います。
ただ、Win98の初期バージョンに入っているDirectXのバージョンが気になるところです。
Win98の初期バージョンのDirectXは5のようなので、7〜8.1あたりをインストールするのもいいかもしれません。
確かDxライブラリはDirectX7あたりのはずです。


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

Name: GPGA  ..プログラマー(37,178ポイント)   Date: 2007/10/29(月) 10:29   No:11334     
Title: Re:DXライブラリについて    
出力されたログファイルの内容を提示してもらうのが一番早いと思います。
個人的な予想では、OSがwindows98であるため、グラフィックカードもそれほど性能が
良いものではないでしょうから、3Dの初期化時に失敗していると思われます。

DxLib_Init()を呼び出す前に SetUse3DFlag(FALSE) を呼べば動くのではないでしょうか。


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

Name: 新米  ..ぴよぴよ(504ポイント)   Date: 2007/10/29(月) 22:49   No:11353     
Title: Re:DXライブラリについて    
皆さんたくさんの回答ありがとうございます。熟練のプログラマーさんの言われた通りログファイルのコピーを載せます。私は見てもよく分かりません。どなたか分かる方教えていただけませんでしょうか?

1:システムの情報を出力します
18: DXライブラリ Ver2.21a
19: OS Windows98 ( Build 67766222 )
520: CPU動作速度:264MHz
521: MMX命令を使用します
522: CPUベンダ:GenuineIntel
525:COMの初期化... 成功しました
817:ソフトの2重起動検査... 2重起動はされていませんでした
822:メモリ総量:63.03MB 空きメモリ領域:7.34MB
823:ソフトの実行優先レベルを上げました
824:ウインドウクラスを登録します... 登録に成功しました
825:ウインドウモード起動用のウインドウを作成します
914:IMEを無効にしました
968:タイマーの精度を検査します
1634:精度結果 更新回数 マルチメディアタイマー:4 パフォーマンスカウンター:60
1634:パフォーマンスカウンターを使用します タイマー分解能 : 1193.180000 KHz
1835:ウインドウスタイルをウインドウモード用に変更します... 完了
1840:DirectInput関係初期化処理
1840: DirectInputオブジェクトの取得中... 取得に失敗
2293: ウインドウを閉じようとしています
2374: ウインドウが破棄されようとしています
2375: ソフトを終了する準備が整いました
2861:
2861: Alloc memory dump
2862: Total size:0(0.000kb) Alloc num:0
2863:


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

Name: tkmakwins15 [URL]  ..プログラマー(34,407ポイント)   Date: 2007/10/29(月) 23:43   No:11354     
Title: Re:DXライブラリについて    
1840の所に注目してください。DirectInput(キー入力とかの機能部)の初期化に失敗してます。

メモリの総量も空きもかなり少ないように思います。もしやメモリ不足で失敗しているのかも。



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

Name: 新米  ..ぴよぴよ(599ポイント)   Date: 2007/10/30(火) 00:19   No:11355     
Title: Re:DXライブラリについて    
回答ありがとうございます。
DirectInput(キー入力とかの機能部)の初期化に失敗してます。
↑これはいったいどうすれば直るのでしょうか?またメモリ不足
はどうやって解消すれば言いのでしょうか?初歩的な質問ですみません。


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

Name: tkmakwins15 [URL]  ..プログラマー(34,496ポイント)   Date: 2007/10/30(火) 07:34   No:11357     
Title: Re:DXライブラリについて    
初期化の失敗の解決法はどうにも思いつきませんが、メモリであれば、手っ取り早い順から…

1 起動しているソフトを終了させる。
2 パソコンにメモリを増設する。
3 パソコンそのものを買い換える。

といったものなのですが、2,3はさすがにやりすぎになりそうです(笑)


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

Name: よっつん  ..入門者(3,159ポイント)   Date: 2007/10/30(火) 23:25   No:11387     
Title: Re:DXライブラリについて    
半分自己レスですが、
ジョイスティックなどが入力しっぱなしの状態だと、
WaitKey()は反応しないそうです。
一度ボタンを離すと反応します。
うちのPCは、ジョイスティックが入力しっぱなしになってました・・・
最近新しいのを買ったんですが、それが原因でした。


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

Name: 新米  ..ぴよぴよ(648ポイント)   Date: 2007/10/31(水) 00:25   No:11389     
Title: Re:DXライブラリについて    
回答ありがとうございます。
起動しているソフトを終了してから実行してみましたがやはり
ウインドウはすぐに閉じてしまいました。


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

Name: 新米  ..かけだし(1,658ポイント)   Date: 2007/11/02(金) 00:15   No:11445     
Title: Re:DXライブラリについて    
もしかしてDXライブラリのバージョンが低いのが原因ではないかと考え最新のバージョン
をダウンロードして実行してみたらやっぱり変わらない結果になりました。そのときの
ログファイルはこれです。結局何もせずウインドウが閉じてしまいました。
どうしたらいいのかまったく分かりませんどなたか教えていただけないでしょうか?

11:システムの情報を出力します
33: DXライブラリ Ver2.23
33: OS Windows98 ( Build 67766222 )
135: CPU動作速度:大体0.26GHz
136: MMX命令を使用します
137: CPUベンダ:GenuineIntel
141:COMの初期化... 成功しました
672:メモリ総量:63.03MB 空きメモリ領域:34.68MB
674:タイマーの精度を検査します
680:精度結果 更新回数 マルチメディアタイマー:3 パフォーマンスカウンター:60
681: パフォーマンスカウンターを使用します タイマー分解能 : 1193.180000 KHz
682: ソフトの二重起動検査... 二重起動はされていませんでした
741:ウインドウクラスを登録します... 登録に成功しました
743:ウインドウモード起動用のウインドウを作成します
938:IMEを無効にしました
2345:ウインドウスタイルをウインドウモード用に変更します... 完了
2372:DirectInput関係初期化処理
2373: DirectInput7 の取得中... 取得に失敗。
3043: エラーコード 0x80004002

3044: DirectInput8 の取得を試みます...取得に失敗。DirectInput を使用しません。
3415: パッドの数は 0 個です

3416:入力関連の初期化をしました
3430:DirectSound の初期化を行います
3431:DirectSound インターフェースの取得を行います.... 成功
4183:引き続きインターフェースの初期化処理... 成功
5580:DirectSoundのプライマリサウンドバッファの作成に失敗しました
5640:DirectDraw 関連の初期化を行います
5640: DirectDraw オブジェクトの取得を行います.... オブジェクトの取得に失敗しました
5683: DirectDrawオブジェクトの作成に失敗しました
5685: DirectDraw 関連の終了処理をおこないます

                   〜  中略(同じ処理がかなり何回も続くため)  〜

14921:DirectDraw 関連の終了処理をおこないます
14922:DirectDrawオブジェクトを解放します
14923:DirectDrawオブジェクトを解放しました
15078:DirectDrawオブジェクトを解放します
15079:DirectDrawオブジェクトを解放しました
15079:DirectDraw オブジェクトの取得を行います.... オブジェクトの取得に失敗しました
15097:DirectDraw オブジェクトの作成処理時にエラーが発生しました
15099:DirectDraw 関連の終了処理をおこないます
15100:DirectDrawオブジェクトを解放します
15100:DirectDrawオブジェクトを解放しました
15231:画面モードを元に戻す処理は正常に終了しました
15232:DirectDraw 関連の終了処理は正常に終了しました
15280:ウインドウを閉じようとしています
15326:ウインドウが破棄されようとしています
15327:ソフトを終了する準備が整いました
15475:
15476: Alloc memory dump Total size:0(0.000kb) Alloc num:0
15477:


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

Name: Justy  ..ハッカー(169,052ポイント)   Date: 2007/11/02(金) 02:45   No:11448     
Title: Re:DXライブラリについて    
 何日か前に tkmakwins15さんが書いていますが、DirectXのバージョンを確認して下さい。
 ver7以降が入っていないとDXライブラリは使えません。


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

Name: 新米  ..かけだし(1,712ポイント)   Date: 2007/11/03(土) 13:54   No:11483     
Title: Re:DXライブラリについて    
DirectXのバージョンを新しくしたところ何とか正常に起動しました。
皆さん何度も親切に回答していただきありがとうございました。


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



Name: tomato  ..ぴよぴよ(640ポイント)   Date: 2007/11/03(土) 01:24   No:11479       
Title: javaに関することなのですが......    
はじめまして。ここはC言語の質問掲示板だということなのですが、規約を見た所C言語だけに限らないと書いてありましたのでここで質問させていただきます。
もしわかるかたがいらっしゃいましたら、答えていただけると非常に助かります。

プログラムは添付した物です。これは2つの端点を持つ線分を定義して、それらの線分に対して長さを求めたり、長さを縮めたり、線分に対して様々な操作を行うプログラムです。
今回は作成した線分を配列groupに格納していくという作業をやっています。
また、配列に格納可能かを調べるメソッドとしてequalsというものがあります。
ここでその格納可能な条件とは、その線分がすでに格納されているかいないかということです。
つまり配列の中にすでに格納されている線分であれば、格納しないということです。
また、配列から格納されている線分を削除するメソッドとしてdeleteというものもあります。
今回行き詰っているのは、クラスGroupedLineSegmentの中身についてです。
  r1.equals(r1);
r1.add();
r2.equals(r2);
r2.add();
の部分なのですが、これではr2.equals(r2);の部分がヌルポインターとなってしまうらしくエラーになってしまいます。
コンパイルはできるのですが、実行時に上手く動きません。
最初のequalsは普通に使えているのに、なぜ2度目に出てくるequalsはヌルポインターになってしまうのでしょうか?
また、
r1.equals(r1);
r2.equals(r2);
と2回連続で書いた場合はエラーになりませんでした。これはなぜでしょうか?
どうやらadd()が間に入るとエラーになってしまうようです。
なんでこのようになってしまうのか全くわかりません。
わかる方がいたら教えてください。よろしくお願いします。



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




Name: マサキ  ..初心者(5,788ポイント)   Date: 2007/11/02(金) 21:01   No:11473       
Title: 数値の演算について    
こんばんわ。
添付したファイルのような演算を行いたいのですが、上手くいきません。
コンパイルは通るのですが、実行時に途中でセグメントエラーになってしまいます。
自分としてはプログラム中の
PR=(k1/T1)*(exp(a));
Hukyuu=k2*(1-exp(b));
Nesage=k3*(1-exp(c));
の部分の計算が上手く処理されてないのではないかと思いました。
しかしどのように直せばいいかわかりません。
もしよろしかったら、このプログラムの問題点とどのように直せばいいかを教えてください。
お願いします。



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


Name: box  ..比類無きプログラマー(91,229ポイント)   Date: 2007/11/02(金) 21:08   No:11474     
Title: Re:数値の演算について    
scanf()の第2引数の型を見直してください。

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



Name: K-I  ..ぴよぴよ(721ポイント)   Date: 2007/10/31(水) 23:10   No:11414       
Title: 数独について    
今数独をとくプログラムを作成しています
#include <stdio.h>
int map1[9][9];
/* m:Mondai */
int p[9][9]={{0,0,6,0,0,0,0,0,1},
{0,7,0,0,6,0,0,5,0},
{8,0,0,1,0,3,2,0,0},
{0,0,5,0,4,0,8,0,0},
{0,4,0,7,0,2,0,9,0},
{0,0,8,0,1,0,7,0,0},
{0,0,1,2,0,5,0,0,3},
{0,6,0,0,7,0,0,8,0},
{2,0,0,0,0,0,4,0,0}};
void disp()
{ int i,j;
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%2d",p[i][j]);
}
printf("\n");
}
}
void main(void)
{
int i,j,k,l;


for (i=0;i<9;i++){
for (j=0;j<9;j++) map1[i][j]=0;
}

for(i=0;i<9;i++){
for(j=0;j<9;j++){
if (p[i][j] !=0) map1[i][j]=2;
if (p[i][j] ==1){
map1[i][j]=1;
}
for(k=0;k<9;k++){
if(map1[k][j] ==0) map1[k][j]=2;
if(map1[i][k] ==0) map1[i][k]=2;
}
for (i=0;i<7;i+3){
for (j=0;j<7;j+3){
for(k=i;k<k+3;k++){
for(l=j;l<l+3;l++){
}
}
}
}
}
disp();
}
}
私の考えは1の入る場所を特定する場合元の数の0以外を2 1を1 そして1の縦横を1にして3*3マスに0が一つ他が2のときその0に1が入るという考えで進めています 現在3*3のマスに0が一つ他が2の場所を作り3*3マスずつ調べていくところまでできたのですが どうやって0に1を入れていいのかというところで躓いています うまく説明できなくてすみません
利用規約を読んだんですが 質問のしかた間違っていたら申し訳ありません
どなたかアドバイスよろしくお願いします


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


Name: K-I  ..ぴよぴよ(760ポイント)   Date: 2007/10/31(水) 23:29   No:11415     
Title: Re:数独について    
書き忘れてすみませんOSはWindowsVistaHomeプレミアムです BorlandC++を使っています

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

Name:  ..中級者(12,622ポイント)   Date: 2007/11/01(木) 01:43   No:11420     
Title: Re:数独について    


とりあえずソースを載せる時は<pre></pre>を使ってください。(もちろん半角で)

で、ソースがちょっと意味不明な個所がありました。
実行しながらやっていますか?

タブがおかしいのには目を瞑ってくださいorz

**以下改変したソース**

#include <stdio.h>

int map1[9][9];
/* m:Mondai */
int p[9][9]={{0,0,6,0,0,0,0,0,1},
{0,7,0,0,6,0,0,5,0},
{8,0,0,1,0,3,2,0,0},
{0,0,5,0,4,0,8,0,0},
{0,4,0,7,0,2,0,9,0},
{0,0,8,0,1,0,7,0,0},
{0,0,1,2,0,5,0,0,3},
{0,6,0,0,7,0,0,8,0},
{2,0,0,0,0,0,4,0,0}};

void disp(void)
{
int i,j;
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%2d",p[i][j]);
}
printf("\n");
}
}

void disp_2(void)
{
int i,j;
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%2d",map1[i][j]);
}
printf("\n");
}
}


void main(void)
{
int i,j,k,l;

for (i=0;i<9;i++){
for (j=0;j<9;j++) map1[i][j]=0;
}

for(i=0;i<9;i++){
for(j=0;j<9;j++){
if (p[i][j] !=0) map1[i][j]=2;
if (p[i][j] ==1){
map1[i][j]=1;
}
for(k=0;k<9;k++){
if(map1[k][j] ==0) map1[k][j]=2;
if(map1[i][k] ==0) map1[i][k]=2;
}
/* for (i=0;i<7;i+3){
for (j=0;j<7;j+3){
for(k=i;k<k+3;k++){
for(l=j;l<l+3;l++){
}
}
}
}
*/ }

}
disp();
printf("\n");
disp_2();
}
**------**

**実行結果**

0 0 6 0 0 0 0 0 1
0 7 0 0 6 0 0 5 0
8 0 0 1 0 3 2 0 0
0 0 5 0 4 0 8 0 0
0 4 0 7 0 2 0 9 0
0 0 8 0 1 0 7 0 0
0 0 1 2 0 5 0 0 3
0 6 0 0 7 0 0 8 0
2 0 0 0 0 0 4 0 0

2 2 2 2 2 2 2 2 1
2 2 2 2 2 2 2 2 2
2 2 2 1 2 2 2 2 2
2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2
2 2 2 2 1 2 2 2 2
2 2 1 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2

**-------**

何を求めているかは良く分かりませんが、、、

>どうやって0に1を入れていいのかというところで躓いています
0がありませんが、どうすればよいでしょうか?

多分
for(k=0;k<9;k++){
if(map1[k][j] ==0) map1[k][j]=2;
if(map1[i][k] ==0) map1[i][k]=2;
}

これが悪さの原因ですよ
これを消すと・・・
実行結果:disp_2
0 0 2 0 0 0 0 0 1
0 2 0 0 2 0 0 2 0
2 0 0 1 0 2 2 0 0
0 0 2 0 2 0 2 0 0
0 2 0 2 0 2 0 2 0
0 0 2 0 1 0 2 0 0
0 0 1 2 0 2 0 0 2
0 2 0 0 2 0 0 2 0
2 0 0 0 0 0 2 0 0
** ここまで **

こういうのを出したかったのではないかと思うのですがどうでしょう?
もしこのような考えなら後はif文で終わっちゃうかとw(やってないけどww

違ったら、ごめんなさい^^;




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

Name:  ..中級者(12,648ポイント)   Date: 2007/11/01(木) 04:23   No:11421     
Title: Re:数独について    
作ってみたんですが…正解が出てきませんorz
どこかで凄い勘違いをしていそうなんですが…
どうすればいいんだーーーーorz


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

Name: K-I  ..ぴよぴよ(819ポイント)   Date: 2007/11/01(木) 07:04   No:11422     
Title: Re:数独について    
お返事ありがとうございます!
もう少し詳しくのせるべきでした すみません
PCが使える状態になりましたら また書き込みたいと思います 夕方になってしまうと思うんですが できればアドバイスよろしくお願いしますm(_ _)m


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

Name:  ..中級者(13,154ポイント)   Date: 2007/11/01(木) 15:01   No:11430     
Title: Re:数独について    
こちらこそお願いします。

どうにも解法が思いつけない状態でして、手詰まってしまいました。
書き込みお待ちしています。

こちらは帰りが夜中になりそうなので、時間が無くほとんどできないかもしれないので、
急がれなくても良いかと思います。


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

Name: K-I  ..かけだし(1,665ポイント)   Date: 2007/11/01(木) 17:04   No:11432     
Title: Re:数独について    

#include <stdio.h>
int map1[9][9];
/* m:Mondai */
int p[9][9]={{0,0,6,0,0,0,0,0,1},
{0,7,0,0,6,0,0,5,0},
{8,0,0,1,0,3,2,0,0},
{0,0,5,0,4,0,8,0,0},
{0,4,0,7,0,2,0,9,0},
{0,0,8,0,1,0,7,0,0},
{0,0,1,2,0,5,0,0,3},
{0,6,0,0,7,0,0,8,0},
{2,0,0,0,0,0,4,0,0}};
void disp()
{ int i,j;
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%2d",map1[i][j]);
}
printf("\n");
}
}

void main(void)
{
int i,j,k;


for (i=0;i<9;i++){
for (j=0;j<9;j++) map1[i][j]=0;
}

for (i=0;i<9;i++){
for (j=0;j<9;j++){
if (p[i][j] !=0) map1[i][j]=2;
if (p[i][j] ==1){ map1[i][j]=1;
for(k=0;k<9;k++){
if(map1[k][j] ==0) map1[k][j]=2;
if(map1[i][k] ==0) map1[i][k]=2;


}
}}
}
disp();

}



表示結果

2 2 2 2 2 2 2 2 1
0 2 2 2 2 0 0 2 2
2 2 2 1 2 2 2 2 2
0 0 2 2 2 0 2 0 2
0 2 2 2 2 2 0 2 2
2 2 2 2 1 2 2 2 2
2 2 1 2 2 2 2 2 2
0 2 2 2 2 0 0 2 2
2 0 2 2 2 0 2 0 2

となって3*3左上で言うと

2 2 2
0 2 2
2 2 2

この部分なんですがこの0にはかならず1が入るんですが一番最初の


for (i=0;i<7;i+3){
for (j=0;j<7;j+3){
for(k=i;k<k+3;k++){
for(l=j;l<l+3;l++){


で3*3ますずつ調べてその後2が7個0が1個の場合0を1にするというのをどうしたらいいかで躓いています また説明下手ですみません Countを使ってみたらといわれたんですが 私の本にはCountが載っていなくて・・・
自分なりにやっていますが多分まだ解決しそうにないので どうかアドバイスのほうお願いします


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

Name:  ..中級者(13,565ポイント)   Date: 2007/11/01(木) 17:37   No:11434     
Title: Re:数独について    
実行結果
2 2 2 2 2 2 2 2 1
0 2 2 2 2 0 0 2 2
2 2 2 1 2 2 2 2 2
0 0 2 2 2 0 2 0 2
0 2 2 2 2 2 0 2 2
2 2 2 2 1 2 2 2 2
2 2 1 2 2 2 2 2 2
0 2 2 2 2 0 0 2 2
2 0 2 2 2 0 2 0 2

0 0 6 0 0 0 0 0 1
0 7 0 0 6 1 1 5 0
8 0 0 1 0 3 2 0 0
0 0 5 0 4 1 8 0 0
0 4 0 7 0 2 0 9 0
0 0 8 0 1 0 7 0 0
0 0 1 2 0 5 0 0 3
0 6 0 0 7 0 0 8 0
2 0 0 0 0 0 4 0 0

一様 0が1 2が7 はできました。
2が8じゃないのは何でなんでしょうか?

作れましたが、説明は苦手なので、解読お願いします。
どこが何してるか不明ってところがあれば聞いていただければお答えします。

がんばってください。


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

Name: K-I  ..かけだし(2,003ポイント)   Date: 2007/11/01(木) 18:19   No:11435     
Title: Re:数独について    
お忙しいのにありがとうございます!
すみません 3*3=9なのだから0が1つ 2が8こでした
3*3のマスには同じ数字が入ることがないので

2 2 2
0 2 2
2 2 2

の場合0に1が入るでした 結果が

2 2 2 2 2 2 2 2 1
0 2 2 2 2 0 0 2 2
2 2 2 1 2 2 2 2 2
0 0 2 2 2 0 2 0 2
0 2 2 2 2 2 0 2 2
2 2 2 2 1 2 2 2 2
2 2 1 2 2 2 2 2 2
0 2 2 2 2 0 0 2 2
2 0 2 2 2 0 2 0 2

↑これから

2 2 2 2 2 2 2 2 1
1 2 2 2 2 0 0 2 2
2 2 2 1 2 2 2 2 2
0 0 2 2 2 0 2 0 2
0 2 2 2 2 2 0 2 2
2 2 2 2 1 2 2 2 2
2 2 1 2 2 2 2 2 2
0 2 2 2 2 0 0 2 2
2 0 2 2 2 0 2 0 2

こうするにはどうしようという質問でした
間違えてしまい申し訳ありません



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

Name: K-I  ..かけだし(2,011ポイント)   Date: 2007/11/01(木) 21:23   No:11441     
Title: Re:数独について    
雷さん すばらしいです!雷さんのでいけると思います!
でも自分のやつの続きに加えていかないとならないのでつなげてみたんですが1が代入されません なぜでしょうか?


#include <stdio.h>
int map1[9][9];
/* m:Mondai */
int p[9][9]={{0,0,6,0,0,0,0,0,1},
{0,7,0,0,6,0,0,5,0},
{8,0,0,1,0,3,2,0,0},
{0,0,5,0,4,0,8,0,0},
{0,4,0,7,0,2,0,9,0},
{0,0,8,0,1,0,7,0,0},
{0,0,1,2,0,5,0,0,3},
{0,6,0,0,7,0,0,8,0},
{2,0,0,0,0,0,4,0,0}};
void disp()
{ int i,j;
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%2d",p[i][j]);
}
printf("\n");
}
}
void main(void)
{
int i,j,k;
int x,y; //ブロック移動用
int count_0, count_2; //個数を数える用
int set;
int r,s,t=3; // t は足す数、 r,s はx,y の3倍



for (i=0;i<9;i++){
for (j=0;j<9;j++) map1[i][j]=0;
}

for(i=0;i<9;i++){
for(j=0;j<9;j++){
if (p[i][j] !=0) map1[i][j]=2;
if (p[i][j] ==1){
map1[i][j]=1;
for(k=0;k<9;k++){
if(map1[k][j] ==0) map1[k][j]=2;
if(map1[i][k] ==0) map1[i][k]=2;
}
for(x=0; x<3; x++){
for(y=0; y<3; y++){
r=x*3;
s=y*3;
count_0=0;
count_2=0;
for(i=r; i<r+t; i++){
for(j=s; j<s+t; j++){
if( map1[i][j] == 0)
count_0 +=1;
else if( map1[i][j] == 2 )
count_2 +=1;
}
}

if( (count_0 == 1) && (count_2 == 8)){
for(i=r; i<r+t; i++){
for(j=s; j<s+t; j++){
if( map1[i][j] == 0){
p[i][j] = 1;
}
}} }
} } }}
disp();
}
}


表示結果

0 0 6 0 0 0 0 0 1
0 7 0 0 6 0 0 5 0
8 0 0 1 0 3 2 0 0
0 0 5 0 4 0 8 0 0
0 4 0 7 0 2 0 9 0
0 0 8 0 1 0 7 0 0
0 0 1 2 0 5 0 0 3
0 6 0 0 7 0 0 8 0
2 0 0 0 0 0 4 0 0

もうなにがなんやら・・ あと雷さんはどんな勉強法をしていますか?参考までに教えていただけるとありがたいのですが


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

Name:  ..中級者(14,475ポイント)   Date: 2007/11/01(木) 23:46   No:11444     
Title: Re:数独について    
>でも自分のやつの続きに加えていかないとならないのでつなげてみたんですが1が代入されません なぜでしょうか?

何故だと思いますか?
まず、どこで1が代入(でいいのかな?)されているか分かりますか?
その関数はどこで宣言されていますか?
その値は何が入っていますか?

それと、『自分のやつの続きに加えていかないとならない』ですが、関数を使えるようになったほうが良いと思います。
K-Iさんのプログラムは for文の中に for文が入っていてとても見にくいですよね?
これを解消するために関数を使います。
そうすると、上で投げかけている質問の答えが一瞬で分かります。
僕もまだまだなのですが、ばらばらにするべきところを見極めて実行できると、とても見やすいものが出来上がります。
これによりバグが出にくくなるはずです。

関数化はLvが一段あがるものと僕は考えています。
なので、今のmain関数をバラバラに関数化してみてください。
かなりの重労働に感じるでしょう。
でも、それこそが良い勉強になると思います。
つまり、

>雷さんはどんな勉強法をしていますか?参考までに教えていただけるとありがたいのですが

これが僕の勉強方みたいなものです。(ぇ

本やサイトなどを見ながらプログラムを作りますよね?
その時、コピー&ペーストは極力控えるのです。
そうすると、何故か本当に何故か知りませんが、なんとなく頭に入ってきているのです。
改造したい時にこの辺を変えれば良いんじゃないかな?
と、あたりがつけやすく感じるのです。

もちろんめちゃくちゃ面倒で、したくありません。

他の方々ならもっと良い方法を使用しているかもしれません。
でも、僕は記憶力が悪いので(orz)この方法が一番あっていると感じます。

と、言ってもつまらないものは詰まらないんです。
なので、今回のように作ってみたいな〜っと思ったものを一様完成まで持っていくのです。
その後で、色々な効果、機能を追加していく。
面白いし、勉強になると思います。

こうしたい!こうやって見たがうまくいかなかった。
などというのが合ったら、相談してください。
頑張って分かる限り答えます。
でも、僕も未だに基礎がおろそかな者です。
このサイトには良い方々(神の様な)が居られます。
その方達の注意をちゃんと聞いていけば、僕などすぐに抜かれてしまうかもしれません。
そうならないように頑張りますがw

ただ、今回のプログラムで僕よりもうまいところがあり、勉強させてもらっているものでよければですがw

偉そうに言うことと長文失礼しました。


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

Name:  ..中級者(14,675ポイント)   Date: 2007/11/02(金) 00:16   No:11446     
Title: Re:数独について    
この方法で、9回、回してみたが…
後いる条件が僕には分かりません。

0 0 6 0 2 7 0 0 1
1 7 0 0 6 0 0 5 8
8 0 0 1 0 3 2 0 0
7 0 5 0 4 0 8 0 0
0 4 0 7 8 2 0 9 0
0 0 8 0 1 0 7 0 0
0 0 1 2 0 5 0 0 3
0 6 0 0 7 0 0 8 2
2 0 0 0 0 0 4 0 0

ここから、0の場所に入れていってなり立つかどうかでも検証すれば良いのかな?
成り立つものが複数存在する可能性があるから、それぞれの番号で保存して、
全部の番号が重ならないのを呼び出せばいけそうだけど…
やりたくない;;
何か良いアルゴリズムがあればご教授下さい^^;


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

Name: K-I  ..かけだし(2,014ポイント)   Date: 2007/11/02(金) 06:37   No:11451     
Title: Re:数独について    
雷さん返信ありがとうございます!
アドバイス通りやってみます!
あと勉強法も試してみようと思います!


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

Name: K-I  ..かけだし(2,151ポイント)   Date: 2007/11/02(金) 20:05   No:11472     
Title: Re:数独について    
やっと出来ました!力技でやったのでまだ改良しなくちゃいけませんが 表示結果も正しい答えが表示されて もう感激です;;
雷さんやこの掲示板を作ってくださった管理人さんやみなさんのおかげでプログラムが面白くなってきました!
また何かあったらアドバイスお願いします^^


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



Name: 悪戦苦闘している大学生  ..ぴよぴよ(174ポイント)   Date: 2007/11/02(金) 04:01   No:11449       
Title: 選択肢について    
初めまして.
私は現在大学生で,卒業制作にDXライブラリでゲーム製作しようと意気込んでいるのですが,
早速壁にぶち当たりましたので,質問させていただきました.

まず,環境その他を説明させていただきます.
OSはWindowXP,開発環境はVisualStudio2005です.
開発言語はC++で,私を含めまして,総勢3名での開発を目指してします.
参考資料としまして,DXライブラリを開発された方が著された,
「14歳からはじめるC++ わくわくゲームプログラミング」を用いております.
また,貴サイト「C言語〜ゲームプログラミングの館〜」は,
DXライブラリの基礎の部分で非常にお世話になっております.
ありがとうございます.


現在,タイトルの通り,選択肢を実装するところで躓いております.
と言いますのも,貴サイトにて解説されていました,
「33. 選択画面の作り方。」を参考に,選択画面の処理を実装してみました.
具体的には,例えば「START」と「EXIT」のような選択肢があるとしますと,
それぞれ画像を2枚準備し,選択状態にあるかないかで画像を切り替えるというものです.
なお,この処理はクラスのメンバ関数内で定義しており,
オブジェクトが持つゲームの状態(TITLE画面なのかMAIN画面なのか)をwhileループ内のswitch文で判定し,
当該メンバ関数を呼び出しています.
(参考資料の第4章,GameFrameクラスに相当)


まず,解説されている内容を参考にして,選択が上にも動くように実装しました.
躓いているのは,選択が動くスピードが異常といいますか,とにかく早いのです.


解説されているソースを丸々コピーしてコンパイルすると,
選択状態を表す「■」は正常な速度で動きます.(当たり前ですが…)
そこで,選択処理の部分をコピーし,メンバ関数にはりつけたのですが,
やはり処理が異常に早く,一回↓キーを押しただけで,ルーレット状態となってしまいます.

次に,whileループ内に,メンバ関数を呼び出すのではなく,当初の選択処理を直接記述すると,
選択は正常に動作しました.
念のため試してみたのですが,「■」を動作させる処理をメンバ関数内で処理すると,
やはりルーレット状態になってしまいました.


以上の点から,メンバ関数に記述していること自体が問題だと思うのですが,
一応,処理の流れ上,ループする毎にScreenFlip();関数が呼び出されているはずなので,
何故このような状態に陥るのか分からず,解決できないでおります.
なお,STARTが選択されている状態で「z」キーを押すと,
ちゃんとメイン画面に切り替わるので,ループ処理にも問題はないと思います.


ソースの一部を,別にレスして載せますので,どなたかご助言いただけませんでしょうか.
よろしくお願いいたします.


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


Name: 悪戦苦闘している大学生  ..ぴよぴよ(927ポイント)   Date: 2007/11/02(金) 04:13   No:11450     
Title: Re:選択肢について    
whileループ

while(!(bool)ProcessMessage() && !(bool)ClearDrawScreen() && !(bool)CheckHitKey(KEY_INPUT_ESCAPE)){
switch(test.gstate){
case GAME_TITLE:
test.drawGameTitle();
break;
case GAME_MAIN:
DrawString(100, 100, "testText(MAIN)", GetColor(255, 255, 255));
break;
case GAME_EXIT:
DxLib_End();
return EXIT_SUCCESS;

}

ScreenFlip();
}





drawGameTitle()メンバ関数(テスト用にコピーしたので,コメント等がそのままになっています.)
ソース引用→http://dixq.net/g/#33

void GameFrame::drawGameTitle()
{
int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;//各種フラグの宣言

char_disp(GetColor(255, 255, 255),y);

if( KeyBuf[ KEY_INPUT_DOWN ] == 1 )
NewDown=1; // 今押されている状態に
else // 押されていなかったら
NewDown=0; // 今押されていない状態に

if( OldDown==0 && NewDown==1 ) // 前回押されてなく、今回押されていたら
DownOshita=1; // たった今押された状態に
else // それ以外なら
DownOshita=0; // たったいま押されていない状態に

if( OldDown==1 && NewDown==1 ) // 前回も押され、今回も押されていたら
DownPusingCounter++; // 押しっぱなしカウンターを増加
else
DownPusingCounter=0;

if( DownOshita==1 || DownPusingCounter>30){ // たった今押したか、30カウンター以上押しっぱなしなら
if(DownPusingCounter>30) // 30カウンター以上押しっぱなしならカウンターを27へ
DownPusingCounter=27; // オートの場合4回に1回下に下がる。
y+=20;
if(y==260) // y座標が260なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}
OldDown=NewDown; // 新しい入力情報を古い入力情報へ
}





質問文に記しましたように,こういった記述だと,
↓キーを押すとルーレットのように早く回ります.(1回押しただけで,4,5つ下に行ってしまいます.)

一応,WaitTimer()関数を挟むことで,無理やり反応を鈍らせることはできるのですが,
あまりにも挙動不審なので,できれば正常な状態で選択画面を実装したいと考えております.


長文,大変失礼いたしました.
よろしくお願いいたします.


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

Name: バグ  ..比類無きプログラマー(62,117ポイント)   Date: 2007/11/02(金) 08:04   No:11452     
Title: Re:選択肢について    
押しっ放しの場合に移動しないようにしてはどうでしょうか?

1:下キーが押されていて、フラグ用変数が0以外の場合に2へ進む

2:カーソル移動処理をして、フラグ用変数を0以外にする

3:下キーが押されていなければフラグ用変数を0にする。

というような処理を行なえば、下キーが押された初回の1回だけ移動すると思いますよ(^-^)


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

Name: 悪戦苦闘している大学生  ..かけだし(1,233ポイント)   Date: 2007/11/02(金) 18:40   No:11468 解決!     
Title: Re:選択肢について    
>バグ様
ご助言,ありがとうございます.
自分なりにそれを実現してみようとしたのですが,何故か今度は動かなくなってしまいました.



今日一日,改めてソースと睨めっこしていたら,やっと原因が分かりました.
・上に載せたソースがルーレット状態に陥ってしまう原因と思われるもの
→メンバ関数内で,DownOshitaなどの各種フラグ変数を初期化してしまっていたこと.

恐らく,これが一番の原因だと思います.
これを別のところで宣言したところ,正常に機能しました.

また,これを受けて,コメントとして残していた当初記述していたソースを見直してみると,
OldDown=NewDown;に相当する記述がぽっかり抜けてしまっていたようで…


初歩的なミスに全然気づかず,また思いこみが原因だったにも関わらず,
勇み足で質問してしまいまして,申し訳ございませんでした.


ご回答くださいましたバグ様をはじめ,皆様には大変ご迷惑をおかけいたしました.
また,何か問題が発生しましたら質問させていただくこともあるかと思いますが,
そのときはしっかりと全ての可能性を検証した上で,質問させていただきます.

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


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



Name: ぺけ  ..ぴよぴよ(179ポイント)   Date: 2007/11/02(金) 09:37   No:11453       
Title: Cygwinの環境変数    
Cygwinを使ってC言語をコンパイル・実行しているのですが、
実行時に「./」をつけないですむように設定する方法がわかりません。

例えば
> make hogetest
としたあと、
> ./hogetest
ではなく
> hogetest
だけで実行できるようにするためには、パスがどうのこうのといわれましたが、
具体的には、↓の場合ですとどう付け加えればよいのでしょうか?

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\WBEM;C:\j2sdk1.4.2\bin;C:\Program Files\MySQL\MySQL Server 5.0\bin;C:\gs\gs7.07\bin;C:\gs\gs7.07\lib

初歩的ですみません。


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


Name: たかぎ [URL]  ..上級者(16,716ポイント)   Date: 2007/11/02(金) 10:30   No:11454     
Title: Re:Cygwinの環境変数    
export PATH=$PATH:.

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

Name: ぺけ  ..ぴよぴよ(429ポイント)   Date: 2007/11/02(金) 10:42   No:11455     
Title: Re:Cygwinの環境変数    
>たかぎさん
ご回答ありがとうございます。
これは、システムプロパティの詳細設定→環境変数で、
システム環境変数→Path→変数値
の末尾に書き加えればよいということでしょうか?

すみません、何せ無知なもので、
「ここに、この通り書け!」といったようにご説明していただけないでしょうか。
よろしくお願いします。


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

Name: toyo  ..初心者(5,451ポイント)   Date: 2007/11/02(金) 10:58   No:11457     
Title: Re:Cygwinの環境変数    
ls -a
でファイルを表示させるとユーザのホームディレクトリに
.bashrc
というファイルがあると思います。
このファイルに追加しておけばいちいち実行する必要はなくなります。(bash使用という前提ですが)


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

Name: ぺけ  ..ぴよぴよ(503ポイント)   Date: 2007/11/02(金) 11:05   No:11458     
Title: Re:Cygwinの環境変数    
>toyoさん
ご回答ありがとうございます。
windowsでホームディレクトリに行くにはどうしたらよいのでしょうか(>_<)
マイコンピュータから行くのですか?
アホな質問で大変恐縮です↓↓


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

Name: たかぎ [URL]  ..上級者(16,950ポイント)   Date: 2007/11/02(金) 13:17   No:11460     
Title: Re:Cygwinの環境変数    
Windows のことはいったん忘れてください。
cygwin.bat を起動、または(Windows の)スタートメニュー等で Cygwin を起動すれば、コマンドプロンプトによく似た bash が起動するはずです。
そこで、

export PATH=$PATH:.

と入力すれば、以降は ./ が不要になります。
毎回入力するのが面倒であれば、toyo さんが書かれているように .bashrc を修正すればよいのですが、ちょっとコツがあるので、/etc/profile に追記してしまってもよいでしょう。
# Unix 信者からは怒られそうですが...


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

Name: ぺけ  ..ぴよぴよ(480ポイント)   Date: 2007/11/02(金) 15:43   No:11461     
Title: Re:Cygwinの環境変数    
わかりました!
export PATH=$PATH:.
でやってみます。
でも毎回それをやらずに済む方法があればいいのですが・・・^^;
一応、bashrcという文字列を含むファイルは4つほど
@bash.bashrc(C:/cygwin/etc)
A.bashrc(C:/cygwin/etc/skel)
Bbash.bashrc(C:/cygwin/etc/defaults)
C.bashrc(C:/cygwin/etc/defaults/skel)
検索に引っかかりましたが、
@のでよいのでしょうか?
このファイルを書き換えるにはどうしたらよいですか?


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



Name: ひろっち  ..ぴよぴよ(115ポイント)   Date: 2007/10/31(水) 14:46   No:11398       
Title: 質問です。    
勉強するために、拝見しています。
シューティングの館で、33章以降リンクが貼られていないのですが、いつになればリンクは貼られますでしょうか?33章以降楽しみにしています。
または、シューティングの館を見て作っているのですが、別途参考になるサイトなどがあれば教えていただきたく存じます。


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


Name: 管理人 [URL]  ..伝説のハッカー(438,420ポイント)   Date: 2007/11/01(木) 20:02   No:11440     
Title: Re:質問です。    
すみません、最近忙しくてなかなかHP更新に手が付けられません(_ _||)

あのページはそもそもシューティングを作るための物ではなく、
C言語で、こんなに簡単にゲームが作れるんだという事を実感してもらいたくて作ったものですので、
アルゴリズムとしても、コードの書き方としても本格的なシューティングにはふさわしくないものです。
極力易しく書いて、難しさの抵抗無くゲームを作る楽しさを味わっていただきたいと思いました。

もし33章までご理解いただけたら、ご自分で完成まで持っていけるのではないでしょうか。
ゲーム完成のちょっとしたお手伝い程度に、あまり期待せずご参考下さい(_ _)

あと、参考にした書籍やサイトはありません。
しかし、DXライブラリから本が出版されています。
http://www.google.co.jp/search?hl=ja&q=14%E6%AD%B3%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BC%E8%A8%80%E8%AA%9E%E3%82%8F%E3%81%8F%E3%82%8F%E3%81%8F%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%95%99%E5%AE%A4&lr=

読んだ事が無いのでよくわかりませんが、DXライブラリを使った書籍というのはこれ以外に聞いたことがないので、参考にしてみてはいかがでしょうか。


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

Name: よっつん  ..入門者(3,182ポイント)   Date: 2007/11/01(木) 22:48   No:11443     
Title: Re:質問です。    
こんにちは。
シューティングで役に立つ当たり判定の記事がわかりやすく解説されているサイトをひとつ。

http://marupeke296.com/index.html

私は文系で物理やら数学はさっぱりですが、ここはとても分かりやすかったです(~▽~@)♪


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

Name: ひろっち  ..ぴよぴよ(143ポイント)   Date: 2007/11/02(金) 11:34   No:11459 解決!     
Title: Re:質問です。    
返答ありがとうございます。
一度参考にして、頑張ってみようと思います。


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



Name:  ..上級者(15,151ポイント)   Date: 2007/11/02(金) 01:57   No:11447       
Title: 再起:数独用 の確認の仕方が良く分かりません。    


数独をとくためのパーツとして再起関数を作ったのですが、ちゃんと動作するかどうかの確認方法が分からなかったので、質問しています。
以下のことは成り立っているでしょうか?

** やりたいこと **

   →x, j
■□■
↓ ■□□
y,i ■■■

□ :条件を満たす( check_number == true )
■ :条件を満たさない
について、

一つ目の□では配列の途中で停止していて、次の四角に進む
そしてその次でも同じことを行い右下に来てしまったらそのとき
前呼び出したところに戻る。
樹形図のような感じで処理していきたいと考えています。

うまく日本語に出来ていませんが、よろしくお願いします。

** --------- **

** 処理内容が足りないスクリプト ** 実行は出来ています **

#include <stdio.h>

#define false 0
#define true 1

int map[9][9];

/*
a :チェックしたい変数
*/
int check_number(int a, int x, int y)
{
int i,j;

x=x*3; y=y*3;

for(i=y; i<3+y; i++){
for(j=x; j<3+x; j++){
if(map[i][j] == a)
return false;
}
}
return true;
}

/*
本題
*/
void check_pattern(int change_x, int change_y)
{
int y,x;
int a=1;

for(y = 0+change_y; y<3; y++){
for(x = 0+change_x; x<3; x++ ){
if(check_number(a, x, y) == true){
if(x == 2){ //右端の時
if(y==2) break;
else check_pattern(0,1);
}else{
check_pattern(1,0);
}
}
}
change_x=0;
}
}

int main()
{
check_pattern(0,0);

return 0;
}
** --------------------------------- **



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




Name: parapara  ..初心者(6,895ポイント)   Date: 2007/10/30(火) 17:04   No:11369       
Title: 音楽を多重起動するには?    
3Dゲームとかで一片に敵を倒すと、敵の断末魔が重なって聞こえてきますが、

あのように、同じ音を多重起動するにはどうすればいいんでしょうか?
分かり難いかもしれませんが、どうぞよろしくお願いします。
一応考えて見ましたが、どこが悪いのかわかりません。
#define _WIN32_WINNT 0x400
#include<windows.h>
#define PRT_CLASS "Prt_Class"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
HWND hWnd;
MSG msg;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=PRT_CLASS;
wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wcex);

hWnd=CreateWindow(PRT_CLASS,
"親ウィンドウ",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static ThreadParam param;
DWORD dwID;
static MCI_OPEN_PARMS mop;
int iErr;
TCHAR strErr[255];
switch(message){//音楽
case WM_CREATE:
mop.dwCallback=(DWORD)hWnd;
mop.lpstrDeviceType=(LPCTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
mop.lpstrElementName=TEXT("test.wav");
iErr=mciSendCommand(NULL,MCI_OPEN,
MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,
(DWORD)&mop);
if(iErr){
mciGetErrorString(iErr,strErr,1024);
MessageBox(hWnd,strErr,NULL,MB_OK);
return(-1);
}
return(0);
case WM_LBUTTONDOWN:
param.mop=mop;
param.owner=hWnd;
CreateThread(NULL,0,ThreadFunc,(LPVOID)¶m,0,&dwID);
//mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
return(0);
case WM_RBUTTONDOWN:
mciSendCommand(mop.wDeviceID,MCI_STOP,0,0);
mciSendCommand(mop.wDeviceID,MCI_SEEK,
MCI_SEEK_TO_START,0);
return(0);
case WM_DESTROY:
mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0);
PostQuitMessage(0);
return(0);
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
}


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


Name: parapara  ..初心者(6,910ポイント)   Date: 2007/10/31(水) 20:18   No:11406     
Title: Re:音楽を多重起動するには?    
環境は OS:Windows XP pro、処理系:VS.NET2003を使用しています。
どうかよろしくお願いします。


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

Name: ibis  ..ぴよぴよ(561ポイント)   Date: 2007/10/31(水) 20:26   No:11407     
Title: Re:音楽を多重起動するには?    
PlaySound関数を使うと簡単ですよ。
ただ、winmm.libをリンクする必要がありますが。
これを使うと、音を再生しながらでも別の処理ができます。

ソースコードは流し読みしただけなのでよくわかりませんが、
もしスレッドを再生の為に作っているのなら、
この関数を使えばマルチスレッドは必要無くなるかと思います。


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

Name: parapara  ..初心者(6,931ポイント)   Date: 2007/11/01(木) 07:25   No:11423     
Title: Re:音楽を多重起動するには?    
ありがとうございます。早速試してみます。

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

Name: バグ  ..比類無きプログラマー(61,971ポイント)   Date: 2007/11/01(木) 08:08   No:11424     
Title: Re:音楽を多重起動するには?    
あれ?PlaySound関数は多重起動できないんじゃないですか?
同じファイルを連続して再生すると、再生〜停止〜再生〜停止となるので、エコーがかかったようには聞こえないと思います。


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

Name: parapara  ..初心者(7,104ポイント)   Date: 2007/11/01(木) 14:40   No:11428 解決!     
Title: Re:音楽を多重起動するには?    
PlaySoundは以前にも試してみて、駄目だったので、自分のやり方が悪かったのかと思い、
もう一度試してみましたが、
バグ様の言う通りでした。PlaySoundは多重起動できませんでした。
あと私の勉強してる本にはPlaySoundは処理が重い&wavファイルのみなのでキャラクターの声などに
限定したほうがいいかもしれないようなことが書かれていました。
間違っても、バックグラウンドミュージックには使わないほうが良さそうなことが書かれていました。
MCIは軽くて、様々な圧縮形式に対応してるので、これを使うのがよいと書かれておりました。

ibis様バグ様アドバイスありがとうございます。
自己解決しました。勉強不足でした。ありがとうございました。


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

Name: ibis  ..ぴよぴよ(878ポイント)   Date: 2007/11/01(木) 19:37   No:11438     
Title: Re:音楽を多重起動するには?    
誤情報失礼しました。
同ファイルを多重にってのはできないのですね。


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



Name:  ..中級者(11,046ポイント)   Date: 2007/10/30(火) 18:45   No:11374       
Title: ウィンドウを別々に制御    
ウィンドウを二つ表示して、それぞれにおいて別々の処理を行いたいのですが、方法が分かりません。
ウィンドウの生成方法が間違っているのでしょうか?

どのようにすれば良いのかが分からず行き詰ってしまいました。

ご教授よろしくお願いします。


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


Name: tkmakwins15 [URL]  ..プログラマー(34,495ポイント)   Date: 2007/10/30(火) 18:53   No:11376     
Title: Re:ウィンドウを別々に制御    
ウィンドウごとにプロシージャとウィンドウクラスを別々にするというのはどうでしょうか?

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

Name:  ..中級者(11,078ポイント)   Date: 2007/10/30(火) 21:24   No:11384     
Title: Re:ウィンドウを別々に制御    
そんな事が可能なんですか?
是非方法を教えてはいただけ無いでしょうか?


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

Name: tkmakwins15 [URL]  ..プログラマー(35,948ポイント)   Date: 2007/10/30(火) 22:45   No:11386     
Title: Re:ウィンドウを別々に制御    
中身は同じウィンドウを2つ作り別々に制御するプログラム(ウィンドウは単なる雛形)

#include<windows.h>

bool AppInit(HINSTANCE,PTSTR);
bool AppInit2(HINSTANCE,PTSTR);
bool MakeBeginWindow(HINSTANCE,PTSTR);
WPARAM Message();
LRESULT CALLBACK WProc1(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WProc2(HWND,UINT,WPARAM,LPARAM);

bool w1=true,w2=true;

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WPARAM endcode=0;
PTSTR wcname1=TEXT("window1");
PTSTR wcname2=TEXT("window2");
if(!AppInit(hInstance,wcname1)||!AppInit2(hInstance,wcname2))return -1;
if(!MakeBeginWindow(hInstance,wcname1)||!MakeBeginWindow(hInstance,wcname2))return -1;
endcode=Message();
MessageBox(NULL,TEXT("終わり"),TEXT("終了通知"),MB_OK);
return endcode;
}

bool AppInit(HINSTANCE hInst,PTSTR wcname)
{
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WProc1;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(hInst,(LPCSTR)100);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=wcname;
return (bool)RegisterClass(&wc);
}

bool AppInit2(HINSTANCE hInst,PTSTR wcname)
{
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WProc2;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(hInst,(LPCSTR)100);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=wcname;
return (bool)RegisterClass(&wc);
}

bool MakeBeginWindow(HINSTANCE hInst,PTSTR wcname)
{
HWND hWnd;
bool wndbool;
hWnd=CreateWindow(wcname,TEXT("Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,480,360,
NULL,NULL,hInst,NULL);

wndbool=(bool)hWnd;

if(wndbool==false){
return wndbool;
}
ShowWindow(hWnd,SW_SHOW);
return wndbool;
}

WPARAM Message()
{
MSG msg;
while(1){
if(GetMessage(&msg,NULL,0,0)==0&&!w1&&!w2)
break;

TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}


LRESULT CALLBACK WProc1(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
switch(message){
case WM_DESTROY:
w1=false;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wp,lp);
}

LRESULT CALLBACK WProc2(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
switch(message){
case WM_DESTROY:
w2=false;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wp,lp);
}

たぶんこんな感じと思います。


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

Name:  ..中級者(11,079ポイント)   Date: 2007/10/31(水) 00:12   No:11388 解決!     
Title: Re:ウィンドウを別々に制御    
ありがとうございます!

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

Name:  ..中級者(11,498ポイント)   Date: 2007/11/01(木) 01:01   No:11419     
Title: Re:ウィンドウを別々に制御    

一度解決したといっておいて何なのですが、
tkmakwins15さんに質問があります。
とても基礎的なことだと思いますがよろしくお願いします。

WPARAM endcode=0;

endcode=Message();

この二つは何そしているのかが良く分かりませんでした。

if(!AppInit(hInstance,wcname1)||!AppInit2(hInstance,wcname2))
これあは、どちらかがTrue(0以外)でなかった時という解釈で良いんですよね?
(今必死でC++の勉強中です…)

wndbool=(bool)hWnd;

if(wndbool==false){
return wndbool;
}

これは、ハンドルが生成失敗をした時に0を返すという処理に見えますが、
何故boolを使ってやっているのでしょうか?
boolのfalseは0なので、普通に
if(hWnd == 0)
return hWnd;
とやってしまってはいけないのでしょうか?
一様実行をしてみても問題が無い感じたのですが、後に問題が生じるのでしょうか?

WProc1の中で
w1=false;

とされていますが、他の場所で使用されているのが発見できませんでした。
何故 w1 や w2 が必要なのでしょうか?

他にも理解できていないところがありますが、それはC言語の方でも同じように使われているので、
呪文であると考えて、今わスルーしているので、僕のレベルでは理解できないだろう、
と思われる個所がありましたら、呪文ですで良いので、ご回答の程よろしくお願いします。

最後に、もしC++関係でお勧めの書籍などありましたらお教えいただけるとうれしいです。



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

Name: tkmakwins15 [URL]  ..プログラマー(36,229ポイント)   Date: 2007/11/01(木) 08:33   No:11425     
Title: Re:ウィンドウを別々に制御    
上から順に説明します。引用は色を変えて対応します。


WPARAM endcode=0;

endcode=Message();

これは、Message()関数の戻り値に関係があります。Message()の戻り値は、終了コードになるようにしているのです。

ハンドルのfalseの返し方の問題ですが、これはただbool型であることを明記しているだけです。なので、そのまま返しても大丈夫です。

w1,w2の意味は、ウィンドウの存在フラグです。両方のウィンドウが閉じられたらソフトを終了させるという意味です。

僕のコーディングは教えてもらったものではなく、自分でHP見ながら自分が読みやすいようなコーディングにしてますから読みにくかったと思います。読みにくいプログラムを示してしまい失礼しました。


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

Name: tkmakwins15 [URL]  ..プログラマー(35,965ポイント)   Date: 2007/11/01(木) 09:02   No:11426     
Title: Re:ウィンドウを別々に制御    
すいません、回答足りませんね。

>他にも理解できていないところがありますが、それはC言語の方でも同じように使われているので、
>呪文であると考えて、今わスルーしているので、僕のレベルでは理解できないだろう、
>と思われる個所がありましたら、呪文ですで良いので、ご回答の程よろしくお願いします。

そんなことは気にせず、分からなかったら質問していただければいいですよ。

いい本の紹介です、ハーバート・シルト著の「独習C++」や柴田望洋著の「明解C++」がC経験者には最適です。
Windowsプログラミングの入門書であれば粂井康孝著の「猫でも分かるWindowsプログラミング」がいいでしょう。
C++の奥深いところを解説してある本は、Bjarne Stroustrup著の「プログラミング言語C++第3版」がいいと思います。


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

Name:  ..中級者(13,041ポイント)   Date: 2007/11/01(木) 14:55   No:11429     
Title: Re:ウィンドウを別々に制御    
ご回答ありがとうございます。

>僕のコーディングは教えてもらったものではなく、自分でHP見ながら自分が読みやすいような
>コーディングにしてますから読みにくかったと思います。読みにくいプログラムを示してしまい失礼しました。

ぜんぜんそんなことはありません。
参考になります!

>そんなことは気にせず、分からなかったら質問していただければいいですよ。
ありがとうございます。
よろしくお願いします。

>w1,w2の意味は、ウィンドウの存在フラグです。両方のウィンドウが閉じられたらソフトを終了させるという意味です。

どうやって存在フラグが成立しているのでしょうか?
WM_DESTROY の中でfalseにしているので、ほとんど意味が無い様に思うのですがどうなんでしょうか?
w1をw2があるところで宣言すると、ウィンドウが破棄されるのでしょうか?

今学校で試すことができないので、家に帰ったらやってみますが、よろしければお答えお願いします。



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

Name: tkmakwins15 [URL]  ..プログラマー(36,753ポイント)   Date: 2007/11/01(木) 15:28   No:11431     
Title: Re:ウィンドウを別々に制御    
僕も今学校から帰ってきて見たところです。

グローバル変数ですから、プログラム中のどこからでも見ることができます。宣言時にtrueにしていますね。
なので、ウィンドウが閉じられるまでずっとtrueを指し示すようになります。
閉じられた時には、ウィンドウプロシージャにWM_DESTROYを送りますから、それを捕まえて、falseにすると、ウィンドウがないという状態だと指す事ができます。流れとしては…

最初、フラグ変数2つはtrue(真)で初期化。
        ↓
※メッセージループの終了条件は二つのフラグがfalse(偽)である事。
        ↓
(ウィンドウが1つ閉じられた時)
閉じられたほうのウィンドウのプロシージャにWM_DESTROYが来る。
そのときに対応するフラグをfalse(偽)にする。
        ↓
ウィンドウが2つ閉じていないので終了条件には適合しない。
        ↓
(2つ目が閉じられた時)
もう一方のウィンドウのプロシージャにWM_DESTROYが来る。
対応するフラグをfalse(偽)にする。
        ↓
すると※の二つのフラグが偽であるという条件に合致するため、メッセージループの終了となる。
        ↓
そのときに受け取った終了コードでプログラムを終了する。

という感じになります。


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

Name:  ..中級者(13,266ポイント)   Date: 2007/11/01(木) 17:15   No:11433 解決!     
Title: Re:ウィンドウを別々に制御    
ご回答ありがとうございます。

>if(GetMessage(&msg,NULL,0,0)==0&&!w1&&!w2)
の一文を探し出せていませんでした。

詳しい説明ありがとうございました。
やっていてわからないところがあったらまた質問させていただきたいと思います。

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


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



Name: GPGA  ..プログラマー(37,536ポイント)   Date: 2007/10/31(水) 19:09   No:11401       
Title: バッファから作成できるストリームについて    
お世話になります。

C++のストリームについての質問です。
JavaのByteArrayInputStreamのような、バッファを対象とするストリームはありますでしょうか?

やりたいこととしては、あるリソースを管理するクラスがあり、そのクラスはファイルからの読み込みとバッファからの読み込みに対応しています。
簡単にですが、やっていることを説明するクラスを以下に記載します。


class CResource
{
public :
SetFile(const char* szFileName) {
std::ifstream ifs(szFileName, std::ios::in | std::ios::binary);
std::istream is(ifs.rdbuf());
int size; // サイズ

// 必要な箇所にストリームのポインタをセットする
・・・

ReadData(is, size);
}

SetMemory(const char* lpcBuffer) {
// std::ifstream ifs(szFileName, std::ios::in | std::ios::binary); ←★ここにバッファからストリームを作成するクラス
std::istream is(ifs.rdbuf());
int size; // サイズ

// 必要な箇所にストリームのポインタをセットする
・・・

ReadData(is, size);
}

private :
void ReadData(std::istream& is, int size) {
buf.resize(size);
is.read(&buf[0], size);
}

private :
std::vector<char> buf;
};
 
★に該当するクラスはありますでしょうか?
宜しくお願いいたします。


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


Name: たかぎ [URL]  ..上級者(16,672ポイント)   Date: 2007/10/31(水) 19:22   No:11402     
Title: Re:バッファから作成できるストリームについて    
std::istrstream は試してみましたか?
一応非推奨扱いにはなっていますが、実はかなり便利なクラスだったりします。


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

Name: GPGA  ..プログラマー(37,887ポイント)   Date: 2007/10/31(水) 19:41   No:11403     
Title: Re:バッファから作成できるストリームについて    
ご返信ありがとうございます。

先ほど記載を忘れましたが、環境は OS:Windows XP、処理系:VS2005を使用しています。

istringstreamは試してみましたが、コンストラクタでバッファを渡したときに
バッファに0があると、そこでデータを切り取られてしまうため、画像やサウンドなどのデータを扱う場合、不可能と判断しました。



#include <iostream>
#include <sstream>

int main()
{
char buf[4] = { 0 };
char buf2[] = { 3, 2, 0, 1, };
std::istringstream iss(buf2);
std::istream is(iss.rdbuf());

is.read(buf, 4);

for (int i = 0; i < 4; ++i) {
std::cout << "buf[" << i << "] = " << (int)buf[i] << std::endl;
}
return 0;
}

[結果]
buf[0] = 3
buf[1] = 2
buf[2] = 0
buf[3] = 0

 
istringstreamに替わるクラスもしくは、istringstreamクラスで0終端でデータを切らない方法などはありますでしょうか?


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

Name: GPGA  ..プログラマー(37,998ポイント)   Date: 2007/10/31(水) 19:56   No:11405     
Title: Re:バッファから作成できるストリームについて    

追記

std::istringstream iss(buf2);

std::istringstream iss(buf2, std::ios::in | std::ios::binary);

に変更して試してみましたが、結果に変化はありませんでした。
 


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

Name: たかぎ [URL]  ..上級者(16,726ポイント)   Date: 2007/10/31(水) 23:33   No:11418     
Title: Re:バッファから作成できるストリームについて    
istringstream ではなく istrstream です。
コンストラクタでサイズを指定してやれば、ナル文字は考慮されなかった気がするのですが...


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

Name: GPGA  ..プログラマー(38,049ポイント)   Date: 2007/11/01(木) 10:58   No:11427     
Title: Re:バッファから作成できるストリームについて    
> istringstream ではなく istrstream です。
大変失礼しました。
勝手にistringstreamに脳内変換していました。

istrstreamを使用することで、望む動作を得ることができました。
ありがとうございました。


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



Name: C.K  ..かけだし(1,417ポイント)   Date: 2007/10/31(水) 18:26   No:11399       
Title: DXライブラリでの弾の処理    
はじめまして。現在DXライブラリを用いてゲーム作成を行っております。キャラクターが右を向いているときは、右方向に弾を発射して、左を向いているときは左方向に発射するというプログラムを作りたいのですが、うまくいきません。

以下のように作ってみたのですが、これだと、右方向に弾を発射している途中に左を押すと、右にいっていた弾が左向きに方向転換して左に飛んで行ってしまいます。

途中で弾の向きが変わらないようにするにはどうすればいいでしょうか?

#include "DxLib.h"

struct CharaData{
int x;
int y;
int muki;
int ghandle;
int life;
};

//プロトタイプ宣言
void JitamaMove();

//グローバル変数
struct CharaData jikidata;
struct CharaData jitama[3];
int trigger = 0;

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

jikidata.ghandle = LoadGraph("media\\char01.png");
jikidata.x=0;
jikidata.y=296;
jikidata.muki=1;
int g = LoadGraph("media\\tama.jpg");
for(int i=0; i<3; i=i+1) jitama[i].ghandle = g;

SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClsDrawScreen();
DrawBox(0,360,640,480,65535,TRUE);

//自キャラ移動
int Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if( Key & PAD_INPUT_UP ) jikidata.y -= 3 ; // 上を押していたら上に進む
if( Key & PAD_INPUT_DOWN ) jikidata.y += 3 ; // 下を押していたら下に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.x += 3 ; // 右を押していたら右に進む
if( Key & PAD_INPUT_LEFT ) jikidata.x -= 3 ; // 左を押していたら左に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.muki = 1; //右を押したらjikidata.mukiに1を代入
if( Key & PAD_INPUT_LEFT ) jikidata.muki = 2; //左を押したらjikidata.mukiに2を代入


//右を押したら右向き、左を押したら左向きの画像を表示
if(jikidata.muki==1)
jikidata.ghandle = LoadGraph("media\\char01.png");
if(jikidata.muki==2)
jikidata.ghandle = LoadGraph("media\\char02.png");
DrawGraph(jikidata.x,jikidata.y,jikidata.ghandle,TRUE);

JitamaMove();
ScreenFlip();
}

DxLib_End();
return(0);
}

void JitamaMove(){
//弾の発射
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(( key & PAD_INPUT_B ) && (trigger == 0)){
for(int i=0; i<3; i=i+1){
if(jitama[i].life == 0){
jitama[i].life = 1;
jitama[i].x = jikidata.x+24;
jitama[i].y = jikidata.y+8;
break;
}
}
trigger = 20;
}
if(trigger>0) trigger = trigger - 1;

//弾の移動
if(jikidata.muki == 1){
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x + 10;
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x >640) jitama[i].life = 0;
}
}
}
else if(jikidata.muki == 2){
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x - 10;
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x <0) jitama[i].life = 0;
}
}
}
}


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


Name: やそ  ..かけだし(2,255ポイント)   Date: 2007/10/31(水) 19:42   No:11404     
Title: Re:DXライブラリでの弾の処理    
一度発射された弾にはその時のjikidata[i].muki をjitama[i].muki
にセットしておいて、弾の移動ルーチンの判定は
jitama[i].mukiを使うといいんじゃないかな?

if(jitama[i].life > 0){
//life>0なら弾がある
switch (jitama[i].muki) {
//右方向に発射!どっかーん!
case 1:
  jitama[i].x = jitama[i].x + 10;
//画面外に出た時の処理 ばいばいきーん!
if(jitama[i].x >640) jitama[i].life = 0;
break;
//左方向に発射!ばっきゅーん!
case 2:
  jitama[i].x = jitama[i].x - 10;
//画面外に出た時の処理 ばいばいきーん!
if(jitama[i].x <0) jitama[i].life = 0;
break;
}
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
}



こんなかんじ?


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

Name: ibis  ..ぴよぴよ(846ポイント)   Date: 2007/10/31(水) 20:50   No:11408     
Title: Re:DXライブラリでの弾の処理    
switch (jitama[i].muki) {
//右方向に発射!どっかーん!
case 1:
  jitama[i].x = jitama[i].x + 10;
break;
//左方向に発射!ばっきゅーん!
case 2:
  jitama[i].x = jitama[i].x - 10;
break;
}
//画面外に出た時の処理 ばいばいきーん!
if(jitama[i].x <0 || jitama[i] >640) jitama[i].life = 0;

弾の消滅で、ほぼ同じ処理が重複してますので、
こうすると少し見やすいかと。(見やすいか否かは個人差があるかとは思いますが)
まぁ一般的には「同じ事を2度書くな」と言いますし。

論点がずれてますよね。
失礼しました。


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

Name: C.K  ..かけだし(1,507ポイント)   Date: 2007/10/31(水) 23:32   No:11417 解決!     
Title: Re:DXライブラリでの弾の処理    
>やそ様
お教えいただいてありがとうございました。
教えていただいた方法で無事にできました!
ありがとうございました!

>ibis様
見やすく書くのに慣れていないのでとても参考になりました。
ありがとうございました!


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



Name: しゅうじ  ..ぴよぴよ(260ポイント)   Date: 2007/10/31(水) 21:30   No:11412       
Title: クリックイベントについて    
初めまして。しゅうじと申します。

学校の授業の課題で好きにソフトを作ることになったので、自分たちの班では
クリックの回数をカウントする、クリックカウンターのようなものを作ることになりました。

色々と調べてみたのですが、自分のプログラムのウィンドウ内のクリックは
ここ
ttp://www.fireproject.jp/feature/c-language/curses/mouse.html
のページを見てなんとなくできそうだと思ったのですが、ウィンドウ外の
クリックを拾う方法はあるでしょうか?
こういう場所を調べたらいいとか、この本を読んだらいいとかでも良いので
できたらアドバイスをお願いします。

環境はLinuxRedhatです。曖昧な感じで申し訳ないですが、よろしくお願いします。



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




Name: AISU  ..ぴよぴよ(212ポイント)   Date: 2007/10/30(火) 17:59   No:11372       
Title: ファイルからの値の読み込み    
どうしても解き方の分らない問題があるので教えてください。


矩形AはX軸の+方向に一定の速度で進む
矩形BはX軸の−方向に一定の速度で進む

A,Bの動きをシュミレーションして、毎秒ごとのA,Bの位置と衝突する
秒数を画面に表示させよ。

ただし、各矩形の初期位置及び大きさ、速度はCドライブのtempファイルに記述されているものとし、
ファイルから読み込んで設定できるものとする。
初期位置及び大きさ、速度は任意の値でよい。

何度挑戦してもビルドが通りませんでした。
正解例のコーディングを見て勉強したいとおもいますので、どなたかご教授お願いします。


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


Name: バグ  ..比類無きプログラマー(60,537ポイント)   Date: 2007/10/30(火) 18:27   No:11373     
Title: Re:ファイルからの値の読み込み    
具体的にどのようなエラーが出てビルド出来ないのでしょうか?
また、自分自身、何が分かっていないか言えますか?
それから、最低でも開発環境くらいは書いていただかないと答えようがありません。
最後に、ここの掲示板は、答えを求める場所ではなく、アドバイスを求める場所です。つまり最終的に課題を解くのは、あなた自身だという事を忘れないで下さい。


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

Name: tkmakwins15 [URL]  ..プログラマー(34,449ポイント)   Date: 2007/10/30(火) 18:46   No:11375     
Title: Re:ファイルからの値の読み込み    
ファイルがバイナリならfopen("ファイル名","rb");で開く、fread()で読み込む。
テキストによるcsvに近いなら
"rb"→"r"として、fscanf()またはfgets→atoiの組み合わせでしょう。


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

Name: AISU  ..ぴよぴよ(314ポイント)   Date: 2007/10/30(火) 18:55   No:11377     
Title: Re:ファイルからの値の読み込み    
正直お手上げですので、質問した次第です。
そういう状況なら丸投げも可と利用規約に書いてありましたので・・・。
tempファイルはメモ帳です。
使用しているコンパイラはVisual C++ 2005 Express Editionで、
使用パソコンのOSはXPです。


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

Name: box  ..比類無きプログラマー(91,148ポイント)   Date: 2007/10/30(火) 20:36   No:11381     
Title: Re:ファイルからの値の読み込み    
> 何度挑戦しても

と書かれていますので、何らかのソースコードは
お手元にありますね?

それを提示してみるお考えはありますか?


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

Name: toyo  ..初心者(5,365ポイント)   Date: 2007/10/30(火) 20:54   No:11383     
Title: Re:ファイルからの値の読み込み    
条件の後出しはだめですよ
できれば課題の文章そのままがいいです
値は任意でよいとしてファイルフォーマットは決まってないのですか?
例えば
AX0,AY0,AX1,AY2,AV,BX0,BY0,BX1,BY1,BV
のように矩形の左上座標、右下座標、速度の順にコンマ区切りの整数とするとか
あと表示する矩形の位置は左上の座標なのか中心の座標なのか
衝突しない場合の処理はどうするのか



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

Name: AISU  ..ぴよぴよ(373ポイント)   Date: 2007/10/31(水) 09:33   No:11390     
Title: Re:ファイルからの値の読み込み    
最初に投稿した記事の問いが課題の文章そのままです。
表示する矩形の位置は中心の座標でいいと思います。
衝突しない場合の処理は考えなくても良いと思われますといいますか、
単純に+方向と−方向に進む2つの物体が衝突しないという事態は考えられるのでしょうか?


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

Name: AISU  ..ぴよぴよ(407ポイント)   Date: 2007/10/31(水) 09:35   No:11391     
Title: Re:ファイルからの値の読み込み    
ファイルフォーマットにつきましても特に指示はありませんでした。
値が読み込めさえすれば良いのだと思います。


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

Name: バグ  ..比類無きプログラマー(61,123ポイント)   Date: 2007/10/31(水) 10:35   No:11392     
Title: Re:ファイルからの値の読み込み    
>>単純に+方向と−方向に進む2つの物体が衝突しないという事態は考えられるのでしょうか?

例えば矩形1がプラス方向、矩形2がマイナス方向に動くとして、矩形2の初期位置の値が、矩形1の初期位置の値よりも小さかった場合ですね。これは絶対に衝突しないですよね?


>>ファイルフォーマットにつきましても特に指示はありませんでした。
>>値が読み込めさえすれば良いのだと思います。

下記のソースは『データを読み込むだけ』のサンプルです。移動・衝突などの処理は一切行っていません。
分からない所があったら、また書き込みしてください(^-^)



#include <stdio.h>

/* データ格納用構造体 */
typedef struct Temp_Data
{
float width; // 矩形幅
float height; // 矩形高
float speed; // 1sec辺りの移動量
float postion; // 矩形
} TEMP_DATA;

/* メイン関数 */
void main(void)
{
int i, check;
TEMP_DATA temp[2];
FILE* pFile;

/* テキストFileを読み込みモードでオープンする */
if ((pFile = fopen("temp.txt", "rt")) == NULL)
{
/* Fileのオープンに失敗したので終了する */
printf("File Open NG!!\n");
return;
}
else
{
printf("File Open OK!!\n");
}

/* Fileデータの読み込み */
for (i = 0; i < 2; i++)
{
/* データ読み込み */
check = fscanf(pFile, "%f,%f,%f,%f", &temp[i].width, &temp[i].height, &temp[i].speed, &temp[i].postion);

/* データ読み込みのエラーチェック */
if (check == 0 || check == EOF)
{
/* データの読み込みに失敗したので終了する */
printf("File Read NG!!\n");
return;
}
else
{
printf("TempData %d Read OK!!\n", i + 1);
}
}

/* 読み込んだデータの表示 */
for (i = 0; i < 2; i++)
{
printf("幅 = %f, 高 = %f, 速 = %f, 位置 = %f\n", temp[i].width, temp[i].height, temp[i].speed, temp[i].postion);
}

}


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

Name: AISU  ..ぴよぴよ(522ポイント)   Date: 2007/10/31(水) 10:51   No:11393     
Title: Re:ファイルからの値の読み込み    
回答ありがとうございます。
しかし、ファイルの読み込みの所はなんとか自分でも理解はできていました。
私がお聞きしたかったのは移動・衝突などの処理のロジックです;;
申し訳ございませんが、引き続きご教授願えたら幸いです。


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

Name: バグ  ..比類無きプログラマー(61,682ポイント)   Date: 2007/10/31(水) 11:26   No:11394     
Title: Re:ファイルからの値の読み込み    
既にtoyoさんが書き込みしていますが、矩形の何処を基準にすれば良いのでしょうか?


矩形@         矩形A
A┏━━━━━━━━┓D E┏━━━━━━━━┓H
┃        ┃  ┃        ┃
┃        ┃  ┃        ┃
B┗━━━━━━━━┛C F┗━━━━━━━━┛G



例えば上記の用な矩形があったとして、矩形@の初期位置の座標というのを、Aを基準にするのか、Dを基準にするのか、はたまたAとDの中間地点とするのかで判定基準が変わってきますので、任意だと言われるのならば、その辺りをあらかじめ自分で決めておいていただかねばなりません。

仮に矩形@をA、矩形AをEの位置を初期位置とした場合の衝突判定を説明します。

このときの衝突したと判断する条件は、D値がE値よりも大きくなった場合(もしくはE値がD値よりも小さくなった場合…って、当然ですね(汗))となるのは分かりますか?

この条件が満たされているかを調べる為には、それぞれの矩形のN秒後の位置を求める必要があります。

《 初期位置 + 1秒辺りの移動量 × 移動開始からの経過時間(秒) 》

それは上記の式で求まります。

しかしこれはあくまでもA値とE値であって、今回必要なのはD値とE値の比較値な訳です。そこで、A値に矩形の幅を足してやる事でD値を求めてやる訳です。

これで、条件を判断するのに必要な条件は揃いましたよね?
あとはD値とE値を比較すればよいだけです。説明がくどくなってしまいましたが、分かってもらえましたか?


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

Name: AISU  ..ぴよぴよ(632ポイント)   Date: 2007/10/31(水) 12:52   No:11395     
Title: Re:ファイルからの値の読み込み    
丁寧なご説明誠に感謝いたします。
説明も理解できて、納得もできるのですが、
そこまでは、私も考えついておりました;;
わからないのは、それをソース上で表すにはどうすればよいか?
ということに尽きます。
初期位置については、バグ様の仮設定通り、
矩形@をA、矩形AをEで構いませんので、
お手数おかけしますが、引き続きご教授願えないでしょうか?


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

Name: バグ  ..比類無きプログラマー(61,912ポイント)   Date: 2007/10/31(水) 13:33   No:11397     
Title: Re:ファイルからの値の読み込み    
まず、今回の処理にあらかじめ必要なデータを考えてみて下さい。
これは上記の説明を読んでもらえばすぐに分かると思います。

@:矩形の位置
A:矩形の幅
B:矩形の1秒辺りの移動量

…の3つですよね。この3つのデータが各矩形ごとに必要となります。
ここまでが私が前に載せたデータ読み込みの部分です。


次の段階は、矩形@と矩形Aを移動させて、衝突するまで繰り返すことになります。

@:時間のカウントを1秒進める
A:矩形@の現在位置を計算して、画面に表示する
B:矩形Aの現在位置を計算して、画面に表示する
C:衝突していたらDへ、そうでなければ@へ戻る
D:衝突した時点の時間を画面に表示して終了

という流れになります。
前述のファイル読み込みのソースが理解できるならば、充分に組めると思いますよ。

頑張って下さい♪


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



Name: リク  ..ぴよぴよ(18ポイント)   Date: 2007/10/26(金) 22:31   No:11267       
Title: 質問なんですが・・・    
インベーダーゲームをつくりたいのですが、
敵の動きのプログラムが分からないです。
教えていただけませんか?


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


Name: tkmakwins15 [URL]  ..プログラマー(33,150ポイント)   Date: 2007/10/26(金) 23:53   No:11270     
Title: Re:質問なんですが・・・    
>リクさん

とりあえず、ある画像をウィンドウ内で下に動かすようなプログラムは組めますか?

敵の動きというのは、アニメーションの考え方になります。そこで、画像の描画位置を少しずつ動かしていく事で表現できます。
ということは、座標を少しずつ変化させていく事で、画像を動かせます。


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

Name: リク  ..ぴよぴよ(113ポイント)   Date: 2007/10/27(土) 00:08   No:11271     
Title: Re:質問なんですが・・・    
回答ありがとうございます。

画像を右なら右、左なら左みたいに
一方通行ならプログラムはできるんですが、

インベーダーゲームみたいに
→→→→→↓
↓←←←←←

みたいなプログラムができないのです。


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

Name: 管理人 [URL]  ..伝説のハッカー(435,975ポイント)   Date: 2007/10/27(土) 00:47   No:11272     
Title: Re:質問なんですが・・・    

まずゲームだと思わずにコンソール画面で処理出来るかどうか試してみてください。

int x,y;

の変数を用意し、増減フラグ

int flag;

を用意して、座標(x,y)を考えます。

(0,0)→(1,0)→(2,0)→(3,0)

(1,1)←(2,1)←(3,1)←(4,1)
  ↓
(0,2)→(1,2)→(2,2)→(3,2)

このような動きをさせたいなら最初増減フラグはオンにしておきます。
増減フラグがオンの時はx座標が増加します。4まで来たら増減フラグはオフにします。
増減フラグが入れ替わる時、yが1増加します。
オフにしている最中はxは減少します。0まで来ると増減フラグはオンになります。

これを実装すればいいのではないでしょうか?
上記のような座標がコンソールで出せるかやってみてください。



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

Name: 管理人 [URL]  ..伝説のハッカー(436,109ポイント)   Date: 2007/10/27(土) 00:56   No:11273     
Title: Re:質問なんですが・・・    
もし言っている意味がわからなければ以下のサンプルを参考にしてください。

アルゴリズムは上のものをそのまま実装しただけです。


#include <stdio.h>

int main(){
int x=0,y=0,flag=1;
while(y<5){
printf("(%d,%d)\n",x,y);
x += flag; //x座標を増減
if(x>=4 || x<=0){ //範囲の外まで来たら
flag*=-1;//フラグを入れ替える
y++; //y座標増加
}
}
return 0;
}
 


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

Name: 管理人 [URL]  ..伝説のハッカー(436,523ポイント)   Date: 2007/10/27(土) 01:06   No:11274     
Title: Re:質問なんですが・・・    
DXライブラリをお使いでしたら以下のサンプルもどうぞ。


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int x=0,y=0,flag=1;
char Key[256];
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
DrawBox(x*30,y*30,(x+1)*30,(y+1)*30,GetColor(255,255,255),TRUE);//四角形描画
x += flag;
if(x>=10 || x<=0){
flag*=-1;
y++;
}
if(y>10)break;
ScreenFlip(); //裏画面反映
WaitTimer(100);//0.1秒待つ
}
DxLib_End();
return 0;
}
 


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

Name: リク  ..ぴよぴよ(0ポイント)   Date: 2007/10/27(土) 09:27   No:11278     
Title: Re:質問なんですが・・・    
回答ありがとうございます。
DXライブラリをつかっているので、下のプログラムを実行してみました。
思っているような動きをしたのはしたのですが、
さきほど管理人さんがおっしゃられたものなのですが、



(0,0)→(1,0)→(2,0)→(3,0)

(1,1)←(2,1)←(3,1)←(4,1)
  ↓
(0,2)→(1,2)→(2,2)→(3,2)

これを下のようにできませんか?

(0,0)→(1,0)→(2,0)→(3,0)→(4,0)

(0,1)→(1,1)←(2,1)←(3,1)←(4,1)

(0,2)→(1,2)→(2,2)→(3,2)→(4,2)
 


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

Name: リク  ..ぴよぴよ(35ポイント)   Date: 2007/10/27(土) 09:32   No:11279     
Title: Re:質問なんですが・・・    
空白をいれたつもりが変な風になってしまいました。

僕が変えたところは、

上の↓は(4,0)の下です。



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

Name: tkmakwins15 [URL]  ..プログラマー(33,293ポイント)   Date: 2007/10/27(土) 09:48   No:11281     
Title: Re:質問なんですが・・・    
Dxライブラリ使用だとしたら、画面の座標は左上を(0,0)として、右に行くほどx座標がが増加し、下に行くほどy座標が増加します。
つまり、int型変数で上下左右の動きを制御する変数を用意し、その変数の値によって、座標を動かすという考え方になります。
とりあえず、サンプルプログラムを作ってみましたのでlzhで添付します。


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

Name: リク  ..ぴよぴよ(63ポイント)   Date: 2007/10/27(土) 09:55   No:11282     
Title: Re:質問なんですが・・・    
回答ありがとうございます。

今から実行してみます。


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

Name: リク  ..ぴよぴよ(124ポイント)   Date: 2007/10/27(土) 10:08   No:11283     
Title: Re:質問なんですが・・・    
さきほどのサンプルの意味はわかったのですが、
キーボードで動かすのではなく、勝手に動くようにするには、
どこをかえればいいですか?


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

Name: リク  ..ぴよぴよ(340ポイント)   Date: 2007/10/27(土) 10:52   No:11284     
Title: Re:質問なんですが・・・    
管理人さんのとtkmakwins15のを両方を合体させて自分なりにプログラムを書いてみました。
こんな感じでいいでしょうか?


#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int x=0,y=0;//座標の変数
int x_flag=0,y_flag=0;//上下左右に動いているかのフラグ。
int grhandle; //グラフィックハンドル。
int flg = 3;

if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init()==-1) return -1;
SetDrawScreen(DX_SCREEN_BACK);

grhandle=LoadGraph("shikaku.bmp");

while(ProcessMessage()!=-1){

DrawGraph(x,y,grhandle,FALSE);

ScreenFlip();
ClearDrawScreen();

x += flg;

if(x==0 || x==300){
flg *= -1;
y += 5;
}
}

DxLib_End();
return 0;
}


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

Name: tkmakwins15 [URL]  ..プログラマー(33,952ポイント)   Date: 2007/10/27(土) 11:40   No:11285     
Title: Re:質問なんですが・・・    
方向を勝手に変えるには、乱数を使うとよいでしょう。

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int x=320-16,y=240-16;//座標の変数
int x_flag=0,y_flag=0;//上下左右に動いているかのフラグ。
int grhandle; //グラフィックハンドル。
int begin; //最初の基準秒数を記録する変数。

ChangeWindowMode(TRUE);
SetMainWindowText("sample");
SetOutApplicationLogValidFlag(FALSE);
if(DxLib_Init()==-1)return -1;
SetDrawScreen(DX_SCREEN_BACK);

grhandle=LoadGraph("shikaku.bmp");

begin=GetNowCount();
while(ProcessMessage()!=-1){

DrawGraph(x,y,grhandle,FALSE);

DrawFormatString(0,0,GetColor(255,255,255),"(%d,%d)",x,y);

ScreenFlip();
ClearDrawScreen();

if(CheckHitKey(KEY_INPUT_ESCAPE))break;//エスケープキーが押されたら終了。

//動いてから1秒経ったら動く方向を乱数で取得。
if(GetNowCount()-begin>1000){
x_flag=GetRand(2)-1;
y_flag=GetRand(2)-1;
begin=GetNowCount();
}
//x_flagは上に動くなら-1、変化なしなら0、下へ動くなら1を指し示す。
x += x_flag*2;
//y_flagも右なら-1、動かないなら0、左なら1を指す。
y += y_flag*2;
if(x<0)x=0; //X座標が0より下ならば、見えないので強制的に0にする。
if(x>640-32)x=640-32;//X座標が640-32より上ならば、同じ理由で640-32にする。
//Y座標も同じように修正する。
if(y<0)y=0;
if(y>480-32)y=480-32;

}
DxLib_End();
return 0;
}

//基本的な部分の説明は省略させていただきました。

これはサンプルプログラムです、さっきのソースコードをこれに置き換えて、コンパイルしなおすと、さっきとは動きが変わります。
考え方は、X座標が右に変化する時は−、左に動く時は+、動かなければ0とすると、それに1フレームで動かしたいドット数をかけると、その方向に変化するということです。


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

Name: 管理人 [URL]  ..伝説のハッカー(437,215ポイント)   Date: 2007/10/27(土) 14:25   No:11287     
Title: Re:質問なんですが・・・    
それなら方向を決める変数を用意して、if文で制御してもいいのではないでしょうか?

方向を示す

int dir=0;

を用意します。

dir=0 は右方向に進む
dir=1 は下方向に進む
dir=2 は左方向に進む
dir=3 は下方向に進む

これを繰り返したらいいですよね?これを繰り返すには

dir = (dir+1)%4;

でOKです。
この変数に格納されている指示通り動かせばいいでしょう。


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int x=1,y=0,dir=0;
char Key[256];
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

DrawBox(x*30,y*30,(x+1)*30,(y+1)*30,GetColor(255,255,255),TRUE);

if(x>=10 || x<=0)//外側まで来たら
dir = (dir+1)%4;//方向転換

if (dir==0)//右方向なら
x++;//右へ
else if(dir==1 || dir==3)//下方向なら
y++;//下へ
else if(dir==2)//左方向なら
x--;//左へ

if(y>10)break;
ScreenFlip();
WaitTimer(100);
}
DxLib_End();
return 0;
}


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

Name: 管理人 [URL]  ..伝説のハッカー(437,582ポイント)   Date: 2007/10/27(土) 14:29   No:11288     
Title: Re:質問なんですが・・・    
ifを並べるのがいやならこんな風にスマートにも出来ます。
黄色の部分が変更点です。



#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int x=1,y=0,dir=0;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,1}; char Key[256];
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

DrawBox(x*30,y*30,(x+1)*30,(y+1)*30,GetColor(255,255,255),TRUE);


if(x>=10 || x<=0)//外側まで来たら
dir = (dir+1)%4;//方向転換

x+=dx[dir]; y+=dy[dir];

if(y>10)break;
ScreenFlip();
WaitTimer(100);
}
DxLib_End();
return 0;
}


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

Name: リク  ..ぴよぴよ(454ポイント)   Date: 2007/10/27(土) 14:41   No:11289     
Title: Re:質問なんですが・・・    
回答ありがとうございます。
プログラムはとても分かりやすかったです。

続けて質問したいのですが、
縦に3匹、横4匹、計12匹いるようなものを
全部まとめてさきほどと同じように動かすにはどうすればいいですか?




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

Name: 管理人 [URL]  ..伝説のハッカー(436,994ポイント)   Date: 2007/10/27(土) 14:54   No:11290     
Title: Re:質問なんですが・・・    
全部聞いてしまったらプログラムを作る楽しみが減りませんか??
リクさんがよいのでしたらサンプル作りますが、一応基礎があるので、はってんさせてみてはいかがでしょうか?
上記サンプルを応用するとすれば、12匹のどれかが端にさしかかったら方向転換すればいいんですよね。
xy座標は12匹全部違うはずですが、端にくる敵はかわらないはずですから、その敵を判定材料にすればよいでしょう。

緑が左端、黄色が右端にさしかかったことを判定させればいいでしょう。

□■■■■□□
□■■■■□□
■■□□
□□□□□□□

□□■■■■□
□□■■■■□
□□■■
□□□□□□□

□□□■■■■
□□□■■■■
□□□■■
□□□□□□□

□□□□□□□
□□□■■■■
□□□■■■■
□□□■■

□□□□□□□
□□■■■■□
□□■■■■□
□□■■

□□□□□□□
□■■■■□□
□■■■■□□
■■□□

□□□□□□□
■■■■□□□
■■■■□□□
■■□□□




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

Name: tkmakwins15 [URL]  ..プログラマー(33,991ポイント)   Date: 2007/10/27(土) 15:01   No:11291     
Title: Re:質問なんですが・・・    
長方形型なのであれば、その長方形ひとつで考えるという方法もあります。描画は別として、

後、余談ですが、リクさん。ソースコード投稿時はそれらを
ソースコード
のように投稿するときれいに表示されると思います。


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

Name: リク  ..ぴよぴよ(589ポイント)   Date: 2007/10/27(土) 15:17   No:11292     
Title: Re:質問なんですが・・・    
回答ありがとうございます。

勉強のつもりでやっているので、サンプルプログラムを載せていただいてもかまわないです。

一応今、自分で作っているプログラムでは32ピクセルの画像を2つ使って、
動かしているところです。

敵を配列にいれると簡単だと聞いたのですが
配列をつかってするにはどうすればよいですか?


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

Name: 管理人 [URL]  ..伝説のハッカー(437,804ポイント)   Date: 2007/10/27(土) 15:29   No:11293     
Title: Re:質問なんですが・・・    
一番左上の敵のみ座標を移動させています。
敵の間隔は常に等間隔で、決まったフォーマットなので、一匹敵の座標が決まるだけで全ての
座標が決められる事を利用しました。

プロジェクトファイルに

http://dixq.net/img/img.PNG

を保存して以下のプログラムを実行してください。

なお、ソースコードを投稿する時や、半角空白を使って文字で図を表したい時は
プレタグと言うものを利用してください。

これは<pre>というタグと</pre>というタグで囲む事で文字が等間隔、空白も表示されるようになります。
<>これは半角で入力してください。タグは記事には表示されません。


#include "DxLib.h"

typedef struct{
int x,y;
}xy_t;

int img;
xy_t xy[3][4];//敵の座標構造体

void set(){//左上の敵の座標[0][0]をもとに、敵の座標を決定
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
xy[i][j].x=xy[0][0].x+j;
xy[i][j].y=xy[0][0].y+i;
}
}
}

void graph(){//描画
int i,j;
//四角形描画
for(i=0;i<10;i++)
for(j=0;j<10;j++)
DrawBox(j*20,i*20,(j+1)*20,(i+1)*20,GetColor(255,255,255),FALSE);
//敵描画
for(i=0;i<3;i++)
for(j=0;j<4;j++)
DrawGraph(xy[i][j].x*20,xy[i][j].y*20,img,FALSE);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int dir=0,dx[4]={1,0,-1,0},dy[4]={0,1,0,1};
char Key[256];

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

xy[0][0].x=1;
xy[0][0].y=0;
img = LoadGraph("img.PNG");

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
set();
graph();

if(xy[0][0].x<=0 || xy[0][3].x>=9)//外側まで来たら
dir = (dir+1)%4;//方向転換

xy[0][0].x+=dx[dir]; xy[0][0].y+=dy[dir];

if(xy[0][0].y>7)break;
ScreenFlip();
WaitTimer(500);
}
DxLib_End();
return 0;
}
 


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

Name: リク  ..ぴよぴよ(647ポイント)   Date: 2007/10/27(土) 22:53   No:11297     
Title: Re:質問なんですが・・・    
回答ありがとうございます。

ご返事送れてすいません。

自機は自分でがんばりたいと思います。
でも当たり判定は悩みそうなので
分からなかったら、また質問させてください。


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

Name: リク  ..ぴよぴよ(694ポイント)   Date: 2007/10/29(月) 21:46   No:11349     
Title: Re:質問なんですが・・・    
敵を32ピクセル×2個をつかって
動いてるように見せながら、移動させるには
どうすればいいですか?


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

Name: リク  ..ぴよぴよ(792ポイント)   Date: 2007/10/30(火) 10:06   No:11359     
Title: Re:質問なんですが・・・    
一つ前の質問は解決しました。すいません。

当たり判定もできたのですが、
敵にあたって存在フラグを0にして、
敵を画面から消すことまでできたのですが、
その画面から消した敵のところに
弾を打つとそこで弾が消えてしまいます。

画面から消えても敵がいるみたいな感じになっています。

どうやって直せばいいでしょうか?


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

Name: バグ  ..比類無きプログラマー(60,415ポイント)   Date: 2007/10/30(火) 10:27   No:11362     
Title: Re:質問なんですが・・・    
存在フラグが0の場合には、当たり判定処理を無視するように書き換えればよいかと思います(^-^)

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

Name: リク  ..ぴよぴよ(824ポイント)   Date: 2007/10/30(火) 10:29   No:11363     
Title: Re:質問なんですが・・・    
回答ありがとうございます。

さっそくやってみます。


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

Name: リク  ..ぴよぴよ(879ポイント)   Date: 2007/10/30(火) 22:23   No:11385     
Title: Re:質問なんですが・・・    
質問なんですが、
インベーダーの敵がランダムに1発ずつ攻撃してくる
方法が分からないです。

教えていただけませんか?

GetRandで乱数を発生させてやったのですが、
処理が早すぎて一瞬だけしか画面に表示されないのです。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +