関数について

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

関数について

#1

投稿記事 by DIAMOND » 16年前

はじめまして
この度、ゲームを作ろうと調べていたらここにたどり着きました。
サイト全体を拝見してみたところ、ゲームプログラミングの館が一番理解しやすそう
だったので参考にしながら選択画面の作り方あたりまで勉強したので簡単なゲームを
作っていけたらいいな~と思っているのですが、DXライブラリの使い方などはわかりました。

ただ、ゲームを作成するときの処理の流れがイマイチ理解できていません。
ゲーム等を作るときって関数の中に関数を入れていって処理するんでしょうか?

例えば
全体の関数{
{Aのキャラクターが歩く計算}
{Bのキャラクターが歩く計算}
{Aの描画}
{Bの描画}


こんな感じで{}は関数を表してるんですが・・・・
見当違いな事を言っていたら申し訳ないのですがイマイチ言語と処理の流れのイメージがつかめていません。
ご指導よろしくお願いします。

kazuoni

Re:関数について

#2

投稿記事 by kazuoni » 16年前

自分はですが、
あまりいろいろな物をごちゃまぜにしないほうが良いと思います。
・他に応用がきく関数
・プログラムを簡潔に見せる関数
とりあえずはこの二つですかね。(まだまだ初心者なんで、適切ではないかと思いますが。。)
応用がきく関数は例えばですが、
RPGで町キャラクター、自キャラの動かし方は同じです。
(自動、手動は違いますが、大本は http://dixq.net/g/#22 と同じ)

町人ごとに歩くアルゴリズム書いていたらとんでもないことになります。
そこで関数化を図り、無駄な記述を少なくすることができます。

簡潔に見せる関数は、
例えばmain()にすべての処理を書いてある場合と、
それぞれの関数を分けてmain()で各関数を呼び出す場合を
考えたら一目瞭然です。
ただ、これは見た目の問題なんで、個人のやりやすいようにしたほうがいいと思いますが。

初心者の分際なんで、参考にならないかも知れませんが・・・。

Mato

Re:関数について

#3

投稿記事 by Mato » 16年前

 はじめまして。
別にキューさん(管理人)の回し者ではないですが、ゲームプログラミングの館は理解重視で作られてますので、オススメです(´▽`)



全体の関数{
{Aのキャラクターが歩く計算}
{Bのキャラクターが歩く計算}
{Aの描画}
{Bの描画}



というイメージの掴みは良いと思います。
もし、”{Aのキャラクターが歩く計算}”や”{Aの描画}”というのを関数化しない場合を考えます。
その場合、実際にプログラミングすると、”全体の関数”というのが膨大な行の関数になってしまいます。
後で自分が見直した場合に、「このプログラムは何をしたいのか」が分からなくなってきます。
他にも関数化の利点は色々とあります。


 そういうわけで、その色々なメリットを利用しない手はない、ということで関数が使われます。
もちろん、WinMain関数にずらずらーっと書き連ねても、ゲームは作れます。
関数がなくてはプログラムは動かないというわけではない、ということですね(WinMain関数だけは使って頂きたいところですが)。

御津凪

Re:関数について

#4

投稿記事 by 御津凪 » 16年前

C 言語では、関数の中に関数を書くことは出来ません。
(書くことのできる言語はあります)
void function( int arg ){
    printf("input arg of %d.\n", arg);
}
上記のような構造を一括りで関数とし、関数の処理の中で別の関数を呼び出すことで、それぞれの処理を
行なうことができます。

つまり、

Aのキャラクターが歩く計算 の関数{処理}
Bのキャラクターが歩く計算 の関数{処理}
Aの描画 の関数{処理}
Bの描画 の関数{処理}

全体の関数{
 Aのキャラクターが歩く計算 を呼び出す
 Bのキャラクターが歩く計算 を呼び出す
 Aの描画 を呼び出す
 Bの描画 を呼び出す


のような関係になります。


もし、C言語についての書き方を基礎から覚えたい場合は、
入門書を読むか、「C言語 入門」で検索して気に入った入門系サイトを探すと良いでしょう。
(さすがに全てをここで覚えるわけにはいかないと思いますので…)


プログラムとしての大まかな処理の流れとしては、

・初期化処理(データの読み込みなども含む)
・主要処理(移動・描画など)
・終了(後始末)処理

と、なっています。
これは、ゲームやソフトとして、また関数ごとの流れとしても当てはまります。

# どのような処理を関数に分けるのか、という考えは kazuoni さんの方法が無難ですね。

> Mato さん
> もちろん、WinMain関数にずらずらーっと書き連ねても、ゲームは作れます。
> 関数がなくてはプログラムは動かないというわけではない、ということですね(WinMain関数だけは使って頂きたいところですが)。

単純な処理でない限り、絶対スパゲッティコード(処理が関数内でごちゃごちゃ)になるので厳禁であることを私から付け加えておきます。

DIAMOND

Re:関数について

#5

投稿記事 by DIAMOND » 16年前

>kazuoniさん

確かに町の1人1人に歩くアルゴリズムを割り当ててたら大変ですね;

>・他に応用がきく関数
>・プログラムを簡潔に見せる関数

ほかに応用が利く関数と言うのは歩くアルゴリズム、ショット等のアルゴリズム
戦闘時の計算アルゴリズムみたいな感じですかね。


プログラムを簡潔に見せる関数は、シューティングの館、龍神録プログラムの館
等で出てくる、キャラクター移動、描画、当たり判定、ショットアルゴリズムなどが
当てはまるのでしょうかね?
分かりやすい回答ありがとうございました。


>Matoさん

>全体の関数{
>{Aのキャラクターが歩く計算}
>{Bのキャラクターが歩く計算}
>{Aの描画}
>{Bの描画}
>}


>というイメージの掴みは良いと思います。
>もし、”{Aのキャラクターが歩く計算}”や”{Aの描画}”というのを関数化しない場合を考えます。
>その場合、実際にプログラミングすると、”全体の関数”というのが膨大な行の関数になってしまいます。
>後で自分が見直した場合に、「このプログラムは何をしたいのか」が分からなくなってきます。
>他にも関数化の利点は色々とあります。

イメージのつかみ方が合ってたのでホッっとしました。
問題はイメージをどうやってプログラムに組み直すかですね。
やはり全体の関数の中にすべての処理を書くのは無理だと思いつつ書いてました。
特にRPGなどはMAPが2次元配列なので分けないととんでもないことになりそうです。
関数の利点が理解しやすい内容でしたので助かりました。ありがとうございました。



>御津凪さん


>C 言語では、関数の中に関数を書くことは出来ません。

できないのですか~残念。


>関数の処理の中で別の関数を呼び出すことで、それぞれの処理を
>行なうことができます。

調べてみると関数は別のcppファイルからでも呼び出せるとか。
一度ゲーム館の中にある簡単なプログラムを別のファイルに書いて分割したり
関数を呼び出す練習をして行こうと思います。
関数をどう扱えばいいのか分かったのでよかったです。
ありがとうございました。



PS
>単純な処理でない限り、絶対スパゲッティコード(処理が関数内でごちゃごちゃ)になるので厳禁であること>を私から付け加えておきます。

なんでスパゲッティーコードって言うんでしょう?
やっぱりアジアなら一本麺って表現が合ってる様にも思います(笑)

御津凪

Re:関数について

#6

投稿記事 by 御津凪 » 16年前

>なんでスパゲッティーコードって言うんでしょう?
>やっぱりアジアなら一本麺って表現が合ってる様にも思います(笑)

由来は、処理がスパゲッティのように絡み合い、どこか一箇所を修正しようとすると、
全体に影響が出る(引きずられる)状態から来ているそうです。

確かに一本麺でも表現は似てますね。本数は違いますが。

Dixq (管理人)

Re:関数について

#7

投稿記事 by Dixq (管理人) » 16年前

まず基礎を固め、何度も自分でプログラムを書き、プログラムに慣れるのが一番だと思います。

http://www5c.biglobe.ne.jp/~ecb/c/c00.html
この辺の入門サイトの7章などをよみ、関数化について勉強して下さい。

そして自分が考えられる限りの色んな関数化によるプログラムを書いてみて下さい。
沢山書いているうちに何を関数にすればいいかわかってくると思います。
最初のうちは関数化できそうなものは端から関数化してみて下さい。

ポインタを勉強するとその関数化がグッと効率的に使えるようになると思います。

閉鎖

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