Enligt Wikipedia-sidan för Pac-Man är högsta möjliga poäng 3333360 poäng. Det kallas ett perfekt spel och det uppnåddes redan av tre olika personer.

Vad jag vill veta är: VARFÖR är det exakt 3333360 poäng? Det måste vara en teknisk begränsning, men det här numret är ingen mening enligt min mening.

Jag vet att spelet har 255 nivåer. 255 är 11111111 i binär och nivå 256 (som verkar existera mystiskt) ger 8-bitarsiffran ett överflöd, vilket slutar i en krasch av spelet.

Men, 3333360 bara verkar så slumpmässig.

Kommentarer

  • Det ’ är inte ett tekniskt begränsning lika mycket som det poäng som du råkar få om du äter varje pellets och bit frukt på ett liv på varje nivå.
  • Problemet är inte det faktum att det försöker ladda nivå 0. Problemet är att numret 256 (100000000 i binärt format) lagras i minnet som bara har tilldelats för att innehålla 8 bitar. Den första skrivs därför i minnet som tilldelas något annat, vilket i grund och botten förstör hela spelet.
  • @LeeWhite: That ’ s inte riktigt frågan. Problemet är att koden som ska dra frukten börjar genom att anta att antalet frukter ska matcha nivån, kontrollerar om den ’ är större än 7, och i så fall ställer in den på 7. Då fungerar logiken för att göra frukterna genom att upprepade gånger rita en frukt, minska antalet frukter som ska dras och slingra tills minskningen ger noll. Om nivån var noll, försöker koden att rita 256 frukter, vilket överskriver visningsminne bortom regionen där frukten ska gå.
  • @LeeWhite Det låter mycket osannolikt. Som programvaruingenjör vet jag inte ’ om några processorer som fungerar på det sättet. Om ett tal flödar över, går ’ 1 ’ till vänster om numret bara bort (och sätter kanske också en överflödesflagga, beroende på arkitektur.) Jag ’ är inte medveten om några arkitekturer som skulle översvämma ett nummer till nästa minnesadress, särskilt eftersom matematik inte ’ t händer vanligtvis direkt på data i minnet ändå. Matematik sker vanligtvis på data som lagras i register och efter att matematiken är klar skrivs data tillbaka till minnet om det behövs.
  • @willoller Nej, det är inte ’ t. Heltalsöverskridande och buffertöverskridande är två helt separata, icke-relaterade koncept. Buffertöverflöd är resultatet av att det inte går att kontrollera gränserna för tilldelat minne innan du skriver något till det (eller läser något från det, om så är fallet.) Heltal överflöd är när du utför en aritmetisk operation som resulterar i ett antal större (mindre ) än det maximala (minsta) värdet som stöds av datatypen. Heltalsöverflöd orsakar inte buffertöverflöde. Det gör vanligtvis bara att heltalet ’ sveper runt ’ till den andra änden av dess giltiga värden.

Svar

Pacman Museum har en artikel om att få 3 333 360 Poäng. Och här ”sa video av någon kille som gör nivå 255 och 256 , med viktig information angående nivå 256.

Nivå 1 till 255

Äta prickar : Det finns 240 vanliga prickar per nivå, värda 10 poäng vardera, Netting 2400 poäng per nivå Dessutom får du ytterligare 200 poäng genom att äta de fyra energiseringspunkterna, värda 50 poäng vardera.
⇒ 255 × 2600 = 663000

Äta ”frukt” : Det finns ett ätbart objekt per nivå som bara visas för en viss tid, två gånger per nivå. Beroende på vilken typ av frukt som i sin tur beror på nivån du spelar får du olika poäng. Totalt får du
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Äta spöken : Att äta ett spöke under samma energiseringsperiod ger dig 200 poäng och dubbelt så mycket för varje ytterligare spöke du äter (400, 800 och 1600 för 2: a till 4: e spöket, respektive).Du kan göra detta fyra gånger per nivå, men bara upp till nivå 16, och på nivå 18, eftersom spöken inte blinkar i nivå 17 och 19+ ⇒ 4 × 3000 × 17 = 204000

