NeWorld

Trikampiai skaičiai

by neworld on Rgp.01, 2007, under matematika, php, Programavimas, Žaidimas

Neseniai šių skaičių atradimas man išgelbėjo gyvybę (perkeltine prasme, nieks žudytis nebandė:)). Taigi viskas prasidėjo nuo to, kad mano sugalvota funkcija, kuri pagal taškus išvesdavo lygį. Ją taikydavau žaidimė visur, pradedant lygio skaičiavimu, baigiant garaže.

Pati funkcija atrodė taip:

[code lang="php"]function getlvl($exp,$bit) {
$i=$bit;
$lvl=0;
while ($exp>$i) {
$exp=$exp-$i;
$i=$i+$bit;
$lvl++;
};
return $lvl;
};[/code]

sakykim, kai $bit yra vienas, tai gaunam tokią seką: 1, 3, 6, 10, 15, 21, 28, 36 ir t.t. Vienu žodžiu jo formulė atrodytų taip A(n)=A(n-1)+n;

Tačiau, žiuriu jog žaidime žaidėjų lygiai labai greitai kyla. Tad kuo toliau, tuo yra viniojamas vis didesnis ciklas. Tad sugalvojau sukurti formulę, kuri galbūt ne tiksliai paskaičiuos, bet maždaug plius minus pataikys tiem skaičiams. Deje į galvą šovė kvadratinės formulės, kurios niekaip nesutapdavo su mano reikalingais skačiais. Tada nusprendžiau iš savo formulės išsivesti reikiamą, tačiau vėl, skaičiavau. Pagavau tik viena sistemą, kad radimas pagal $bit būtų sekos nario dauginimas iš $bit. Taigi funkcija:

[code lang="php"]function getlvl($exp,$bit) {
$i=0;
$exp=floor($exp/$bit);//naudoju floor, dėl didesnio tikslumo
$lvl=0;
while ($exp>$i) {
$exp=$exp-$i;
$i=$i++;
$lvl++;
};
return $lvl;
};[/code]

Vualia. Jau šiek tiek laimėjau, mano formulė skaičiuos tiksliau esant dideliem argumentam. Tačiau manęs tai netenkino. Ilgai žiūrėdamas į seką 1, 3, 6, 10, 15, 21, 28 pagalvojau juos suvesti į visagalį google. Deje nieko. Pagalvojau gal reikėtų patrumpinti seką (jug kas nerizikuoja, ats negeria šampano). Nu ir ką, pats pirmasis rezultatas buvo http://www.research.att.com/~njas/sequences/A000217. Sulyginu su savo seka ir jos sutampa. Gera pradžia pusę darbo. Vartydamas tinklapį pamatau formulę A(n)=n(n+1)/2. Paskaičiuoju, viskas tinka. Tada dar radau keletą nuorodų ir sužinau dėl ko šitie skaičiai tokie įpatingi:

http://www.shyamsundergupta.com/triangle.htm

http://milan.milanovic.org/math/english/triangular/triangular.html

ogi dėlto, jog jie parodo obejktų dėliojimą vertikaliu trikampu skaičių, žinant pagrindo dydį, arba aukštį. Sakykim norim sudėt konservų dėžutes 20 dėžučių auksčiu. Taigi pagal formulę mes gausim A(20)=20(20+1)/2=20*21/2=210, mum reikės 210 dėžučių.

O man reikia pagal dėžučių skaičių nustatyti aukštį. Taigi imam ir pasirašom kvadratinę formulę:

x(x+1)/2=210
x^2+x-420=0
D=b^2-4ac=1^2-4*1*(-420)=1+1680
<....> (nenorių rašyti, kadangi vienoje eiltėje nesigaus taip gražiai kaip pipieruje
x=20

Taigi formulę turim. Dabar ją reikia parašyti php kalba (aišku su $bit kintamuoju kuris parodis imties dydį):

[code lang="php"]//gaunam taškų skaičių pagal lygį
function getexp($lvl,$bit) {
$A=$lvl*($lvl+1)/2;
return $A*$bit;
};
//gaunam lygi pagal taškus
function getlvl($exp,$bit) {
$D=1+4*2*$exp/$bit;
$x=floor((sqrt($D)-1)/2);
//return $x*$bid;
return $x;
};
//gaunam procentais kiek jau užpildėm einančio lygio
function getexpper($lvl,$exp,$bit) {
$x1=getexp($lvl,$bit);
$x2=getexp($lvl+1,$bit);
$all=$x2-$x1;
$exp2=$exp-$x1;
$r=round($exp2/$all*100);
return $r;
};[/code]

Sudėjau visas formules, gal kam pravers. Tiesa, paskutinioji tik pasinaudoja ankstensmėis formulėmis, tad jos keisti nereikėjo


Comments are closed.

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!