プログラミングのコード量に関する素朴な疑問

このQ&Aのポイント
  • ゲーム開発におけるコード量について疑問を持っています。例えば、ファイナルファンタジーやドラクエなどのゲームは、どのくらいのコードを書いているのでしょうか? ExcelのVBAを使ってプログラムをしている際に、ひとつのモジュールでは約3万文字のコードを書いていましたが、プロのゲーム開発者はどれくらいの行数や文字数でゲームを作成しているのでしょうか?
  • また、プログラムの書き方や繰り返し処理の設定、Excelなどの特定のツールを使う場合などによって、コード量は異なると思いますが、プロの人たちはどんな制限容量の中でゲームを作っているのでしょうか? どれくらいの行数や文字数が必要なのでしょうか? それに関する逸話や興味深い事例を教えていただけると幸いです。
  • さらに、素数を生成するプログラムなどの簡単なプログラムでも、多種多様な解法が存在します。同じ結果が出るのにも関わらず、コードの長さはまちまちです。昔のファミコンなどの制限の中で、どんなにコードを工夫してゲームが作られていたのか気になります。ファミコン時代のゲーム制作に関する知識も教えていただけると嬉しいです。
回答を見る
  • ベストアンサー

プログラミングのコード量に関する素朴な疑問

自分がプログラミングを初めてから、ふと思った疑問なのですが、 たとえば、ファイナルファンタジーとかドラクエとかって、どのくらいのコードを書いて、あんなゲームになっているんだろう??なんて思いました。 僕はExcelのVBA機能を使ってプログラムをしているのですが、 ひとつのモジュールで、だいたい、1500行前後、これをWordで文字数をカウントしたら、約3万文字でした。 これ以上書きこむと、そのコードを実行するのに耐えられない時間を要するので、だいたいこの程度で、ひとつのモジュールを終えているんだと思います。 プログラムの書き方や、繰り返し処理の設定の仕方や、僕の場合はExcelベースなので、特にシートとのアクセスの多さでコード量なんてプログラムを組む人それぞれだと思いますが、プログラムを組むプロの人たちが、制限容量の中で頑張ってあんなゲームを作るためには、どんだけの行数、文字数を使ったプログラムを作成するんだろう? と、ふと疑問に思ってしまいました。 別にドラクエなどでなくてもよいのですが、たとえば、このプログラムはこんだけの量(行数だったり、文字数だったり)を要さないと作れなかったんだよー、みたいなことをご存じの方がおりましたら、その逸話などを紹介していただけないでしょうか?? たとえば、僕が実際に検索してみた「素数を生成」するプログラムなどは、多くの方が作成されており、長いものから、短いものまで、同じような結果がでるのに、さまざまでとても興味深いです。 ファミコン時代などは、容量がこれくらいの制限だから、これくらいのコード(文字数とか。。。)しか納められなかったんだよ…、みたいなことも知れたら幸いです。 どうぞ、よろしくお願いいたします。

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.5

