• ベストアンサー

クラスを使用したプログラミングの練習

クラスを使用したプログラミングは学校で習ったことがあるのですが、 机上での学習のみで実習はありませんでした。 クラスを使用したプログラムを勉強したいのですが、 どんなプログラムを作る練習をすればいいのでしょうか? ちなみに今パソコンで使用可能な言語でクラスの概念が用いられているのは RPGツクールVXに付いているRGSS2だけです。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.5

4番の回答者です。 >例えば、普通のプログラム言語では「入力した文字を表示するだけのプログラム」や「合計を求めるプログラム」などのような課題から学習していきますよね。 >それでは、クラスの概念を用いたプログラムはどんな課題から学習していくものなのかという素朴な疑問をしただけです。 >「クラスってこういうふうに使うものなのか」がわかればいい程度で、 >実際に実用的な何かを作りたいというわけではありません。 「実用的」ですか……自分としてはぜんぜん実用的じゃないと思ってたんですが……。 クラスの概念を用いたプログラムのエッセンスを体験できる課題を自分なりに考えたものなのですが、課題の意図を書かなかったのが問題かもしれないのですね。 以下に課題の意図を書いていきます。 1. クラスの定義、クラス≠インスタンス(オブジェクト)ということ、クラスで定義したメソッドの使い方 この課題ですが、ただ指定のメッセージを表示させるだけなら(Rubyの場合)  puts "モンスターは殴りかかってきた" で終わってしまう内容です。それをそうせずに、クラスを定義してそのクラスのインスタンスを作成し、インスタンスのメソッドを呼び出すということを行ってください、ということです。 これが出来ないと、そもそもクラスを使ったプログラミングもなにもあったものではありません。 2. カプセル化、コンストラクタの書き方 モンスターの名前を表す変数とMonsterクラスのインスタンスを別々に用意して処理を行っても指定のメッセージを表示させることは可能です。しかし、そのようなことをすると、モンスターのデータが名前とそれ以外とで分かれてしまいます。 一緒に取り扱うデータは一まとめにすべきで、そのための器としてクラスがあるのです。 その際、そのクラスが持っているデータはクラスの外側からは直接変更できないようにすべきです。 3. クラスの継承、コピペコードは最悪である 2.の課題の結果をコピペしてメッセージを書き換えるだけで課題が要求するメッセージ表示は可能です。 でも、コピペは今は楽でも後々苦労することになります。そりゃあもうコピペしたやつの首を絞めたくなるくらい(そしてそれが3ヶ月前の自分だったということもよくある)。 クラス継承という仕組みを使ってコピペを減らす努力をしてほしいというのがこの課題の意図です。 この課題は課題4.をこなす上での準備でもあります。 4. 抽象クラス、is-a とはいえ、むやみに継承するのは問題です。今回の課題の場合、通常攻撃を行うモンスターから炎を吐くモンスターに派生させていますが、これが問題です。継承を使う場合、is-a関係(「~は~である」という関係)を表現すべきです。「炎を吐くモンスターは通常攻撃を行うモンスターである」というのはおかしいですよね? この場合、「炎を吐くモンスターはモンスターである」「通常攻撃を行うモンスターはモンスターである」というのが正しい関係で、そのような関係を表現できるように継承関係を修正すべきです。 なお、is-a関係だけで継承を考えるのは問題があることが分かっています(正方形は長方形ですが、縦横を変更可能な長方形クラスを派生して正方形クラスを作り、縦の長さを変更したらどうなるかを考えてみてください)。厳密には「リスコフの置換原則」(参考URL)というものに沿っているかどうかで継承関係を考えてください。 5. 多態性 これをよく考えずにやったら、「スケルトンならば××、ドラゴンなら○○」という処理が表示部分に現れます。今回のプログラムなら1回だけですが、実際には1回だけで終わるわけがありません。また、音波攻撃をするモンスター、全体攻撃を仕掛けてくるモンスター、……等が追加されたとき、いちいち表示部分を書き換える必要が出てきます。 これを避け、条件分岐をインスタンス生成部分のみにすることが出来るようになるのがこの課題のミソです。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87
viajarse
質問者

お礼

皆様回答ありがとうございました。

その他の回答 (4)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.4

