メモ

メモを入力してみよう!


Lesson01「オブジェクト指向ってなに?」

学習概要

オブジェクト指向を理解するためにまず普通に「ドラ◯エ」のゲームを作ってみましょう!

補足

今回の機能を実装したソースはコチラ→http://webukatu.com/sample/objective_lesson01.zip

この練習でわからない所を質問する※部活外の質問はできません

ログインが必要です

この練習への質問一覧

ログインが必要です

Lesson01「オブジェクト指向ってなに?」の内容※SEO用のため読めません

今回からこの部ではPHPを使った「オブジェクト指向」について学んでいきます。

オブジェクト指向というのは、javascript部の方でもちょろっとやりましたけど、プログラムという「仮想の世界」ですね。
その世界で、実際プログラムを組んでいくのですけども、プログラムを組んでいく際に、現実世界、私たちの世界ですね、私たちの世界というのは「オブジェクト」という「実体」に基づいて全て構成されています。

なので、その現実世界のオブジェクトに照らし合わせてプログラムを書いていく、といった「考え方」のことを言います。

その「設計手法」に基づいてプログラムを書いていくことで、保守性の高いアプリケーションを作ることが出来ます。

オブジェクト指向というのはなかなか初心者の方には分かりにくいのですけれども、この部ではオブジェクト指向を一番理解しやすいように、PHPを使ってゲームを作っていきたいと思います。

今回からはこのようなゲームを作っていきたいと思います。

画面にモンスターが現れて、そのモンスターのHPがあります。

そして、自分のHPがあって、ゲームリスタートを押すと新しいゲームがスタートします。
その履歴というのは右に表示されています。

「逃げる」を押せば新しいモンスターがまた現れるような形になります。

そして、「攻撃」を押すとモンスターに攻撃することができます。

反対に、モンスターからも攻撃を受けます。

そしてどんどん、お互いのHPが減っていくような形です。

モンスターを倒すと、どんどん新しいモンスターがやってきます。

そして、倒したモンスターの数がココに出てきます。


自分のHPが0になると「またゲームスタートしますか?」という形で、この画面が現れます。
一番最初の画面も、この画面です。

こういった簡単なゲームを使って、これからオブジェクト指向を理解していきたいと思います。


これがですね、さっきのゲームのソースコードになります。

ソースは単純で、1個の「index.php」で出来上がっています。

またですね、中にログを出したいので「php.log」も書かれています。

あとは「img」ですね。
各モンスターの画像をimgディレクトリーの中に8体、入れてあげています。

Webサービス部でもやったのと同じように、実際のソースコードを、コメントの補足欄ですね、URLを貼り付けておくので、そこからダウンロードしてきて、MAMPのhtdocsの中ですね、そこへ解凍して実際に動かせるようにしてください。

今見ているアプリケーションはこちらになります。
「framework_lesson01_1」というところですね。このディレクトリーの中に、index.phpとimgディレクトリーが入っています。



では実際にソースコードを見ていきたいと思います。

まずは上の部分、ログを出しています。お決まりのやつですね。

そしてSESSIONとかを使っているので「session_start()」をしています。
で、自分のHPですね。500からスタートしたいので、定数として「MY_HP」を用意しています。
下でモンスターを作っているんですけども、その配列として格納するための「$monsters」という配列を作ってあげています。

そして、「key value」の形でモンスターを実際に作っています。配列として。

「name」と「hp」あとはモンスターを表示する画像のパスですね、そして攻撃力です。

攻撃力はランダムでやりたいので、mt_randという関数を使って、乱数を作っています。

第1引数、第2引数でそれぞれ最小と最大の値を指定します。
その中で、整数として1つの値が入ってきます。小数点は入らない、ということですね。

これを8体作ってあげています。少々面倒くさいです。

そして、createMonster()という関数を作ってあげて、さっきの$monstersですね、globalで指定して使えるようにしてあげています。

そして、この$monstersをキーを配列の形式なのでキーを指定してあげれば、それぞれのモンスターのどれかのモンスターの配列を取り出せます。

なのでmt_randを使って、0か6ですね、6じゃない、7ですね。
0から7までで8個になります。その内のどれか1つのキーを取ってきて、その配列をこの$viewMonsterの中に入れている、という形です。

どれか1つのこれが入る、ということですね。

そしてこのcreateMonster()というのは、init()という次の「初期化用の関数」ですね。
ゲームをスタートする時の関数です。

その時にcreateMonster()を呼んでいるんですけれど、それまでに今まで使ったSESSIONの中にnameとかhpとか入っているので、それらを全部unsetで削除してあげます。

そして、新しくSESSIONの中に1個選んだモンスターの名前、hp、imgですね、そして攻撃力、で、historyという形で、historyはここ(ゲーム画面右側)に表示する文字です。
そこの中に、「モンスターが現れた!」という履歴を出してあげます。
これがcreateMonster()という関数ですね。

で、init()という関数です。これは初期化用の関数になります。
まずはhistoryの中に「初期化します!」というものを入れてあげます。

そして、knockDownCountですね、これ0を設定します。
これは「倒したモンスターの数」ですね。

そして、myhpとして自分のhpを最初500のもの(定数:MY_HP)を入れてあげます。
そして、createMonste()を呼んであげます。そうすることで、モンスターが1個、SESSIONの中に入ります。

