C言語何でも質問掲示板


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

規約と使い方

 
   K&Rの演習問題   
     ・[17582] box 
     ・[17586] Diaoler 
   構造体配列のコピーに ....   
     ・[17557] box 
     ・[17568] アニィ 
   画像の上に文字を表示 ....   
     ・[17543] Justy 
     ・[17544] kazuoni 
     ・[17545] kazuoni 
     ・[17549] 狼肉 
   タイピングソフトを作 ....   
   ゲーム館22章について   
     ・[17492] やそ 
     ・[17497] BCI-3e 
     ・[17499] kazuoni 
     ・[17500] やそ 
     ・[17506] BCI-3e 
     ・[17508] やそ 
     ・[17509] やそ 
     ・[17510] kazuoni 
     ・[17512] kazuoni 
     ・[17515] BCI-3e 
     ・[17516] kazuoni 
     ・[17517] kazuoni 
     ・[17520] BCI-3e 
     ・[17526] kazuoni 
     ・[17540] BCI-3e 
   また課題が出てしまい ....   
     ・[17407] kazuoni 
     ・[17408] 通りすがり 
     ・[17409] 木霊 
     ・[17410] 木霊 
     ・[17416] manako 
     ・[17429] 木霊 
     ・[17430] 木霊 
     ・[17431] 木霊 
     ・[17432] 木霊 
     ・[17433] manako 
     ・[17450] 木霊 
     ・[17454] manako 
     ・[17456] 木霊 
     ・[17457] 木霊 
     ・[17458] やそ 
     ・[17470] manako 
     ・[17472] 木霊 
     ・[17474] 木霊 
     ・[17480] manako 
     ・[17485] 木霊 
     ・[17525] manako 
   2分木の構築   
     ・[17471] Mist 
     ・[17473] Koot 
     ・[17475] Mist 
     ・[17476] Mist 
     ・[17477] Koot  
     ・[17478] Koot 
     ・[17493] Mist 
     ・[17495] box 
     ・[17501] Koot 
   無題   
     ・[17498] たいちう 
   四捨五入    
     ・[17453] box 
     ・[17459] たいちう 
     ・[17460] たかぎ 
     ・[17461] toyo 
     ・[17479] たいちう 
     ・[17484] kurt 
     ・[17489] たいちう 
   特定の場所での画面の ....   
     ・[17428] 管理人 
     ・[17434] 新参者 
     ・[17440] 雷 
     ・[17462] 新参者 
   ボンバーマンもどきを ....   
     ・[17169] TKOZ 
     ・[17170] TKOZ 
     ・[17171] Justy 
     ・[17201] TKOZ 
     ・[17368] TKOZ 
     ・[17371] Justy 
     ・[17448] TKOZ 
     ・[17449] TKOZ 
     ・[17455] Justy 
   メモリの動的確保につ ....   
     ・[17436] 雷 
     ・[17437] やそ 
     ・[17438] Mist 
     ・[17439] たいちう 
     ・[17441] overdo 
     ・[17442] overdo 
     ・[17443] overdo 
     ・[17444] Mist 
     ・[17445] overdo 
   勉強して来ました!   
     ・[17245] sousi 
     ・[17254] 雷 
     ・[17256] やそ 
     ・[17260] sousi 
     ・[17262] バグ 
     ・[17264] sousi 
     ・[17270] やそ 
     ・[17278] sousi 
     ・[17279] sousi 
     ・[17282] 雷 
     ・[17283] 雷 
     ・[17285] やそ 
     ・[17286] sousi 
     ・[17290] やそ 
     ・[17295] sousi 
     ・[17299] 雷 
     ・[17302] やそ 
     ・[17304] 雷 
     ・[17305] sousi 
     ・[17307] sousi 
     ・[17312] sousi 
     ・[17332] 雷 
     ・[17337] やそ 
     ・[17373] Mist 
     ・[17375] sousi 
     ・[17383] やそ 
     ・[17404] sousi 
     ・[17411] Mist 
     ・[17424] やそ 
     ・[17426] sousi 
   4方向移動→8方向移動   
     ・[17378] sousi 
     ・[17423] C入門者 
     ・[17425] Mist 
   javaによる本棚の実現   
     ・[17220] Koot 
     ・[17225] たいちう 
     ・[17229] Koot 
     ・[17230] たいちう 
     ・[17231] 管理人 
     ・[17238] 通りすがり 
     ・[17240] Koot 
     ・[17241] Koot 
     ・[17242] Koot 
     ・[17252] たいちう 
     ・[17289] Koot 
     ・[17318] 通りすがり 
     ・[17322] たいちう 
     ・[17393] Koot 
     ・[17396] たいちう 
     ・[17422] Koot 
   無題   
     ・[17419] たいちう 
     ・[17420] やそ 
     ・[17421] お願いします 
   ゲーム館22章につい ....   
     ・[17347] 管理人 
     ・[17349] manako 
     ・[17351] 管理人 
     ・[17417] manako 
   デバッグ実行中にclas ....   
     ・[17399] たかぎ 
     ・[17412] 中古 
     ・[17413] たいちう 
     ・[17415] バグ 
   Visual C++について   
     ・[17316] box 
     ・[17317] 不知火 
     ・[17334] たいちう 
     ・[17338] 組木紙織 
     ・[17339] たいちう 
     ・[17340] 組木紙織 
     ・[17343] たいちう 
     ・[17344] やそ 
     ・[17346] manako 
     ・[17414] 組木紙織 
   無題   
     ・[17386] at 
     ・[17387] tkmakwins15 
     ・[17388] バグ 
     ・[17389] しりうす〜 
     ・[17392] たいちう 
     ・[17395] tkmakwins15 
     ・[17403] gogo 
     ・[17405] しりうす〜 
   fprintf   
     ・[17401] box 
     ・[17402] お願いします 
   カーソルの変更   
     ・[17390] バグ 
     ・[17391] ctw 
     ・[17394] バグ 
     ・[17397] ctw 
   シューティングの自機   
     ・[17363] dolphin 
     ・[17379] Y 
   課題が;;   
     ・[17313] box 
     ・[17314] たいちう 
     ・[17326] C言語初心者 
     ・[17327] フリオ 
     ・[17329] やそ 
     ・[17330] toyo 
     ・[17341] しっぽ 
     ・[17377] C言語初心者 
   フラグの意味について   
     ・[17357] 水孤 
     ・[17359] BCI-3e 
     ・[17360] 通りすがり 
     ・[17366] kazuoni 
     ・[17369] BCI-3e 
     ・[17370] kazuoni 
     ・[17372] BCI-3e 
     ・[17374] Mist 

Name: Diaoler  ..ぴよぴよ(403ポイント)   Date: 2008/06/22(日) 20:44   No:17581       
Title: K&Rの演習問題    
 初の書込みです……ではなくて,昨年「羽流布」という名で書込みました。

 Diaoler(ディアオラ)です。改めて宜しくお願いしますm(_ _)m

 今,K&R(第2版)で勉強しています。
 そこで質問なんですが,

【演習問題1−14】
 入力中の異なる文字の頻度をヒストグラムにプリントするプログラムを書け。

って下記のような感じでよいのでしょうか? 問題の意味が少々解りづらかったものですから……。

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
入力中の異なる文字の頻度をヒストグラムにプリントするプログラム;縦書き
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#include <stdio.h>

#define KINDS 26
#define DIF_S 97
#define DIF_L 65

