Avatar billede brinck10 Nybegynder
25. februar 2007 - 18:01 Der er 10 kommentarer og
1 løsning

Øvelse i OOP

Hej ekspertern.

Nu er jeg godt og grundigt kørt sur i noget OOP. Jeg ville gerne blive bedre så jeg forsøgede mig lidt. Jeg tænkte det kunne da være sjovt at lave sådan en "krigs-simulator". Så jeg prøvede mig frem og er noget frem til dette:

<?
class Battle
{   
    protected $unitsT1;
    protected $unitsT2;
   
    protected $turnT1 = true;
       
    public function __construct($units1, $units2){
        $this->setUnitsT1($units1);
        $this->setUnitsT2($units2);
    }
   
    public function publish(){
        while($this->checkFightning()){
            if($this->turnT1){
                if(rand(0,100) > 80){
                    $this->setUnitsT2($this->unitsT2--);
                }else{
                    $this->setUnitsT1($this->unitsT1--);
                }
                $this->turnChange();
                break;
            }else{
                if(rand(0,100) > 80){
                    $this->setUnitsT1($this->unitsT1--);
                }else{
                    $this->setUnitsT2($this->unitsT2--);
                }
                $this->turnChange();
                break;
            }
        }
        return $this->result();
    }
   
    public function turnChange(){
        $this->turnT1 = !$this->turnT1;
    }
   
    public function getUnitsT1(){
        return $this->unitsT1;
    }
    public function setUnitsT1($units){
        $this->unitsT1 = $units;
    }
   
    public function getUnitsT2(){
        return $this->unitsT2;
    }
    public function setUnitsT2($units){
        $this->unitsT2 = $units;
    }
   
    public function checkFightning(){
        if($this->unitsT1 > 0 && $this->unitsT2 > 0){
            return true;
        }else{
            return false;
        }
    }
   
    public function result(){
        if($this->unitsT1 <= 0){
            return "Team2 vandt.  De havde ". $this->getUnitsT2 ." tanks tilbage. Kom igen Team1";
        }else{
            return "Team1 vandt. De havde ". $this->getUnitsT1 ." tanks tilbage. Kom igen Team2";
        }
    }
}
?>

Som sagt kunne jeg ikke få det til at virke som jeg ville have det. Er heller ikke sikker på om det simulere ordenligt.

Her er min side 2 der bruger klassen:

<head>
<?
require_once("battle.Class.php");
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Battle</title>
</head>

<body>
<?
function showForm(){
    echo "<form method=\"post\" action=\"battle.php\">";
    echo "<h3>Team1:</h3><br>";
    echo "Antal tanks på team1:<br>";
    echo "<input type=\"text\" name=\"tanksT1\" value=\"0\">";
    echo "<br><br>";
    echo "<h3>Team2:</h3><br>";
    echo "Antal tanks på team2:<br>";
    echo "<input type=\"text\" name=\"tanksT2\" value=\"0\"><br>";
    echo "<input type=\"submit\" name=\"submit\" value=\"Send til krig\">";
    echo "</form>";
}
if(isset($_POST["submit"])){
    $tanksT1 = $_POST["tanksT1"];
    $tanksT2 = $_POST["tanksT2"];
    $battle = new Battle($tanksT1, $tanksT2);
    echo $battle->publish();
}else{
    showForm();
}
?>
</body>
</html>

Er der nogen der kan fortælle mig hvad jeg har gjort galdt? Hver kan jeg kører den igennem vinder Team1 heletiden, og jeg kan ikke se hvor mange tanks de havde tilbage. Er det her den rigtige måde at gøre det på?

Håber i kan hjælpe.
/Frederik
Avatar billede dkfire Nybegynder
25. februar 2007 - 18:47 #1
Hej

