プログラミング

ダメージ固定技編(ちきゅうなげ・カウンター) PHPポケモン 41

PHP PHPポケモン ポケモン
ダメージ固定技編(ちきゅうなげ・カウンター) PHPポケモン 41

ダメージ固定技とは

PHPポケモンでも作成したダメージ計算機能ですが、ポケモンの技の中にはそれを必要としない技がいくつかあります。それが「固定ダメージ技」です。

ポケモンwiki(ダメージ固定技)

ステータスに依存せず、わざ自体にダメージ量が決まっているわざ。

一口にダメージ固定技と言っても効果が大きく分かれており、対戦面などでも基本的に別物として考えられる。

  • 純粋にわざに定められたダメージを与えるもの
    ソニックブーム、ちきゅうなげなど
  • 相手の現在HPから一定割合を削るもの
    いかりのまえばなど
  • 相手から受けたダメージによって変化するもの(カウンター技)
    カウンターなど
  • 当たる確率は低いが相手のHPを全て削るもの
    一撃必殺技

 

 以前作成した「一撃必殺技」もダメージ固定技に分類されています。

今回作成するのは、自分のレベル分のダメージを与えることができる「ちきゅうなげ」と、自分のレベルに応じた乱数ダメージを与える「サイコウェーブ」このターン受けたダメージ量によって与えるダメージが変化する「カウンター」の3つを作成しましょう。

 

ちきゅうなげ

まずは「ちきゅうなげ」という技を作成します。固定ダメージ技には威力が不要のため、威力値にはnullをセットしておき、代わりに与えるダメージを返却するためのメソッド(getFixedDamage)と、ダメージ固定技を判別するためのプロパティ(fixed_damage_flg)を新しく用意しましょう。

 

ちきゅうなげ(/Classes/Move/SeismicToss.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// ちきゅうなげ
class SeismicToss extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'ちきゅうなげ';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '自分のレベル分の固定ダメージを与える';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Fighting';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 20;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * ダメージ固定技フラグ
    * @var boolean
    */
    protected $fixed_damage_flg = true;
 
    /**
    * 固定ダメージ量の取得
    *
    * @param Pokemon $atk 攻撃ポケモン
    * @param Pokemon $def 防御ポケモン
    * @return integer
    */
    public function getFixedDamage($atk, $def)
    {
        // 攻撃ポケモンのレベル分ダメージを与える
        return $atk->getLevel();
    }
 
}

 

次に、親クラスにダメージ固定技フラグの取得用メソッド(getFixedDamageFlg)と、ダメージ固定技フラグのプロパティ(fixed_damage_flg)に初期値のfalseをセットしておきましょう。

 