main()
{
int c, aChar[KINDS], i, j, eMax;

/* 初期化 */
for( i = 0; i < KINDS; ++i )
aChar[i] = 0;
eMax = 0;

/* 度数を記録 */
while( (c = getchar()) != EOF )
{
if( c >= 'a' && c <= 'z' )
++aChar[c - DIF_S];
else if( c >= 'A' && c <= 'Z' )
++aChar[c - DIF_L];
}

/* 最大度数を求める */
for( i = 0; i < KINDS; ++i )
{
if( aChar[i] > eMax )
eMax = aChar[i];
}

/* ヒストグラムを出力 */
for( i = 0; i < KINDS; ++i )
printf( " %c", 'A' + i );
printf( "\n" );
for( i = 0; i < KINDS; ++i )
printf( "--" );
printf( "\n" );
for( i = 0; i < eMax; ++i )
{
for( j = 0; j < KINDS; ++j )
{
if( aChar[j] >= eMax - i )
printf( " *" );
else
printf( " " );
}
printf( "\n" );
}
for( i = 0; i < KINDS; ++i )
printf( "--" );
printf( "\n" );
for( i = 0; i < KINDS; ++i )
printf( " %c", 'A' + i );
printf( "\n" );

getchar(); // 結果確認用
}



 あと,入力文字数が多いと上部が表示されないんですが,DOS窓って出力制限があるのですか?


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


Name: box  ..ハッカー(111,947ポイント)   Date: 2008/06/22(日) 21:23   No:17582     
Title: Re:K&Rの演習問題    

サンプルの入力ファイルとして、お書きになったコードを
プログラムに食わせてみる、という方法があるでしょう。

>  あと,入力文字数が多いと上部が表示されないんですが,DOS窓って出力制限があるのですか?

コマンドプロンプトのプロパティで「高さ」を多く取ればよいと思います。

または、出力結果をテキストファイルにリダイレクトして、
後からエディタなどで確認する、という方法もあります。

hoge.exe < hoge.c > result.txt

のように。


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

Name: Diaoler  ..ぴよぴよ(521ポイント)   Date: 2008/06/22(日) 22:05   No:17586 解決!     
Title: Re:K&Rの演習問題    
 boxさん,回答ありがとうございますm(_ _)m

> コマンドプロンプトのプロパティで「高さ」を多く取ればよいと思います。

 おお,そうでした(^ ^;
 DOS窓にはプロパティがありましたね。


 ちなみに私は現在,ダンジョン自動生成アルゴリズムを用いたダンジョンRPGを制作中です。
 (C++とDXライブラリ使用)

 クラスやらポインタやらと奮闘中。。。


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



Name: アニィ  ..かけだし(1,178ポイント)   Date: 2008/06/22(日) 02:19   No:17555       
Title: 構造体配列のコピーについて    
ご質問があります。
ある構造体配列を関数に渡し、渡した関数で引数の構造体配列をコピーする、という事を
行いたいのですが、エラーが出てしまいます。
どのようにしたら問題を解決できるかをご教授いただきたいと思います。
以下に簡単なサンプルプログラムを記載します。

#include <stdio.h>


struct ST{
int a;
};

class A{
ST clA[10];
public:
void Draw( ST st_a );
};

void A::Draw( ST st_a ){

// 構造体のコピー
clA = st_a;
for(int i=0; i<10; i++){
printf("%d", clA[i].a);
}
}

void main(){

A a;
ST st_data[10];

for(int i=0; i<10; i++){
st_data[i].a=i+1;
}

a.Draw( st_data );

getchar();
}


コンパイルすると
error C2440: '=' : 'ST' から 'ST [10]' に変換できません。
error C2664: 'A::Draw' : 1 番目の引数を 'ST [10]' から 'ST' に変換できません。

というエラーが表示されます。
どういうエラーが出ているかはわかるのですが、解決方法が思いつきません。
どうぞよろしくお願いします。


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


Name: box  ..ハッカー(111,631ポイント)   Date: 2008/06/22(日) 05:16   No:17557     
Title: Re:構造体配列のコピーについて    

こういう風なことがしたかったのでしょうか。
いいかげんな回答で申し訳ありません。


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

struct ST {
int a;
};

class A {
ST clA[10];
public:
void Draw(ST *st_a);
};

void A::Draw(ST *st_a)
{
// 構造体のコピー
//clA = st_a;
memcpy(clA, st_a, sizeof(clA));

for (int i = 0; i < 10; i++) {
printf("%d\n", clA[i].a);
}
}

int main(void)
{
A a;
ST st_data[10];

for (int i = 0; i < 10; i++) {
st_data[i].a = i + 1;
}

a.Draw(st_data);
getchar();
return 0;
}



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

Name: アニィ  ..かけだし(1,240ポイント)   Date: 2008/06/22(日) 11:30   No:17568 解決!     
Title: Re:構造体配列のコピーについて    
ご解答ありがとうございます。
まさにこのような事がしたかったのです。
おかげさまで解決する事ができました。
ありがとうございました。


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



Name: 狼肉  ..ぴよぴよ(749ポイント)   Date: 2008/06/21(土) 19:12   No:17542       
Title: 画像の上に文字を表示させるやり方。    
ゲームのタイトル画面を作っているのですが、背景に画面いっぱいの画像を写してしまったら、文字なのが背景に隠れて表示できなくなってしまいます。背景の下に文字が言ってしまうのではなく、文字の下に背景が来るようにするためにはどうしたらよいですか?


ソース

#include "DxLib.h"

int function_status=0,White;
char KeyBuf[ 256 ] ;

void A(){
DrawString( 160 , 340 , "PRESS ENTER KEY" , White );
if( KeyBuf[ KEY_INPUT_RETURN ] == 1 )
function_status=1;
}
void B(){
PlaySound( "onngaku/start.wav" , DX_PLAYTYPE_BACK ); // test.midのバックグラウンド演奏
function_status=2;
}
void C(){
DrawString( 160 , 340 , "PRESS ENTER KEY" , White );
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

White = GetColor( 255 , 255 , 255 ) ; //色の取得

SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る

switch(function_status){
case 0:
A();
break;
case 1:
B(),C();
break;
case 2:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}

SetFontSize( 85 ) ; //サイズを20に変更
SetFontThickness( 1 ) ; //太さを1に変更
ChangeFont( "HGS創英角ポップ体" ) ; //HGS創英角ポップ体に変更
ChangeFontType( DX_FONTTYPE_ANTIALIASING_EDGE );//アンチエイリアス&エッジ付きフォントに変更

DrawString(25,120,"ゲームタイトル!! ",White);

SetFontSize( 30 ) ; //サイズを20に変更
SetFontThickness( 1 ) ; //太さを1に変更
ChangeFont( "HGS創英角ポップ体" ) ; //HGS創英角ポップ体に変更
ChangeFontType( DX_FONTTYPE_ANTIALIASING_EDGE );//アンチエイリアス&エッジ付きフォントに変更


LoadGraphScreen( 0 ,0 , "gazou/A.jpg" ,FALSE) ;


if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了

ScreenFlip() ; // 裏画面データを表画面へ反映
}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}



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


Name: Justy  ..ハッカー(194,776ポイント)   Date: 2008/06/21(土) 19:41   No:17543     
Title: Re:画像の上に文字を表示させるやり方。    
>背景の下に文字が言ってしまうのではなく、文字の下に背景が来るようにするためにはどうしたらよいですか?

 DXライブラリの場合、画用紙に絵の具で絵を描いたときと同じく、原則として後から
