can_or_cannot関数についてわからない事があります・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りらっくま

can_or_cannot関数についてわからない事があります・・・

#1

投稿記事 by りらっくま » 9年前

ゲーム基本編~23.行けない所をつくる~1D
を見て作っていたのですが、can_or_cannot関数についての使い方?を教えてほしいです

↓のC++のコードで括った2つの箇所でcan_or_cannotを使っていますが
上ではなんで()の中身で(int x , int y , int muki)と また宣言しているのでしょうか?

さらに上では x,y,muki の値がこれだったら~と書いているのに
下では()の中身が(ch.x , ch.y , ch.muki)となっています
上と下の中身が一緒じゃなくてもいいのでしょうか?
私は上も(ch.x , ch.y , ch.muki)にした方が良いと思うのですが、、、

HP作者様の説明、「呼び出している」というのも理解できておりません

私の考えでは、「上と下の引数が違うからエラーになるはず・・・」です

すみません、can_not_cannot関数について調べましたが、Googleでも4ページ分しか出ず、
その中から調べても詳しい説明はありませんでした
分かりそうで分かりません、、
理解できずに、進む、デバッグをするのは悔しいです・・・

お願いします、can_or_cannotについて引数の意味、上と下で2回呼び出している意味を教えてくれると助かります


#include "DxLib.h"

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

コード:

int hantei[20] = { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 } ;
 
int can_or_cannot(int x,int y,int muki){//進む方向が通れるか通れないかを判定
        if(muki==1)//左向きなら
                if(hantei[x/32-1]==1)//通れないなら
                        return 1;//エラー
        if(muki==3)//右向きなら
                if(hantei[x/32+1]==1)//通れないなら
                        return 1;//エラー
        return 0;//正常
}


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; //歩かないフラグを立てる

コード:

[code=cpp]if(ch.walking_flag==1)    //もし歩くなら
                if(can_or_cannot(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walking_flag=0;                  //歩かないフラグを立てる。
        }
[/code]

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;
}

アバター
MNS
記事: 35
登録日時: 9年前

Re: can_or_cannot関数についてわからない事があります・・・

#2

投稿記事 by MNS » 9年前

関数の理解はきちんとされていますか?
前者(上)は、「can_or_cannnot関数の定義」
後者(下)は、「can_or_cannnot関数の呼出」
です。

”呼び出す”というのは”使用する”ということです。
誤解を恐れずに数学の関数で例えれば、
関数の定義:f(x) = x + 4
関数の呼出:f(4) = 8
ということになります。

―追記というか補足。
つまりこのcan_or_cannot関数でいえば、
前者は「進む方向が通れるか通れないかを判定する関数の定義」
すなわち、あらゆる方向、座標において、汎用的に使用できる、
判定の処理が書かれています。

そして、後者は、これを実際に、「キャラが進む向き」&「キャラの座標」で使っています。
ですから、can_or_cannot(ch.x,ch.y,ch.muki)という呼出では、
ch.x→キャラのX座標、ch.y→キャラのY座標、ch.muki→キャラの向き
と決まっているので、前者のx,y,muki(…”何の座標・向きかは決まっていない”)とは異なるのです。

例えば敵としてtekiという変数を宣言した場合には、
can_or_cannot(teki.x, teki.y, teki.muki);
と、敵の進行可不可判定にも用いることができます。
関数とはそういうところに利便性をもちます。

りらっくま

Re: can_or_cannot関数についてわからない事があります・・・

#3

投稿記事 by りらっくま » 9年前

回答ありがとうございます
can_or_cannot関数の定義の仕方等もよく分かっていませんでした
さらに他の事まで教えていただいて、、、ありがとうございます

上の()は特に意味はないのですね・・・

上に書いておいて下で実際の値を入れて実行する。
また敵がいけない範囲としても設定できる。

上手く言葉では書けませんが、ようやく上と下でしていることの理解が出来ました

本当に感謝します、ありがとうございました

box
記事: 1746
登録日時: 9年前

Re: can_or_cannot関数についてわからない事があります・・・

#4

投稿記事 by box » 9年前

りらっくま さんが書きました: 上の()は特に意味はないのですね・・・
上の()、というのが関数の定義のことだとして、特に意味がない、というのは大間違いです。
()の記述がないと、関数の定義は成立しません。ていうか、()がないとコンパイルエラーが出て、先へ進めません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る