この時、gameOver()関数というものがあります。
これは自分のhpが0になった時に呼ぶものです。

ゲームオーバーになったらこれを呼んであげて、SESSIONを全てarray()という形で初期化し空にしてあげます。


画面に表示するhtmlの方をちょっと見ていきましょう。

htmlは一般的な感じです。
styleの方はこの中(headタグ内)に書いちゃっています。styleの説明は省いちゃっています。

htmlの実際のPHPの部分なのですけれども、SESSIONがあるか無いかを、まず判定しています。

session_start()をすれば、SESSIONの中になにかしら入ってきます。
もし入っていなければ、一番最初に初期画面を表示してあげます。

さっきのゲームをスタートしますか?(GAME START?)というものですね。

そして、formタグを入れてあげて、(method属性を)postしてあげます。

input(のtype属性は)submitで、nameをstartというものにして、「ゲームスタート」というボタンを(value属性で)作ってあげています。

これを押すと、postという中で、startというキーを使って、valueを取り出すことが出来ます。
もしSESSIONの中になにかしら入っていれば、ゲームがスタートしているということなので、こっちを実際に表示してあげます。

これはモンスターの名前を表示するところですね。
そして、モンスターの画像を表示するところです。それぞれSESSIONの中に入っているので、それをキーを指定して表示してあげます。

あとはモンスターのHP、倒したモンスターの数、勇者の残りのHPですね。

そして、それぞれformタグでボタンを作ってあげます。

攻撃するボタンですね、nameをattackにしてあげます。
逃げるボタンはescape、ゲームリスタートはstartにしてあげます。

それぞれこのキーでvalueが送信されるような形ですね。

で、サイドバー、右側ですね。こっちの方にはSESSION[‘history’]の中身を表示させます。

そしてpostされた時の処理はこちらですね。ここからhtmlの上のところまでです。

なにをやっているのかというと、postされた場合、それぞれですね、POSTのattackなのかstartなのか、これを取り出しています。

そして中に値があればtrueを入れてあげて、無ければfalseを入れてあげます。
$attackFlg、$startFlgというものをそれぞれ用意してあげて、それをfalseで中に入れてあげるという形ですね。

で、error_logを書いてあげています。
startボタンを押した場合にはPOSTにstartというものが入っているはずです。右側startの方ですね。
その中にvalueが入っているはずなので、trueになっているはずです。

なので、histroyとして「ゲームスタート」というものを中に入れてあげます。

そして、init()関数を呼んであげます。

init()というのは初期化用の関数といった意味合いで名前を付けてあげています。
これは「習わし」ですね。

init()関数の中では「初期化します」というものと、「倒したモンスターの数」を初期化してあげて、自分のHP(MY_HP)を500にしてあげて、モンスターをSESSIONの中に入れてあげるという形ですね。

そして、そうじゃなくてですね、$attackFlgがtrueの場合、攻撃するボタンを押した場合ですね、その場合には「攻撃した」というものを出してあげて、まず、ランダムでモンスターに攻撃を与えます。
mt_randで勇者の攻撃力を50から100の間で入れてあげます。

それをSESSIONの中に入っているモンスターのhpをここから引いてあげます。

ちょっとここ間違っていますね。(100行目:mt_rand(50,100)ではなく)$attackPointを引いてあげるという形です。
そうしないと、それぞれで乱数を作ってしまうので、与えるポイントと表示するポイントが違ってきちゃいますね。そういう形です。

こう書かないで、省略的な書き方として(デクリメント:-=を使用し)、こういう書き方もできます。
そして、与えたポイントを表示してあげて、今度はモンスターから攻撃を受けます。

モンスターの攻撃力はSESSIONの中に入っているので、自分のHPをその分引いてあげます。これも省略的な書き方ですね。

そして、何ポイントのダメージを受けたのか、というのをhistoryの中に入れてあげて表示してあげます。

そして、もし自分のHPが0以下になった場合ですね、gameOver()の関数を呼んであげます。
gameOver()関数の中ではSESSIONをクリア(=array())してあげます。SESSIONをクリアした場合には、こっちの方ですね、SESSIONの中に何も入っていないので、「GAME START?」という画面の方を出せるような形になります。

MY_HPがまだ残っている場合には、今度はモンスターのhpですね、判定します。

モンスターのhpが0以下の場合に、新しいモンスターを出現させてあげます。

historyの中に、倒したモンスターの名前を入れてあげます。そして、createMonster()を呼んであげることで、SESSIONに新しくモンスターが入ってきます。

そして、knockDownCountですね。こういう「+1」をしてあげます。

反対に「逃げる」ボタンを押した場合ですね、その場合にはhistoryの中に「逃げた!」と入れてあげて、また新しくモンスターを作ってあげるというような形です。


最後はPOSTされていたものを、きちんと(array=();とし)空にしてあげます。

このような仕組みでですね、このゲームというのは出来上がっています。
実際のゲームというのも、こんな感じで動いているんですね。

あとはjavaScriptで動きなんかを付けてあげれば、実際のゲームっぽくなってきます。

モンスターをちょっと飛び出してあげたりとか、切られた時は切られたアニメーションを付けてあげるとかですね。
あとは効果音なんかを入れることもできます。