1~3番の回答者が言っているとおり、RGSS2はRPGツクールと密接に結びついているため、エラーが発生したときに作成したプログラムの問題かRGSS2の仕様上の問題か切り分ける必要があります。したがって、純粋にプログラムを学習する上ではちょっと問題があると思います。 あなたがRGSS2に慣れているのであれば、プログラミングの勉強はその基となったRubyで行ったほうがいいでしょう。 ただ、Rubyでは変数の型について厳格とはいえない部分がありますので、クラスの派生の部分を学習する上ではJavaなどで学習したほうがよいでしょう(課題を作っている最中に気づいた)。 とはいえ、あなたの質問はプログラミング言語は何を選べばいいのかではなくどのような学習をしたらいいのかですので、簡単な課題を出します。 1. モンスターをあらわすクラスMonsterを一から作成して、そのMonsterクラスにプレイヤーを攻撃するattackメソッドをとりあえず「モンスターは殴りかかってきた」と言うメッセージを返すように実装してください。次に、そのMonsterクラスを使って、プログラムを起動したら上記のメッセージを表示して終了すると言う処理を書いてください。 2. 1.で作ったMonsterクラスを、インスタンスを作成するときにモンスターの名前を指定するように変更し、メッセージを「(モンスターの名前)は殴りかかってきた」となるようにattackメソッドを修正してください。モンスターの名前は取得することはできても変更することができないようにします。次に、上記のメッセージ表示プログラムを(多分あるであろう)、Monsterクラスのnew部分のみを書き換えて、プログラムを起動したら「スケルトンは殴りかかってきた」を表示して終了するようにしてください。 3. 2.のMonsterクラスから派生させたBreathMonsterを作成し、そのattackメソッドを「(モンスターの名前)は炎を吹いた」と表示するようにオーバーライドしてください。オーバーライドする部分とコンストラクタ以外はBreathMonsterに書いてはいけません。次にメッセージ表示プログラムを、{Javaの場合、変数の型を変えずに}Monsterクラスをnewしている部分のみを書き換えて、プログラムを起動したら「ドラゴンは炎を吹いた」を表示して終了するようにしてください。 4. 3.の状態から、Monsterクラスから派生させたNormalMonsterを作成し、Monsterクラスのattackメソッドをnormal_attackメソッドに改名してprotectedメソッドにします。{Javaの場合、attackメソッドをabstractメソッドとして定義します。}次にNormalMonsterクラスのattackメソッドを、Monsterクラスのnormal_attackメソッドを呼び出すだけの処理で実装します。最後にメッセージ表示プログラムを、3.と同じ制約で書き換えて、2.と同じ表示を行うようにしてください。 5. 4.のプログラムを、「スケルトンは殴りかかってきた」というメッセージと「ドラゴンは炎を吹いた」というメッセージを半々の割合で表示するように書き換えてください。ただし、修正していいのはMonsterクラスの派生クラスをnewしている部分のみです。{Javaの場合さらに、変数の型はMonsterのままにしてください。} たぶんこれで基礎の基礎は実感できると思います。 ……しかし、「オブジェクト指向での教科書的な仕様」で「すべてがオブジェクト指向」だから「Javaを勉強することはオブジェクト指向を勉強することになる」ですか……。

viajarse
質問者

お礼

質問と回答がずれているのですが……。 例えば、普通のプログラム言語では「入力した文字を表示するだけのプログラム」や「合計を求めるプログラム」などのような課題から学習していきますよね。 それでは、クラスの概念を用いたプログラムはどんな課題から学習していくものなのかという素朴な疑問をしただけです。 「クラスってこういうふうに使うものなのか」がわかればいい程度で、 実際に実用的な何かを作りたいというわけではありません。

回答No.3

>RPGツクールVXの中にRGSS2という機能があるわけではありません。 と言うことはRPGツクール(ランタイム)なしでRGSS2単体のランタイムがあると言うことですか? >RGSS2は通常のプログラム言語と同等の機能を有しています。 RGSSはRubyをベースにしているみたいですね。 で http://ja.wikipedia.org/wiki/RGSS を見てみると >初心者にはエラーが起きても原因が分かりにくい。 ってあるけどまともなデバッガはあるのか? まともにプログラミングを勉強するならデバッガは重要。 それとJavaを奨めたのはJavaがオブジェクト指向での教科書的な仕様だから。 オブジェクト指向の事をクラスって言うあたり質問者の素人さの現れですけど そんな人が中途半端な物で勉強するよりしっかりとしたもので勉強した方がいいため。 >クラスを使用したプログラムを勉強したいのですが、 >どんなプログラムを作る練習をすればいいのでしょうか? Javaはすべてがオブジェクト指向だからJavaを勉強することはオブジェクト指向を勉強することになる。

回答No.2