Lägga till dessa siffror ger 3326600 , bara 6760 poäng som är perfekta.

Nivå 256

Detta udda tal kan fås i den utglättade nivån 256.

Skärmdump av en normal Pac-Man-nivå Skärmdump av en felaktig Pac-Man-nivå

Synliga punkter : Som du kan se saknas lite mer än hälften av skärmen, vilket innebär att du bara kan få 112 normala och två energiseringspunkter.
⇒ 1220

Enkel frukt : Due till glitc hed-skärm, du kan bara få nyckeln (”frukten”) en gång
⇒ 5000

Glitched Dots : Det finns nio normala prickar i det glitched out-området som visas igen varje gång du dör. Vid fem extra liv kan du få dem 6 gånger
⇒ 6 × 90 = 540

Grand Totalt

(663000 + 1220 + 540 (punkter)) + (2459600 + 5000 (frukt)) + (204000 (spöken)) = 3333360

Kommentarer

  • Jag började skriva svaret och tänkte att siffrorna skulle lägga sig bra och de gjorde inte ’ t. Det tog ganska lång tid att ta reda på det konstiga som är poängen i nivå 256.
  • 256 är ett ganska viktigt nummer.
  • @Howdy_McGee Speciellt på en 8-bitars processor …
  • Är 256: e nivåfel avsiktligt – eller är det något som är en faktisk fel?
  • @ RPi_Awesomeness det ’ är en faktisk fel, som har att göra med siffror som rullar över i binär. 256 är 100000000 i binär, men numret stöder inte ’ t mer än åtta binära siffror, vilket minskar 1, vilket gör det till 00000000, vilket är 0. För vissa inte riktigt relaterade problem , detta orsakar problem, snarare än att sätta dig i nivå 0 igen.

Svar

Poängen är begränsad eftersom en fel uppstår på nivå 256 som skriver över halva skärmen med skräp. Spelet kommer inte att låta en spelare avancera från ett bräde till ett annat utan att äta 244 prickar och energizer, men glitchen skriver över många av prickarna. Detta gör att spelaren inte kan äta 244 prickar och energizer, och därmed inte kan lämna Om du undrar över varför fel uppstår, liknar maskinkoden i Pac-Man för att rita frukten 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); 

Observera att till skillnad från många maskiner använder Pac Man en ganska nyfiken skärmminneslayout som placerar på varandra följande byte horisontellt på toppen och botten av skärmen och vertikalt i mitten. Detta gjordes troligen för att göra det så att minnesadresserna ökades med en effekt på två var åtta skanningsrader när du ritar den huvudsakliga delen av skärmen (notera att skärmens ”övre” är på höger sida av bild). I huvudsak konverterade kretsar rad / kolumnindex till minnesadresser med en mappning som liknar:

//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 implementeras i kretsar snarare än kod. Detta gjorde det möjligt att beräkna skärmadresser med hjälp av ett par räknare och en krets för att välja en av två permutationer av dessa räknarbitar. Hårdvaran som krävs för att ha minnesadressen ökar med 36 för varje rad snarare än 32 skulle ha varit mer komplicerat av jämförelse.

Kommentarer

  • @Kevin: Den angivna poängen är det högsta möjliga i Pac Man eftersom felet som visas ovan (i C-kod som är funktionellt liknande Z80-koden i själva spelet) skriver värdelös skräp över mycket av skärmen och skriver över de punkter som spelaren ska äta. Det andra svaret anger vad som synligt händer för att begränsa poängen, men ovanstående indikerar (för tekniskt sinnade läsare) varför det händer (och föreslår att begränsningen på 256 nivåer troligen inte var ’ t avsiktlig utan istället sker på grund av en tillsyn).
  • Båda svaren kompletterar frågan mycket bra.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *