2009-04-02 14 views
6

Czy można włączyć jedną funkcję do innej? Aby nauczyć się funkcji, próbuję stworzyć sekwencję walki za pomocą PHP. Sekwencja będzie wyglądać następująco:Czy mogę dołączyć funkcję do innej funkcji?

  1. Kostki będą się obracać, przypisując numery do zmiennych;
  2. Drukowane są wyniki ataku Hero1;
  3. Kostki zostały rzucone, przypisując numery do zmiennych;
  4. Wyniki ataku Hereo2 są drukowane;
  5. Kostki zostały rzucone, przypisując numery do zmiennych;
  6. Wyniki ataku Hero3 zostaną wydrukowane.

Rzut kostką będzie funkcją automatyczną. Oto kod:

<? 
rollSim(); 
combatSim(); 

function rollSim() { 
    $hAttack = rand(1,20); 
    $mDefend = rand(1,20); 
    $mAttack = rand(1,20); 
    $hDefend = rand(1,20); 
    $mDamage = rand(10,25); 
    $hDamage = rand(1,20); 
} // end rollSim 

function combatSim() { 
    rollSim(); 
    if ($hAttack>$mDefend) { 
     print "Hero hit monster for $hDamage damage.<br>"; 
    } else if ($hAttack<=$mDefend) { 
     print "Hero missed monster."; 
    } 
} // end combatSim 

?> 

Odpowiedz

4

Możesz wywoływać funkcje od siebie nawzajem, oczywiście ... ale myślę, że chcesz użyć zakresu jednego w drugim, prawda?

Dzielenie się jest niepotrzebnym biznesem. Lepiej przekazywać argumenty.

16

Twoja funkcja powinna zwinąć liczby zamiast ustawiania niektórych zmiennych i próbować użyć ich w innej funkcji. Zwróciłbym je w tablicy asocjacyjnej, tak:

function rollSim() { 
    $roll['hAttack'] = rand(1,20); 
    $roll['mDefend'] = rand(1,20); 
    $roll['mAttack'] = rand(1,20); 
    $roll['hDefend'] = rand(1,20); 
    $roll['mDamage'] = rand(10,25); 
    $roll['hDamage'] = rand(1,20); 

    return $roll; 
} 

function combatSim() { 
    $roll = rollSim(); 

    if ($roll['hAttack'] > $roll['mDefend']) { 
     print "Hero hit monster for {$roll['hDamage']} damage.<br>"; 
    } else if ($roll['hAttack'] <= $roll['mDefend']) { 
     print "Hero missed monster."; 
    } 
} 
+0

Dzięki za odpowiedź; jest to bardzo pomocne. Szybkie pytanie kontrolne - czy za każdym razem będę mógł skorzystać z funkcji "ponownego przewijania"? Tak więc na przykład potrzebowałbym osobnego zestawu rzutów kostką dla bohaterów 2 i bohatera 3. Jeszcze raz dziękuję wszystkim, którzy odpowiedzieli. –

+0

Ciało drugiego, jeśli w combatSim nie jest potrzebne.(Wiem, że skopiowałeś OP, jeśli chcesz tylko o tym wspomnieć.) – strager

+0

@Matt, Przekaż wyniki rzutów jako parametry do combatSim. – strager

9

Nie, naprawdę nie możesz zrobić tego, o co prosisz. Nawet jeśli umieścisz deklarację rollSim() w definicji combatSim() (co możesz zrobić, to jest legalne, ale nie ma żadnych rzeczywistych efektów), zmienne, które ustawiasz w rollSim(), nadal będą lokalne i niedostępne przez combatSim().

Potrzebujesz lepszego sposobu przekazywania informacji, które Cię interesują. Jeremy Ruten opisuje szczegółowo dobrą drogę. Innym sposobem jest zdefiniowanie obiektu, który jest odpowiedzialny za modelowanie twojego zdarzenia bojowego i obaj są metodami na nim.

class myCombat { 

    private $hAttack; 
    private $mDefend; 
    private $mAttack; 
    private $hDefend; 
    private $mDamage; 
    private $hDamage; 

    function rollSim() { 
     $this->hAttack = rand(1, 20); 
     $this->mDefend = rand(1, 20); 
     $this->mAttack = rand(1, 20); 
     $this->hDefend = rand(1, 20); 
     $this->mDamage = rand(10, 25); 
     $this->hDamage = rand(1, 20); 
    } 

    function combatSim() { 
     $this->rollSim(); 
     if($this->hAttack > $this->mDefend) 
      echo 'Hero hit monster for ' . $this->hDamage . ' damage.<br />'; 
     else 
      echo 'Hero missed monster'; 
    } 

} 

$combat = new myCombat; 
$combat->combatSim(); 
+1

kiedy potrzebujesz funkcji wewnątrz funkcji nadszedł czas, aby przejść do OOP i zrobić klasę +1 – Mikey1980

2

Jeśli chcesz zdefiniować funkcje wewnątrz funkcji w PHP można to zrobić tak:

 
function a() 
{ 
    function b() 
    { 
     echo 'I am b'; 
    } 
    function c() 
    { 
     echo 'I am c'; 
    } 
} 
a(); 
b(); 
c(); 

Musisz wywołać funkcję nadrzędną, potem funkcje wewnątrz.

3

oto prosty przykład wywołanie funkcji wewnątrz funkcji

class Percobaan{ 

    public function coba(){ 
    return "return value"; 
    } 

    public function call(){ 
    //call coba function 
    return $this->coba(); 
    } 

} // end of class percobaan 

//call the method 
$klass = new Percobaan(); 
echo $klass->call(); 

willbe wyjściowa:

"return value" 
+0

Wklejam to pomiędzy php-tags w pliku o nazwie whatever.php i przesyłam go na mój serwer WWW (wersja PHP 5.6) ... Wynik nie jest "wartością zwracaną" ... To nic (ani prawdopodobnie pusta linia) ... Co robię źle? – Speckle

+0

Przepraszam, zapomniałem dodać 'return' w funkcji' call() ', a ja edytowałem –

0

To byłoby zamknięcie, jeśli będzie.

Powiązane problemy