>「どんな言語がいいか」ということではなく、 >「どんなプログラムを作る練習をすればいいか」ということをお願いします。 マイナーな言語では資料もするないしメジャーな資料が豊富な言語で勉強して それから好きな言語でやった方がいいよ。 それと >どんなプログラムを作る練習をすればいいか っていうけどRPGツクールVXではRPGツクールVXの制限内のことしかできないでしょ。 だったらまずはオブジェクト指向の勉強をしっかりやるべき。 そのためにオブジェクト指向の勉強も向いているJavaってわけ。

viajarse
質問者

お礼

>っていうけどRPGツクールVXではRPGツクールVXの制限内のことしかできないでしょ。 いや、結構普通のプログラム言語と同等のことができますが……。

viajarse
質問者

補足

RPGツクールVXの中にRGSS2という機能があるわけではありません。 RGSS2は通常のプログラム言語と同等の機能を有しています。

回答No.1

オブジェクト指向を勉強するならJavaが一番いいでしょう。

viajarse
質問者

お礼

「どんな言語がいいか」ということではなく、 「どんなプログラムを作る練習をすればいいか」ということをお願いします。

関連するQ&A

  • RPGツクールとMMO

    カテゴリー違いでしたらすいません。 最新のRPGツクールを購入しようと思うのですが知りたい事があります。 RGSSというスクリプト言語を使えるようですがこの言語でRPGツクールをMMOのようにする事は可能でしょうか?(何人かの人が対戦できるようにする事は可能でしょうか?)。 可能なら何を勉強するべきか教えて下さい。

  • RPGツクールXP・VXのゲームがRTPを組み込んでもプレイできない

    RPGツクールXPおよびRPGツクールVXを PLAYしたいのですが、 「RGSS2Playerは動作を停止しました」というエラーメッセージが出てきて 遊べません。 原因は何でしょうか? ちなみにXP・VXともランタイムはインストール済みで、プレイしたいゲームフォルダ内に入れています。 OSはVistaです。 何が原因だと思われますか? ちなみに2000・2003はPLAY可能です。

  • RPGツクールVXにて製作されたゲームが起動しません。

    RPGツクールVXにて製作されたゲームをプレイしようとしたところ、『RGSS200J.dllが見つかりませんでした』というエラーが出ます。 OSはVistaで、RTPもダウンロードしてあります。 もしよろしければどなたか教えていただけませんか? よろしくお願い致します。

  • プログラミングについて質問!目標実現のため多くの意見が必要です!すいませんが回答お願いします。

    (1)プログラミング学習の目的・・・ゲーム作成ができるようになるため。 目標・・・RPGツクール(RGSSスクリプト [rubyのこと])を自由に使いこなし、好きなようにRPGが作れるようになる。 一から2Dゲームなど(恋愛シミュレーション・2Dアクションなど)が作れるようになる。 (2)(1)から自分なりに考えて最低限習得したほうがいいと考えた言語 C/C++、ruby、C#、java (3)質問 1、(2)の言語でこれは覚えなくてもいいよとか他にこれは覚えたほうがいいという言語はありませんか? (できれは理由もあれば幸いです。) 2、質問者様の回答1からそれらの言語の効率的な順序を教えてください。 (例:もし質問者様が(2)にVBがあったほうがいいよと回答した場合それも含めてこの質問を回答。) ※大変申し訳ないのですが、プログラミングの基本はCだという意見が多いので一番最初に学習する言語はCに固定させてい ただきます。もしどうしてもCを最初にするのは絶対よくない!という意見がありましたらお願いします。 3、恋愛シミュレーション系(これしかこのタイプのゲームは思いつかないのですが。。。)のゲーム形式は、プログラムするとき、 文字の表示などの簡単なところは、スクリプトを使って実装するようですが、実際にはどんな言語を使っているのでしょうか? スクリプトということなら=rubyやjavascript,perlやphpなどの言語だと思っていいのでしょうか? もしそうなら(2)の候補でスクリプト言語はrubyしかないのですが大丈夫でしょうか? 4、その他なにかアドバイスがありましたら、お願いします。 ちなみに私は高1です。毎日なんとかPGのために時間を作ろうと考えています。 目標実現のためにがんばります! こんな長文に付き合っていただきありがとうございました。 参考にさせていただきます。

  • Java:クラスをたくさん使ったプログラミング?

    Java言語勉強中のものです。 Eclipseをつかっています。 初心者ですので、易しい言葉でご回答いただければ幸いです。 Javaの基礎についてひととおり勉強しました。 オブジェクト指向についても、だいたい・・なんとなくは理解できていると思います。 ただ、自分で作成するときに、 うまくオブジェクト指向を取り入れたプログラミングができません。 なんだかあっちこっちのものを呼び出してきてとてもややこしいです。 クラスがたくさんつかわれているプログラムは、 ほかの人がつくったプログラムをなんとかがんばって読む、というのが精一杯です。 自分ではとても思いつかない構造ばかりです。 あっちこっちからよんできているので、図やらリストやらを書いて 本当に「なんとか」理解できた、というレベルです。 クラスが5個以上になると正直もう嫌だってなります。。実用レベルにはまだまだ至っていません。 本当の意味でオブジェクト指向を理解できていないのかもしれません。 どうすればそういった、オブジェクト指向をとりいれたプログラムが書けるようになるのでしょうか? いろんなプログラムを見る、数をこなすことでしょうか? 何かおすすめの参考書や、 「こういう考え方をすれば・・・」というものがありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • RPGツクール2000について

    RPGツクール2000について 以前「教えて!goo」でRPGツクールはどれがいいかとお尋ねしたところ、 「RPGツクール2000」がいいかなぁ…と思ったので、それについてです。 RPGツクール2000では、プログラミング?(言語を使うやつ?)等はあるのか 「ひよこ侍」みたいな戦闘システムは、最初から入っているのか の2つです。  回答よろしくお願いしますm(__)m

  • RPGツクールVXを起動するとフリーズする。

    私のパソコンは富士通で、型名FMVWMD2S7でOSwindows8.1を現在使っているのですが、 RPGツクールVXのRGSS2 Player(ユニコーンみたいなアイコン)をダブルクリックして起動させると、 約5秒後に、矢印のポインタが輪っか(読み込み表示?)になり、ゲームの画面や音も一切表示されることなく、画面がフリーズして、一切動かなくなります。 ポインタもキーボードも何も動かないので、強制終了するしかありません。 他のツクールシリーズであるRPGツクールMVやドラゴンみたいなアイコンのRPGツクールVX Aceは普通に起動するのですが、RPGツクールVXのゲームは全て上記の現象が起こってしまいます。 ちなみに、10年以上前のNecのボロイxpのパソコンはvxも動くので、富士通の性能面は問題ないと思うのですが・・・ 原因がわかるようでしたら教えてください ※OKWAVEより補足:「富士通FMV」についての質問です。

  • RPGツクールVX Aceの素材使用について

    私はRPGツクールVX Aceのみ正規ユーザー登録をしてRPG製作をしているのですが、 VX規格で作られたオリジナル素材を、VX Aceのみを持ったユーザーが使用することはできますか? VXのRTP改変素材などはVX正規ユーザーしか使用不可というのは調べてみて分かったのですが、オリジナル素材に関してはいくら調べても分かりません…。 どなたかご存知の方がいましたら教えて下さると嬉しいです。

  • ゲームを作るためのスクリプト言語の勉強について。

    ゲームを作るために、プログラミングについて勉強を始めたいと思っている者です。 またDXライブラリやUnityなど比較的高難易度なツールを使っているわけではなく、RPGツクールやMMF2など初心者向けのツールを使っています。 RPGツクールやMMF2の初歩的な扱いには大分慣れてきたと思うので、変数を使ってより複雑なゲームを作りたいと考えているのですが、いまひとつ変数について理解できず、アルゴリズムもよくわかりません。 色々なサイトを調べたところ、いきなりC言語などのプログラミング言語から入るよりも、Rubyなどのスクリプト言語から勉強したほうがとっつきやすいし比較的簡単だという話だったので、スクリプト言語を勉強したいと思っているのですが、何かおすすめの言語とかはありますか? 今現在は、lua、Rubyのどちらにするかで悩んでいます。おすすめの参考書などありましたら教えてください。 またスクリプト言語の勉強はRPGツクールやMMF2といったツールの変数やアルゴリズムを理解するのに役立つのでしょうか? もし大して役に立たないということであれば、何か効果的な勉強法などありましたら教えていただけると嬉しいです。 ご回答、よろしくお願いします。

  • プログラミングが得意な方への質問です。

    プログラミング言語を複数使われている方へ質問です。 (1)一言語使えるようになるのに掛かった期間や経過など簡単にまとめて教えてもらえませんか? (2)言語マスターに時間が掛かっている人に対してどこが問題だと思いますか? (3)新しい言語の学習を始めるためには何から手をつけますか? (4)関数やクラスなどはどれ位使えば覚えられますか?  存在を知っていて使う時に調べればよい派ですか?  それとも初めに必要な部分は覚えてしまいますか? (5)言語マスターへの必要要素は、  概念の理解、文法の理解、必要性の高い関数やクラスの熟知  それ以外にありますでしょうか?

専門家に質問してみよう