webForumDet fria alternativet

Spara funktion(med exit;) i databasen?

PHP

14 svar · 373 visningar · startad av Pike

Medlem sedan nov. 200452 inlägg
Frågan#1

Hejsan!
jag håller på med ett OnlineRPG som är byggt i PHP och MySQL. när man spelar en match mot ett monster, ennan spelare eller skogsslag så ska hela match rapporten som kommer upp sparas i databasen.

Det jag tror skulle fungera är att lägga hela matchen i en function, men när någon krigare vinner så har jag
exit;
för att den inte ska fortsätta matchen efteråt... men då kan jag inte ha så att den sparar ela rapporten i databasen....
någon som har något förslag/tips till detta?

Tack på förhand ;)

Medlem sedan juni 20008 205 inlägg
#2

Så använd inte exit. Det är omöjligt att svara på vad du ska ha istället utan att veta hur koden ser ut, men antagligen blir det ett villkor i en if-sats eller i en loop.

Medlem sedan nov. 200452 inlägg
#3

hmm... utan exit? då kommer mathen att bli jätte lång!

såhär har jag testat:

function foo($userid,$m){

$resultu1=mysql_query("SELECT * FROM multopia_users WHERE id='$userid'");
$user1=mysql_fetch_array($resultu1);
$user1_hp = $user1['hp'];
$user1_hpmax = $user1['hp_max'];
$user1_vapenid = $user1['vapenid'];
$user1_smidighet = $user1['smidighet'];
$user1_rustningid = $user1['rustningid'];
$user1n = $user1['username'];
if(empty($user1['vapenid'])){
    $user1_vapenn = "knytnäve";
    $user1_vapens = rand(0, 2);
}

$resultu2=mysql_query("SELECT * FROM multopia_monster WHERE id='$m'");
$user2=mysql_fetch_array($resultu2);
$user2_hp = $user2['hp'];
$user2_smidighet = $user2['smidighet'];
$user2n = $user2['namn'];
$user2_vapens = $user2['vapen_skada'];
$user2_vapenn = $user2['vapen'];
$user2_xp = $user2['xp'];
$user2p = $user2['pengar'];

if($user1['level'] <= $user2['level']){

$user1_minhp = ($user1_hp/$user1_hpmax*100);
if($user1_minhp < "30"){
    echo "Din krigare är för skadad för att kunna slås.";
    exit;
}
$siffra1 = "9";
$siffra2 = "0";
$siffra3 = "0";
while ($loop_skadebonus++ < 100){
    if($user1['styrka'] <= "$siffra1" AND $user1['styrka'] >= "$siffra2"){
        $skadebonus = "$siffra3";
    }
    $siffra1 = ($siffra1+10);
    $siffra2 = ($siffra2+10);
    $siffra3 = ($siffra3+1);

}

echo "<u>".$user1['username']." mot ".$user2['namn']."</u>";
echo "<br>";

echo "<table width='100' border='0' cellpadding='0' cellspacing='10'>";
echo "<tr>";
echo "<td><table width='200' border='0' cellspacing='0' cellpadding='0'>";
echo "<tr>";
echo "<td colspan='2'><b>".$user1['level']." | ".$user1['username']."</b></td>";
echo "</tr>";
echo "<tr>";
echo "<td><img src='".$user1['bild']."' width='100'></td>";
echo "<td valign='top'><table width='100' border='0' cellspacing='0' cellpadding='0'>";
echo "<tr>";
echo "<td><u>Skadebonus:</u> $skadebonus</td>";
echo "</tr>";
echo "<tr>";
echo "<td><u>Vapen:</u> <br>";
echo "$user1_vapenn</td>";
echo "</tr>";
echo "<tr>";
echo "<td><u>RustningID:</u> <br>";
echo "".$user1['rustningid']."</td>";
echo "</tr>";
echo "</table>";
echo "</td>";
echo "</tr>";
echo "</table></td>";
echo "<td><table width='200' border='0' cellspacing='0' cellpadding='0'>";
echo "<tr>";
echo "<td colspan=2'><b>".$user2['level']." | ".$user2['namn']."</b></td>";
echo "</tr>";
echo "<tr>";
echo "<td><img src='".$user2['bild']."' width='100'></td>";
echo "<td valign='top'><table width='100' border='0' cellspacing='0' cellpadding='0'>";
echo "<tr>";
echo "<td><u>Skadebonus:</u>".$user2['skadebonus']."</td>";
echo "</tr>";
echo "<tr>";
echo "<td><u>Vapen:</u> <br>";
echo "".$user2['vapen']."</td>";
echo "</tr>";
echo "<tr>";
echo "<td><u>Rustning:</u> <br>";
echo "".$user2['rustning']."</td>";
echo "</tr>";
echo "</table>";
echo "</td>";
echo "</tr>";
echo "</table></td>";
echo "</tr>";
echo "</table>";

echo "<br>";

while ($i++ < 100){                                                              //loopar 100 rundor

    if($user2_hp <= "0"){                                                       // $user1 vann striden
        echo "<br>";
        echo "<br>";
        echo "$user1n vann striden (+$user2_xp xp).";
        echo "<br>";
        echo "$user2n lämmnade $user2p$ efter sig.";
        $xp = ($user1['xp']+$user2_xp);
        $pengar = ($user1['pengar']+$user2p);
        mysql_query("UPDATE multopia_users SET xp='$xp', pengar='$pengar' WHERE id='$userid'");
        mysql_query("INSERT INTO multopia_historia (user1, user2) VALUES ('$user1n', '$user2n')");
        exit;
    } elseif($user1_hp <= "0"){                                                 // $user2 vann striden
        echo "<br>";
        echo "<br>";
        echo "$user2n vann striden.";
        echo "<br>";
        echo "$user1n får 1$ som tack för att ha ställt upp.";
        $pengar = ($user1['pengar']+1);
        mysql_query("UPDATE multopia_users SET pengar='$pengar' WHERE id='$userid'");
        mysql_query("INSERT INTO multopia_historia (user1, user2) VALUES ('$user2n', '$user1n')");
        exit;
    }
    
    echo "<br>";
    echo "Runda $i:";
    echo "<br>";                                                           // runda 1, 2, 3, ... 99, eller 100
    

    $h = "0";
    while ($h++ < 2){             // hur många attacker pär runda

        if($user2_hp <= "0"){                                                       // $user1 vann striden
            echo "<br>";
            echo "<br>";
            echo "$user1n vann striden (+$user2_xp xp).";
            echo "<br>";
            echo "$user2n lämmnade $user2p$ efter sig.";
            $xp = ($user1['xp']+$user2_xp);
            $pengar = ($user1['pengar']+$user2p);
            mysql_query("UPDATE multopia_users SET xp='$xp', pengar='$pengar' WHERE id='$userid'");
            mysql_query("INSERT INTO multopia_historia (user1, user2) VALUES ('$user1n', '$user2n')");
            exit;
        } elseif($user1_hp <= "0"){                                                 // $user2 vann striden
            echo "<br>";
            echo "<br>";
            echo "$user2n vann striden.";
            echo "<br>";
            echo "$user1n får 1$ som tack för att ha ställt upp.";
            $pengar = ($user1['pengar']+1);
            mysql_query("UPDATE multopia_users SET pengar='$pengar' WHERE id='$userid'");
            mysql_query("INSERT INTO multopia_historia (user1, user2) VALUES ('$user2n', '$user1n')");
            exit;
        }

        $result5=mysql_query("SELECT * FROM multopia_vapen WHERE id='$user1_vapenid'");
        $user1v=mysql_fetch_array($result5);

        $user1_vapenn = $user1v['namn'];
        $user1_vapen1 = $user1v['skada1'];
        $user1_vapen2 = $user1v['skada2'];
        $user1_vapens = rand($user1_vapen1, $user1_vapen2);

        if(empty($user1['vapenid'])){
                $user1_vapenn = "knytnäve";
                $user1_vapens = rand(0, 2);
        }

        $user1_rustningid = $user1['rustningid'];
        $result6=mysql_query("SELECT * FROM multopia_rustningar WHERE id='$user1_rustningid'");
        $user1r=mysql_fetch_array($result6);
        $user1_rustnings = rand($user1r['skada1'], $user1r['skada2']);
        $user1_rustningn = $user1r['namn'];

        $f = ($user1_smidighet+$user2_smidighet);
        $a = ($user1_smidighet/$f);
        $e = ($user2_smidighet/$f);

        $c = ($a*15);
        $d = ($a*35);
        $b = ($a*100);

        $x = ($e*15);
        $z = ($b+$x);

        $w = ($e*35);
        $y = ($b+$w);

        $p = rand(0, 100);

        $m = ($e*100+$b);

        $user_skadatotal = ($user1_vapens+$skadebonus);

        if($p <= "$c"){
            echo "$user1n försöker attackera $user2n med $user1_vapenn, men $user2n hinner undvika anfallet.";
        } elseif($p <= "$d"){
            echo "$user1n försöker attackera $user2n med $user1_vapenn, men $user2n hinner blockera attacken.";
        } elseif($p <= "$b"){
            echo "$user1n attackerar $user2n med $user1_vapenn, som skadas $user_skadatotal.";
            $user2_hp = ($user2_hp-$user_skadatotal-$skadebonus1);

         } elseif($p <= "$z"){
            echo "$user2n försöker attackera $user1n med $user2_vapenn, men $user1n hinner undvika anfallet.";
        } elseif($p <= "$y"){
            echo "$user2n försöker attackera $user1n med $user2_vapenn, men $user1n hinner blockera attacken.";
        } elseif($p <= "$m"){
            if(!empty($user1_rustnings)){
                $rustning_visa = "(-$user1_rustnings, rustning)";
            } else {
                $rustning_visa = "";
            }
            echo "$user2n attackerar $user1n med $user2_vapenn, som skadas $user2_vapens. $rustning_visa";
            if($user1_rustnings > "$user2_vapens"){
                $user1_hp = ($user1_hp-$user2_vapens);
            } else {
                $user1_hp = ($user1_hp-$user2_vapens+$user1_rustnings);
            }
            mysql_query("UPDATE multopia_users SET hp='$user1_hp' WHERE id='$userid'");
        }
        
        echo "<br>";
    }

    echo "<br>";
}

} else {
    echo "Monstret du försöker möta vill inte möta dig för att du är på högre level.";
    echo "<br>";
    echo "Testa med något annat monster.";
}

}  // function

