Avatar billede spidr Nybegynder
13. april 2007 - 16:45 Der er 9 kommentarer og
1 løsning

Kode for lang

Ok, jeg har et spil hvor jeg tidligere brugte arrays til at bestemme brugerens level ud fra xp, mit problem er at nu hvor jeg er gået fra 100 til 1000 lvls er koden der styre den del af siden ved at blive lige stor nok, og jeg er sikker på der er en måde hvorpå denne kan optimeres, jeg kan bare ikke finde den.

Jeg bruger denne formel til at bestemme hvor mange XP brugeren skal bruge til næsten lvl: 5*x^2+95*x hvor x er brugerens lvl.

Tidligere har jeg brugt denne kode:

if($hentlvl >= 0 && $hentlvl < 999)
{
    if($XPpoint >= $XPpointArr[$hentlvl])
    {
        $XPstatus = $XPstatusArr[$hentlvl+1];
        $XPlvl = $hentlvl+1;
        $XPtop = $XPpointArr[$hentlvl+1];
        mysql_query("UPDATE LoveHinaUSERS SET lvl = " . $XPlvl . " WHERE Nickname = '$Nickname'");
    $levelup = yes;
    }
    else
    {
        $XPlvl = $hentlvl + 1;
        $XPstatus = $XPstatusArr[$hentlvl];
        $XPtop = $XPpointArr[$hentlvl];
    }
}

elseif ($hentlvl == 999){
        $XPlvl = $hentlvl;
        $XPstatus = $XPstatusArr[$hentlvl];
        $XPtop = $XPpointArr[$hentlvl];
}


Som bygger på nedenstående array, samt $hentlvl og $XPpoint som bliver hentet fra en sql database.


$XPpointArr = array(100, 210, 330, 460, 600, 750, 910, 1080, 1260, 1450, 1650, 1860, 2080, 2310, 2550, 2800, 3060, 3330, 3610, 3900, 4200, 4510, 4830, 5160, 5500, 5850, 6210, 6580, 6960, 7350, 7750, 8160, 8580, 9010, 9450, 9900, 10360, 10830, 11310, 11800, 12300, 12810, 13330, 13860, 14400, 14950, 15510, 16080, 16660, 17250, 17850, 18460, 19080, 19710, 20350, 21000, 21660, 22330, 23010, 23700, 24400, 25110, 25830, 26560, 27300, 28050, 28810, 29580, 30360, 31150, 31950, 32760, 33580, 34410, 35250, 36100, 36960, 37830, 38710, 39600, 40500, 41410, 42330, 43260, 44200, 45150, 46110, 47080, 48060, 49050, 50050, 51060, 52080, 53110, 54150, 55200, 56260, 57330, 58410, 59500, 60600, 61710, 62830, 63960, 65100, 66250, 67410, 68580, 69760, 70950, 72150, 73360, 74580, 75810, 77050, 78300, 79560, 80830, 82110, 83400, 84700, 86010, 87330, 88660, 90000, 91350, 92710, 94080, 95460, 96850, 98250, 99660, 101080, 102510, 103950, 105400, 106860, 108330, 109810, 111300, 112800, 114310, 115830, 117360, 118900, 120450, 122010, 123580, 125160, 126750, 128350, 129960, 131580, 133210, 134850, 136500, 138160, 139830, 141510, 143200, 144900, 146610, 148330, 150060, 151800, 153550, 155310, 157080, 158860, 160650, 162450, 164260, 166080, 167910, 169750, 171600, 173460, 175330, 177210, 179100, 181000, 182910, 184830, 186760, 188700, 190650, 192610, 194580, 196560, 198550, 200550, 202560, 204580, 206610, 208650, 210700, 212760, 214830, 216910, 219000, 221100, 223210, 225330, 227460, 229600, 231750, 233910, 236080, 238260, 240450, 242650, 244860, 247080, 249310, 251550, 253800, 256060, 258330, 260610, 262900, 265200, 267510, 269830, 272160, 274500, 276850, 279210, 281580, 283960, 286350, 288750, 291160, 293580, 296010, 298450, 300900, 303360, 305830, 308310, 310800, 313300, 315810, 318330, 320860, 323400, 325950, 328510, 331080, 333660, 336250, 338850, 341460, 344080, 346710, 349350, 352000, 354660, 357330, 360010, 362700, 365400, 368110, 370830, 373560, 376300, 379050, 381810, 384580, 387360, 390150, 392950, 395760, 398580, 401410, 404250, 407100, 409960, 412830, 415710, 418600, 421500, 424410, 427330, 430260, 433200, 436150, 439110, 442080, 445060, 448050, 451050, 454060, 457080, 460110, 463150, 466200, 469260, 472330, 475410, 478500, 481600, 484710, 487830, 490960, 494100, 497250, 500410, 503580, 506760, 509950, 513150, 516360, 519580, 522810, 526050, 529300, 532560, 535830, 539110, 542400, 545700, 549010, 552330, 555660, 559000, 562350, 565710, 569080, 572460, 575850, 579250, 582660, 586080, 589510, 592950, 596400, 599860, 603330, 606810, 610300, 613800, 617310, 620830, 624360, 627900, 631450, 635010, 638580, 642160, 645750, 649350, 652960, 656580, 660210, 663850, 667500, 671160, 674830, 678510, 682200, 685900, 689610, 693330, 697060, 700800, 704550, 708310, 712080, 715860, 719650, 723450, 727260, 731080, 734910, 738750, 742600, 746460, 750330, 754210, 758100, 762000, 765910, 769830, 773760, 777700, 781650, 785610, 789580, 793560, 797550, 801550, 805560, 809580, 813610, 817650, 821700, 825760, 829830, 833910, 838000, 842100, 846210, 850330, 854460, 858600, 862750, 866910, 871080, 875260, 879450, 883650, 887860, 892080, 896310, 900550, 904800, 909060, 913330, 917610, 921900, 926200, 930510, 934830, 939160, 943500, 947850, 952210, 956580, 960960, 965350, 969750, 974160, 978580, 983010, 987450, 991900, 996360, 1000830, 1005310, 1009800, 1014300, 1018810, 1023330, 1027860, 1032400, 1036950, 1041510, 1046080, 1050660, 1055250, 1059850, 1064460, 1069080, 1073710, 1078350, 1083000, 1087660, 1092330, 1097010, 1101700, 1106400, 1111110, 1115830, 1120560, 1125300, 1130050, 1134810, 1139580, 1144360, 1149150, 1153950, 1158760, 1163580, 1168410, 1173250, 1178100, 1182960, 1187830, 1192710, 1197600, 1202500, 1207410, 1212330, 1217260, 1222200, 1227150, 1232110, 1237080, 1242060, 1247050, 1252050, 1257060, 1262080, 1267110, 1272150, 1277200, 1282260, 1287330, 1292410, 1297500, 1302600, 1307710, 1312830, 1317960, 1323100, 1328250, 1333410, 1338580, 1343760, 1348950, 1354150, 1359360, 1364580, 1369810, 1375050, 1380300, 1385560, 1390830, 1396110, 1401400, 1406700, 1412010, 1417330, 1422660, 1428000, 1433350, 1438710, 1444080, 1449460, 1454850, 1460250, 1465660, 1471080, 1476510, 1481950, 1487400, 1492860, 1498330, 1503810, 1509300, 1514800, 1520310, 1525830, 1531360, 1536900, 1542450, 1548010, 1553580, 1559160, 1564750, 1570350, 1575960, 1581580, 1587210, 1592850, 1598500, 1604160, 1609830, 1615510, 1621200, 1626900, 1632610, 1638330, 1644060, 1649800, 1655550, 1661310, 1667080, 1672860, 1678650, 1684450, 1690260, 1696080, 1701910, 1707750, 1713600, 1719460, 1725330, 1731210, 1737100, 1743000, 1748910, 1754830, 1760760, 1766700, 1772650, 1778610, 1784580, 1790560, 1796550, 1802550, 1808560, 1814580, 1820610, 1826650, 1832700, 1838760, 1844830, 1850910, 1857000, 1863100, 1869210, 1875330, 1881460, 1887600, 1893750, 1899910, 1906080, 1912260, 1918450, 1924650, 1930860, 1937080, 1943310, 1949550, 1955800, 1962060, 1968330, 1974610, 1980900, 1987200, 1993510, 1999830, 2006160, 2012500, 2018850, 2025210, 2031580, 2037960, 2044350, 2050750, 2057160, 2063580, 2070010, 2076450, 2082900, 2089360, 2095830, 2102310, 2108800, 2115300, 2121810, 2128330, 2134860, 2141400, 2147950, 2154510, 2161080, 2167660, 2174250, 2180850, 2187460, 2194080, 2200710, 2207350, 2214000, 2220660, 2227330, 2234010, 2240700, 2247400, 2254110, 2260830, 2267560, 2274300, 2281050, 2287810, 2294580, 2301360, 2308150, 2314950, 2321760, 2328580, 2335410, 2342250, 2349100, 2355960, 2362830, 2369710, 2376600, 2383500, 2390410, 2397330, 2404260, 2411200, 2418150, 2425110, 2432080, 2439060, 2446050, 2453050, 2460060, 2467080, 2474110, 2481150, 2488200, 2495260, 2502330, 2509410, 2516500, 2523600, 2530710, 2537830, 2544960, 2552100, 2559250, 2566410, 2573580, 2580760, 2587950, 2595150, 2602360, 2609580, 2616810, 2624050, 2631300, 2638560, 2645830, 2653110, 2660400, 2667700, 2675010, 2682330, 2689660, 2697000, 2704350, 2711710, 2719080, 2726460, 2733850, 2741250, 2748660, 2756080, 2763510, 2770950, 2778400, 2785860, 2793330, 2800810, 2808300, 2815800, 2823310, 2830830, 2838360, 2845900, 2853450, 2861010, 2868580, 2876160, 2883750, 2891350, 2898960, 2906580, 2914210, 2921850, 2929500, 2937160, 2944830, 2952510, 2960200, 2967900, 2975610, 2983330, 2991060, 2998800, 3006550, 3014310, 3022080, 3029860, 3037650, 3045450, 3053260, 3061080, 3068910, 3076750, 3084600, 3092460, 3100330, 3108210, 3116100, 3124000, 3131910, 3139830, 3147760, 3155700, 3163650, 3171610, 3179580, 3187560, 3195550, 3203550, 3211560, 3219580, 3227610, 3235650, 3243700, 3251760, 3259830, 3267910, 3276000, 3284100, 3292210, 3300330, 3308460, 3316600, 3324750, 3332910, 3341080, 3349260, 3357450, 3365650, 3373860, 3382080, 3390310, 3398550, 3406800, 3415060, 3423330, 3431610, 3439900, 3448200, 3456510, 3464830, 3473160, 3481500, 3489850, 3498210, 3506580, 3514960, 3523350, 3531750, 3540160, 3548580, 3557010, 3565450, 3573900, 3582360, 3590830, 3599310, 3607800, 3616300, 3624810, 3633330, 3641860, 3650400, 3658950, 3667510, 3676080, 3684660, 3693250, 3701850, 3710460, 3719080, 3727710, 3736350, 3745000, 3753660, 3762330, 3771010, 3779700, 3788400, 3797110, 3805830, 3814560, 3823300, 3832050, 3840810, 3849580, 3858360, 3867150, 3875950, 3884760, 3893580, 3902410, 3911250, 3920100, 3928960, 3937830, 3946710, 3955600, 3964500, 3973410, 3982330, 3991260, 4000200, 4009150, 4018110, 4027080, 4036060, 4045050, 4054050, 4063060, 4072080, 4081110, 4090150, 4099200, 4108260, 4117330, 4126410, 4135500, 4144600, 4153710, 4162830, 4171960, 4181100, 4190250, 4199410, 4208580, 4217760, 4226950, 4236150, 4245360, 4254580, 4263810, 4273050, 4282300, 4291560, 4300830, 4310110, 4319400, 4328700, 4338010, 4347330, 4356660, 4366000, 4375350, 4384710, 4394080, 4403460, 4412850, 4422250, 4431660, 4441080, 4450510, 4459950, 4469400, 4478860, 4488330, 4497810, 4507300, 4516800, 4526310, 4535830, 4545360, 4554900, 4564450, 4574010, 4583580, 4593160, 4602750, 4612350, 4621960, 4631580, 4641210, 4650850, 4660500, 4670160, 4679830, 4689510, 4699200, 4708900, 4718610, 4728330, 4738060, 4747800, 4757550, 4767310, 4777080, 4786860, 4796650, 4806450, 4816260, 4826080, 4835910, 4845750, 4855600, 4865460, 4875330, 4885210, 4895100, 4905000, 4914910, 4924830, 4934760, 4944700, 4954650, 4964610, 4974580, 4984560, 4994550, 5004550, 5014560, 5024580, 5034610, 5044650, 5054700, 5064760, 5074830, 99999999, 999999999
);
Avatar billede nixir Nybegynder
13. april 2007 - 20:48 #1
For det første bør du ikke lave dit array som du gør.. Du bør tilføje dem en af gangen like:

$XPpointArr[] = 100;
$XPpointArr[] = 210;
$XPpointArr[] = 330;
etc...

Det kan lyde ret mærkeligt, men det er rent faktisk hurtigere... På samme måde skal dit status-array laves...

Først skal det lige siges at jeg har valgt at baserer mit svar på denne formel:
5 * x ^ 2 + 95 * x
Altså går jeg ud fra at der ingen paranteser er, eller skulle være som fx:
(5 * x )^(2 + 95 * x)

Mit svar bliver så hvordan man kan fjerne det besværlige array med point...

if($hentlvl >= 0 && $hentlvl < 999)
{
    if($XPpoint >= (5 * $hentlvl ^ 2 + 95 * $hentlvl))
    {
        $XPstatus = $XPstatusArr[$hentlvl+1];
        $XPlvl = $hentlvl+1;
        $XPtop = 5 * ($hentlvl+1) ^  2 + 95 * ($hentlvl+1);
        mysql_query("UPDATE LoveHinaUSERS SET lvl = " . $XPlvl . " WHERE Nickname = '$Nickname'");
        $levelup = yes;
    }
    else
    {
        $XPlvl = $hentlvl + 1;
        $XPstatus = $XPstatusArr[$hentlvl];
        $XPtop = $XPpointArr[$hentlvl];
    }
}

elseif ($hentlvl == 999){
        $XPlvl = $hentlvl;
        $XPstatus = $XPstatusArr[$hentlvl];
        $XPtop = 5 * $hentlvl ^  2 + 95 * $hentlvl;
}

Det burde fjerne dit behov for at indtaste point-array, men status array går jeg ud fra er noget i stil med et slags "rang-navn" - men det er intet problem at beholde det sku jeg mene, der kan du bare tilføje navne til dit array - så længe du giver dem array nummeret der svarer til deres lvl.

Self tager jeg forbehold for fejl :)

Du må jo lige accepterer / afvise svar, for var ikke helt sikker på hvad du spørger om...
Avatar billede morhan Novice
13. april 2007 - 20:59 #2
nixir, hvis jeg benchmarker dit udsagn får jeg (ved at bruge hans array):

<?php
function microtime_float(){
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}

$start = microtime_float();
include("array1.php");
//include("array2.php");
$slut= microtime_float();

echo $slut-$start;
?>


alle på én gang:
0.00236797332764
0.00250601768494
0.00250101089478
0.00262188911438

enkeltvis:
0.0076680183410
0.0084011554718
0.0079038143158
0.0071120262146
Avatar billede spidr Nybegynder
13. april 2007 - 21:33 #3
Hmmm, faktisk ret spændene hvad der er hurtigst, men er vi ikke enige om det er hurtigst helt uden et array, og med formlen istedet? :)
Avatar billede spidr Nybegynder
13. april 2007 - 21:47 #4
Btw nixir, det ser ud præcis som jeg havde tænkt mig, utroligt jeg ikke selv kunne tænmke til det :)

Tester det her senere, det er lidt svært for mig at teste uden at det hele går ned hvis ikke det virker :D

Men ville også gerne lige have flere syn på hvad der er hurtigst, men vil mene det er din kode :)
Avatar billede nixir Nybegynder
13. april 2007 - 22:13 #5
Morhan >> Jeg sku mene jeg har ret - men har dog aldrig testet det ligesom dig...
Min kilde er andre brugere af php.net, som har postet den metode jeg påstod var hurtigst, som den hurtigeste..
Kilde: http://dk.php.net/manual/en/function.array.php#50097


Men jeg tror det kan ligge i, at det array der skal oprettes, er ren tal... Forsøg med at oprette 100 "rækker"/"linier" (ved faktisk ikke hvad det hedder?) som indeholder bogstaver (ligesom hans status-array vil gøre det)...
Opret bogstavs-array'et på følgende måder:

$array = array('tEst1', 'tEst2', 'tEst3', 'tEst4', 'tEst5', 'tEst6', ... , 'tEst100');
  eller
$array[] = 'tEst1';
$array[] = 'tEst2';
$array[] = 'tEst3';
$array[] = 'tEst4';
$array[] = 'tEst5';
$array[] = 'tEst6';
...
$array[] = 'tEst100';

Bare for at se hvad forskellen er... :) Nu har du jo lavet funktionen anyway :P
Kan det have nogen indflydelse at det er flere linier/flere bits der skal includeres når du laver array vi include? Er bare nysgerrig...


spidr >> Du må lige fortælle om udregningen af point er rigtig ...
Avatar billede spidr Nybegynder
13. april 2007 - 22:29 #6
Nixir, ja, er igang med at lave en måde så jeg kan teste det :D


Her er mit array med status (dog kun til lvl 300),men det har jeg tænkt mig at
fjerne, bare så i kan teste det :)


$XPstatusArr = array("Wannabe Wanker Rank1","Wannabe Wanker Rank2","Wannabe Wanker Rank3","Wannabe Wanker Rank4","WWannabe Wanker Rank5","Wanker Rank1","Wanker Rank2","Wanker Rank3","Wanker Rank4","Wanker Rank5","Keitaro Wannabe Rank1","Keitaro Wannabe Rank2","Keitaro Wannabe Rank3","Keitaro Wannabe Rank4","Keitaro Wannabe Rank5","Girls Friend Rank1","Girls Friend Rank2","Girls Friend Rank3","Girls Friend Rank4","Girls Friend Rank5",
"Girls Close Friend Rank1","Girls Close Friend Rank2","Girls Close Friend Rank3","Girls Close Friend Rank4","Girls Close Friend Rank5","Girls Best Friend Rank1","Girls Best Friend Rank2","Girls Best Friend Rank3","Girls Best Friend Rank4","Girls Best Friend Rank5","Love Sick Rank1","Love Sick Rank2","Love Sick Rank3","Love Sick Rank4","Love Sick Rank5","Stalker Rank1","Stalker Rank2","Stalker Rank3","Stalker Rank4","Stalker Rank5",
"Thoughtful Rank1","Thoughtful Rank2","Thoughtful Rank3","Thoughtful Rank4","Thoughtful Rank5","Admirable Rank1","Admirable Rank2","Admirable Rank3","Admirable Rank4","Admirable Rank5","Awesome Rank1","Awesome Rank2","Awesome Rank3","Awesome Rank4","Awesome Rank5","Beloved Rank1","Beloved Rank2","Beloved Rank3","Beloved Rank4","Beloved Rank5",
"Kentaro Sakata Rank1","Kentaro Sakata Rank2","Kentaro Sakata Rank3","Kentaro Sakata Rank4","Kentaro Sakata Rank5","#66","#67","#68","#69","#70","#71","#72","#73","#74","#75","#76","#77","#78","#79","#80",
"#81","#82","#83","#84","#85","#86","#87","#88","#89","#90","#91","#92","#93","#94","#95","#96","#97","#98","#99","#Hitch Rank1",
"Hitch Rank2","Hitch Rank3","Hitch Rank4","Hitch Rank5","#105","#106","#107","#108","#109","#110","#111","#112","#113","#114","#115","#116","#117","#118","#119","#120",
"#121","#122","#123","#124","#125","#126","#127","#128","#129","#130","#131","#132","#133","#134","#135","#136","#137","#138","#139","#140",
"#141","#142","#143","#144","#145","#146","#147","#148","#149","#150","#151","#152","#153","#154","#155","#156","#157","#158","#159","#160",
"#161","#162","#163","#164","#165","#166","#167","#168","#169","#170","#171","#172","#173","#174","#175","#176","#177","#178","#179","#180",
"#181","#182","#183","#184","#185","#186","#187","#188","#189","#190","#191","#192","#193","#194","#195","#196","#197","#198","#199","#Don Juan Rank1",
"Don Juan Rank2","Don Juan Rank3","Don Juan Rank4","Don Juan Rank5","#205","#206","#207","#208","#209","#210","#211","#212","#213","#214","#215","#216","#217","#218","#219","#220",
"#221","#222","#223","#224","#225","#226","#227","#228","#229","#230","#231","#232","#233","#234","#235","#236","#237","#238","#239","#240",
"#241","#242","#243","#244","#245","#246","#247","#248","#249","#250","#251","#252","#253","#254","#255","#256","#257","#258","#259","#260",
"#261","#262","#263","#264","#265","#266","#267","#268","#269","#270","#271","#272","#273","#274","#275","#276","#277","#278","#279","#280",
"#281","#282","#283","#284","#285","#286","#287","#288","#289","#290","#291","#292","#293","#294","#295","Wintas Assistant Rank1","Wintas Assistant Rank2","Wintas Assistant Rank3","Wintas Assistant Rank4","Wintas Assistant Rank5","God of love!");
Avatar billede nixir Nybegynder
13. april 2007 - 22:53 #7
lige præcis hvad jeg tænkte ...

Prøv at brug ' istedet for " .. det burde være hurtigere ...
Avatar billede spidr Nybegynder
14. april 2007 - 00:29 #8
Virker ikke helt, men er ved at prøve at finde fejlen, den får det til at jeg skal bruge 62692 til næste lvl når  jeg er lvl 672, og det er jo HELT forkert, burde nærmere være noget alla 2328580 :S
Avatar billede spidr Nybegynder
14. april 2007 - 00:35 #9
Måtte lige ændre lidt :D men nu virker det :D


if($hentlvl >= 0 && $hentlvl < 999)
{
    if($XPpoint >= (5*pow($hentlvl,2) + 95 * $hentlvl))
    {
        $XPlvl = $hentlvl+1;
        $XPtop = 5 * pow($hentlvl+1,2) + 95 * ($hentlvl+1);
        mysql_query("UPDATE LoveHinaUSERS SET lvl = " . $XPlvl . " WHERE Nickname = '$Nickname'");
        $levelup = yes;
    }
    else
    {
        $XPlvl = $hentlvl + 1;
        $XPtop = 5 * pow($hentlvl+1,2) + 95 * ($hentlvl+1);
    }
}

elseif ($hentlvl == 999){
        $XPlvl = $hentlvl;
        $XPtop = 5 * pow($hentlvl,2) + 95 * ($hentlvl);
}
Avatar billede nixir Nybegynder
14. april 2007 - 19:54 #10
Okay ... godt du fik det til at virke :)
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