質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

797閲覧

オブジェクト指向の勉強の仕方について

tetatetu

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2021/04/01 14:29

編集2021/04/01 14:41

私はプログラミングを独学で勉強しており、素人ながら日常生活や仕事で使うための簡単なプログラムを書いています。近頃、もっと綺麗で制御しやすいコードを書けるようになりたい、と思うようになり、オブジェクト指向プログラミング(OOP)に興味を持ちました。手探りながら、classやオブジェクトを作って制御することを意識しながらプログラミングしています。

しかし、手探りの上、周りにプログミングをやる人が全くおらず、OOPにおける一般的な作法が分からなかったり、自分のやっている実装のどこが悪く、どこから直せばよいか、などが分からず、困っています。

そこで、先ほど、JavaScriptでRPGゲームのプログラムを作ることを想定して、ゲームに出てくるclassやオブジェクトのひな型のようなものを書いてみました。
完全に即席な上、省略ばかりでほんの導入部分を書いただけですが、クラスの設計や実装の考え方について、コメントをいただけないでしょうか?

コードは以下になります。
ご回答よろしくお願い致します。

javascript

1//map_listゲームのマップデータが入ったオブジェクト 2const map_list = { 3 //key:場所の名前,value:マップの座標 4 //0:何もない空間,1:壁、2:出口,3:人間 5 "村の自宅": [ 6 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 7 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 8 [1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 9 [1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1], 10 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 11 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 12 ], 13 "自宅の外の村全体": [ 14 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 15 [1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], 16 [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], 17 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2], 18 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], 19 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 20 ], 21 "魔王の城": [ 22 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 23 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 24 [1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1], 25 [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1], 26 [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 27 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 28 ] 29 //以下同様 30} 31 32class Game { 33 constructor() { 34 /* Gameクラスの各プロパティ */ 35 //現在のゲームモード: 0:フィールドモード、1:バトルモード、2:ミニゲームモード 36 this.mode = 0; 37 38 //フィールドモードオブジェクト 39 this.fieldMode = { 40 41 //プレイヤーがいる場所を格納する変数(初期値は村の自宅) 42 this.place = "村の自宅", 43 //プレイヤーがどこにいるかを示す座標(初期値は村の自宅の左片隅の(1,1)座標) 44 this.site = map_list["村の自宅"][1][1], 45 46 //プレイヤーの持ち物(初期値は木の枝1コと美味しいアメ3コ) 47 this.belongings = new Map([ 48 ["木の枝": 1], 49 ["美味しいアメ": 3] 50 ]), 51 52 setup(_saveData) { 53 //セーブデータをもとにゲームをセットアップ 54 this.place = _saveData.fieldMode.place; //場所情報をロード 55 this.site = _saveData.fieldMode.site; //位置情報をロード 56 this.belongings = _saveData.fieldMode.belongings; //持ち物をロード 57 //以下同様 58 }, 59 60 start(){ 61 //マップの画像や操作画面を作成する処理 62 } 63 64 } 65 66 67 this.battleMode = { 68 //バトルモードでのゲームのオブジェクトを記述 69 setup(_saveData) { 70 //セーブデータをもとにゲームをセットアップ 71 }, 72 start(){ 73 //操作画面を作成する処理 74 } 75 76 }; 77 this.miniGameMode = { 78 //ミニゲームでのゲームのオブジェクトを記述 79 setup(_saveData) { 80 //セーブデータをもとにゲームをセットアップ 81 }, 82 start(){ 83 //マップの画像や操作画面を作成する処理 84 } 85 86 }; 87 } 88 89 start() { 90 const saveData = this.load();//セーブデータを読み込む 91 92 if (saveData) { 93 this.fieldMode.setup(saveData); 94 this.battleMode.setup(saveData); 95 this.miniGameMode.setup(saveData); 96 console.log(`おかえりなさい!`); 97 98 //ゲーム開始時はフィールドモードからスタート 99 this.filedMode.start(); 100 101 } else { 102 console.log(`はじめまして!ゲームの世界にようこそ!`); 103 104 //ゲーム開始時はフィールドモードからスタート 105 this.filedMode.start(); 106 } 107 108 } 109 110 //セーブデータを作り、JSONファイルとして出力 111 save() { 112 //セーブの処理 113 } 114 115 //ブラウザ上のHTML要素にドラッグ&ドロップされたセーブデータのJSONファイルを読み込み、パースして返す関数 116 load(){ 117 let saveData;//セーブデータをパースする変数 118 //なんらかの処理 119 120 return saveData; 121 } 122 123 124} 125 126 127 128 129//make instant 130const myGame = new Game(); 131//game start 132myGame.start();
WeilSpinor👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/04/01 14:35