$matchen = foo($userid,$m);
mysql_query("INSERT INTO multopia_historia (rapport) VALUES ('$matchen')");

Om det är till någon hjälp ;)

Medlem sedan juni 20008 205 inlägg
#4

Jag orkar inte grotta runt i din kod, men som du ser ligger alla dina exit-anrop i if-satser. Det enklaste är att slänga på else-satser på dem. Om vi exempelvis kollar på din första exit:

if($user1_minhp < "30"){
    echo "Din krigare är för skadad för att kunna slås.";
    exit;
}

... så behöver du bara lägga resten av funktionen i en else-sats istället för att anropa exit. Det kommer bli rätt grötigt när du gör så med alla dina if-satser, eftersom det är en hyfsat ostrukturerad lösning du har nu. Den skulle må bra av lite objektorientering ;)

Medlem sedan nov. 200452 inlägg
#5

nu hänger jag inte med...
ska jag göra en STOR if-sats eller bara lägga dit
} else {
istället för
exit;
}

isåfall, vart ska sluttaggen för "else" vara då? :OO

Medlem sedan juni 20008 205 inlägg
#6

\r Aha, nu hajar jag! :i Tänkte i fel banor förut. Jag tror att saker och ting skulle bli bättre för dig om du bara nöjde dig med att säga return (som avbryter funktionen) i stället för exit (som avbryter scriptet). Dessutom ska du veta att du försöker ett returvärde från funktionen (genom att säga $matchen = foo($userid,$m);), men inget returneras någonsin, så inget kommer sparas i databasen. Det du skriver ut med echo hamnar direkt i webbläsaren.

Medlem sedan nov. 200452 inlägg
#7

jo... jag förstår hur du menar, men jg får fel på denna rad:

return $userid,$m;

ska det stå så eller har jag gjort fel :?

Medlem sedan juni 20008 205 inlägg
#8

Du har väl inte bytt ut foo($userid,$m) mot return $userid,$m? För det är helt fel. Dessutom kan du bara returnera en enda variabel.

Medlem sedan nov. 200452 inlägg
#9

spango skrev:

\r Aha, nu hajar jag! :i Tänkte i fel banor förut. Jag tror att saker och ting skulle bli bättre för dig om du bara nöjde dig med att säga return (som avbryter funktionen) i stället för exit (som avbryter scriptet). Dessutom ska du veta att du försöker ett returvärde från funktionen (genom att säga $matchen = foo($userid,$m);), men inget returneras någonsin, så inget kommer sparas i databasen. Det du skriver ut med echo hamnar direkt i webbläsaren.

Förklara lite hur du menar med "returneras". Vad ska ajag skriva istället för exit; om funktionen heter foo($userid,$m)?

Medlem sedan mars 20034 471 inlägg
#10

Pike skrev:

... Förklara lite hur du menar med "returneras". Vad ska ajag skriva istället för exit; om funktionen heter foo($userid,$m)?

Vad funktionen heter har inte med saken att göra. Det är vad som händer I den som är intressant. Några exempel:

function plus($k) {
   $res = $k + 19;
   echo "$res";
}

function plus2($k) {
   $res = $k + 19;
   return $res;
}

//main
$knas = plus(7);
$vett = plus2(7);

Vad händer? Jo:
plus(7) ==> $res får värdet 26 och detta skickas till webbläsaren.
Funktionen returnerar ingenting så echo $knas ger "" (tom sträng).

plus2(7) ==> $res får värdet 26 och detta returneras från funktionen och hamnar i $vett.
echo $vett ger 26 medan funktionen själv inte skriver ut värdet.

Om du returnerar eller ej beror på vad du vill att din funktion ska göra. Är du med så långt? :q

I princip är det riktigt att man bara kan returnera ett värde från en funktion, men vill man returnera flera går detta utmärkt i PHP om man lagrar dessa värden i en array och returnerar den.

//Helt värdelös funktion för det finns ingen logik i att slänga in
// värden bara för att ta ut dem igen, men som exempel...
funktion moreToReturn($a, $b) {
  $arr = array($a, $b);
  return $arr;
}
Medlem sedan nov. 200452 inlägg
#11

jo, jag hänger med... litegrann...
men jag har ju inte det som sk skrivas ut i någon $sträng för jag använder echo...

en match kan se ut såhär:

Runda 1:
Skorpion försöker attackera Pike med Klor, men Pike hinner undvika anfallet.
Skorpion attackerar Pike med Klor, som skadas 2.

Runda 2:
Skorpion attackerar Pike med Klor, som skadas 2.
Skorpion attackerar Pike med Klor, som skadas 2.

Runda 3:
Skorpion försöker attackera Pike med Klor, men Pike hinner undvika anfallet.
Pike försöker attackera Skorpion med stav, men Skorpion hinner undvika anfallet.

Runda 4:
Skorpion attackerar Pike med Klor, som skadas 2.
Skorpion attackerar Pike med Klor, som skadas 2.

Runda 5:
Skorpion försöker attackera Pike med Klor, men Pike hinner undvika anfallet.
Skorpion försöker attackera Pike med Klor, men Pike hinner blockera attacken.

Runda 6:
Skorpion försöker attackera Pike med Klor, men Pike hinner undvika anfallet.
Pike attackerar Skorpion med stav, som skadas 1.

Runda 7:
Skorpion attackerar Pike med Klor, som skadas 2.
Pike försöker attackera Skorpion med stav, men Skorpion hinner undvika anfallet.

Runda 8:
Skorpion försöker attackera Pike med Klor, men Pike hinner blockera attacken.
Pike attackerar Skorpion med stav, som skadas 3.

Runda 9:
Skorpion attackerar Pike med Klor, som skadas 2.

Skorpion vann striden.
Pike får 1$ som tack för att ha ställt upp.

Så kan mna inte lägga in allt somt functionen skriver ut i databasen eller ska jag byta ut echo till någon $sträng. Fasst det loopas ju?

Medlem sedan mars 20034 471 inlägg
#12

Hmm... hur mycket av ovan beskrivna match avgörs av indata från folk, och hur mycket avgörs av slumptal eller variabelvärden? :q

Medlem sedan nov. 200452 inlägg
#13

Den slumpar ju inte 100%... om du har mer smidighet än den andra så har du ju större chans att undvika och parera. Spelaren har en viss smidighet (som man får lite poäng att placera ut för varje level) och monstret har man gett visst mycket i databasen... men det den behöver hämta utanfär funktionen är ju vilket ID monster det är ($m) och vilket ID spelaren har....

Medlem sedan juni 20008 205 inlägg
#14

Pike: Ta inte illa upp, men jag skulle rekommendera att du sätter dig och försöker lära dig programmera, för det kan du helt uppenbart inte. Sätt dig ner med en schysst tutorial och läs in dig på hur funktioner fungerar.

Medlem sedan nov. 200452 inlägg
#15

Det är lungt spango, jag förstår om du tycker att jag inte är helt hajj på funktioner för att jag nästan aldrig använder det... Men är man 13 år och har programerat i bara 1.5/2 år så är man inte den bästa ju ;)

260 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)