Ifølge Wikipedia-siden for Pac-Man er den højest mulige score 3333360 point. Det kaldes et perfekt spil, og det blev allerede opnået af 3 forskellige personer.

Hvad jeg vil vide er: HVORFOR er det nøjagtigt 3333360 point? Det må være en teknisk begrænsning, men dette tal giver efter min mening ingen mening.

Jeg ved, at spillet har 255 niveauer. 255 er 11111111 i binær og niveau 256 (der synes at eksistere mystisk) bringer 8-bit cifret til et overløb, som ender i et sammenbrud af spillet.

Men, 3333360 bare virker så tilfældig.

Kommentarer

  • Det ‘ er ikke en teknisk begrænsning lige så meget som den score, du tilfældigvis får, hvis du spiser hver pille og stykke frugt på et liv på hvert niveau.
  • Problemet er ikke det faktum, at det forsøger at indlæse niveau 0. Problemet er, at tallet 256 (100000000 i binær) lagres i hukommelsen, der kun er allokeret til at indeholde 8 bit. Den første er derfor skrevet i hukommelsen, der er tildelt noget andet, hvilket i det væsentlige ødelægger hele spillet.
  • @LeeWhite: At ‘ s ikke helt problemet. Problemet er, at koden, der formodes at tegne frugterne, starter ved at antage, at antallet af frugter skal matche niveauet, kontrollerer, om det ‘ er større end 7, og i så fald indstiller den til 7. Derefter fungerer logikken for at gengive frugterne ved gentagne gange at tegne en frugt, mindske antallet af frugter, der skal tegnes, og løkke, indtil nedgangen giver nul. Hvis niveaunummeret var nul, forsøger koden at tegne 256 frugter og overskrive displayhukommelsen ud over det område, hvor frugterne skal gå.
  • @LeeWhite Det lyder meget usandsynligt. Som softwareingeniør kender jeg ikke ‘ til nogen CPUer, der fungerer på den måde. Hvis et nummer overløber, forsvinder ‘ 1 ‘ til venstre for nummeret (og sætter måske også et overløbsflag, afhængigt af arkitekturen.) Jeg ‘ er ikke opmærksom på nogen arkitekturer, der vil løbe over et nummer til den næste hukommelsesadresse, især da matematik ikke ‘ t sker normalt alligevel direkte på data i hukommelsen. Matematik sker generelt på data, der er gemt i registre, og når matematikken er færdig, skrives dataene tilbage til hukommelsen, hvis det er nødvendigt.
  • @willoller Nej, det er ikke ‘ t. Heltalsoverløb og bufferoverløb er to helt separate, ikke-relaterede begreber. Bufferoverløb er resultatet af ikke at kontrollere grænserne for den tildelte hukommelse, før du skriver noget til det (eller læser noget fra det, alt efter tilfældet.) Heltalsoverløb er, når du udfører en aritmetisk operation, der resulterer i et større nummer (mindre ) end den maksimale (minimum) værdi, der understøttes af datatypen. Heltalsoverløb forårsager ikke et bufferoverløb. Det får normalt bare heltallet til at ‘ vikle rundt ‘ til den anden ende af dets række af gyldige værdier.

Svar

Pacman Museum har en artikel om at få 3.333.360 Point. Og her “sa video af en fyr, der gør niveau 255 og 256 med vigtige oplysninger om niveau 256.

Niveau 1 til 255

Spise prikker : Der er 240 regelmæssige prikker pr. niveau, værd 10 point hver, Netting 2400 point pr. niveau Derudover giver dig yderligere 200 point at spise de fire energizer-prikker til en værdi af 50 point hver.
⇒ 255 × 2600 = 663000

Spise “frugt” : Der er et spiseligt objekt pr. Niveau, der kun vises for et bestemt tid, to gange pr. niveau. Afhængigt af hvilken frugt, der igen afhænger af det niveau, du spiller, får du et andet antal point. I alt får du
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Spise spøgelser : At spise et spøgelse i samme energizer periode giver dig 200 point, og dobbelt så for hvert ekstra spøgelse, du spiser (400, 800 og 1600 for henholdsvis 2. til 4. spøgelse).Du kan gøre dette 4 gange pr. Niveau, men kun op til niveau 16, og på niveau 18 da spøgelserne ikke blinker i niveau 17 og 19+ ⇒ 4 × 3000 × 17 = 204000

Tilføjelse af disse tal giver 3326600 , bare 6760 point under perfekt.