sjovt lille spil du har gang i.
I din  publish() function skal du ikke have noget break. Slet de to break.
Jeg tror du skal ændre din turnChange() til noget ala:
public function turnChange(){
if($this->turnT1 == TRUE)
{
  $this->turnT1 = FALSE;
}else
  $this->turnT1 = TRUE;
}
Avatar billede dkfire Nybegynder
25. februar 2007 - 18:49 #2
Lige en ting til, mange af dine funktioner kan godt være private istedet for public
Avatar billede brinck10 Nybegynder
25. februar 2007 - 19:01 #3
nu har jeg så ændret lidt i det, og det virker bedre. Nu er problemet bare, at den stadig ikke viser hvor mange tanks der er tilbage til sidst. Jeg føler heler ikke at den simulere det ordenligt. Da hvis jeg skriver 2 tanks i hver, og går vidre, vinder team2 altid. (har prøvet i lang tid nu )

Min kode ser nu således ud:

<?
class Battle
{   
    protected $unitsT1;
    protected $unitsT2;
   
    protected $turnT1 = true;
       
    public function __construct($units1, $units2){
        $this->setUnitsT1($units1);
        $this->setUnitsT2($units2);
    }
   
    public function publish(){
        while($this->checkFightning()){
            if($this->turnT1){
                if(rand(0,100) > 80){
                    $this->setUnitsT2($this->unitsT2 -= 1);
                }else{
                    $this->setUnitsT1($this->unitsT1 -= 1);
                }
                $this->turnChange();
            }else{
                if(rand(0,100) > 80){
                    $this->setUnitsT1($this->unitsT1 -= 1);
                }else{
                    $this->setUnitsT2($this->unitsT2 -= 1);
                }
                $this->turnChange();
            }
        }
        return $this->result();
    }
   
    public function turnChange(){
        if($this->turn == true){
            $this->turn = false;
        }else{
            $this->turn = true;
        }
    }
   
    public function getUnitsT1(){
        return $this->unitsT1;
    }
    public function setUnitsT1($units){
        $this->unitsT1 = $units;
    }
   
    public function getUnitsT2(){
        return $this->unitsT2;
    }
    public function setUnitsT2($units){
        $this->unitsT2 = $units;
    }
   
    public function checkFightning(){
        if($this->unitsT1 > 0 && $this->unitsT2 > 0){
            return true;
        }else{
            return false;
        }
    }
   
    public function result(){
        if($this->unitsT1 <= 0){
            return "Team2 vandt.  De havde ". $this->getUnitsT2 ." tanks tilbage. Kom igen Team1";
        }else{
            return "Team1 vandt. De havde ". $this->getUnitsT1 ." tanks tilbage. Kom igen Team2";
        }
    }
}
?>

foresten dkfire. Ja, de kan være private :) Skal de også, men vil lige have det hele til at funge ordentligt.
Avatar billede erikjacobsen Ekspert
25. februar 2007 - 19:06 #4
Hvis vil kalde en funktion skal du have ()-ere på:  $this->getUnitsT2()
Avatar billede dkfire Nybegynder
25. februar 2007 - 19:08 #5
Grunden til at du ikke får noget output er at $this->getUnitsT2 mangler () efter sig. Det samme gælder for T1.
Avatar billede dkfire Nybegynder
25. februar 2007 - 19:11 #6
Du skal nok heller ikke bruge $this->unitsT2 -= 1, men istedet for bruge
($this->unitsT2 - 1)
Avatar billede dkfire Nybegynder
25. februar 2007 - 19:13 #7
Det kunne måske også hjælpe dig hvis du løbende kom med output hvordan kampen går.
Så som antallet af units og tur.
Avatar billede brinck10 Nybegynder
25. februar 2007 - 19:19 #8
Nu virker det perfekt

Ja, men ville bare live skrive det basale også opdatere :)
Dk fire smid et svar. (Håber ikke det gør noget erik. Du var først med svaret, men du beviste tidligere idag at du var ligeglad !! Thumb up!)
Avatar billede dkfire Nybegynder
26. februar 2007 - 00:04 #9
Nææ behold du bare de point.
Jeg er her kun for at lære og hjælpe andre.
Og så kunne jeg da godt tænke mig at se det spil når du engang er færdig med det.
Avatar billede brinck10 Nybegynder
26. februar 2007 - 15:06 #10
:) Vi kan da udvikle det "sammen". Skriv din hotmail (hvis du har en) til brinck10[at]gmail.com
Avatar billede brinck10 Nybegynder
27. februar 2007 - 14:35 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester