• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ゲーム)

C言語でゲームプログラムに関数を追加する方法

このQ&Aのポイント
  • C言語でゲームプログラムに関数を追加する方法を教えてください。
  • また、移動可能なマップを作成し、キャラクターの座標を操作することができるようにしたいです。
  • 具体的なプログラムの修正箇所や追加すべき関数などを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

目的もなく、ただ「関数を一つ増やしたい」と言われても困ります。 目的を決まらなければ、どんな関数にしたらよいかがわかりません。 どんな関数にしたらよいかがわからなければ、プログラミングのしようがありません。 以下、余談にはなりますが。 > char map[][81]={ ■が2バイトだと決めつけていますが、UTF-8だと3バイトです。 プログラム中この2バイトであると決めつけた「2」という数値が出てきます。 これは「よくないプログラミング手法」です。 //マップチップ char mc[2][3]={ と用意しているのですから、マップデータを表示と同じにする必要はありません。 char map[][81]={ /*00*/"********************", /*01*/"* * * * *", ... などとすれば、2を掛けたり割ったりする必要がなくなります。 strncpy,strcmp関数もほとんど不要です。 あるいは int jm[25][40]; //移動可不判定 にマップ情報をいれるのですから、最初から int jm[][41]={ {1,1,1,1,1,1,1,1,1,1,....,1,2}, {1,0,1,0,0,1,1,1,1,1,0,....,1,2}, ... {2} } 等とjmに直接マップデータを記述して、 char map[][81] をまったく使用しない、という方法もあります。 // 列の終端、行の終端に 2 を使用しました。 // sizeofによる計算や、strlen関数の代りに、終端までの数を数えるようにします。 // 現行のmapでも、終端行の目印(空文字列とか)を入れて、そこまでの行数を数えるようにする方が、sizeofを使うものに比べて汎用性がよいです。 /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ 条件をよく見てください。 この条件が成立するのは、次のどちらかが成立している場合です。 1. (fy<=sty||fx<=stx) 2. (y==sty&&x==stx&&jm[y][x]==1) 1.には、変数 x,y が使われていないので、ループの影響は受けません。 2. では、 少なくとも、y==sty&&x==stx が成立している必要があります。これ以外のx,yでは不成立です。  つまり、 このforループでは、y==sty&&x==stxの1回以外は無駄なループです。 sty,stxが範囲外だと、jm[sty][stx]==1 で動作に不具合が出ます。 ですが、 (sty,stxが範囲外である) || (jm[sty][stx]==1) とすると、 || 演算子の特性( 左が真なら、右は計算しない) によって、 jm[sty][stx]==1 を評価するのは sty,stxが が範囲内の場合のみ、となります。 もっとも、私なら次のように作ります newX=stx ; newY=sty ; /* 入力キー、移動座標出力 */ KEY(&kn,&newY,&newX); /* 壁、マップ外への侵入防止 */ if ( newX,newYがマップの範囲内 && jm[newY][newX]==0 ) { stx=newX; sty=newY; } キーコードで判定して移動したものを、またキーコードで判定して元に戻す、なんて、面倒ではなかったですか? 「移動」に必要なのは、次の座標と、そこへ移動できるかどうかの判断だけで、キーコードは不要です。

tokkurisann
質問者

お礼

無茶なこと質問した自分にこんなにも回答ありがとうございます。すごくためになりました。 自分でももう一度考えてみたいと思います。

関連するQ&A

専門家に質問してみよう