Otóż pisałem już jakiś czas temu skrypt do własnej gry bazującej na silniku Vallheru, lecz ostatnio napotkałem na pewno niedociągnięcie w logice skryptu. Pytałem się już o to na forum zajmującym się m.in. tym enginem, ale nie dostałem odpowiedzi, która by mnie satysfakcjonowała.
Wszystko jest oparte na smartku i Ado.
Jest to skrypt szkolenia postaci. Problem polega na tym że podczas treningu koszt jest naliczany wedle pierwszej zmiennej ze wzoru, zaś celem jest by koszt był naliczany osobno za każdym razem, a nie tylko raz na początku.
Wykonałem pętle for do tego:
[php]<?php
for ($i=0;$i<$_POST['rep'];$i++) {
$cost_sila = (ceil(($player -> strength*($player -> strength*0.05))*($cost2 + $cost3)));
$cost1 += $cost_sila;
$db -> Execute("UPDATE players SET strength=strength+".$_POST["rep"]." WHERE id=".$player -> id);
$db -> Execute("UPDATE players SET credits=credits-".$cost." WHERE id=".$player -> id);
}
?>[/php]
Wedle zamierzeń pętla miała się wykonywac $_POST['rep'] razy, $cost_sila to wzór z zastosowaniem klas ($cost2 i $cost3 to zmienne liczbowe ze switch'a), następnie koszt miał byc dodawany do całkowitego kosztu, na koniec updatowana jest baza i pętla idzie jeszcze raz od początku, przynajmniej takie było zamierzenie...
Gdy cena (wyliczona początkowo ze wzoru) jest równa 450 to po jednym treningu ubywa 450 credits i przybywa 1 strength. Jednak gdy cena wynosi 452 i trenuje 2 razy to odejmuje 904 credits (czyli 452+452), z czego wynika że pętla nie wykonała wzoru z nowymi parametrami i liczyła tak samo jak za pierwszym razem. I tu właśnie tkwi cały problem.
Moim celem jest by, np. gdy koszt równa się 100, a po wyliczeniach wzoru z nowymi parametrami było (np.!) +1, czyli przy treningu 3 razy wzór wyglądał by tak: 100 + 101 = 201 + 102 = 303.
Proszę Was o szybka i fachową pomoc.
Pozdrawiam
Anorax
P.s. poniżej zamieszczam cały kod tego get'a.
[php]<?php
if (isset ($_GET['view']) && $_GET['view'] == 'sila') {
$cost_s = ceil(($player -> strength*($player -> strength*0.05))*($cost2 + $cost3));
//trenowanie siły
if (isset ($_GET['train']) && $_GET['train'] == 'sila') {
if (!isset($_POST['rep'])) {
error("Powiedz ile chcesz ćwiczyć!");
}
if (!ereg("^[1-9][0-9]*$", $_POST["rep"])) {
error ("Zapomnij o tym!");
}
$_POST["rep"] = mysql_real_escape_string($_POST["rep"]);
$cost_sila = $cost_s;
//pętla
for ($i=0;$i<$_POST['rep'];$i++) {
$cost_sila = (ceil(($player -> strength*($player -> strength*0.05))*($cost2 + $cost3)));
$cost1 += $cost_sila;
$db -> Execute("UPDATE players SET strength=strength+".$_POST["rep"]." WHERE id=".$player -> id);
$db -> Execute("UPDATE players SET credits=credits-".$cost." WHERE id=".$player -> id);
}
$energia = ($_POST["rep"] * 0.5);
if ($player -> energy < $energia || $_POST["rep"] < 1) {
error ("Nie masz tyle energii!");
}
if ($cost > $player -> credits) {
error ("A czym niby chcesz za to zapłacić?!?");
}
$db -> Execute("UPDATE players SET energy=energy-".$energia." WHERE id=".$player -> id);
$smarty -> assign ("Messege", "".$on_ona2." bardzo długo, dzięki czemu twoja siła wzrasta o ".$_POST["rep"]." za ".$cost." sztuk złota i ".$energia." punktów energii");
}
$smarty -> assign(array("Cost" => $cost_s, "View" => $_GET['view']));
}
?>[/php]
[php] Bierzące naliczanie w pętli [ważne]
Re: [php] Bierzące naliczanie w pętli [ważne]
[php]<?php
$db -> Execute("UPDATE players SET credits=credits-".$cost." WHERE id=".$player -> id);
?>[/php]
wywal za pętlę. Powinno ruszyć
$db -> Execute("UPDATE players SET credits=credits-".$cost." WHERE id=".$player -> id);
?>[/php]
wywal za pętlę. Powinno ruszyć
Re: [php] Bierzące naliczanie w pętli [ważne]
To za dużo nie dało, poza tym że jest błąd logiczny człowieka, bo po co zmienia pierw wartośc credits i potem sprawdza czy credits jest większe lub równe kosztowi. To jednak nie zmienia faktu że problem ciągle istnieje.
Gdy koszt początkowy wynosił 463 to po jednym treningu ($_POST['rep'] = 1) to cena końcowa wynosiła 463. Jednak gdy koszt początkowy wynosił 466 to po dwóch treningach ($_POST['rep'] = 2) cena końcowa jest równa 932, czyli 266*2, a nie o to chodzi.
Wiem że jest to dosyc trudne do zrozumienia
Chcę żeby za każdym razem pętla wykonywała wzór na koszt z nowymi parametrami.
Powiedzmy że wzór to (1 + x).
X jest to trenowana wartośc, powiedzmy że 100.
Czyli:
<?php
$x = 100
for ($i=0; $i< $x; $i++) {
$cost_sila = $x + 1;
$cost1 += $cost_sila;
$db -> Execute("UPDATE players SET strength=$x WHERE id=1");
}
?>
Z tego wynika że przy jednym treningu powinienem zapłacic 101, a przy następnych $x + a.
Czyli przy trzech treningach powinno to tak wyglądac: 100 + 101 = 201 + 102 = 303.
A tu na złośc ciągle jest 300...
Gdy koszt początkowy wynosił 463 to po jednym treningu ($_POST['rep'] = 1) to cena końcowa wynosiła 463. Jednak gdy koszt początkowy wynosił 466 to po dwóch treningach ($_POST['rep'] = 2) cena końcowa jest równa 932, czyli 266*2, a nie o to chodzi.
Wiem że jest to dosyc trudne do zrozumienia
Chcę żeby za każdym razem pętla wykonywała wzór na koszt z nowymi parametrami.
Powiedzmy że wzór to (1 + x).
X jest to trenowana wartośc, powiedzmy że 100.
Czyli:
<?php
$x = 100
for ($i=0; $i< $x; $i++) {
$cost_sila = $x + 1;
$cost1 += $cost_sila;
$db -> Execute("UPDATE players SET strength=$x WHERE id=1");
}
?>
Z tego wynika że przy jednym treningu powinienem zapłacic 101, a przy następnych $x + a.
Czyli przy trzech treningach powinno to tak wyglądac: 100 + 101 = 201 + 102 = 303.
A tu na złośc ciągle jest 300...
Re: [php] Bierzące naliczanie w pętli [ważne]
koszt = 100Moim celem jest by, np. gdy koszt równa się 100, a po wyliczeniach wzoru z nowymi parametrami było (np.!) +1, czyli przy treningu 3 razy wzór wyglądał by tak: 100 + 101 = 201 + 102 = 303.
gratis = 1
ilerazy=3
koszt razem = ilerazy*koszt + ( (0+ilerazy-1)*ilerazy / 2) * gratis
to kupa na koncu to po prostu suma ciagu arytmetycznego 0 do ilerazy-1
