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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

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

Q&A

解決済

2回答

518閲覧

PHPのオブジェクト指向について

ponponn12

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

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

0グッド

2クリップ

投稿2022/10/20 00:10

編集2022/10/20 00:12

このPHPのオブジェクト指向での解き方やヒントを教えて欲しいです。この問題をベースにオブジェクト指向の考え方を身に付けたいです。

複数の島をボートで巡って、お金を探し出し、ゴールへ辿り着きなさい。

プレイヤーはターンごとに1回または複数回サイコロを振ります(島によっては複数回必要な場合がある)。
プレイヤーのいる島ごとに、サイコロの目に応じてターンの行動が決まります。
スタート地点から出発し、ゴールを目指してください。

・全体の地図
群島はスタートとゴール、およびA島〜E島の5つの島からなります。

・ステータス保持
プレイヤーは、ターン数、所持ゴールド、および巡った島の記録を保持しています。

島ごとのサイコロの目と行動は、次のように決められています。

島 | 判定
・スタート地点
サイコロの出目が1ならA島へ、2ならB島へ、6ならC島へ、その他なら、動けない 。
・A島
サイコロの出目が3ならB島へ、4ならC島へ、その他なら100Gゲットしてスタートへ
・B島
サイコロの出目が奇数ならD島へ、偶数ならE島へ
・C島
サイコロを2回ふって、出目の和が奇数なら200GゲットしてD島へ、偶数なら100GゲットしてE島へ
・D島
サイコロの出目が4か5ならE島へ、それ以外は、スタートへ
・E島
サイコロの出目が6かつ所持Gが500G以上ならゴールへ、それ以外なら、100GゲットしてC島へ

問題1

サイコロの出目の配列を入力値で受け取り、配列を最後まで処理した段階での、プレイヤーのステータスを出力とするプログラムを作成してください。
入出力は、以下の4パターンをすべてパスするようにしてください。

・記録に使う島名は、以下のようにしてください

  • スタート地点:S
  • A島:A
  • B島:B
  • C島:C
  • D島:D
  • E島:E
  • ゴール:G

・ターン数は、サイコロを振った回数ではなく、ヒントの判定を行った回数です。
・スタート地点でサイコロを振り、移動しても移動しなくても1ターン。
・C島では2回サイコロを振り、その結果移動で1ターン。

実現したいこと

クラスの定義

島へ移動方法

ステータスの保持方法

試したこと

if文に配列を入れて条件分岐

島のクラスに数字を代入

ダイス、プレイヤー、島のクラスをつ作るif文に配列を入れて条件分岐

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

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

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

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

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

yambejp

2022/10/20 00:35

クラスにしたいのはどの部分でしょうか? UIはフォームからのget/postなのでしょうか? そうなるとデータの保持はsセッションなのでしょうか?
m.ts10806

2022/10/20 00:38

現状の問題点は何でしょう 「試したこと」も文章だけなので、どこまでできていて何ができていなくて何を解決したいのかさっぱりです。 「問題1」についてもどこから出てきたもので、どうしなければならないのか。 単に「オブジェクト指向を理解したい」だけにしては大がかりすぎる気もしますが。
ponponn12

2022/10/20 01:06

yambejp様 ご質問ありがとうございます。 クラスにしたい部分はサイコロとキャラクターと島と考えております。 クラス定義を作成した事がなく、どこをクラスとして定義すれば扱いやすいという所が把握できておりません。 データの保持はDBを使用せず、セッションでと考えております。 m.ts10806様 ご質問ありがとうございます。 サイトや動画でオブジェクト指向の考え方を調べながらやっているのですが、この問題を解くにはまず何からすればいいのかという所から解決出来ていない状態です。 クラスに関しては、daicクラスを作り、そこからどのように応用するのかが理解出来ていません。
m.ts10806

2022/10/20 01:11

質問本文追記してください。 それに「基本を理解する」べきであって、今から応用を考えようとしてもできないのは当然です。
AbeTakashi

2022/10/20 02:06

>この問題を解くにはまず何からすればいいのかという所から解決出来ていない状態です。 おそらくですが、題材が難しすぎると思います。もっとシンプルで簡単なところからやるか、オブジェクト指向以前の基礎を磨くべきではないかと思います。自分のペースに合わせて少しずつ進んでいくようにしないと無理かと。
miyabi_takatsuk

2022/10/20 03:05