書いたものが上に表示されます。
 
 
 今のコードですと、文字を書いてから(DrawString)背景を表示(LoadGraphScreen)しようと
していますよね?
 これでは文字を書いた後、それを塗りつぶして背景が表示されてしまいます。

 なので、背景を表示してから文字を表示するようにすれば、文字を上にすることが出来ます。
 試してみて下さい。


# メインループ内の毎フレーム通過するところに LoadGraphScreen()を置くのは
処理効率の面からあまりお薦めできません。
 これでは毎回ファイルをロードすることになるので、結構処理が重たくなるはずです。

 LoadGraph()/DrawGraph()などに変えて、ロードを最小限に抑えた方がいいかと思います。


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

Name: kazuoni  ..上級者(19,987ポイント)   Date: 2008/06/21(土) 19:41   No:17544     
Title: Re:画像の上に文字を表示させるやり方。    
コードを載せる際には、規約にも書いてありますが、<pre></pre>をつけるようにしてください。

表示する順番を変えてやるだけだと思います。今は文字→背景ですが、背景→文字が正しいです。


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

Name: kazuoni  ..上級者(19,987ポイント)   Date: 2008/06/21(土) 19:43   No:17545     
Title: Re:画像の上に文字を表示させるやり方。    
すんません、かぶってました^^;失礼しましたミ

Name: 狼肉  ..ぴよぴよ(559ポイント)   Date: 2008/06/21(土) 22:31   No:17549 解決!     
Title: Re:画像の上に文字を表示させるやり方。    
Justyさん、kazuoniさんありがとうございました。
おかげで、きちんと表示する事が出来ました。DXライブラリにそんな仕様があったのは知りませんでした。それと、処理を軽くするための LoadGraph()とDrawGraph()もやりました。2重にありがとうございます。助かりました。

>kazuoniさん

<pre></pre>忘れてました!すいません。次回コードを書く事があれば、忘れずに書きます。








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



Name:  ..ぴよぴよ(79ポイント)   Date: 2008/06/21(土) 19:06   No:17541       
Title: タイピングソフトを作っています    
こんばんは、C言語でなくすみません。
現在COBOLという事務処理用言語でタイピングソフトを作っていて、
すでに"ん"を打つときに"n"でも"nn"でもできるという処理は完成しています。

しかし曖昧入力の処理の仕方が分からず困っています。

たとえば"し"の入力方法は"si"と"ci"と"shi"の3つがあります。
これらを打ってる最中に見分けて、どの打ち方でも正解にするにはどうすればいいでしょうか?


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




Name: BCI-3e  ..かけだし(2,002ポイント)   Date: 2008/06/20(金) 00:49   No:17482       
Title: ゲーム館22章について    
現在RPG製作中ですが、ゲーム館のキャラクターを4方向に歩かせるで
移動フラグのところで少し質問があるので教えてください。


#include "DxLib.h"

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16];
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
}

ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();
}

DxLib_End();
return 0;
}


このように22章ではあると思います。
今の課題は移動のループからあるボタンを押すと抜け出すことができない!!!
です。たとえばdouguと言う名前のフラグを立てたい場合に

ch.walking_flag=0; //歩かないフラグを立てる
}
if ( Key[ KEY_INPUT_A] == 1 )
dougu_flag=0;

とした場合にはAキーが押されているときにしかフラグが立ちません。
Aキーが押されたときに別のフラグを立てて今のループから抜け出す方法を
どなたか教えてください。


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


Name: やそ  ..比類無きプログラマー(63,542ポイント)   Date: 2008/06/20(金) 10:00   No:17492     
Title: Re:ゲーム館22章について    
入力可能状態において、移動キー(上下左右)ではなく”A”を押したら
道具の表示&使用処理に飛びたい。

ということでしょうか?
それなら

else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
のところで
else if ( Key[ KEY_INPUT_A] == 1 ){
         dougu_flag=0;
ch.walking_flag=0; //歩かないフラグを立てる
}
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}


とすれば、移動入力待ちの状態で”A”を押すことによって、dougu_flagに0を入れ、
かつ、歩かないフラグを立てられます。
それから、

if(ch.walking_flag==1){ //歩くフラグが立っていたら
・・・
}
の前でも後でも
if(dougu_flag=0){ //歩くフラグが立っていたら
dougu_syori() //道具処理ルーチンに飛ぶ
}

とすれば良いんじゃないでしょうか。
ただ、ひとつ懸念が。0でフラグを立てるの?
「立てる」という場合は普通0以外の値(1とか)を入れたほうが分かりやすいと思いますよ^^


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

Name: BCI-3e  ..かけだし(2,286ポイント)   Date: 2008/06/20(金) 16:11   No:17497     
Title: Re:ゲーム館22章について    
と言うことは歩かないフラグを立てておいてなおかつ道具フラグを立てるという事になるんですね。
この場合、歩かないフラグが立っているので十字キーが押されても歩かずに道具を選択できると理解
していいのですよね?
なおかつ、2つのキャラクターをつかうRPG(バイオハザードのキャラチェンジみたいなの)の行動処理を
分ける場合にも使えそうですね。2キャラ別々に行動フラグを立てたい場合にはdougu_flagをキャラクター
フラグに変えて(あるいはCH CH1,CH2;とでも宣言しておいてch2の移動フラグを立てる)とAキーが押されたら
行動が別々になるという事ですね。

>if(ch.walking_flag==1){ //歩くフラグが立っていたら
>・・・
>}
>の前でも後でも
>if(dougu_flag=0){ //歩くフラグが立っていたら
> dougu_syori() //道具処理ルーチンに飛ぶ
>}

とありますが、これはどのような意味になるでしょうか?
十字キーのフラグと同じようにすればいいのでしょうか?
ルーチンの意味がよくわかっていないのですが詳しく説明していただけないでしょうか。


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

Name: kazuoni  ..上級者(17,038ポイント)   Date: 2008/06/20(金) 16:50   No:17499     
Title: Re:ゲーム館22章について    
>と言うことは歩かないフラグを立てておいてなおかつ道具フラグを立てるという事になるんですね。
>この場合、歩かないフラグが立っているので十字キーが押されても歩かずに道具を選択できると理解していいのですよね?

そうですね。歩くかどうかのif文は実行されませんね。

>なおかつ、2つのキャラクターをつかうRPG(バイオハザードのキャラチェンジみたいなの)の行動処理を
>分ける場合にも使えそうですね。2キャラ別々に行動フラグを立てたい場合にはdougu_flagをキャラクター
>フラグに変えて(あるいはCH CH1,CH2;とでも宣言しておいてch2の移動フラグを立てる)とAキーが押されら
>行動が別々になるという事ですね。

これでもいいですが、また新たな変数を入れるのは効率が悪いかなって思います。歩く方法は同じですよね?RPGなら大抵マップでの動きはすべて同じですよね?ならキャラチェンジ→歩くキャラの画像を入れ替えるだけと認識したほうが無駄を省けると思います。自分はステータス画面のいちばん上のキャラがマップを歩くようにしています。キャラクタに構造体を用いて管理し・・・なんて事をゆくゆくはしなきゃならなくなるので、その時に「あ、kazu...ってやつがこんなこと言ってたな」って思いだしていただけたらと思います(笑)今回はここは余談でした。

>これはどのような意味になるでしょうか?
>十字キーのフラグと同じようにすればいいのでしょうか?
やそさんの
>if(dougu_flag=0){ //歩くフラグが立っていたら

>if(dougu_flag=0){ //「道具画面へ移る」フラグが立っていたら
と認識ししてもらったらいいと思います。
ドラクエでいうと、ステータスを確認したり、アイテムを使用したり、セーブしたりと、マップとは違う画面に映りますよね?ここの処理をdougu_syori()で行うんです。


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

Name: やそ  ..比類無きプログラマー(63,961ポイント)   Date: 2008/06/20(金) 17:21   No:17500     
Title: Re:ゲーム館22章について    
んー、まず、22章のプログラム理解できてますか?

「ループから抜けたい」と言っておられましたが、
ループ抜けるとプログラム終わっちゃいますよ?

>と言うことは歩かないフラグを立てておいてなおかつ道具フラグを立てるという事になるんですね。
>この場合、歩かないフラグが立っているので十字キーが押されても歩かずに道具を選択できると理解
>していいのですよね?

結果的にはそうなりますが、力技で無理やりしているので美しくありません。

22章のプログラムはキー入力可能状態(キャラクタの座標が32で割り切れる位置にいるとき)
になったら、
強制的に「歩きフラグをON」して歩きたくてうずうず状態になっています。
そのときに、「上下左右」の移動キーが押されずに、
”A”が押されたら・・・
  道具フラグをON
  歩きフラグをOFF
にしました。
よって、その後に続くch.y--;などの座標移動判定をスキップできるわけです。

>なおかつ、2つのキャラクターをつかうRPG(バイオハザードのキャラチェンジみたいなの)の行動処理を
分ける場合にも使えそうですね。

それはなんとも言えません。上手く使えればキャラクタチェンジみたいなことも出来るでしょう。

>2キャラ別々に行動フラグを立てたい場合にはdougu_flagをキャラクター
>フラグに変えて(あるいはCH CH1,CH2;とでも宣言しておいてch2の移動フラグを立てる)とAキーが押され
>たら行動が別々になるという事ですね。

んー、非常に管理が面倒くさそうに思えます。また「行動が別々」というところがイマイチイメージが掴めないのでyesとは明言しないでおきます^^;

>>if(ch.walking_flag==1){ //歩くフラグが立っていたら
>>・・・
>>}
>>の前でも後でも
>>if(dougu_flag=0){ //歩くフラグが立っていたら
>> dougu_syori() //道具処理ルーチンに飛ぶ
>>}

>とありますが、これはどのような意味になるでしょうか?
>十字キーのフラグと同じようにすればいいのでしょうか?
>ルーチンの意味がよくわかっていないのですが詳しく説明していただけないでしょうか。

ルーチンという言葉はあまり気にしないで良いです。
見たとおり、道具の処理に飛ぶというだけですが・・・。
道具の処理はたぶん別の関数になるのかなと勝手に予想して書いただけです。
混乱させてしまったのかな?


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

Name: BCI-3e  ..入門者(2,970ポイント)   Date: 2008/06/20(金) 19:07   No:17506     
Title: Re:ゲーム館22章について    
今のところ、22章の意味はわかっています。while文が使われているので
ループを抜け出すためにbreak文を使えばループから抜け出すことになります。

続いて、if文の事ですがif文とは0と1により真・偽を判断し、2文岐させるため
制御構造文と考えております。ここではキーが押されれば1に等しいすなわち真
を示し、zahyouという変数に処理を引き渡している。と言う事になると思います。

なので、ループを抜け出さず、なおかつループ処理を機能させずに別のフラグ処理を
させたいと考えているのですがなかなかうまい事いかないんです。
とりあえず今、考えているのは移動フラグを機能させずに別のフラグを立ててその処理を
行わしたいんです。そのためにはキー入力によって別のフラグを立てさせる必要があると
思うのですが、ここまでの考えは合っていますよね?

合っているなら次に、2キャラの移動フラグの事についてなのですが・・・・
単にAキーが押されたらch1は動かずにch2が動けばいいんです。バイオハザードをご存知なら
わかると思うのですが、キャラクターを別行動&チェンジするとAキャラは動かずにBキャラ
だけが動くと言う事になっていると思います。それをRPG内でやりたいと考えています。
2キャラを別々に使う事によってダンジョンの難易度が比較的上がると思ったので・・・・・

次に道具フラグの事なのですが
>if(dougu_flag=0){ //歩くフラグが立っていたら
> dougu_syori() //道具処理ルーチンに飛ぶ
これは、dougu_syori() の()内に別の画面などの構造体
の変数を書き込めと言うことですか?

これを2キャラの移動に使う場合にはch.2を()の中に入れればいいのでしょうか?
この2キャラの移動に関する事を過去のスレッドで調べてみたのですが当てはまるとすれば
sousiさんの勉強してきました!
のスレッドで枠を2つ表示させ、あるボタンが押されたら枠1を決定し枠2を選択するの考え方で
よろしいかと思います。ですが、肝心の移動変換の部分が出てきていなかったのその部分を応用
させていただこうと思っています。


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

Name: やそ  ..比類無きプログラマー(64,198ポイント)   Date: 2008/06/20(金) 19:45   No:17508     
Title: Re:ゲーム館22章について    
いろいろ質問されてますが、たくさん書くと見難くなるのでまずひとつ。

>なので、ループを抜け出さず、なおかつループ処理を機能させずに別のフラグ処理を
>させたいと考えているのですがなかなかうまい事いかないんです。
フラグは用意してあって、そのフラグの内容によって”とある処理”(この場合アイテムの処理)
をしたいなら、

アイテムの処理を別のプログラム(関数)で作成しておいて、
必要な場所で呼び出せばいいだけじゃないでしょうか?

item_syori(){
アイテムを使うぞー!
}

main(){//メイン処理
item_flag=1;//フラグon

if(item_flag==1){//フラグONならアイテム処理へ
item_syori();
}
}



みたいな感じでプログラムを分けて呼び出せば、アイテムの処理をした後
呼び出し直後の位置にもどってきます。




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

Name: やそ  ..比類無きプログラマー(64,586ポイント)   Date: 2008/06/20(金) 21:10   No:17509     
Title: Re:ゲーム館22章について    
>合っているなら次に、2キャラの移動フラグの事についてなのですが・・・・
>単にAキーが押されたらch1は動かずにch2が動けばいいんです。バイオハザードをご存知なら
>わかると思うのですが、キャラクターを別行動&チェンジするとAキャラは動かずにBキャラ
>だけが動くと言う事になっていると思います。それをRPG内でやりたいと考えています。
>2キャラを別々に使う事によってダンジョンの難易度が比較的上がると思ったので・・・・・

Aキーが押されたらキャラチェンジ?
それならキャラクタを配列で持てばいいですね。
ch_flagとでもフラグを用意して、0ならキャラ1、
1ならキャラ2と決めておく。
ch[0],ch[1]という変数(構造体)にしておく。

ch_flag=0;//初期値は0

if(Key[ KEY_INPUT_A] == 1 ){
ch_flag=(~ch_flag)&1;//フラグの反転0→1 1→0
ちょっと修正^^;
}
で、あとは・・・
ch[ch_flag].xなり
ch[ch_flag].yなりで
好きなようにいじってください。

コレならAを押すたびにキャラ1とキャラ2を交互に動かせるはず。

んー、分かるかな?難しいでしょうか?






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

Name: kazuoni  ..上級者(18,082ポイント)   Date: 2008/06/20(金) 21:15   No:17510     
Title: Re:ゲーム館22章について    
#include "DxLib.h"


typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[2][16];
char Key[256];
ch_t ch[2];





if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch[0].x=320;
ch[0].y=160;
ch[0].walking_flag=0;
ch[0].muki=3;
    ch[1].x=320;
ch[1].y=160;
ch[1].walking_flag=0;
ch[1].muki=1;
    int char_num=0;
    int char_num_change_flag=0;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char1.png" , 16 , 4 , 4 , 32 , 32 , image[0] ) ;//画像を分割してimage配列に保存
LoadDivGraph( "char2.png" , 16 , 4 , 4 , 32 , 32 , image[1] ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch[char_num].x%32==0 && ch[char_num].y%32==0){ //座標が32で割り切れたら入力可能
ch[char_num].walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP]==1 ) //上ボタンが押されたら
ch[char_num].muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ]==1 ) //左ボタンが押されたら
ch[char_num].muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ]==1 ) //下ボタンが押されたら
ch[char_num].muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT]==1 ) //右ボタンが押されたら
ch[char_num].muki=3; //右向きフラグを立てる
else if(Key[ KEY_INPUT_A]==1){
  char_num_change_flag=1;
  ch[char_num].walking_flag=0;
}
else //何のボタンも押されてなかったら
  ch[char_num].walking_flag=0; //歩かないフラグを立てる
}

if(ch[char_num].walking_flag==1){ //歩くフラグが立っていたら
if (ch[char_num].muki==0) //上向きならch.y座標を減らす
ch[char_num].y--;
else if(ch[char_num].muki==1) //左向きならch.x座標を減らす
ch[char_num].x--;
else if(ch[char_num].muki==2) //下向きならch.y座標を増やす
ch[char_num].y++;
else if(ch[char_num].muki==3) //右向きならch.x座標を増やす
ch[char_num].x++;
}
if(char_num_change_flag==1){
if(char_num==0)
  char_num=1;
else
  char_num=0;
}

ch[0].img=image[0][(ch[0].x%32+ch[0].y%32)/8 + ch[0].muki*4]; //画像をセット
ch[1].img=image[1][(ch[1].x%32+ch[1].y%32)/8 + ch[1].muki*4]; //画像をセット
DrawGraph( ch[0].x , ch[0].y , ch[0].img , TRUE ) ;//画像を描画
    DrawGraph( ch[1].x , ch[1].y , ch[1].img , TRUE ) ;//画像を描画
    char_num_change_flag=0;
ScreenFlip();
}
  DxLib_End();
return 0;
}

解説次で^^;


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

Name: kazuoni  ..上級者(18,320ポイント)   Date: 2008/06/20(金) 21:32   No:17512     
Title: Re:ゲーム館22章について    
とりあえずキャラチェンジを無理やり作ってみました^^;キャラの構造体の配列を作りました。今回はch[]でキャラをひとまとめにして作りました。これならキャラが増えて三人でも四人でもいけます。途中で、
else if(Key[ KEY_INPUT_A]==1){

char_num_change_flag=1;
ch[char_num].walking_flag=0;

でキャラのチェンジするフラグを立て、このキャラを動かないようにする。(あまりフラグというものにこだわらないでいいと思いますが^^;)次に、
if(char_num_change_flag==1){

if(char_num==0)
char_num=1;
else
char_num=0;
で選択キャラの番号を変えます。すると一番上に戻った時には、キャラの番号を変えてスタートします。

ただ、これは今回のキャラチェンジのために作りました。今後このままではたぶん使えません(笑)改良は自分でくわえてください。あと・・・途中の無理やりのあたり、大御所方、ツッコんでいってください^^;



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

Name: BCI-3e  ..入門者(3,480ポイント)   Date: 2008/06/21(土) 00:13   No:17515     
Title: Re:ゲーム館22章について    
>アイテムの処理を別のプログラム(関数)で作成しておいて、
>必要な場所で呼び出せばいいだけじゃないでしょうか?
つまりアイテムの構造体(関数)をAキーによって呼び出し処理をさせると言うことですね。
ゲーム館にメイン関数と言うのが出てこなかったと思うので一度勉強してから作り始めようと思います。

>キャラクタを配列で持てばいいですね。
配列と言うのはマップでも使われている九九表見たいな物ですよね?
それを構造体に入れるのだから、この場合は

typedef struct{
int x,y,img,muki,walking_flag;
int ch[0],ch[1]
}ch_t;

こういうことでしょうか?
配列と言うものは、わかっていても、どのように使うかがわかりません。
今、わかっているのは

・配列はExcelのような表みたいなもの。
・マップで使われている。
・配列の数値の入れ替えは可能
・配列の各先頭要素のアドレスで呼び出せる

ぐらいです。

kazuoniさんが例に作ってくださったソースにもch_t ch[2];と配列にしているのは
わかるのですが、問題はch[char_num].です。
この部分がいまいちわかっていません。
int char_num=0;
int char_num_change_flag=0;
この二つの配列が何を意味しどのように作用しているのかがわかりません。
宣言したchの中に組み込まれてるようにも見えますし、chをひとまとめにするためにあるようにも見えます。
(コピーして丸々使わせていただきましたがエラーが86も・・・・・・)



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

Name: kazuoni  ..上級者(19,002ポイント)   Date: 2008/06/21(土) 00:56   No:17516     
Title: Re:ゲーム館22章について    
>つまりアイテムの構造体(関数)をAキーによって呼び出し処理をさせると言うことですね。
構造体のとらえ方が少し違いますかね^^;構造体とは↓
http://www9.plala.or.jp/sgwr-t/c/sec15.html
構造体と関数は別物です。
今回構造体を用いたのはキャラクターの情報を簡潔に管理するためです。たとえばマップでのキャラの情報は「向き、場所、フラグ、アイテム・・・・」などたくさんありますが(今回はアイテムはありませんっ^^;)、すべてがバラバラだとどうでしょうか?頻繁に使うのであればとてもコードが見にくいです。管理もしづらいと思います。そこで今回はch[0].〜〜〜となれば「あ、このキャラの〜〜〜のことか」と一目でわかります。今はそんな感じと覚えておけばよろしいかと^^;

最初は九九表でいいんですが、RPGをつくるにあたっては、やはりもっと深い理解が必要になってくると思います。今後、分割などを考えると思いますので。。配列→ポインタと今後進んで勉強していけばRPG制作はぐんぐん進みますw自分も一か月ぐらい前にようやく勉強したんですがっ^^;ググればめちゃくちゃ出てきます。ここは・・・がんばりましょう(自分もまだ全然煮詰めてないので・・・お互いにっがんばりましょうw)


>int char_num=0;
>int char_num_change_flag=0;
>この二つの配列が何を意味しどのように作用しているのかがわかりません。

二つは配列ではありません。ただの変数です。上から自分の目でおっていってみてください。
まずchar_num=0ですから、ch[char_num]→ch[0]です。これは最初に動ける状態にあるキャラです。それ以降はAが押されない限りch[char_num]→ch[0]で処理し続けます。Aが押されると
char_num_change_flag=1

ch[char_num].walking_flag=0(これはch[0].walking_flag=0の意味)

となります。こうなると次のif(ch[char_num].walking_flag==1)の条件はみたしません。これで最初のキャラは停止します。次に
if(char_num_change_flag==1){

  if(char_num==0)
    char_num=1;
  else
    char_num=0;
}

は今まで満たさなかった条件を満たすようになるのでこのif文は実行されます。これでchar_num=1になります。(もしchar_num=1ならchar_num=0へ)そしてあとは表示するだけです。表示が終わるとまたいちばん最初の処理に戻りますが、char_num=1なのでch[char_num]→ch[1]で処理をします。これはさっきまで止まっていたキャラです。次はこいつを動かすことになります。(止まったほうは何も変化がないので止まったまま)

こんな感じですかね^^;



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

Name: kazuoni  ..上級者(19,211ポイント)   Date: 2008/06/21(土) 01:06   No:17517     
Title: Re:ゲーム館22章について    
ごめんなさい。早くも勉強不足があらわれました(笑)

やそさんの御回答をしっかり読んでください^^;0→1、1→0は


if(char_num_change_flag==1){
  if(char_num==0)
    char_num=1;
  else
    char_num=0;
}

でもいいんですが、ややこしいです。

if(char_num_change_flag==1)
  char_num=(~char_num)&1;
のがきれいにまとまってます^^;意味は両方とも同じです。本当に前後して申し訳ないです。。


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

Name: BCI-3e  ..入門者(3,987ポイント)   Date: 2008/06/21(土) 01:57   No:17520     
Title: Re:ゲーム館22章について    
初心者はkazuoniのほうが見やすいと思います。
やっと意味がわかりました。
int char_num=0;というのはchar_numに0を代入する(char_numは0と言う意味)
ch[char_num].というのはch[0]と言うことですね。
で、Aキーが押されたら変更のためのフラグを立ててなおかつ
歩かないフラグを立てるんですね。(↓のこと)

else if(Key[ KEY_INPUT_A]==1){
char_num_change_flag=1;
ch[char_num].walking_flag=0;
 }

変更フラグの処理は

変更フラグが立っていてchar_numが0に等しければchar_numは1に
そうでなければchar_num0に

if(char_num_change_flag==1){/
  if(char_num==0)
    char_num=1;
  else
    char_num=0;
}

このように理解しました。
順番に考えていくと意外に難しいですね。
この場合はキーのループを入力によって徐々に変化させると言う知識と言うか考えが必要だった見たいですね。
理数に強いので文系の人に比べればまだマシかと思っていますが、機転の転換が今の課題です。

この考えはどこで勉強されたのでしょうか?
私も初心者のためのポイントC言語を利用させていただいておりますが、そのような事は出てこなかったように思います。機転の転換を身に着けるいいサイトはないものでしょうか?
ある程度C言語がわかる方なら「そんなもの見てわかるだろ!」と言われるでしょうが
初心者のためのポイントC言語も例が意外にわかりにくく困っています。
C言語とゲームを関連付けているサイトがあれば教えてください。
ゲームを学びながらC言語を学べるサイトが一番うれしいです。


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

Name: kazuoni  ..上級者(19,929ポイント)   Date: 2008/06/21(土) 09:46   No:17526     
Title: Re:ゲーム館22章について    
自分はゲーム作るに関してはまったくの初心者です^^;勉強は管理人さんの書かれたゲームプログラミングの館のみです。どちらかというとプログラミングを通してどうしたらうまくいきそうかってのを考えるのを楽しんでます^^;自分もRPG制作はしています。(現在はちょっとばかり止まってますが。。)その中でこんな機能、あんな機能と考えて、ここで質問するとやはり新しい知識が必要なんだな→学校の図書館なり、ググるなりして必死になってます。ググればたくさんでてきますよ^^↓
http://www.google.co.jp/search?hl=ja&lr=&q=C%E8%A8%80%E8%AA%9E+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0+%E3%82%B2%E3%83%BC%E3%83%A0&revid=1335802550&sa=X&oi=revisions_inline&resnum=0&ct=broad-revision&cd=2

自分はどこのページ、どの書籍がいいかはわかりません。(管理人さんのが個人的に最高です。笑)自分の手でプログラムを作ってみるのが一番かなって思いますが・・・イマイチいいアドバイスねならないですね。。


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

Name: BCI-3e  ..入門者(4,294ポイント)   Date: 2008/06/21(土) 18:17   No:17540 解決!     
Title: Re:ゲーム館22章について    
そうですか・・・・
やはりC言語の本も高いですし、一番訪れるのはここですね。
ヤフーや、グーグルでもう一度サイトを調べなおして行こうと思います。
県立図書館とかならまだ、ましな書籍があると思いますしね。
わざわざ解答してくださってありがとうございました。


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



Name: manako  ..入門者(3,768ポイント)   Date: 2008/06/16(月) 23:46   No:17406       
Title: また課題が出てしまいました・・・・・・    
今回はキー入力によって処理を変える事に挑戦中なのですが・・・・・・
先にやりたい事を言っておきますね。

・スペースキーを押されたらch.2のフラグを立てる
・↑が押されたらch.1の画像を2分割した2番目を壁画したい。

今できていないのはch1のキーフラグでスペースを押すとch2のフラグが立てられない。
壁画の変更のしかたがわからない。
この二つです。

ソースは

#include "DxLib.h"


typedef struct{
int x,y,img,zahyou,san_flag;
}ch_t;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[2];
char Key[256];
ch_t ch1,ch2;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
ch1.x =0;
ch1.y =0;
ch2.x =0;
ch2.y =0;
ch1.san_flag=0;
ch1.zahyou=4;
ch2.san_flag=0;
ch2.zahyou=4;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定

{
ClearDrawScreen(); // 裏画面のデータを全て削除
LoadDivGraph( "abcd.png" , 2 , 2 , 1 , 32 , 32 , image );//画像を分割してimage配列に保存
ScreenFlip() ; // 裏画面データを表\u30011 画面へ反映
}



while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch1.x%32==0 && ch1.y%32==0){
ch1.san_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch1.zahyou=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch1.zahyou=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch1.zahyou=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch1.zahyou=3;//右向きフラグを立てる

else if( Key[ KEY_INPUT_SPACE] == 1 )// スペースキー
ch1.zahyou=4;


else //何のボタンも押されてなかったら
ch1.san_flag=0; //向かないフラグを立てる
}


if(ch1.san_flag==1){
if (ch1.zahyou==0)
ch1.y--;
else if (ch1.zahyou==1)
ch1.x--;
else if (ch1.zahyou==2)
ch1.y++;
else if (ch1.zahyou==3)
ch1.x++;
else if (ch1.zahyou==4)
if(ch2.x%32==0 && ch2.y%32==0){
ch1.san_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch2.zahyou=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch2.zahyou=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch2.zahyou=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch2.zahyou=3;//右向きフラグを立てる
else //何のボタンも押されてなかったら
ch1.san_flag=0; //向かないフラグを立てる
}
}
if(ch2.san_flag==1){
if (ch2.zahyou==0)
ch2.y--;
else if (ch2.zahyou==1)
ch2.x--;
else if (ch2.zahyou==2)
ch2.y++;
else if (ch2.zahyou==3)
ch2.x++;
}


ch1.img=image[(ch1.x%32+ch1.y%32)/32 + ch1.zahyou*0];
ch2.img=image[(ch2.x%32+ch2.y%32)/32 + ch2.zahyou*0];
LoadGraphScreen( 0 , 0 , "000.bmp" , FALSE ) ;
DrawGraph( ch1.x , ch1.y , ch1.img , TRUE ) ;
DrawGraph( ch2.x , ch2.y , ch1.img , TRUE ) ;
ScreenFlip();
}

DxLib_End();
return 0;
}


考え方やヒントだけでもいいので教えてください。
よろしくお願いします。


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


Name: kazuoni  ..上級者(15,746ポイント)   Date: 2008/06/17(火) 01:26   No:17407     
Title: Re:また課題が出てしまいました・・・・・・    
・・・またということは以前質問されている方でしょうか^^;コードは<pre>と</pre>タグで挟んで投稿して下さいって↑に思いっきり管理人さんが強調してらっしゃるのですが(笑)次回からは気をつけてくださいね。あと題名は過去ログになる際では大切になってくるので、質問の内容が分かるものがいいと思います。

突っ込みどころがありすぎてよく分からないんですが・・・

ch2.san_flagはとりあえずずっとゼロのままです。ゆえに
if(ch2.san_flag==1)
は実行されることはありません。これでは自分の目的とは異なるのではないのですか?


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

Name: 通りすがり  ..中級者(9,804ポイント)   Date: 2008/06/17(火) 02:15   No:17408     
Title: Re:また課題が出てしまいました・・・・・・    
まず、前回質問したトピは「解決」にしておきましょう。
質問した内容管理人さんに返事もらってるのそのままにして新しいトピを立てるのはやめましょう。
規約をよく読んで投稿しましょう。


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

Name: 木霊  ..初心者(8,237ポイント)   Date: 2008/06/17(火) 02:35   No:17409     
Title: Re:また課題が出てしまいました・・・・・・    