JavaとJavaScriptは別物です<タグ
m.ts10806

2021/04/01 14:37

あと、「オブジェクト指向の概念」とするか「組んでみたコードの問題点」とするか、どちらかに絞った方が良いかと。
takasima20

2021/04/01 21:11

Software Design 3月号でそれ系の特集を読んだのですが、オブジェクト指向も時代の流れにより当初の使い方とはまた違った形が推奨されるようになってきているようです。とりあえず、「継承」はなるべく使うな!ってかんじ?
Zuishin

2021/04/02 06:48 編集

継承は使うべき時には使うべきです。 使うべきではない時に使うと「ここは継承よりも委譲を使いましょう」とか「インターフェースでいいんじゃ」などと言われます。
tetatetu

2021/04/06 08:18

ご回答ありがとうございます。参考にさせて頂きます。
m.ts10806

2021/04/06 08:22

こちらは回答ではなく質問への追記修正依頼のコメント欄です
guest

回答3

0

クラス Game は設計図なのだから、まず複数同時に独立して動くかどうか考えてみては?
多分提示のものだと表示のための出力先がダブってしまうだろうし、入力側も同じ。
極端なことを言えば、地図さえ交換できてもいいはずだ。
そして例題としては壮大すぎなのでは?

js

1const 2 game0 = new Game (), 3 game1 = new Game (output, input, option, map_lists); 4 5game0.start (); 6game1.start ();

--
過去に書いたものが何個かあります

p5.jsでふわふわした円をつくりたい。
https://teratail.com/questions/304747#reply-429337

マウスの動く方向に合わせて向きを変えてついてくる犬のマウスストーカーを作りたい!
https://teratail.com/questions/313793#reply-438084

--
例題:画面上に複数ストップウオッチを作る
(この程度なら付き合ってあげてもいいよ。)

投稿2021/04/01 21:47

編集2021/04/01 21:52
babu_babu_baboo

総合スコア616

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetatetu

2021/04/02 06:42

ご回答ありがとうございます。具体例を挙げていただきありがとうございます。参考にさせて頂きます。
guest

0

Unity がいいと思うんですが、
自分で考えたいということであれば、
Player
Party
Npc
Item
Shop
Map
Enemy
Battle
Script
Event
などのモノを考えて、それぞれがどのようなプロパティを持つべきかを
検討してみてはどうでしょうか。その次に、それをどのようにコントロール
するクラスがあるべきか、と。

投稿2021/04/01 14:51

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetatetu

2021/04/02 06:39

ご回答ありがとうございます。「ゲームを作るならUnity」というのは良く聞きますね。 普段はゲームを作ることはないのですが、ゲームプログラムの制作はオブジェクト指向の勉強に向いている気がしたので、少しゲームまがいのプログラムを作ってみようと思い立ちました。 挙げていただいたクラスの例を参考に、作ってみたいと思います。
guest

0

ベストアンサー

オブジェクト指向はまぁ難しいですが、実践あるのみという感じはあります。
またJavaScriptはプロタイプベースの言語であるため、オブジェクト指向の勉強には向かないと個人的には
考えています。
何で実践するのかという事ですが、
昔ならJavaですが、今ならUnity(C#)でゲームを作りつつ、オブジェクト指向を学ぶというのがおすすめかなと思っています。
ゲームなら楽しみながら作れますし。

投稿2021/04/01 14:40

mingos

総合スコア4207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetatetu

2021/04/02 06:34

ご回答ありがとうございます。 Javaですか。確かに「オブジェクト指向」で検索すると、なぜかJavaの情報ばかり出てきますね。「OOPの共通言語としてJavaが現状支配的である」ということでしょうか。今のところ特にJavaを使う予定はないので、出来れば普段使いそうなJavaScriptやC++で学習できれば、と思うところですが、リソースが少ないならJavaを覚えておくのも手なのかもしれません。 ゲームを作るのはよさそうですね。どちらかというとUnityの方が興味があるので、余裕があるときに触ってみたいと思います。
mingos

2021/04/02 07:17

そうですね。 歴史的な背景でオブジェクト指向の本や情報はJavaでの実装例が多いです。 ちょうどオブジェクト指向が注目され出した時に、C++やJavaが主流だったという事もあるかと思います。 有名なデザインパターンという手法もJavaでの実装例が最初だったので。 でも普段Javaを触らないのであれば、必要ないかなと思います。 言語はお好きなものを使うとして、オブジェクト指向の勉強の題材としては他の方もおっしゃっているようにゲームが良さそうです。 ほどよい複雑さというか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問