> この問題をベースに 問題ということは学校の課題か何かでしょうか? もしそうならば、担当の先生とかに聞いたりしたほうがいいかもしれません。
guest

回答2

0

ベストアンサー

たとえばユーザーのステータス管理ならこんな感じ
※調整しました

PHP

1<?PHP 2class Player{ 3 private $turn=0; 4 private $gold=0; 5 private $log=[]; 6 function __construct($status=null){ 7 $this->set_turn($status["turn"]??0); 8 $this->set_gold($status["gold"]??0); 9 $this->set_log($status["log"]??[]); 10 } 11 private function get_turn(){ 12 return $this->turn; 13 } 14 private function get_gold(){ 15 return $this->gold; 16 } 17 private function get_log(){ 18 return $this->log; 19 } 20 public function get_status(){ 21 return ["turn"=>$this->get_turn(),"gold"=>$this->get_gold(),"log"=>$this->get_log()]; 22 } 23 private function set_turn($turn){ 24 $this->turn=$turn; 25 } 26 private function set_gold($gold){ 27 $this->gold=$gold; 28 } 29 private function set_log($log){ 30 $this->log=$log; 31 } 32 public function increment_turn(){ 33 $this->set_turn($this->get_turn()+1); 34 } 35 public function add_gold($gold){ 36 $this->set_gold($this->get_gold()+$gold); 37 } 38 public function append_log($island){ 39 $this->set_log(array_merge($this->log,[$island])); 40 } 41} 42$status=["turn"=>3,"gold"=>200,"log"=>['A','B']]; 43$player=new Player($status); 44$player->increment_turn(); 45$player->add_gold(100); 46$player->append_log('C'); 47$status=$player->get_status(); 48var_dump($status);

投稿2022/10/20 01:37

編集2022/10/20 01:52
yambejp

総合スコア114843

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

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

ponponn12

2022/10/22 01:45

とてもわかりやすくコードを書いてくださりありがとうございます。 yambejp様のおかげで、クラスをどのように書くのかをイメージする事ができました。 回答が遅れてしまい申し訳ありません。 自分なりに大まかな流れを考えてみたのですが、 1、島クラスをインスタンス化する際に移動条件をセット。 2、プレーヤーのクラスインスタンスを生成。 3、サイコロデータがなくなるまでループ。 4、プレイヤーの現在いる島にサイコロデータとプレイヤーを渡して実行。 5、実行結果はプレイヤーを返す。←ここまでループ 6、ゴールでループが終了したら、プレイヤーのステータスを表示する という認識でもできそうでしょうか? 島クラスを自分なりに考えてみたのですが、 ・サイコロの消費数(C島2、他1) ・移動に必要な値 ・獲得できるゴールド ・移動先 で作成して、これをisland配列におさめて $player=$island[$player->getPlace()]- >exec($dice,$player); という感じでステータスの更新ができればと考えています。 島クラスはこれでいいのか、どのようにスタートを書き始めるのか、次の島に行くための条件式で詰んでいます。説明がうまくできなくて申し訳ありません。
guest

0

実際のコードがないため、
考え方やヒントの回答となることをご了承ください。

プログラミングで例えを出すのはあまりよろしくないのですが、
クラスとインスタンスの理解には、設計図実物に例えるのが一番わかりやすいと思います。

例えば、車で言うなら、
車の仕様書や、設計図がクラスにあたり、車自体はインスタンスとなります。
設計図は変わらないため、基本は一緒ですが、
実物は、ナンバープレートによる車の名前が違ったり、製造工場が違ったりと、
個々の実物のステータスが異なります。

上記を踏まえて、

・全体の地図
群島はスタートとゴール、およびA島〜E島の5つの島からなります。

こちらからクラスとインスタンスを考えていきましょう。

まず、基本の島クラスがあります。
A島~E島がインスタンスとなります。
これは基本の"島"であるのは変わらないが、
それぞれ、名前やルート、島自体の座標が違うので、
違いを出したい段の部分をインスタンスとして扱うわけです。

また、全体の地図クラスと、インスタンスも必要になるでしょう。
(もしかしたら一個かもしれないが、汎用的にステージ別で地図の内容を変えれるようにしておいたほうがよい)
また、ルートの各ポイントのクラスとインスタンスも必要になりそうな気がします。
(各ポイントの座標やステータスなど)

という考え方の元、プレーヤーなども組んでいくとよいかと。
以上、ご参考になれば幸いです。

投稿2022/10/20 03:19

miyabi_takatsuk

総合スコア9528

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問