技クラス(/Classes/Move.php
<?php
$root_path = __DIR__.'/..';
require_once($root_path.'/App/Traits/InstanceTrait.php');
require_once($root_path.'/App/Traits/ResponseTrait.php');
 
// 技
abstract class Move
{
 
--省略
 
    /**
    * 固定ダメージ技フラグの取得
    *
    * @return boolean
    */
    public function getFixedDamageFlg()
    {
        return $this->fixed_damage_flg;
    }

 

これで固定ダメージ技の準備が整いました。

次にダメージ計算処理の修正です。攻撃トレイトのattackSuccessメソッド内に分岐を追加、修正しましょう。

 

攻撃トレイト(/App/Traits/Service/Battle/ServiceBattleTrait.php
/**
* 攻撃判定成功時の処理
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
private function attackSuccess($atk_pokemon, $def_pokemon, $move)
{
    if($move->getFixedDamageFlg()){
        /**
        * 固定ダメージ技
        */
        $damage = $move->getFixedDamage($atk_pokemon, $def_pokemon);
    }else{
        /**
        * 通常技
        */
        // ローカル変数として補正値を用意
        $m = 1;
        // 必要ステータスの取得
        $stats = $this->getStats($move->getSpecies(), $atk_pokemon, $def_pokemon);
        // ダメージ計算(物理,特殊技)
        if($move->getSpecies() !== 'status'){
            // 急所判定
            $critical = $this->checkCritical($move->getCritical());
            if($critical){
                // 補正値を乗算
                $m *= $critical;
                $this->setMessage('急所に当たった!');
            }
            // 乱数補正値の計算
            $m *= $this->calRandNum();
            // タイプ一致補正の計算
            $this->calMatchType($move->getType(), $atk_pokemon->getTypes());
            // ダメージ計算
            $damage = $this->calDamage(
                $atk_pokemon->getLevel(),   # 攻撃ポケモンのレベル
                $stats['a'],                # 攻撃ポケモンの攻撃値
                $stats['d'],                # 防御ポケモンの防御値
                $move->getPower(),          # 技の威力
                $this->m * $m,              # 補正値(プロパティ*ローカル)
            );
            // やけど補正
            if(($move->getSpecies() === 'physical') && ($atk_pokemon->getSa() === 'SaBurn')){
                // 物理且つやけど状態ならダメージを半減
                $damage *= 0.5;
            }
            // タイプ相性のメッセージを返却
            $this->setMessage($this->type_comp_msg);
        }
    }
    // ダメージ計算
    $def_pokemon->calRemainingHp('sub', $damage ?? 0);
    // 追加効果(相手にHPが残っていれば)
    if($def_pokemon->getRemainingHp()){
        // 追加効果
        $move->effects($atk_pokemon, $def_pokemon);
        // 追加効果のメッセージをセット
        $this->setMessage($move->getMessages());
        $move->resetMessage();
        return;
    }
}

 

固定ダメージ技のダメージ量は、各技クラスに作成したgetFixedDamageが算出してくれるため、ダメージ計算を行う必要がありません。その関係上、相手のステータス取得や補正値計算も不要です。タイプ相性の「こうかがない」に関しては従わなければなりませんが「こうかばつぐん」と「こうかいまひとつ」に関しても判定メッセージは不要です。もちろん急所に当たることもありません。

なので、攻撃成功であればまず固定ダメージかどうかの分岐を行いダメージ量を計算、その後ポケモンにダメージを与えるという順番で処理を行なっています。

 

「ちきゅうなげ」のgetFixedDamageメソッドでは攻撃ポケモンのレベルを返り値として返却しているので、この値がダメージ量となってそのまま計算されることになります。

以下出力結果です。

 

 

 

一撃必殺を除き、固定ダメージ技は大ダメージと言えるものではありません。そのため、通常のポケモンではそこまで大きなメリットを感じないかも知れませんが、攻撃力が乏しいポケモン(耐久型ポケモン)などが使えるとなればかなり心強い技の1つです。また、相手の耐久値が高い場合や、ランク補正などで通常技ではとても十分なダメージを与えられない状況においては重宝される1つです。

 

サイコウェーブ

次に「サイコウェーブ」を作成します。こちらも「ちきゅうなげ」の要領で作成します。

 

サイコウェーブ(/Classes/Move/Psywave.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// サイコウェーブ
class Psywave extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'サイコウェーブ';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '相手にランダムに決まった値を固定ダメージとして与える。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Psychic';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'special';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 15;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 固定ダメージフラグ
    * @var boolean
    */
    protected $fixed_damage_flg = true;
 
    /**
    * 固定ダメージ量の取得
    *
    * @param Pokemon $atk 攻撃ポケモン
    * @param Pokemon $def 防御ポケモン
    * @return integer
    */
    public function getFixedDamage($atk, $def)
    {
        // 攻撃ポケモンのレベル*(0.5〜1.5)倍のダメージを与える
        return (int)($atk->getLevel() * (random_int(5, 15) / 10));
    }
 
}

 

サイコウェーブのダメージ量は以下の通りです。

 (攻撃側のレベル×0.5~攻撃側のレベル×1.5)のダメージ

 

固定ダメージとはいっても乱数が含まれます。なので、getFixedDamage内で乱数を作成してダメージ量を確定させます。

小数点以下が含まれる乱数はrandom_intでは作成出来ないため、5〜15の間で乱数を作成し、10で割ってからレベルを掛け、整数(切り捨て)してダメージ量を返却しています。

 

 

 

初代技であれば、「ソニックブーム」や「りゅうのいかり」、「ナイトヘッド」「いかりのまえば」が同じ仕組みを使って作成することができます。ダメージ量が決まっている技はそのまま数値を返却、それ以外も攻撃ポケモンまたは防御ポケモンのインスタンスを引数で受け取っていれば算出が可能なものです。

 

カウンター

ダメージ固定技の中でも「ちきゅうなげ」などとは同じ仕組みだけでは実装できないものがあります。それが「カウンター」という技です。

(使用したターンの最後に受けた物理技のダメージ×2)のダメージ

  

受けたダメージの格納

カウンターは優先度マイナス5という技のため、もし相手も同じ優先度の技を使用していない限りは後手になります。更に、ダメージ量の計算が「使用ターンに自身が受けた物理ダメージの2倍」となるので、技によって受けた最後のダメージ量を格納しておかなければなりません

なので、ポケモンに対して新しくプロパティを用意することで対応しましょう。

 

ポケモンクラス(/Classes/Pokemon.php
// ポケモン
abstract class Pokemon
{
 
--省略
 
    /**
    * このターンに受けた攻撃によるダメージ
    * @var array
    */
    protected $turn_damage = [
        'physical' => 0,
        'special' => 0,
    ];

 

ダメージは物理・特殊の2種類あるため、連想配列で用意します。プロパティの作成に合わせて取得(getTurnDamage)、格納(setTurnDamage)、リセット(resetTurnDamage)を用意します。

 

ポケモン用Get格納トレイト(/App/Traits/Class/Pokemon/ClassPokemonGetTrait.php
/**
* このターンに受けたダメージの取得
* @param string (physical|special)
* @return mixed
*/
public function getTurnDamage($param='')
{
    if(empty($param)){
        // 配列で全返却
        return $this->turn_damage;
    }else{
        // 指定ダメージを取得
        return $this->turn_damage[$param] ?? 0;
    }
}

 

ポケモン用Set格納トレイト(/App/Traits/Class/Pokemon/ClassPokemonSetTrait.php
/**
* このターン受けたダメージ量の格納
* @param string $param
* @param integer $damage
* @return void
*/
public function setTurnDamage($param, int $damage)
{
    $this->turn_damage[$param] = $damage;
}

 

ポケモン用Reset格納トレイト(/App/Traits/Class/Pokemon/ClassPokemonResetTrait.php
<?php
trait ClassPokemonResetTrait
{
    /**
    * このターン受けたダメージ量をリセットする
    * @return void
    */
    public function resetTurnDamage()
    {
        $this->turn_damage = [
            'physical' => 0,
            'special' => 0,
        ];
    }
 
}

※リセットトレイトは新しく作成しています

 

これで準備が整いました。引き継ぎ対象としていないため、前回のダメージがそのまま残り続けることはありませんが、ループで行う自動ターン処理があるため、念には念を入れてサービス開始時にまずリセットを実行しておきましょう。

 

たたかうサービス(/App/Services/Battle/FightService.php
/**
* @return void
*/
public function execute()
{
    // ターンダメージのリセット
    $this->pokemon
    ->resetTurnDamage();
    $this->enemy
    ->resetTurnDamage();

 

次にダメージの格納処理です。こちらはダメージ計算終了後にメソッドを呼び出して、算出したダメージをダメージ計算前に技種別に合わせて格納します。

 

攻撃トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 攻撃判定成功時の処理
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
private function attackSuccess($atk_pokemon, $def_pokemon, $move)
{
    if($move->getFixedDamageFlg()){
        /**
        * 固定ダメージ技
        */
        $damage = $move->getFixedDamage($atk_pokemon, $def_pokemon);
    }else{
        /**
        * 通常技
        */
        // ローカル変数として補正値を用意
        $m = 1;
        // 必要ステータスの取得
        $stats = $this->getStats($move->getSpecies(), $atk_pokemon, $def_pokemon);
        // ダメージ計算(物理,特殊技)
        if($move->getSpecies() !== 'status'){
            // 急所判定
            $critical = $this->checkCritical($move->getCritical());
            if($critical){
                // 補正値を乗算
                $m *= $critical;
                $this->setMessage('急所に当たった!');
            }
            // 乱数補正値の計算
            $m *= $this->calRandNum();
            // タイプ一致補正の計算
            $this->calMatchType($move->getType(), $atk_pokemon->getTypes());
            // ダメージ計算
            $damage = $this->calDamage(
                $atk_pokemon->getLevel(),   # 攻撃ポケモンのレベル
                $stats['a'],                # 攻撃ポケモンの攻撃値
                $stats['d'],                # 防御ポケモンの防御値
                $move->getPower(),          # 技の威力
                $this->m * $m,              # 補正値(プロパティ*ローカル)
            );
            // やけど補正
            if(($move->getSpecies() === 'physical') && ($atk_pokemon->getSa() === 'SaBurn')){
                // 物理且つやけど状態ならダメージを半減
                $damage *= 0.5;
            }
            // タイプ相性のメッセージを返却
            $this->setMessage($this->type_comp_msg);
        }
    }
    // このターン受けるダメージをポケモンに格納
    $def_pokemon->setTurnDamage($move->getSpecies(), $damage ?? 0);
    // ダメージ計算
    $def_pokemon->calRemainingHp('sub', $damage ?? 0);

 

これでダメージ量の補完処理が作成できました。

 

では、カウンターの技クラスを作成しましょう。

 

カウンター(/Classes/Move/Counter.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// カウンター
class Counter extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'カウンター';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '相手から受けた物理攻撃のダメージを2倍にして与える。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Fighting';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 20;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = -5;
 
    /**
    * 固定ダメージフラグ
    * @var boolean
    */
    protected $fixed_damage_flg = true;
 
    /**
    * 固定ダメージ量の取得
    *
    * @param Pokemon $atk 攻撃ポケモン
    * @param Pokemon $def 防御ポケモン
    * @return integer
    */
    public function getFixedDamage($atk, $def)
    {
        // 攻撃ポケモンのレベル分ダメージを与える
        return $atk->getTurnDamage('physical') * 2;
    }
 
}

 

これでカウンターで与える固定ダメージ量が計算できるようになりました。

ただ、カウンターは相手からこのターン物理ダメージを受けていなければ「攻撃失敗」という処理が必要です。なので、こちらは命中判定処理に追記しましょう。

 

攻撃トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 命中判定
*
* @param object $atk
* @param object $def
* @param object $move
* @return boolean
*/
private function checkHit($atk, $def, $move)
{
    // 一撃必殺技のチェック
    if($move->getOneHitKnockoutFlg()){
        if($atk->getLevel() < $def->getLevel()){
            // 相手の方がレベルが高ければ無効
            $this->setMessage($move->getOneHitKnockoutFailedMessage($def->getPrefixName()));
            return false;
        }
        // レベル差計算を含めた命中率を取得
        $accuracy = $move->getOneHitKnockoutAccuracy($atk, $def);
    }else{
        // 命中率取得
        $accuracy = $move->getAccuracy();
    }
    // nullの場合は命中率関係無し
    if(is_null($accuracy)){
        return true;
    }
    // カウンターの失敗判定
    if((get_class($move) === 'Counter') && empty($atk->getTurnDamage('physical'))){
        // 自身にこのターン物理ダメージが蓄積していなければ失敗
        $this->setMessage($move->getFailedMessage($atk->getPrefixName()));
        return false;
    }
    /**
    * 0〜100からランダムで数値を取得して、それより小さければ命中
    * 例:命中80%→mt_randで60が生成されたら成功、90なら失敗
    */
    if($accuracy >= mt_rand(0, 100)){
        // 攻撃成功
        return true;
    }
    // 攻撃失敗
    $this->setMessage($move->getFailedMessage($atk->getPrefixName()));
    return false;
}

 

カウンターは特別な技のため、技クラスで個別の判定を加えました。初代以外ではミラーコートやメタルバーストなどがありますが、もしすべてを実装したとしても数が知れているので、一旦は個別処理で対応します。

 

では、実際にカウンターを使用してみましょう。

 

カウンター成功

 

 

 

カウンター失敗

 

 

 

攻撃が外れた際には失敗となりました。これで正常に判定がされているということがわかりますね。

  

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは「ダメージ固定技」について「ちきゅうなげ」「サイコウェーブ」「カウンター」の作成方法をご紹介しました。

プログラミング学習に取り組んでいる方や、ゲームづくりに興味がある人は、ぜひ参考にしてみてくださいね。

 

注目の記事

初心者向けのブログで稼ぐ方法【アフィリエイト編:Google AdSense】
SEO対策
Google AdSense,アフィリエイト,クリック単価,クリック数,ブログ,広告収入
初心者向けのブログで稼ぐ方法【アフィリエイト編:Google AdSense】

  ブログを始めたほとんどの人が アフィリエイトで稼ぎたい   という強い思いを持っているのではないでしょうか。しかし現実は厳しく、広告の審査さえ通らず挫折してしまうといったことは多いです。 中には審査が通っているが、全然広告収入が得られないという人もいるでしょう。 毎日ブログを書いているの...

ゆびをふる編 PHPポケモン 69
プログラミング
PHP,PHPポケモン,ポケモン
ゆびをふる編 PHPポケモン 69

ゆびをふるとは 今回PHPポケモンで実装する技は「ゆびをふる」です。  ゆびをふる(ポケモンwiki) https://wiki.ポケモン.com/wiki/ゆびをふる   「ゆびをふる大会」というゆびをふるのみを使った大会なども開催されているということもあり、ポケモンの技の中でも初代から長く愛されてきた1つです。で...

20代起業家が教える「やっといて良かった」3つのコト
雑記
起業
20代起業家が教える「やっといて良かった」3つのコト

  「起業するために何を準備すべき?」 「やっておいて良かったことはありますか?」   独立や起業をしようと志している人のほとんどが、こういった質問を投げかけてきます。自分も同じような悩みを持った立場の時には似た質問をしていたので、その真意はよくわかります。   今回はそんな悩みを抱えて...

保守っていくらで何をする?フリーランスWebエンジニア対象!保守業務について解説します
フリーランス
システムエンジニア,フリーランス,プログラマー
保守っていくらで何をする?フリーランスWebエンジニア対象!保守業務について解説します

  サイトの保守を頼まれたけど、具体的に何をやればいいの?   フリーランスの、特に独学やスクール上がりでなった人にとっては保守は何をすれば良いかわからないという悩みを抱えている人は多いのではないでしょうか。 システム開発会社や制作会社にいた人でも、どのぐらいの金額で請け負うのが良いか検...

PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11

  前回のPHPポケモンではメソッドを外部から実行できるようにコントローラー(インターフェース)を作成しました。なので、今回は引数が必要となるメソッドの実装に挑戦してみましょう。 最後にはデモページを準備しているので、気になった人はぜひ遊んでみてください。   第1回はコチラ     ...

PHPポケモン「わざ編〜チャージ技の実装〜」34
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「わざ編〜チャージ技の実装〜」34

チャージ技とは ポケモンの技は数多く存在していて、その中でも特別な処理が必要なものがいくつかあります。その1つが「チャージ技」です。 ※チャージ技とはポケモン上で用いられている用語ではありません   現在実装している初代御三家+ピカチュウの初代レベルアップ技の中では以下の2つがあります。 ロ...

スキル習得で挫折しないための3ステップ
雑記
デザイン,ブログ,プログラミング
スキル習得で挫折しないための3ステップ

  せっかく高い教材を買ったのに、気づいたら積んでしまっている・・・   そんな悩み、あなたには有りませんか? 今回は、そんな方のための勉強方法をテーマに説明していきます。 正しい勉強方法を身に着けていれば、どういったメリットがあるのでしょうか? 三日坊主になりにくい いざという...

ブログで生活するための7つの道のり 〜収益化と拡散の方法教えます〜
ライティング
Facebook,Google AdSense,Twitter,ノマドワーク
ブログで生活するための7つの道のり 〜収益化と拡散の方法教えます〜

  ブログで生活したい   毎日数時間、ブログを書くだけで生きていける、そんな夢のような生活を実現させたいと思い描く人は多いですが、簡単なことでは有りません。 ですが、やらなければいけないことがわかっていれば、収益化するのは簡単です。   今回は「ブログで生活するための7つの道のり」をテ...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力