[php] Hoogste 10 highscores in een textbestand

Pagina: 1
Acties:

  • Johnny
  • Registratie: December 2001
  • Laatst online: 13:10

Johnny

ondergewaardeerde internetguru

Topicstarter
Volgende maand bestaat een website die ik moet onderhouden precies 1 jaar. Ik dacht er aan omdat te vieren met een nieuw javascript spelletje (tetris, snake of iets dergelijks).

Om het wat leuker te maken moeten de hoogste 10 scores worden opgeslagen en op volgorde van hoog naar laag worden weergegeven met daarachter de naam van de speler en de datum. Zonder gebruik van een MySQL database. Een los .txt bestandje dus.

Het script moet:
- bestand openen en de scores vergelijken met de behaalde score
- als de score hoger is dan de laagste score in het bestand moet hij op de juiste plek worden ingevoegd en de scores daaronder moeten een plaats opschuiven, de laatste wordt verwijderd.
- de scores in een tabel weergeven.

Het eerste en laatse punt zijn geen probleem. Maar het op laten schuiven van alle scores lijkt me een beetje heel erg omslachtig gaan als ik iedere variable opnieuw moet schrijven. Het vergelijk en verschuif gedeelte is daarom nog niet aanwezig.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?
$data='highscores.txt';
$date=date("d-m-Y");
$openfile = fopen("$data", "w+");

//Opent het scorebestand en vergelijkt de highscores met de zojuist behaald score
       {$afile = file($data);
for($num = 1; $num <= 10; $num++)
{$bfile = explode("|",$afile[$num]);
//Als de behaalde score groter is dan een highscore zegt variable $place op welke plaats hoe komt
if($score > $bfile[0]){$place = $num}
}
//Als de score niet hoger is dan een highscore: exit.
if($place == "") {exit();}


//Opent het scorebestand en overschrijft het met de juiste data.

fputs($openfile,"$score1|$name1|$date1\n
$score2|$name2|$date2\n
$score3|$name3|$date3\n
$score4|$name4|$date4\n
$score5|$name5|$date5\n
$score6|$name6|$date6\n
$score7|$name7|$date7\n
$score8|$name8|$date8\n
$score9|$name9|$date9\n
$score10|$name10|$date10\n);

FClose($openfile);

//Geeft de 10 regels weer in een tabel met 3 kolommen: score, naam, datum

echo "<table><tr><td><b>Score</b></td><td><b>Naam</b></td><td><b>Datum</b></td></tr>";

       {$afile = file($data);
for($num = count($afile) -1; $num <= 10; $num++)
{$bfile = explode("|",$afile[$num]);

echo"<tr><td>$bfile[0]</td><td>$bfile[1]</td><td>$bfile[2]</td></tr>";

}

echo "</table>";

?>


het zou best kunnen dat er nog andere fouten in de code ziten, ik heb hem nog niet kunnen uittesten. Natuurlijk heb ik de search niet kunnen gebruiken.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:00
Lees het bestand in in een array, sorteer de array, schrijf het bestand weg.

https://fgheysels.github.io/


Verwijderd

koop boek .. en leer !

  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 26-08 18:02
Daar help je niet echt mee, met zo'n opmerking. We komen juist hier om elkaar op weg te helpen bij problemen.

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:00
Inderdaad Skizmo. Het is al niet de eerste keer meer dat je een nutteloze opmerking plaatst zoals deze...

https://fgheysels.github.io/


  • Johnny
  • Registratie: December 2001
  • Laatst online: 13:10

Johnny

ondergewaardeerde internetguru

Topicstarter
We hebben alleen een halve supermarkt (d ie ook dienst doet als postkantoor) op het dorp. De dichtsbijzijnde "ontwikkelde" plaats met boekenwinkels is 12 kilometer hiervandaan. Ze zien me al komen "Een boek over PHP? Oh, iets met computers... we kunnen het wel bestellen, over 3 weken is het er misschien wel." En het is vandaag ook nog eens zondag... (Nee ik ken bol.com niet).

Maar als je het zo goed weet, help me dan even...

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Verwijderd

check de volgende links eens. Ze gaan beide over (sort) algoritmen. Wellicht heb je hier iets aan.

1. http://www.dcc.uchile.cl/~rbaeza/handbook/sort_a.html
2. http://homepages.borland....ibrary/Delphi/Algorithms/

Ik moet er wel ff bij vermelden dat het niet PHP geschreven is, maar ik ga er vanuit dat na enige zelfstudie wel moet lukken.

Wat betreft punt 1. van jouw probleemstelling: Lees alle waarden van die file in, in een array daarna die van het huidige spelletje en laat hierna de sort functie erop los. Daarna kun je het bestand weggooien en de 1e 10 waarden uit de array lezen en met deze waarden een nieuw bestand aanmaken / vullen. Suc6 :)

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

Voor de liefhebbers.

Ik had zelf laatst iets nodig wat een soortgelijke funktie had. Hebbem een beetje aangepast voor je. Het is mooi weer geweest vandaag (kuch kuch), dus veel plezier ermee..

Check ook gewoon even op je het zelf snapt ? ;)


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<? 

// Hier heb ik mee getest, ik weet niet waar jou waarden vandaan komen

$score = $_GET['score'];
$naam = $_GET['naam'];

//-----------------

define ( "HIGHSCORES", "highscores.dat" );


// Sorteer funktie om op basis van de score te bepalen wie boven of onder moet.
function _sorteer_functie( $a, $b )
{
    if ( $a["score"] == $b["score"] )
        return 0;
    return ( $a["score"] > $b["score"] ) ? -1 : 1;

}

// Lees scorelijst in van disk
function leesLijst()
{
    // Zorgen dat het bestand in ieder geval bestaat
    $fp = fopen( HIGHSCORES, "a+" );
    if( $fp )
        fclose( $fp );

    $content = file( HIGHSCORES );

    $scorelijst = Array();

    while( list( $key, $regel ) = each ( $content ) )
    {
        if( trim( $regel ) != "" )
        {
            $velden = explode( "|", $regel );
            
            $scorelijst[] = Array("score" => $velden[0],
                          "naam" => $velden[1],
                          "datum" => $velden[2]
                          );
        }
    }

    return $scorelijst;
}

// Schrijf scorelijst weg naar disk
function schrijfLijst( $scorelijst )
{
    
    // Open het bestand
    $fp = fopen( HIGHSCORES, "w" );

    if( !$fp )
    {
        print "Bestand kon niet worden geopend.";
        exit;
    }
    
    while( list( $key, $velden ) = each ( $scorelijst ) )
    {

        $regel = $velden["score"] . "|" . $velden["naam"] . "|" . $velden["datum"] . "\n";

        fputs( $fp, $regel );
    
    }
    
    fclose ( $fp );

}

// -----------------------------------------------------------------------------------------

// Lees de bestaande lijst in
$scorelijst = leesLijst();

// Voeg nieuwe score toe als ie is opgegeven (dit moet je even aanpassen aan je wensen)
if( $score != 0 )
{
    $scorelijst[] = Array("score" => $score,
                  "naam" => $naam,
                  "datum" => date("d-m-Y")
                );
}

// Sorteer de lijst met behulp van bovenstaande funktie.
usort( $scorelijst, "_sorteer_functie" );

// Limiteer lijst tot 10 items (kun je aanpassen als je meer items wilt opslaan)
$scorelijst = array_slice( $scorelijst, 0, 10 );  

// Schrijf de lijst weg
schrijfLijst( $scorelijst );

// Druk lijst af

print "<TABLE>";
print "<TR><TH>#</TH><TH>Score</TH><TH>Naam</TH><TH>Datum</TH></TR>";

reset( $scorelijst );

while( list( $key, $regel ) = each ( $scorelijst ) )
{
    print "<TR>";
    print "<TD>" . (string)($key + 1) . "</TD><TD>" . $regel["score"] . "</TD><TD>" . 
        $regel["naam"] . "</TD><TD>" . $regel["datum"] . "</TD>";
    print "</TR>";

}

print "</TABLE>";

?> 


Ohja.. Er zitten een paar checks in, maar bij namen met een "|" erin gaat het bijvoorbeeld fout, dus dat laat ik aan je zelf over.

SIZE does matter.
"You're go at throttle up!"

Pagina: 1