Zły parametr w obiekcie.

0

Witam, nie do końca ogarnąłem jak użyć parametru, gdzie... Dobra może zademonstruje o co chodzi:
Tu cały kod ale można ominąć raczej:


<?php
// jestem głupi, teraz statystki na pewno zrobie w tablicy z key values, ale jak tak zacząłem to tak skończe :D


class Unit {
	
	public $name;
	public $hp;
	public $armor1;
	public $armor2;
	public $dmg1;
	public $dmg2;
	public $stat1;
	public $stat2;
	public $stat3;
	
	public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3){
		$this->name = $name;
		$this->hp = $hp;
		$this->armor1 = $armor1;
		$this->armor2 = $armor2;
		$this->dmg1 = $dmg1;
		$this->stat1 = $stat1;
		$this->stat2 = $stat2;
		$this->stat3 = $stat3;
	}
}

class myHero extends Unit {
	
	public $avaiblePoints = 1; //przykładowo
	
	public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3, $avaiblePoints){
		parent::__construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3);
		$this->avaiblePoints = $avaiblePoints;
		
	function addStat($stat_name){ //dobrze to?
		if($this->avaiblePoints >= 1){
			$stat_name++;
			$this->avaiblePoints--;
			
		}
	}
	
	
	}
}

$Hero = new myHero("xd", 100, 90, 40, 50, 60,  50, 20, 25, 1);

//przywołam teraz bohatera, moge później, ale wole mieć pewność że attackIt() niżej zadziała


class Monster extends Unit {
	
	public $rewardPoints = 0; //nie wiem czy to musze już przydzielać
	
	public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3){ //później sobie te statystki odpuszcze u monsters
		parent::__construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3);
		
}

	function attackIt(){
		$i = 1;
		$revertHP = $Hero->hp;
		while($i > 0) { //nie wiem czy tak sie robi :D
			$dmgDone = rand($Hero->dmg1, $Hero-dmg2); 
			$dmgReceived = rand($this->dmg1, $this->dmg2);
			$this->hp =- $dmgDone;
			echo "Zadałeś" . $dmgDone . "obrażeń";
			$Hero->hp =- $dmgReceived;
			echo "Otrzymałeś" . $dmgReceived . "obrażeń";
			if ($this->hp < 0){
				echo "Wygrałeś!";
				$Hero->avaiblePoints = $this->rewardPoints;
				$Hero->hp = $revertHP;
				break;
				}
			elseif ($Hero->hp < 0) {
				echo "Przegrałeś!";
				$Hero->hp = $revertHP;
				break;
			}
				
			}
			
		}
	}


//Hero->addStat()
echo $Hero->name;
$Hero->addStat($Hero->stat1);
echo $Hero->stat1;

?>

Chodzi konkretnie o te fragmenty:


class myHero extends Unit {
	
	public $avaiblePoints = 1; for example
	
	public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3, $avaiblePoints){
		parent::__construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3);
		$this->avaiblePoints = $avaiblePoints;
[....]
	function addStat($stat_name){  // O TUTAJ - jak tutaj sie odwołać, 
		if($this->avaiblePoints >= 1){
			$stat_name++;
			$this->avaiblePoints--;

[...]

$Hero->addStat($Hero->stat1);  //???


Proszę bez linczu :D

0

przekazałeś kopię wartości do metody po czym ją zwiększyłeś o jeden ale na zewnątrz dalej jest poprzednia wartość, jeśli chcesz ją zmienić rzeczywiście to albo użyj referencji albo zwróć nową wartość.

0

Call to undefined method myHero::addStat() <- nie ważne jaki paramtr podam.
kiedy ja dobrze z tego co widzę użyłem metody, sam już sie pogubiłem.

[...]
$Hero->addStat();
[...]
class myHero extends Unit {
	
	public $avaiblePoints = 1; //przykładowo
	
	public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3, $avaiblePoints){
		parent::__construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3);
		$this->avaiblePoints = $avaiblePoints;
		
	function addStat($stat_name){ 
		if($this->avaiblePoints >= 1){
			$stat_name++;
			$this->avaiblePoints--;
			//return $stat_name; tak? wtedy na końcu dałbym żeby sprawdzić: $someVar = $Hero->addStat(stat1); $Hero->stat1 = $someVar; echo  $Hero->stat1;
			
		}
	}

Chciałem to zrobić, że zwróconą wartością, albo coś takiego, by zmieniała się w referencji, ale nie moge tego tu ogarnąć. Tzn, żeby przed $stat_name (nie parametr, to w metodzie) można było dodać THIS->, żeby od razu się zmieniało rzeczywiście.

1

Zjadłeś jeden nawias }

class myHero extends Unit {

    public $avaiblePoints = 1; //przykładowo

    public function __construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3, $avaiblePoints){
        parent::__construct($name, $hp, $armor1, $armor2, $dmg1, $dmg2, $stat1, $stat2, $stat3);
        $this->avaiblePoints = $avaiblePoints;
      } // o tutaj powinno być

    function addStat($stat_name){ //dobrze to?
        if($this->avaiblePoints >= 1){
            $stat_name++;
            $this->avaiblePoints--;

        }
    }
}
0

Nie wiem czemu nie działało, więc zrobiłem to tak:

$stat1Id = 1;
$stat2Id = 2;
$stat3Id = 3;
	function addStat($statID){ 
		if($this->avaiblePoints >= 1){
			if($statID == 1){
				$this->stat1++;
//$avaiblePoints--; w każdym if'ie, ale nie moge dobrze kodu wkleić idk why;/
			}
			elseif($statID == 2){
				$this->stat2++;
			}
			elseif($statID == 3){
				$this->stat3++;
			}
			}
		}
			}
		}
$Hero->addStat($stat1Id);
echo $Hero->stat1;

I takie coś działa :D.

1 użytkowników online, w tym zalogowanych: 0, gości: 1