VBAバカにされたと聞いて飛んできたヽ(`Д´#)ノ 「VBはインタプリタだから遅い」は過去の話、今はコンパイルも可能、速度も改善されていると聞きます。そもそも、そんな高速処理ばかり必要ではないので、インタプリタでも十分です。セルへのアクセスを減らす、配列は大きくしすぎない、この辺がネックになりやすく、簡単に100倍速になります。よく知ることが大事! Excel VBAは、入出力の容易さ・改変しやすさから生産性が高く、業務の効率化に向きます。入門言語としてだけでなく、スキルとして十二分に通用しますよ。 …満足したところで、以下本題に沿って。 コード量は、目安として1人1ヶ月間で1500行の設計~テスト(半分はテスト)。難易度で倍増も半減もしますが、プログラマが生活するにはそれなりの規模が必要です。 モノによるけど、1機能1~2万行もざら。今時は容量制限なんて関係ないぜ!と作った巨大dll(たしか30万行)は、OSにメモリ制限があってダイエットを命じられましたけどね。デバッグ用の機能削って、以後修正のたびサイズ確認が面倒でした。 FC版ドラクエならExcelで再現可能かと。 データは配列にぶちこんで処理から切り離し、操作待ちループから状態遷移と描画を繰り返す。プログラム自体は多分2000行くらい。挑戦してみては?

SURAGOTAPI
質問者

お礼

興味深いご回答ありがとうございます! 私はEXCEL VBAをはじめてからまだ間もないのですが、セルとのアクセスには非常に時間がかかる。配列を使えば速くなるようなことがサイトに載っていたので、それをためしてみて、 およそ500行*30列くらいの配列を10個くらい作って、その一個一個の格納値が他の配列のなかの格納値の一個一個とどのくらい重複しているか?みたいなコードを書いてみました。 ワークシート関数のCOUNTIF(範囲,検索値)みたいなものですね。 配列内ではApplication.CountIfみたいなものが使えないのがわかりました。配列内では、範囲を設定できないんですね…。たぶん。(範囲を設定できないと書くと少し語弊があるかもしれませんが、ワークシート関数みたいな設定の仕方って意味です) んで、For文やEach文を使って一個一個を検索していくのですが、意外と速いのにびっくりしました。 実はこれと似たようなことをシート状でCOUNTIF関数(やら、この関数を交えたやっかいな入れ子関数)を使い実行したら、OS(なのかな?)に「メモリ不足」って怒られてしまったことが発端でEXCEL VBAに手をつけたんですw COUNTIF関数やMAX関数やSUM関数みたいなシート上では範囲を簡単に設定できる処理を、配列を使ってFor文などで表現するのに、苦労しましたが、ワークシート関数使用時のあの再計算処理の苦痛から逃れられたのがとても嬉しい!と感激しました。 他の言語に行く前に、VBAで、もうちょっと頑張ってみようと思わされるご回答、本当にありがとうございました!!

その他の回答 (4)

  • bajutsu
  • ベストアンサー率20% (139/693)
回答No.4

>違いが判ればVBAでも速い処理ができるプログラムが組める可能性がある!ってことですよね??? ExcelVBAって時点で、インタプリタなの。 だから、違いがわかったところで、ExcelVBAを使っている限り 速い処理ができるプログラムは書けません。 wikiで調べたのなら分かると思うけど、インタプリタ型というのは 人間が読める「プログラミング言語」の状態から、実行する時にCPUが理解できる「機械語」に 変換しながら処理をしていくわけで、 例えるなら、日本人とアメリカ人が通訳を挟んで会話している状態だから どうしても「通訳」というロスタイムが発生する。 ゲームだと、既に機械語に翻訳された状態(実行モジュール)の形になっているから 通訳というロスタイムは発生しない。 上の例で言うと、会話に必要な部分だけ英語を丸暗記して、通訳が要らない状態にしてあるってことかな? いわゆる最近の高級言語と呼ばれるもの(VBAとかもそう)は、 “いくつかの処理をまとめた”API群とかがあって、それらの力を借りて 書くコード数は少なくても、いろんなことができるようになってはいるが それらAPI群にはある程度汎用性とか安全性を求めて作られているため 機械語とかにした場合には、要らない処理とかも入ってたりする。 (型のチェックとか、サイズのチェックとか、内容が「決め打ち」なら厳密でなくてもよい) API化した際に、関数の入れ子が多段階に渡ることもある。 「関数呼び出し」って、CPUの処理的にはちょっと重い処理なのだが 単純な処理をするのに、関数を呼んで呼んで~で、結局、基本的な関数を呼んでるだけだったり というようなことも、高級言語のAPIでは多々ありますが 低級な言語を敢えて使うことで、それらの無駄を省いた処理を書くこともできます。 変な話、for文で、10回ループする処理を書くなら 10回分ベタで書いた方が、終了判定や、カウントをアップする処理が要らないくなりますよね? これだとコードの量は増えますが、処理効率はちょっとだけUPします。 まぁ、他はだいたいAno2さんと同意です。 過去の資産がたくさんあるのもそうだし、新規プログラムと言っても、 その過去の資産から、似たようなものを探してきて、土台にしたり… ここでいう、過去の遺産とは、プログラム、作る人、方法論などなど。 あらゆるノウハウは蓄積されているし、これからも蓄積していくでしょう。 とにもかくにも、興味を持たれたのなら、一度VBAから離れてみることをオススメしますが。

SURAGOTAPI
質問者

お礼

ご回答ありがとうございます。 EXCEL VBA を始めてから、まだ間もないので、もう少しVBAで慣れたら他の言語にも挑戦してみたいと思います。 いろいろとEXCELの技法を紹介しているページをみましたが、 ループをするよりも、同じコードを書いたほうが処理効率が上がるってことは知りませんでした! それと、たしかに、いまでも、型が合わないだの、インデックスの範囲外だのって、よく怒られながらEXCEL VBAとケンカしーのプログラムを組んでいますw 叱ってくれるのがインタプリタ型だからなんですよね。 わかりやすい例えで、まだなんとなしですが、これからが楽しくなりました。 怒られなくなったら次の言語に進んでみたくなるご回答でした。 ありがとうございます!

noname#157410
noname#157410
回答No.3

http://www.amazon.co.jp/exec/obidos/ASIN/4844326864/gengengen-22/ref=nosim これでも買って勉強しなおしてください。

SURAGOTAPI
質問者

お礼

再度ありがとうございます。 この本買ってみたいと思います! ご紹介ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

エクセルVBAしかやってなくて、云々するのはおかしいと思う(井の中の蛙)。所詮スクリプトを書いていては、色々いえない。 C++ぐらい使って、さらにAPIなども作るとか、ぐらいのレベルになったら、そのとき考え直したら。 ゲーム製作は特別な分野で、ビジネスデータ処理のエクセルなどと、違う面が多い。 ゲームでなくても、エクセルなどを見て想像しても、開発は大変だなと、質問とおなじようなことは感じる。 私も経験者で無いから詳細言えないが (1)過去からの開発の蓄積が違う。ツールのようなものも出来上がっている。開発方式も経験を積んでいる。 部分で使う技術(プログラム)は既に出来上がっているとおもう。 (2)全世界の開発用の優秀ソフトも使っている。 (3)組織で開発している。下請けも使っているだろう。開発も分業でなされている。 (4)優秀な人が多数従事して開発している (5)資本(金、予算、先行投資となる開発費)もかけている(完成までの長期の人の労働、ソフトや機器の購入)。 結局ゲーム製作に限らず、ロケット開発でも共通する点で、普通の個人には難しいという点の要素(原因)は同じだろう。 質問者が経験することは一生無いと思うし、ゲーム製作の製作現場の人が、こんな質問コーナーに(回答には時間かかるが初心者の質問が多く、回答者の勉強になる場ではないから)付き合っていたらおかしい(ここにある1カテを登録したら1日数十のメイルを見ないと、答えられるテーマかどうかわからず、答えるとなると1問に数十分もかかるのだ。若い優秀な現役がそんなことをしていたら国家・会社・自分の損失)。 ここであまり良い回答は期待せぬが良かろう。

SURAGOTAPI
質問者

お礼

ご回答ありがとうございます。 たしかにプログラムを生活の糧にしている方などは、このような質問は勉強不足と叱咤なさると思いました。 最近勉強し始めて、ふと思った疑問だったので、つい問いかけてしまったのですが、それでも、得られた情報でもっと勉強したくなりました! ありがとうございました!

noname#157410
noname#157410
回答No.1

インタープリンタ型の言語はあえてそんなものですが? サブルーチン多用すれば何とかなるかもですけど。 大体大きなプログラムは、機械語にコンバートしています。 この違いが判らないと、VBAでプログラム組むととてつもなく遅いプログラムが出来上がるでしょうね。

SURAGOTAPI
質問者

お礼

さっそくの回答ありがとうございます。 インタープリンタ型をwikiってみました。この言葉初めて知りました。 (wikiでは[インタプリタ型]としてヒットしましたが同じことですよね??) 違いが判ればVBAでも速い処理ができるプログラムが組める可能性がある!ってことですよね??? ここで、また疑問なのですが、「機械語にコンバートする」ってことと、Excelで「配列で処理する」ってことは、また別の意味合いなんですよね?? なんとも、プログラミングを初めてしがないものなので、どうぞご指南のほどよろしくお願いします。

関連するQ&A

  • HTMLの文字コードに関する素朴な疑問です!?

    HTMLの文字コードに関する素朴な疑問です!? HTMLファイルの書き方は、時とともに変遷してきました。 ■CSSの場合は、 <style type="text/css> ~</style> ↓ <style> ~</style> ■JavaScriptの場合は、 <script type="text/javascript> ~</script> ↓ <script> ~</script> ■文字コードの場合は、 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> ↓ <meta charset="UTF-8"> 調べてみたところ、 ・日本では、「 UTF-8 」、「 Shift_JIS 」、「 EUC-JP 」の  3つがよく使われている文字コードである。 ・Shift-JISでの日本語1文字あたりのデータ量は2バイトだが、  UTF-8は1文字あたり3バイト必要である。  UTF-8よりもShift-JISの方が消費データが少なくて済む。 それにつけても、文字コードは何故 ・一本化しないのだろうか? ・一本化したら困ることでもあるのだろうか?

    • ベストアンサー
    • HTML
  • プログラミングなんですが。。

    次のようなプログラムはどのようにして作成したらいいのでしょうか。 [1]2つの整数aとbを作成します [2]2数が一致すれば”a=b=(入力した数値)” と表示させます [3]2数がともに10より小さければ”2数とも10未満です”と表示させます [4]2数のうちどちらかが5で割り切れれば”どちらかが5で割り切れます”と表示させます [5]bが0でまければa/bを表示させます   また、1文字を入力してその文字が小文字なら大文字に、大文字なら小文字に変換するプログラムを作成するためにはどのようにすればいいのでしょうか。 そして最後に0以上の整数をキーボードから入力し、その数が以下のどれにあたるかを判定し適当なメッセージをさせたいのですが [1]0ではない [2]4の倍数で、かつ7の倍数である [3]4の倍数であるか、もしくは7の倍数である [4]上の[2][3]のいずれにもあてはまらない   長くなってすみません。if文の使い方もよくわからないので教えていただけると嬉しいのですが (^^;)

  • プログラミング

    C言語で以下のプログラムを作成したいのですが教えてください。 水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成する。 アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。 お願いします。

  • meadowである一定以上の量のファイルを作るとバクが起きます

    meadowを使って、WEBから文章データを取ってくるプログラムをrubyで書いています。取得したデータをcygwinでリダイレクトして出力ファイルに書き出していたらある一定以上のデータ量になったとたん、文字コードがSJISからおそらくEUCかなにかに変化してしまいました。量が少ないときは文字コードが変わることはないのですが、これはいったいどういうことなのでしょうか?sjisは大容量のデータファイルには対応していないということなのでしょうか?

  • [word2010]印刷量(ページ数)を減らす工夫

    資料の印刷量が多いので、減らそうとしています。 そこで、以下の点はすでに変更しました。 ・文字数 ・行数 ・文字の大きさ ・余白 ・フォント もし、これら以外に何かできる工夫があれば、教えて下さい。 宜しくお願いします。

  • 文字コード変換プログラム

    こんにちは 文字コードを一発で2進数に変換してくれるプログラムを探しています。例えば A-->01000001 あ-->1000001010100000 16進数に変換してくれるプログラムって結構見つかりましたが なぜか2進数が見つかりませんでした。 (16進数を2進数に変換すれは良いのですが、できれば一発で…) プログラムを載せているサイトをご存知の方、宜しくお願いします。

  • シートのコード部を後からプログラムで作成可能?

    エクセル2003で、シートにプログラム(コード)がありシートを削除すると当然プログラムがなくなります。 シートはシートの挿入で新規に作成できますが、プログラム(コード)部を後から自動的に(標準モジュールの関数からソートのコード)を追加することは可能でしょうか? シートのコード部は主にイベントですが、詳しい方教えて下さい。

  • 文字コードについて

    perlプログラムのでtraceしてて、「HASH(0x815bb68)」 という文字コードがあったのですが意味を教えてください。 「0x」は16進数ということですよね。

    • ベストアンサー
    • Perl
  • World 2013 行数と文字数を設定したい…

    World 2013 を使用しています。 縦書きで原稿を作成しています。 フォントは10,5、文字数30。行数35, に設定しているのですが。 いざ原稿を作成してみると、ページによって文字数も行数もバラバラです。 1ページ目は文字数32、行数32.2ページ目は文字数30.行数34……といった具合です。 どうしたらよろしいでしょうか? 印刷する際、印刷設定で文字数と行数を設定すれば、印刷用紙にはそれで印刷してくれるのでしょうか? 困っております。 どなたか教えていただけますとありがたいです。 よろしくお願いします。

  • このプログラミングの宿題を教えてください。

    「アルファベット4文字を半角で文字列として入力します。4文字のコードを足しあわせ,その結果を10進数で表示します。さらに,百の位,十の位,一の位に分けて表示するようにプログラムを作りましょう。」という宿題です。 main( ) { char s[6]; printf("4文字を入力してください:"); scanf("%s",s); } ここまでできたんですが、そのあとが分かりません。 回答よろしくお願いします。

専門家に質問してみよう