とりあえず

> ch1.san_flag=0; //向かないフラグを立てる

向かないフラグが立っている時、このキャラはどこを向いているんでしょう?


> ch1.img=image[(ch1.x%32+ch1.y%32)/32 + ch1.zahyou*0];
> ch2.img=image[(ch2.x%32+ch2.y%32)/32 + ch2.zahyou*0];

0を掛けるとその答えは0になるので最後の部分は要りません


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

Name: 木霊  ..初心者(8,525ポイント)   Date: 2008/06/17(火) 04:49   No:17410     
Title: Re:また課題が出てしまいました・・・・・・    
変数の意味がわかりづらいと前回か前々回のトピで指摘されてた気がするのですが・・・

構造体 ch_t はキャラクターに関する構造体で合っていますか?
ch1、ch2 はそれぞれどんなキャラクターですか?


> ch1.san_flag=1; //歩くフラグを立てる。
> ch1.san_flag=0; //向かないフラグを立てる

今見つけたのですが構造体のメンバ san_flag は何のフラグですか?
多分「歩く歩かない」のフラグだと思いますが、変数の名前からはその意味が分かりません
分かるように訂正しておくことをお勧めします


> ch1.zahyou=0; //上向きフラグを立てる

構造体のメンバ zahyou は「座標」ではなく「向き」のようですが、変数の意味と名前が不一致です
一致させておくことをお勧めします


> LoadGraphScreen ( 0, 0, "000.bmp", FALSE );

毎ループ毎に画像を読み込んでいるので処理速度がかなり落ちていると思います
素直に LoadGraph , DrawGraph を使った方がいいと思います


> ・↑が押されたらch.1の画像を2分割した2番目を壁画したい。

×壁画(へきが)
○描画(びょうが)


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

Name: manako  ..入門者(4,120ポイント)   Date: 2008/06/17(火) 13:12   No:17416     
Title: Re:また課題が出てしまいました・・・・・・    
頭が混乱して表記ミスが多かったようです。訂正します。
今、やりたいのはch1のフラグを立てて十字移動させ、決定=スペースキーで
ch2のフラグを立てたいのがひとつ。

もうひとつはスペースキーが押されたら2分割した画像の2番目を描画したい。(ch1の)

今、出ている問題はch1は動くのに、スペースキーを押してもch2の
画像が動かない。ch1の画像描画の変更のやり方がわからない。の二点です。
この、あるキーを押されたら別のフラグを立ててその処理をする方法がわかれば
パズルゲームでも作れるように思うのです。
(正確に言うとchは枠の描画の画像と移動のためでキャラクターとは関係ないです)

簡単に言うとif文である事をされると別のフラグを立てて
そちらの処理に移動したいと言うことです




> ch1.san_flag=1; //歩くフラグを立てる。
> ch1.san_flag=0; //向かないフラグを立てる

>今見つけたのですが構造体のメンバ san_flag は何のフラグですか?

とありますが、枠のx.y座標の増減のためのフラグです。




> ch1.san_flag=0; //向かないフラグを立てる

>向かないフラグが立っている時、このキャラはどこを向いているんでしょう?

そこの部分は行動処理を一区間ずつ毎回行うために必要みたいです。
書かないと座標の増減が一区間では終わらずに延々と続いてしまい、一区間歩かず
同じ方向にずっと動き続けます。


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

Name: 木霊  ..初心者(8,648ポイント)   Date: 2008/06/18(水) 03:16   No:17429     
Title: Re:また課題が出てしまいました・・・・・・    
私なりの解釈ですが・・・

最初は「枠1」(ch1)だけを動かす
スペースキーが押されると「枠1」(ch1)は固定し、「枠2」(ch2)だけを動かす
「枠2」を動かしてる間「枠1」は通常とは違う画像を表示する
「枠1・2」の移動は1マス単位(1ドット単位ではない)

と言う事で合ってますか?


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

Name: 木霊  ..初心者(8,670ポイント)   Date: 2008/06/18(水) 03:20   No:17430     
Title: Re:また課題が出てしまいました・・・・・・    
「枠」の移動は1ドット単位で、1回の移動が1マス(32ドット)ですね

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

Name: 木霊  ..初心者(8,693ポイント)   Date: 2008/06/18(水) 04:50   No:17431     
Title: Re:また課題が出てしまいました・・・・・・    
眠たいのでかなり力技ですがこんな感じでしょうか?

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

Name: 木霊  ..初心者(8,776ポイント)   Date: 2008/06/18(水) 04:54   No:17432     
Title: Re:また課題が出てしまいました・・・・・・    
すみません
BCCで作成しましたが画像は御自分で用意して下さい

Frame.bmpは32×64の縦長
BackGround.bmpは640×480の横長です

C++です


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

Name: manako  ..初心者(6,046ポイント)   Date: 2008/06/18(水) 11:49   No:17433     
Title: Re:また課題が出てしまいました・・・・・・    
木霊さん、ありがとうございました。
結局私のプログラムのどこが間違っていたのかぜんぜんわかりませんでしたが
一応考えてるように行動にはなりました。

でも、できるだけあの形で書ける方法はないものでしょうか?
できるだけ今の形を崩さないで書けたほうがこれから先かきやすいんです。
なぜかと言うとパズルゲームはマスの入れ替えがあると思います。



#include "DxLib.h"


typedef struct{
int x,y,img,zahyou,san_flag;
}ch_t;

int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;//正常
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16],i,j;
char Key[256];
ch_t ch1 ch2;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch1.x =0;
ch1.y =0;
ch2.x =0
ch2.y =0
ch1.san_flag=0;
ch2.san_flag=0;
ch1.zahyou=3
ch2.zahyou=3;
.
.
.
.
.


そのときにch1とch2の座標を入れ替えるにはint A とでもしておいて
A = hantei[ch1.x][ch1.y];

hantei[ch1.x][ch1.y] = hantei[ch2.x][ch2.y];

hantei[ch2.x][ch2.y] =A;

のような感じになるとおもいます。
この処理を行うには、ch2の移動フラグのところでEnterを押すとこの処理に
移行させる。

