自分は高校生で、昔からゲームやそれの販売サイトを作ってみたいと思っていて、
入門書を調べているのですが、なかなかよさげなのが見つからず、
とりあえずこのレビューが良さそうなのを見つけました。
ゲーム作りで学ぶJavaプログラミング入門 Java7版
新人君! RPGの世界でJavaを学ぼう
なぜか古いのばかりなんですが、マイクラとかが好きなので、
Javaにこだわっているわけではありませんが、
この言語のものを調べているわけです。
Javaですが、ゲームのプラットフォームはスマートフォンではなく、
パソコンでリリースしたいと思っています。
ゲームは完成次第スチーム等で販売する予定です。
そのほかおすすめの本などがありましたら是非、教えていただけると幸いです。
パソコンはWindows11の64bit版です。
No.3ベストアンサー
- 回答日時:
まずは概要から。
どんな「ソフトウェア」(ゲームを含み)でも押さえておかなきゃならない基本概念にRead-Eval-Print Loop(略してREPL)と言うモノがある。
REPLってのはインタプリタの設計技法なんだけど、極論、どんなソフトウェアだろうとREPLなんだよ。だからREPLと言う「組み立て方」をまずは把握するのが重要。
REPLとは
・読み込み部
・評価部
・出力部
ってパーツを別々に作っておいて、それらを組み合わせてループさせろ、って事だ。
この基本構造からは例えばExcelとかのソフトウェアも逃げられない。
ゲームなんかはグラフィックスが絡むし、ついついそっちに意識を持っていかれるけど、実はこの「REPLと言う構成」を意識するだけでだいぶ視界は開けるんだ。
GUIなんかの設計法にMVC(Model-View-Controller)なんつーものもあるんだけど、実はこれも名前が変わってるだけで、基本的なアイディアはやっぱりREPLなんだ。REPLって設計方法を理解してるかどうか、ってのはかなりの違いを生む。
ぶっちゃけ「ゲームの書き方を教えます!」的なサイトもちらほらあるけど、その「REPL観点」を持ってるトコはほぼない。テクニカルな枝葉末節にこだわってて(確かにそのテの「テクニカルな話題」は重要ではあるんだけど)、「ゴチャゴチャなコード」を提示してる例が多いんだ。
いずれにせよ、「骨太の設計方針」を取るならREPL、って設計法は欠かせない、んだ。そしてREPLを理解するとある意味「プログラムを組む」と言う行為は「ワンパターン」へと落とし込まれる。
なお、ザックリ言うと、ビデオゲームの成立は2系統あって、一つはゲームセンターでのアーケードゲーム(アクションゲームとかシューティングゲームとか)、もう一つが(北米の)大学のメインフレームで成立したゲーム(アドベンチャーゲームとかRPGとか)があるんだ。エロゲのルーツを辿ってくと大学のミニコンとかで動いてたゲームだった、ってのが笑っちゃうんだけど(笑)、いずれにせよ、アドベンチャーゲームとかRPGとかはモロにREPLを含む大学のコンピュータサイエンスの授業/宿題的なプログラム構成法の応用で始まったんだ(RPGそのものは元々ボードゲームなんで、ボードゲームであるTRPGの「規則」をインタプリタ的な「評価部」に当てはめるように実装した、って言って良い)。
一方、ゲーセンのゲームはテクニカルな意味だと「企業秘密」で発展してきた背景があるんで、一般論、っつーかノウハウは公開されてきてないトコがあるわけね。
だからアクションゲームとかシューティングゲームは「纏まった一般ノウハウがない」前提なんで、作るのは難しいんだ。ノウハウがない、って事は徒手空拳で作らなアカン、って事になる。
いずれにせよ、RPG作成でも基本的なトコでは、「大学の宿題」的なインタプリタ作成法の影響が元々大きいジャンルなんだよ。
注: 実際、古典的なテキストアドベンチャーゲームのゲームエンジンはほぼ「インタプリタそのもの」を実装してたり、あるいはコンパイラを書いてるのに等しかったりする。
とまぁ、それが概要だ。
さて、「ゲーム作成法」に関する書籍だと、多分一番有名なのはソフトバンクのシリーズなんじゃなかろうか。WindowsでC++前提になる、って言う縛りにはなるけどね。
アドベンチャーゲームプログラミング:
https://www.sbcr.jp/product/4797320273/
ロールプレイングゲームプログラミング 2nd Edition:
https://www.sbcr.jp/product/4797339616/
ダンジョンゲームプログラミング:
https://www.sbcr.jp/product/4797346282/
アクションゲームプログラミング:
https://www.sbcr.jp/product/4797335971/
シューティングゲーム プログラミング:
https://www.sbcr.jp/product/4797337214/
ご回答いただきありがとうございます。
初めて聞いたREPLですが、インタプリタを知れば理解できるんですね。
ゲームを作る前に勉強しておいたほうが良さそうなので、
回答者様(神)のようなプログラマーになるためにもここは押さえておくべきだと思いました。
以前知恵袋でも同じような質問をしたのですが、
あなたのようなまともな回答はなく、
逆に否定的な回答がつくことがあったので、
教えてgooに引っ越してきてよかったと思っております(関係ないけど)。
No.6
- 回答日時:
あ、ゴメン。
ソフトバンクの本のシリーズに抜けがあったわ。こんな本もある。
3D格闘ゲームプログラミング:
https://www.sbcr.jp/product/4797341805/
いずれにせよ、Windows + C++限定、かな。
No.5
- 回答日時:
「ゲーム」って言っても、その内容によって、
準備するべきものや、やるべきことは全く違うんじゃないの?
あなたが具体的にどんなものを作りたいのかによって
話は違ってくる。あなたの「ゲームを作りたい」が
岸田の「首相になりたい」と同種のものだったとしたら、
あまりにも無意味というか...
No.4
- 回答日時:
ついでに参考まで、に、一体REPLと言う「インタプリタ作成法」で極簡単なゲームをJavaで書くとどうなるのか、ってのを見せてみよう。
繰り返すが、全てのソフトウェアは極論インタプリタなんだ。「言語インタプリタ」って枠組みが実は「ソフトウェアを書く基本」になってるんだけど、大学とかで教える側も教わる側もあまりそれを取り上げる「理由」が分かってない、って言う残念な事実があるんだ。
だからそこが強調されない。
実は「言語インタプリタを作る」って事はなんかエラソーな「アカデミズム」が理由じゃないんだよ。色んなソフトウェア制作に応用出来る「基礎的な考え方」だから取り上げてる、ってのが本当の理由なんだ。
最近のトレンドだと、「最初に紹介するプログラム」が「Hello, World!」って表示するだけのバカなプログラムじゃなくって、「数当てゲーム」を採用してるケースが増えてきている。
数当てゲーム、ってのはコンピュータ側が乱数で1〜100のうちのテキトーな数を選び、プレイヤーがその数を当てる、っつー至極つまらん(笑)ゲームだ。
でも「つまらん」って事は「実装が簡単だ」って事を意味するんで、それを「プログラミング入門」の最初のテーマに使ってる事例が増えている。
個人的にはJavaが苦手なんだけど(Javaは専門じゃない・笑)、REPLの考え方を使って「数当てゲーム」を書けば、次のようになるんじゃないか。
数当てゲーム:
https://paiza.io/projects/uaf8FH6taTSZJaATwTd0hA
Paiza.ioではエラーが出てるが、こちらの環境ではコンパイルは通ってる。っつーか、Paiza.ioでの「入力」が独特なんでエラーが出ているだけ、だ。
繰り返すけど、僕個人はJavaは専門じゃないんで、Javaプログラミングの「スタイル」として妥当なプログラムになっているかどうかは知らない。あくまで「理論的な話」なんで、それもあって「参考程度に」ってこった。
Javaのテクニシャンならもっとキレイでマトモなプログラムを書いてくれるだろう。
Javaだと1クラス = 1ファイルって縛りがあるんで、総計3つのファイルにまとめてある。
それはこれらだ。
・Main.java
・Env.java
・Messages.java
Main.javaはプログラムのエントリポイントになる。要は「ここからプログラムが呼び出される」わけで、他の2つのソースコードから作られたクラスファイルも全部Mainクラスから呼び出される。
まぁ、これはJavaの基本だよな。
次に、先にMessage.javaから説明すると、これは本当にプログラムで表示されるメッセージを独立させて作ったクラスになっている。
今の国際化の時代だと、例えばOyama77氏がゲームを作ってSteamで売出して、外人さんがキョーミを持ってくれたのに「英語化するのが難しい」とかなれば困るだろ、って話になる。
結果、今のトレンドだと、「メッセージ関連」とか、あるいはそれこそ「RPGのシナリオ/セリフ」なんかは別ファイルに纏めてる例が多い。
そうすればソースコードを全部探し回らなくても、一箇所だけ「改変」すれば外国語化が可能になる。そのためにメッセージ関連は別にしてまとめておくわけだ。
実際には、別にテキストファイルをまた用意しておいて、Messages.javaみたいなクラスへと「読み込む」みたいなシステムになるんじゃないか。いずれにせよ、「メッセージ関連は別分けにして纏めておく」ってのが21世紀的なスタイルだと思う。
これを「メッセージ分離方式」と呼ぶ。
今回のプログラムで中心的役割を担うのがEnv.javaだ。これはゲームの環境データを司るクラスだ。かなり端折ってるけどな(笑)。
Envってのは「環境」から名付けたわけだけど、基本的に「全てのゲーム進行にまつわるデータ」を詰め込む為の場所だ。今回はsecretNumber(答え)、guess(ユーザーから受けた入力)、cmp(入力値が答えより大きい/小さい、あるいは同じかのデータ)、あとはEnvクラスから取ってきたメッセージ情報の4つしかないけど、RPGだったらマップデータとかパーティメンバーデータ、敵のデータ、とか自分等が今どこにいるのか、とか様々なデータを詰め込む事となる。必要に応じて、データ作成の為の別のクラス(例えば勇者クラスとかモンスタークラスとか)を作ってここに取り込む事もあるだろう。いや、確実にある(笑)。
いずれにせよ、環境データ、と言うのはゲーム進行に対して「プロセス対象」のデータだ、と言う事だ。そしてプログラムを書く、と言う事でまず重要、あるいは最初にしなければならないのは「データ設計」なんだ。環境データをどう作るのか、がプログラムを書く上で非常に重要で、また「プログラミングのやりやすさ」にモロ影響を与える。下手なデータ設計をすれば下手なプログラムになる、ってこった。
ぶっちゃけ、この辺、実は分かってない質問者が多い。「こんなプログラムを作りたい」とか言う思いがあっても、最初にやらなアカンのは「データ設計なんだ」ってのを大学とかで教わってない可能性が高いんだよ。
プログラミングが上手いヤツはデータ設計が上手い。そうじゃないヤツはそれなりに、なんだ。
要は「データ設計」さえ何とかなれば「プログラミング」の難易度は下がる、んだ。
また、環境データは「ゲーム進行にまつわる全データを詰め込んだモノ」って言った。言い換えるとこの部分を「ファイルに書き出せば」セーブが成立する。書き出した環境データを「読み込めば」ロードが成立する、って事だ。
さて、端折ったのはread、eval、printと言うのを全部Envのメソッドにしちまった辺りだ。本当ならJavaならそれぞれクラスにして・・・ってのが必要だろうけど、一つはそれぞれがこのゲームでは単純なのでわざわざクラスにする必要が無い事、クラスファイルをあまり増やしたくなかった事、そして敢えてREPLを強調する為に、ってぇんでこうした。
そしてJavaは不可思議な事に、フツーの言語に存在する「関数」がないんだ。何でもクラスで書かなアカンので、この辺面倒くさい事になる言語になっている。
Main.javaで次のような記述をしてる。
// Read-Eval-Print Loop(REPL)
env = env.read().eval().print();
言っちゃえばここがこのプログラムの実行本体、で、この書き方を成立させる為「だけ」にreadもevalもprintもEnvのメソッドにしてる。ここはインスタンス変数をreadで加工してそのままevalに渡し、そこでも加工してprintに手渡し、「それらの結果」をインスタンス変数envに再代入してる。
これを「メソッドチェーン」と呼ぶ、んだ。
繰り返すけど、メソッドチェーンを成立させるが為にreadもevalもprintもEnvのメソッドになっていて、それぞれは自分自身、つまりthisを返すように書いている。
readメソッドはユーザー入力を受け取り、Envのインスタンス変数guessにその値を代入する為だけ、にある(ちとこの辺の設計に文句がある人もいると思う・笑)。そしてreturn thisする。
printメソッドは基本的にインスタンス変数cmpを表示するためだけ、にある。そしてreturn thisする。
evalはゲーム進行を司るキモ、でここが「プログラム上の処理」では一番重要だ。ユーザー入力を代入したインスタンス変数guessと答えであるインスタンス変数secretNumberを比較して、適した文字列をmessagesから引っこ抜いてきてインスタンス変数cmpに代入する。結果cmpがそのターンの「結果」を保持することになるわけだ。
そしてやっぱり最後にreturn thisする。
繰り返すが、評価器(eval)がゲーム進行を司る部分になる。場合によってはまた別に「小さな部品」をクラスで作ってevalで呼び出す事もあるだろうけど、いずれにしても、これがRead-Eval-Print LoopのJavaによる「簡単な」説明になる。
で、大掛かりなプログラムになってもこの「構造」は基本的には変わらないんだよ。
と言うわけで、簡単なREPLの説明はここまで、としよう。
あとは専門的にインタプリタの作り方を書いてる本とか、あるいはWeb検索で調べてみて欲しい。
以上。
No.2
- 回答日時:
No.1です。
> コーディング本なら…、それがまた難しくて、
これは、目的が無いまま覚えるだけ、と言う事になるので、
難しく感じるだけです。
ここでは、基本的なコマンドと記述の仕方、
ぐらいを覚えればよいと思います。
> ゲーム開発の本自体…、初心者にはむずかしそうだな~と
先の本で基本的なコマンドと記述の仕方を覚えた後であれば、
ゲーム開発本では、目的を持った実践を学ぶ本なので、
覚えること自体に楽しさが加わるはずです。
ただ、先に書いた、ゲームの原作を作ると言う学びではないので、
それはまた別なお勉強になるかと思います。
No.1
- 回答日時:
ゲーム開発は、ゲームの筋書きを考える、それをプログラミングする、
と言う2段階になります。
これを一人で行う、筋書きを考えながらプログラミングする、
各々を専門化が行う、
等の制作方法があります。
ゲームの筋書きを考える、という入門書は無いと思います。
プログラミング(コーディング)するという入門書は、
プログラム言語ごとに専門書が本屋さんに並んでいるので、
お好みでどうぞ。
ご回答いただきありがとうございます。
コーディング本ならもうすでに買っていて、
それがまた難しくて、ゲーム開発をしながら学べる本というのを探していたんですね。
ですがゲーム開発の本自体コーディングの本であるということなので、
初心者にはむずかしそうだな~と思っています(-_-;)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
あなたの習慣について教えてください!!
あなたが習慣だと思って実践しているものを共有してくださいませんか? 筋肉トレーニングでも朝シャワーでも、あなたが習慣だなと思えば何でも構いません
-
プログラマーは誘惑にさらされる人生?
その他(プログラミング・Web制作)
-
食材の期限を管理するためにGASを利用しようとしたのですがうまく動作してくれません
JavaScript
-
Pythonのコードエラーについてです。
その他(プログラミング・Web制作)
-
-
4
プログラミングの課題がわからないので教えていただきたいです。特にサークル関数を定義した後に呼び出す方
C言語・C++・C#
-
5
Python、プログラミングについて質問です
C言語・C++・C#
-
6
二次元配列を使って順位をだすときに、同点の場合の順位をだす方法を教えて下さい。
JavaScript
-
7
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
8
インターフェースとトレイトってどっちが正義なんですか? インターフェースを利用するとそのクラスのよう
その他(プログラミング・Web制作)
-
9
近年誕生したプログラミング言語
その他(プログラミング・Web制作)
-
10
プログラミングを学ぼうと思います。 1ヶ月程度である程度習得できる言語は何ですか?ブラウザ上でアプリ
その他(プログラミング・Web制作)
-
11
今ってプログラミング言語は何が中心?
C言語・C++・C#
-
12
プログラムの実行時に'<'でリダイレクトする場合でも、キーボードからの入力を受け取られる件について
C言語・C++・C#
-
13
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
14
プログラミングの雑談がしたいのですがどこで出来ますか?
その他(プログラミング・Web制作)
-
15
エディターで以下のような色になるエディターは解りますか?
その他(プログラミング・Web制作)
-
16
ビデオのJSについて
JavaScript
-
17
Pythonでの文字列からfloatへの変換エラー
その他(プログラミング・Web制作)
-
18
パソコン
C言語・C++・C#
-
19
最新のプログラム言語を学ぶには何がいいですか?
その他(プログラミング・Web制作)
-
20
スカラーのベクトル微分
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ニンテンドーDSのソフト作成に...
-
ポトリスのようなゲームを作り...
-
エクセルVBAでRS232Cへ
-
C++における継続行
-
vbaとc言語の関連性について
-
VBSとWSHは読み方が違うだけで...
-
exeファイルを作ったり改造した...
-
プログラミングが趣味って暗い...
-
UWSCはどのプログラミング言語?
-
Iria→Irvineの後継って何でした...
-
C言語って古いですか?
-
プログラミングとプラモ作りて...
-
クオンツに必要なプログラミン...
-
「高スキルなプログラマーにな...
-
Excel VBAのシェアウエアは可能?
-
ネットショップ構築のためのマ...
-
VBSでDim、Private、Publicの違い
-
C/C++でマウスのクリックとホイ...
-
OpenCVで音声は扱えるか
-
html、css、JavaScript、PHP…違...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ニンテンドーDSのソフト作成に...
-
ゲームの開発言語(1980~2010年)
-
フリーゲームを解析したい
-
Javascriptでpk戦のゲームを...
-
ゲームプログラマーとシステム...
-
ゲームのソースコードを解析し...
-
シーケンス制御を用いたゲーム...
-
乱数について(Rnd関数)
-
ノベルゲームを作ろうとおもっ...
-
C、C++でもぐらたたき
-
C#でゲームのチートを作ること...
-
C言語で簡単なゲームを作る方法
-
プログラマーは誘惑にさらされ...
-
C言語でのsleep機能について
-
Now Loadingについて
-
VBAでゲームを作ってみたい
-
C#で音楽の2曲同時再生の仕方
-
VisualC++でアニメーションgif...
-
ゲームプログラミングは難しい...
-
FLASHでゲームを作っていた人は...
おすすめ情報