2016-06-17 4 views
0

これは私が何かを忘れてしまったようで、今この小さな事を固執したようです。複数のインスタンスで関数を使用できるようにするにはどうすればよいですか?例えばplayer1、player2、

2つのチーム試合の間に複数のプレーヤーがあります。すべてのプレーヤーを処理するために、この関数を書く必要がありますか?

Match.php

public function __construct() 
{ 
    $this->redTeam = new Team(); 
    $this->blueTeam = new Team(); 
    $this->player1 = new Player('Bensen'); 
    $this->player2 = new Player('Kicksen'); 
    $this->startMatch(); 
}  

public function fightCreeps() 
{ 
    $creeps = 0; 
    $gold = 0; 
    for ($this->wave; $this->wave > 0; $this->wave--) { 
     if ($this->player1->lasthitting >= rand(1, 100)) { 
      $creeps++; 
      $gold += 40; 
      $this->player1->creeps++; 
      $this->player1->gold += 40; 
      $this->player1->totalGold += 40; 
      $this->player1->experience += 40; 
      $this->player1->health -= rand(5, 10); 
     } 
    } 
    return "<span style=\"color: red;\">{$this->player1->name}</span> has slain {$creeps} Creeps. +{$gold} Gold<br>"; 
} 
+1

ヒント:あなたがしたい場合は、手動で、それを介して収集自分自身と、ループを作成することができますので、のような 'パブリック関数fightCreeps()' => 'パブリック関数fightCreepsを(プレーヤー$プレーヤー) ' – HPierce

答えて

1

私はあなたのアプリケーションのアーキテクチャを検討する必要があると思います。 OOPの観点からは、MatchfightCreeps()ではなく、Playerはクリープと戦う。

リレーションを別に定義します(https://laravel.com/docs/5.1/eloquent-relationships参照)。あなたがしかマッチモデルに、その後、マッチで遊んでいる2つのチームがあるように起こっている知っている場合たとえば、以下を定義します。

use App\Team; 

class Match extends Model { 

    protected static function boot() 
    { 
     parent::boot(); 

     // when a match is created, auto-create teams 
     static::created(function ($match) { 
      $match->redTeam()->create([]); 
      $match->blueTeam()->create([]); 
     }); 
    } 

    public function startMatch() 
    { 
     //fight 
    } 

    public function redTeam() 
    { 
     return $this->hasOne(Team::class); 
    } 

    public function blueTeam() 
    { 
     return $this->hasOne(Team::class); 
    } 
} 

チームモデル:

use App\Match; 
use App\Player; 

class Team extends Model { 

    protected static function boot() 
    { 
     parent::boot(); 

     // when a team is created auto-add players 
     static::created(function ($team) { 
      $team->players()->create(['name' => 'Bensen']); 
      $team->players()->create(['name' => 'Kicksen']); 
     }); 
    } 

    public function players() 
    { 
     return $this->hasMany(Player::class); 
    } 

    public function match() 
    { 
     return $this->belongsTo(Match::class); 
    } 

} 

プレーヤーモデル:

foreach ($this->redTeam->players as $player) { 
    $player->fightCreeps(); 
} 
use App\Team; 

class Player extends Model { 

    public function team() 
    { 
     return $this->belongsTo(Team::class); 
    } 

    public function fightCreeps() 
    { 
     // fight! 
    } 
} 

次に、あなたのようなことを行うことができます

あなたはチームと選手の作り方を変えることができますが、これはあなたが望む一般的な関係だと思います。

ラーベル関係では、複数のリレーションが自動的に(https://laravel.com/docs/5.1/collections)として返されます。これは、配列のより洗練されたバージョンです。 (私が正しくあなたの質問を理解していれば)

$players = collect([$player1, $player2]); 

foreach ($players as $player) { 
    // do something 
} 
1
public $players = []; 

public function __construct() 
{ 
    $this->redTeam = new Team(); 
    $this->blueTeam = new Team(); 
    $this->addPlayer('Bensen'); 
    $this->addPlayer('Kicksen'); 
    $this->startMatch(); 
} 


public function addPlayer($name) 
{ 
    $this->players[] = new Player($name); 
} 


public function startMatch() 
{ 
    // do other starting match related stuff 

    foreach ($this->players as $player) { 
     $this->fightCreeps($player); 
    } 

} 

public function fightCreeps(Player $player) 
{ 
    // do the fighting stuff 
}  
+0

しかし、これはまだクラス内のすべてのハードコーディングの問題があります。実際には実現可能でも拡張可能でもありません –

+0

私はより良い設計原則でクラスを作成することに全力を尽くしていますが、この時点でどのように使用されているのか分かりませんが、これはOPが現在持っているもの – dargue3

関連する問題