Niveau 256

Dette ulige antal kan opnås i det glitched-out niveau 256.

Skærmbillede af et normalt Pac-Man-niveau Skærmbillede af et glitched Pac-Man-niveau

Synlige prikker : Som du kan se, mangler lidt mere end halvdelen af skærmen, hvilket betyder, at du kun kan få 112 normale og 2 energizer-prikker.
⇒ 1220

Enkelt frugt : Due til glitc hed-skærm, du kan kun få nøglen (“frugten”) én gang
⇒ 5000

Glitched Dots : Der er 9 normale prikker i det glitched out-område, der vises igen hver gang du dør. Ved 5 ekstra liv kan du få dem 6 gange
⇒ 6 × 90 = 540

Grand I alt

(663000 + 1220 + 540 (prikker)) + (2459600 + 5000 (frugt)) + (204000 (spøgelser)) = 3333360

Kommentarer

  • Jeg begyndte at skrive svaret og tænkte, at tallene ville tilføje sig fint, og de gjorde ikke ‘ t. Tog lang tid at finde ud af det underlige, der er punkterne i niveau 256.
  • 256 er et ganske vigtigt tal.
  • @Howdy_McGee Især på en 8-bit processor …
  • Er 256. niveau fejl med vilje – eller er det noget, der er en faktisk fejl?
  • @ RPi_Awesomeness det ‘ er en faktisk fejl, der har at gøre med tal, der vælter i binær. 256 er 100000000 i binær, men tallet understøtter ikke ‘ t understøtter mere end 8 binære cifre, hvilket skærer af 1, hvilket gør det til 00000000, hvilket er 0. For nogle ikke rigtig relaterede problemer , dette medfører fejl, snarere end at sætte dig i niveau 0 igen.

Svar

Scoren er begrænset fordi der opstår en fejl på niveau 256, som overskriver halvdelen af skærmen med skrald. Spillet lod ikke en spiller komme videre fra et bord til det næste uden at spise 244 prikker og energizer, men fejlen overskriver mange af prikkerne; dette vil efterlade spilleren ude af stand til at spise 244 prikker og energizers, og dermed ikke i stand til at forlade Hvis du undrer dig over, hvorfor fejlen opstår, ligner maskinkoden i Pac-Man for at tegne frugterne C-koden:

unsigned char temp1, temp2; unsigned char *ptr; temp1 = level; if (temp1 > 15) temp1 = 15; temp2 = temp1; if (temp2 > 7) temp2 = 7; ptr = LOWER_RIGHT_ADDRESS; do { *ptr++ = shapes[temp1--]; } while(--temp); 

Bemærk, at i modsætning til mange maskiner bruger Pac Man et ret nysgerrig skærmhukommelseslayout, der placerer på hinanden følgende byte vandret øverst og nederst på skærmen og lodret i midten. Dette blev højst sandsynligt gjort for at gøre det således, at når man tegner hoveddelen af skærmen, hukommelsesadresser vil blive forøget med en effekt på to hver otte scanningslinjer (bemærk, at “toppen” af skærmen er i højre side af billede). I det væsentlige konverterede kredsløb række / kolonneindeks til hukommelsesadresser med en kortlægning svarende til:

//Using column values in the range 30 to 1, wrapping after 63... address = (column & 32) ? (row << 5) | (column & 31) : ((28 | (column & 3)) << 5) | row); 

men implementeret i kredsløb snarere end kode. Dette tillod, at skærmadresser blev beregnet ved hjælp af et par tællere og et kredsløb til at vælge en af to permutationer af disse tællerbits. Hardwaren, der kræves for at have hukommelsesadresse, øges med 36 for hver række i stedet for 32 ville have været mere kompliceret af sammenligning.

Kommentarer

  • @Kevin: Den angivne score er den maksimale mulige i Pac Man, fordi fejlen vist ovenfor (i C-kode, som er funktionelt svarende til Z80-koden i selve spillet) skriver ubrugelig skrammel over meget af skærmen og overskriver de prikker, som spilleren skal spise. Det andet svar angiver, hvad der synligt sker for at begrænse scoren, men ovenstående angiver (for teknisk sindede læsere) hvorfor det sker (og antyder, at 256-niveau-begrænsningen sandsynligvis ikke var ‘ t bevidst, men i stedet opstår på grund af et tilsyn).
  • Begge svar supplerer spørgsmålet meget godt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *