Gå til innhold

Gjett tallet - webbasert spill


Anbefalte innlegg

Jeg har laget et webbasert spill med PHP som heter "Gjett Tallet".

Reglene er som følger:

Du skal gjette et tall mellom 1 og 10. Gjetter du feil får du tips om du bør gjette høyere eller lavere neste gang. Til slutt gjetter du riktig og får vite hvor mange forsøk du brukte.

 

Så mine bekymringer:

Er det riktig måte å bruke sessions på?

Hvordan fulfører jeg koden slik at folk kan legge igjen sitt navn i en poengtabell (hiscore)?

 

Jeg er en som pleier å kode ting ved å modifisere andres kode, men dette spillet er gjort helt fra bunn av kun ved å bruke dokumentasjonen på www.php.net.

 

Prøv spillet her: http://home.no.net/nxs/files/gjett_tallet.php

Se koden her: http://home.no.net/nxs/files/gjett_tallet.php?showsource=1

 

Ja! Jeg bruker start.no som host.

 

Jeg har skrevet koden i forbindelse med et kurs på skolen jeg går. Derfor det er et såpass kjedelig spill, så dere behøver ikke kommentere spillet som det er. Det eneste jeg vil ha tilbakemelding på er hvordan koden kan forbedres og fullføres.

Endret av saivert
Lenke til kommentar
Videoannonse
Annonse

Jeg vet det er en del feil med skriptet. Jeg posta her for å få hjelp til å fikse skriptet. Se om noen hadde noen råd å gi meg. Men det ser visst ut til at det bare er folk som tror jeg har postet et velfungerende skript og bare skal brife med det.

 

Skjerp dere. Kom med tilbakemelding, ikke bug-reports. Jeg vet det er masse feil med det.

 

Her kan dere se koden: http://home.no.net/nxs/files/gjett_tallet.php?showsource=1

Her kan dere teste spillet: http://home.no.net/nxs/files/gjett_tallet.php

Endret av saivert
Lenke til kommentar

Det er et par svakheter med det scriptet, noen av de er ikke lette å vite dersom du ikke har jobbet lenge nok med PHP

 

1. rand() er det ikke ofte å se i bruk lenre, rett og slett fordi mt_rand() er bedre.

 

2. Hvorfor sjekker du $_POST['gjett'] == "Gjett" når det ikke er vesentlig? Ikke glem at IE faktisk ikke sender den verdien dersom man står i input feltet og klikker enter. Det du må sjekke, og som er relevant, er at det faktisk er skrevet et tall der.

 

3. preg_match("/\D/", $_POST['tall']) stemmer ikke overens med feilmeldingen din. I dette tilfellet vil den ikke godta -1 eller 5.5 - som er tall, selv om feilmedingen din påstår at det ikke er det.

 

4. Flytt session_start() opp, for rett ovenfor der du nå har den så bruker du faktisk en session.

 

5. Det er litt rart å se på en kode der du skriver (jeg har endret variabelene for å slippe å bla tilbake å sjekke):

if ($gjettet == $tallet) {

echo "riktig";

} else {

if($gjettet > $tallet)

echo "høyere";

 

if($gjettet < $tallet)

echo "lavere"

}

 

Der vil det bli mye lettere for andre progammere å se logikken dersom du bruker elseif.

 

6. Hva ønsker du å gjøre med tips funksjonen?

 

Til slutt så må du fikse high scrore funksjonen din.

 

Tips: $_SESSION['forsoek']++; = $_SESSION['forsoek'] += 1;

Endret av ????????
Lenke til kommentar

Ting jeg har fikset på:

1. Jeg fikk vite av dokumentasjonen til www.php.net at regexp-en "/\D/" matchet tall. Mulig jeg må finne oppe en egen regexp istedet for å bruke de standarduttrykka.

2. Jeg har flyttet session_start lenger opp.

3. Foreløpig er Avslutt knappen (og tilhørende kode) fjernet. Ser vel ingen hensikt med det akkurat nå.

 

I koden

     if ( $_POST['tall'] > $_SESSION['tallet'] ) {
       $status .= "lavere";
     } elseif ( $_POST['tall'] < $_SESSION['tallet'] ) {
       $status .= "høyere";
     }

så skal $_POST['tall'] være over tallet som skal gjettes (lagret i $_SESSION['tallet']) eller under tallet som skal gjettes, men vi har ikke med en situasjon hvor tallet er lik siden brukeren da har gjettet riktig og denne koden ikke vil bli utført i det hele tatt.

 

Tl ????: jeg er uenig med punkt 5 i posten din. Det er faktisk flere ting som skal skje i de forskjellige IF ledda. Jeg skal ikke bare skrive ut riktig eller ikke riktig til skjermen. Og jeg kan heller ikke bruke echo akkurat her da den teksten ville havnet før BODY taggen. Men jeg har allikevel forsøkt å dele det opp noe slik at det skal være lettere å følge for de fleste.

 

Også flere spørsmål:

1. Jeg vil gjerne vite hvordan jeg enkelt kan sjekke om brukeren allerede er i gang med spillet. Koden jeg har valgt nå fungerer til en viss grad, men er ikke helt optimal. Det eneste jeg gjør nå er å sjekke om en session variabel er definert slik som her:

// Sjekk om brukeren er igang med spillet. Hvis ikke opprett øktvariablene
// vi trenger og sett de til de opprinnelige verdiene.
if ( !isset($_SESSION['tallet']) ) {
 $_SESSION['tallet'] = rand(NUMBER_MIN,NUMBER_MAX); // Nytt tilfeldig tall
 $_SESSION['forsoek'] = 1; // Nullstill forsøkstelleren til 1
}

 

 

Jeg har lagt ut koden til både showsource.inc.php og hiscore.inc.php slik at dere kan ta en titt på de også.

Lenke til kommentar
Tl ??: jeg er uenig med punkt 5 i posten din. Det er faktisk flere ting som skal skje i de forskjellige IF ledda. Jeg skal ikke bare skrive ut riktig eller ikke riktig til skjermen. Og jeg kan heller ikke bruke echo akkurat her da den teksten ville havnet før BODY taggen. Men jeg har allikevel forsøkt å dele det opp noe slik at det skal være lettere å følge for de fleste.

 

Du kan gjerne ver uenig med meg, men uansett så er vel poenget som følger

 

hvis $gjettet == $tallet

ellers $gjettet < $tallet

hvis ikke det igjen så $gjettet > $tallet

 

Du kan ikke under noen omstendigheter få et kriterie der to eller flere av de uttrykkene er sanne.

 

Hvis du har problemer med sånne uttrykk så hjelper det ofte å tenke på de som settninger: Dersom $gjettet == $tallet, hvis ikke så hvis $gjettet < $tallet, og det ikke er det heller så må det er det $gjettet > $tallet.

 

Jeg har aldri sagt at du må bruke echo, det var kun et eksempel.

 

Så lenge du bare har din egen lille kode så et det ingen forsjkell for meg hva du bruker, men dersom dette skal rettes av en lærer eller du en dag vil jobbe som del av et team med programmering så er det viktig å unngå sånne rariteter, for det vil kun føre til at andre programmere ikke helt skjønner hvorfor du har satt det opp sånn. I dette scriptet tar det ikke lang tid å utelukke andre forklaringer, men i større scripts vil det føre til et tidstap.

 

Det er bedre å gjøre det skikkelig, og lære med en gang :thumbup:

Lenke til kommentar

Håper dere sjekke kildekoden før dere svarer også da. Den ligger fortsatt ute her:

http://home.no.net/nxs/files/gjett_tallet.php?showsource=1

 

 

Det kan jo hende jeg har fikset noe der som jeg ikke nevner i innlegga mine.

Jeg bruker også flittig // for å legge igjen kommentarer her og der.

 

EDIT: Jeg vil nå snart ferdigstille skriptet. Det siste som er igjen er hiscore lista, men det regner jeg med er snart i boks.

Håper dere følger med videre.

 

EDIT (15 november 2005): Jeg har laget et nytt design på spillet. Har skrevet koden som skal lagre navn i hiscore lista, men det er en bug. Trenger hjelp til å se hva jeg har gjort feil.

 

EDIT (16 november 2005): Jeg har fullført koden som tar seg av toppscoretabellen. Jeg anser hele skriptet for å være ferdig nå. De som vil ha det kan gjerne bruke det på siden sin. Men det hadde vært kjekt hvis dere forteller hvem som har laget spillet.

 

Hele skriptet kan lastes ned i sin helhet (inkludert alle filer som den trenger) her:

http://saivertweb.no-ip.com/files/gjett_tallet.zip

 

Start.no (som bruker home.no.net som domene til hjemmesideplassene) sine webservere er meget trege nå om dagen. Selv de korteste og enkleste PHP skript bruker lang tid på å returnere noe til nettleseren. Regner med serverne er overbelastet. Det har jo kommet til en god del flere brukere siden jeg opprette en konto der.

 

Jeg kjører også min egen webserver hvor jeg tester skriptet mitt. Prøv ut her:

http://saivert.no-ip.com:380/site/misc/gjett_tallet.php

Endret av saivert
Lenke til kommentar
Sjekk highscore listen din, ser ut som du har litt jobb igjen fortsatt!

 

Hint: se på funksjonen strip_tags()

5167081[/snapback]

 

Det er fikset for lengs. Så det veldig kjapt. Hadde først bare brukt htmlentities() på value feltet (det som lagrer forsøksantallet), men nå er også navnet (som er det viktigste å bruke htmlentities på egentlig) tatt.

 

Så nå får dere prøve å finne nye exploits da folkens.

Lenke til kommentar

Takker for all tilbakemelding!

 

Jeg har nå begynt å bruke strip_tags. Jeg bruker strip_tags før navnenen blir lagret i datafilen (slik holder jeg også innholdet i datafilen mest mulig rent).

 

Siden datafilen blir lest inn i et array can jeg bare sortere arrayet med en av aray_sort funksjonene. Jeg bruker bare endimensjonalt array hvor jeg har en key, value indeling.

 

Neste prosjekt blir et yatzi spill. Først lages det i VB.NET (som et frittstående program) og så kommer en PHP utgave (web applikasjon).

 

Poengtabellen er også sortert med asort().

 

Hipp hurra!

Lenke til kommentar
Neste prosjekt blir et yatzi spill. Først lages det i VB.NET (som et frittstående program) og så kommer en PHP utgave (web applikasjon).

5175070[/snapback]

 

Hmm... Jeg lagde yatzy i javascript (Javatzy :p ) og asp (For highscore) for noen år siden. Så på det nå, og det er endel bugs.

 

Men selve yatzyen fungerer helt som det skal. Med "Score-preview" og Undo-funksjon

 

Også er det et reklame-banner helt øverst, som ikke var der da jeg lagde for noen år siden. Highscore greia er basert på at de som spiller er ærlige, og ikke jukser :) Ikke så veldig vanskelig å finne ut hvordan man kan jukse med highscoren.

 

Hvis du vil, så kan du jo se på det:

Javatzy

 

OBS: Alt er laget i javascript, inkludert instruksjoner, og den første siden. Er derfor avhengig av at javascript tillates fra klienten.

Endret av kakkle
Lenke til kommentar
morro.. litt n00b da

5177589[/snapback]

 

Ja, jeg er n00b når det gjelder PHP ja. Men vanligvis bruker ikke jeg slike uttrykk da.

 

Ellers:

 

Jeg testa og skrive inn ?hiscore=add og fikk da lagt til nye navn i lista selv om jeg ikke hadde spilt i det hele tatt. Jeg har sjekka om $_SESSION['forsoek_hiscore'] er blank eller ei (er den blank betyr det at man ikke har spilt), men får det fremdeles ikke til.

 

Sjekk kildekoden igjen da:

http://saivert.no-ip.com:380/site/misc/gje...hp?showsource=1

 

Og test spillet her:

http://saivert.no-ip.com:380/site/misc/gjett_tallet.php

 

Prøv å legge til navn uten å ha spilt:

http://saivert.no-ip.com:380/site/misc/gje...php?hiscore=add

 

 

PS! Jeg kommer til å benytte min egen webserver fremfor home.no.net siden de er så trege nå om dagen.

Lenke til kommentar
Var slett ikke værst det der kakkle :)

Men du burde nok ha jobbet litt med sikkerheten på highscore. Det var ikke fryktelig vanskelig å pynte på resultatet når alle variabler sendes via GET og ikke valideres på noen måte ;)

5176518[/snapback]

Hehe... Som sagt så er det en god stund siden jeg lagde dette... Er ikke akkurat det beste highscore scriptet, nei, men synes faktisk at selve javascriptet er greit nok. Gadd aldri å fikse på det med highscoren. Glemte nesten av hele scriptet et par uker etter at jeg var ferdig med det :)

 

Fikk faktisk mail fra en kar som hadde jukset på den måten en gang. Han spurte om jeg kunne slette den, siden han ville oppnå poeng på den riktige måten :)

 

Skulle jeg laget noe nytt idag, så ville jeg nok ha forbedret highscore delen, og kanskje brukt noe annet enn javascript. Men ville nok ikke brukt serverside språk.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...