こんなプログラムにする場合、一番最初に書いたソースのように書かないと自分で
もわけがわからなくなりそうなので何かいい方法があれば教えてください。


わがままとわかっていてのお願いですが、よろしくお願いします。


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

Name: 木霊  ..中級者(9,029ポイント)   Date: 2008/06/18(水) 22:35   No:17450     
Title: Re:また課題が出てしまいました・・・・・・    
最初のソースだと、ループの最初でch1の判定をしています
そこで方向キーの入力があればzahyouが0〜3になり、4にはなりません
スペースキーの判定の前にif〜else文を抜けるからです

一方ch2の判定はch1.zahyouが4の時のみ行われますが、キー入力はループの最初で判定されたものを
そのまま使っているのでch1の判定の時に方向キーが押されてなく、かつスペースキーが押されていた時しか
ch2の移動判定は行われないことになります
その時には方向キーが押されていないので、当然ch2は動きません

つまり、方向キーが押されている時は常にch1が動き、ch2は動かないソースになっています

> else if( Key[ KEY_INPUT_SPACE] == 1 )// スペースキー
> ch1.zahyou=4;

の部分をelseを外して直前のif〜else文の後ろに出してやればch1からch2への移り変わりだけはうまくいきます

自分のソースも大筋はmanakoさんのものと変わらないと思います
大きく違うのはch1、ch2を配列にして管理しているぐらいでしょうか?


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

Name: manako  ..初心者(6,061ポイント)   Date: 2008/06/18(水) 23:46   No:17454     
Title: Re:また課題が出てしまいました・・・・・・    
なるほど〜。
ループの外にスペースキーの判定があるからいけないのですね。

> else if( Key[ KEY_INPUT_SPACE] == 1 )// スペースキー
> ch1.zahyou=4;

>の部分をelseを外して直前のif〜else文の後ろに出してやればch1からch2への移り変わりだけはうまくいま


とありますが

else if( Key[ KEY_INPUT_SPACE] == 1 )// スペースキー
ch1.zahyou=4;


else //何のボタンも押されてなかったら
ch1.san_flag=0; //向かないフラグを立てる
}


この部分を

<pre>
else //何のボタンも押されてなかったら
ch1.san_flag=0; //向かないフラグを立てる
}

if( Key[ KEY_INPUT_SPACE] == 1 )// スペースキー
ch1.zahyou=4;


と言うことでしょうか?
あと、木霊さんのソースの配列とは私のように座標とキー入力と
増減を別々にせずに一緒にしていると言うことでしょうか?


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

Name: 木霊  ..中級者(9,208ポイント)   Date: 2008/06/19(木) 01:25   No:17456     
Title: Re:また課題が出てしまいました・・・・・・    
はい、そういうことです
ですが、このままだとch1が移動中にスペースキーが押された時、ch1の座標(具体的にはX、Yの両方が
共に32で割り切れない時)によってはch2しか動かせないようになってしまいます

ch1が移動中にスペースキーが押されてもch1が32で割り切れる座標まで動きつつ、ch2を操作できるように
するのか、それともch1が移動中はスペースキーを無効にするのか、最初は後者の方が作りやすいと思います


> あと、木霊さんのソースの配列とは私のように座標とキー入力と
> 増減を別々にせずに一緒にしていると言うことでしょうか?

ch1とch2を、自分のソースではFrameとしてまとめています
Frame [ 0 ]がch1、Frame [ 1 ]がch2に対応しています
また、zahyou = 4の代わりに別の変数Choose_Frameを作って、
ch1とch2の切り替え(今見たらch1からch2への一方通行だったorz)を管理しています

同じソースを変数だけ変えて打ち直す(コピペ)なら、関数化やfor、while文を使えるようにした方がミスも
少ないでしょう(現に最初のソースではch2の処理のはずなのにch1のフラグを立てている)

あと、移動時の座標の増減を一度別のメンバ変数X_Move、Y_Moveに渡しておき、毎ループごとにX += X_Moveとさせています(移動していない時はX_Moveは0で計算している)ので「枠1」が移動中に「枠2」に
操作を切り替えても座標が32で割り切れるところまでは勝手に動きます

> LoadGraphScreen( 0 , 0 , "000.bmp" , FALSE ) ;

ループの中で毎回画像を読み込んでいたら重過ぎます
ループ外でint Gr_Handle = LoadGraph ( "000.bmp" );
ループ内ではDrawGraph ( 0, 0, Gr_Handle, FALSE );
としてください

添付ファイルは変更を最小限にしたソースです


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

Name: 木霊  ..中級者(9,682ポイント)   Date: 2008/06/19(木) 02:30   No:17457     
Title: Re:また課題が出てしまいました・・・・・・    
> こんなプログラムにする場合、一番最初に書いたソースのように書かないと自分で
> もわけがわからなくなりそうなので何かいい方法があれば教えてください。

今回の場合、動かす「枠」の数だけ移動判定の処理を書くということですね?

とりあえず、メンバ変数zahyouを見直しましょう
zahyou = 0 上方向への移動フラグ
zahyou = 1 左方向への移動フラグ
zahyou = 2 下方向への移動フラグ
zahyou = 3 右方向への移動フラグ
zahyou = 4 別の枠を動かす為のフラグ

と0〜3と4で2種類のフラグが混在しています
これは分けた方が後々の為にもいいでしょう

自分ならzahyou = 4の状態を管理する別の変数(先のソースではChoose_Frame)を作り
Choose_Frame = 0 「枠1」を動かす スペースキーでChoose_Frame = 1にする
Choose_Frame = 1 「枠2」を動かす エンターキーでChoose_Frame = 2にする
Choose_Frame = 2 「枠1」と「枠2」の座標を入れ替える 入れ替え終わったらChoose_Frame = 0にする
という感じにします

で、それぞれの移動判定を
if ( Choose_Frame == 0 ) {
// 移動判定の処理
if ( key [ KEY_INPUT_SPACE ] == 1 ) { Choose_Frame = 1; }
}
・・・
if ( Choose_Frame == 1 ) {
// 移動判定の処理
if ( key [ KEY_INPUT_ENTER ] == 1 ) { Choose_Frame = 2; }
}
・・・
if ( Choose_Frame == 2 ) {
// 座標の入れ替え処理
Choose_Frame = 0;
}
とします


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

Name: やそ  ..熟練のプログラマー(59,826ポイント)   Date: 2008/06/19(木) 09:36   No:17458     
Title: Re:また課題が出てしまいました・・・・・・    
こんにちわ。
別トピのsousiさんの「勉強してきました!」
でもほぼ同じ事をやろうとしていて、やそがいろいろ回答をつけたトピックがあります。

一度ご覧になってみてはどうでしょう。
(ま、最終的には木霊さんと同じような考え方になるんじゃないかと思いますが(笑))


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

Name: manako  ..初心者(6,398ポイント)   Date: 2008/06/19(木) 16:46   No:17470     
Title: Re:また課題が出てしまいました・・・・・・    
やそ様

言われた通りに読んでみます。いま、ちょっと見てみたのですが疑問に思う事、
あるいは、勉強したい事などを検索してみると以外に出てきて勉強になりますね^^


木霊様
初心者の疑問に長々と付き合ってくださり、ありがとうございました。とてもわかりやすかったです。
ですが、後に作っていただいたソースを実行してみるとなぜかスペースキーを押しているときにしか
ch2の画面が動きません。なぜでしょう?