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

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

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

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

Q&A

解決済

3回答

935閲覧

【PHP】キャラ固有のスキルなど、中身の処理が異なるデータについて

mijinko889

総合スコア33

PHP

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

1グッド

0クリップ

投稿2019/01/08 11:53

編集2019/01/08 13:20

見ていただきありがとうございます。

現在ブラウザゲームを作成しながらjsやPHPの勉強をしております。
ざっくりとした悩みではあるのですが、題の通り『キャラの固有スキル』の実装の形について質問させてください

やりたいこと

PHP側でスキルのリストを作り、プレイヤーがアクションをするたびそこから操作キャラに合ったスキル処理を呼び出すといったことをしたいと考えています。(計算処理などもPHP側で行います)

発生している問題

今のところclassを使って個別に処理内容や名前などを実装しようと考えているのですが、classをたくさん作るというのも無駄が多いような気がして悩んでおります。実装するならこうかなと思っているコードも一応あるのです。

PHP

1//スキルclassリスト 2 3 class SkillSample{//スキルの親クラス 4 public $skllname; 5 public function __construct($name){ 6 $this->skillname=$name; 7 } 8 9 public function action(){} 10} 11 12class Skill_1 extends SkillSample{ 13 public function action(){ 14 //固有の処理1 15 } 16} 17 18class Skill_2 extends SkillSample{ 19 public function action(){ 20 //固有の処理2 21 } 22} 23 24//..以下たくさん 25 26$skills = array( 27 "Skill_1"=>new Skill_1("スキル1"), 28 "Skill_2"=>new Skill_2("スキル2"), 29 //...以下classの数だけ増加? 30);

PHP

1//呼び出し側 2require_once("./SkillList.php"); 3 4$PlayerSt = array( 5 "name"=>"プレイヤー1", 6 "charaId"=>1, 7 "skillName"=>"Skill_1" 8 //...などのステータスをcsvファイルから格納 9); 10 11//スキル探索 12 $playskill = $skills[$PlayerSt["skillName"]; 13//スキル処理 14 $playskill->action();

処理の中身だけ違うのにたくさん生成するのはどうだろうかというのが今の考えです。いいclassの利用方法や他の実装方法の例などあれば教えていただきたいですよろしくお願いします。

追記

詳しい仕様について補足させていただきます。
現状の仕様として、
「キャラは一人一つ以上固有スキルを持つ」(共通スキルといったものは特に考えていませんでしたが、処理内容が同じものはこれに相当すると思います)
「キャラのマスタデータ(基礎ステータスやプロフィール部分)はcsvファイルに記述している」
「csvファイルからスキルIDを取得しclassの探索」
といった具合です。

少し考えた策

この質問を投げた後もスキルの内容や仕様を整理してみました。
ダメージ数なども結局はキャラステータス依存なので、倍率ダメージ、回復、連続攻撃など似通ったスキルのクラスは親クラスとして、スキルIDを基にスキルの形式からクラスを選んでインスタンス化して直後に処理を呼び出そうという案が浮かびました。
トレイトや戦闘で使うキャラステータスのclass生成についても検討中です(;'∀')

miyabi_pudding👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

抽象クラスで実装するメソッドと引数を強制する

Classをクラス名のファイルに分けて名前空間でフォルダ分けして
spl_autoload_registerで必要になったものだけ適宜呼び出せるようにする

php

1$skills = array( 2 "Skill_1"=>new Skill_1("スキル1"), 3 "Skill_2"=>new Skill_2("スキル2"), 4 //...以下classの数だけ増加? 5);

オートロードにするならこれは必要なし、
かつプレイヤークラスのインスタンスを
コンストラクタで引数にとるようにしておくと
多分色々拡張性が良くなるかと愚考

php

1$player=new Player($PlayerSt); 2$skillClassName=$PlayerSt->skill; 3$skillObj=new $skillClassName($player);

投稿2019/01/09 05:37

KazuhiroHatano

総合スコア7804

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

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

mijinko889

2019/01/09 06:20

ありがとうございます!クラスごとにファイルを作成となるとなかなかに根気が要りそうですね(;'∀') ただそちらの方が通信時の容量的にも優しそうです(__autoloadなるものを初めて知りました) クラス管理についても試してみます!
guest

0

抽象クラスを頑張っても無理が生じるなら、
PHP: トレイト - Manual
が便利なんじゃないかって、どこかで聞いた話です。

投稿2019/01/08 12:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mijinko889

2019/01/08 12:15

ありがとうございます!確かに基本的な動きは似ているのでトレイトで形だけ作って組み合わせるというのは管理が楽そうですね!サンプル作って試してみます!
guest

0

設計をもう少しきちんとかためてからの方がいいかもしれません。
Skillについては大体「キャラが身につけている特殊技能」のことだと思うので、
キャラクタークラスの要素の1つとしてもいいように思いますし、
キャラクタークラスのプロパティとしないまでもSkillを持たないキャラクタもいることも加味すると
場合によりでそのキャラクタにinterfaceとしてつけても良いように思いますし。
「固有スキル」があるということは「共通スキル」もあるということですよね?
要は「そのクラスがどのように使われるか」ですね。
仕様を整理するために関連図を作ってみると良いかもしれません。

その辺りはオブジェクト指向のis-aとhas-aの関係を加味すると良いかもしれません。

投稿2019/01/08 12:51

m.ts10806

総合スコア80852

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

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

mijinko889

2019/01/08 13:12

ありがとうございます!キャラクターのステータスの一部とするのも良いですね!単語選びで勘違いさせてしまったようですいません。補足ですと、「キャラは少なくとも1つ以上スキルを持つ(これを固有スキルとよんでしまいました)」「キャラのマスタデータ(基礎ステータスやプロフィール)はcsvファイルに記述している」といった状態です。スキルIDなどだけ持たせてそれを基に探索と処理呼び出しまでをしたいと思っています。後ほどより詳しい仕様を本文に追記させていただきます(+o+)
m.ts10806

2019/01/08 19:05

語句が正しく使えていないとそれは仕様のブレにつながります。 自身しか関わらないものであってもなるべく誰が見ても共通の認識が持てるような表現を心がけてください。 ※ちなみに本質問内容はどこを落としどころにするかが不明瞭です。仕様をここで確定させる目的で使うのであればそれは「質問」ではなくなるのでご注意ください
mijinko889

2019/01/09 06:22

全部を全部伝えるのは難しいですね…。自分の中でも仕組みを整理しておこうと思います。 実装方法として良いものや適切なものを募ろうという気持ちだったので確かに質問とは違うかもしれません、ご指摘ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問