I følge Wikipedia-siden for Pac-Man er høyest mulig poengsum 3333360 poeng. Det kalles et perfekt spill, og det ble allerede oppnådd av 3 forskjellige personer.

Det jeg vil vite er: HVORFOR er det nøyaktig 3333360 poeng? Det må være en teknisk begrensning, men dette tallet gir ingen mening etter min mening.

Jeg vet at spillet har 255 nivåer. 255 er 11111111 i binær og nivå 256 (som ser ut til å eksistere mystisk) bringer 8-bits siffer til et overløp, som ender i et krasj i spillet.

Men, 3333360 bare virker så tilfeldig.

Kommentarer

  • Det ‘ er ikke en teknisk begrensning så mye som det poengsummen du får hvis du spiser hver pellet og fruktbit på ett liv på hvert nivå.
  • Problemet er ikke det faktum at det prøver å laste nivå 0. Problemet er at tallet 256 (100000000 i binær) lagres i minnet som bare er tildelt til å inneholde 8 biter. Den første skrives derfor inn i minnet som er tildelt noe annet, noe som egentlig ødelegger hele spillet.
  • @LeeWhite: At ‘ s ikke helt problemet. Problemet er at koden som skal trekke fruktene begynner med å anta at antall frukt skal samsvare med nivånummeret, sjekker om den ‘ er større enn 7, og i så fall setter den til 7. Da fungerer logikken for å gjengi fruktene ved å trekke en frukt gjentatte ganger, redusere antall frukt som skal tegnes, og løkke til dekrementet gir null. Hvis nivånummeret var null, prøver koden å tegne 256 frukter, og overskrive visningsminnet utenfor regionen der fruktene skal gå.
  • @LeeWhite Det høres veldig usannsynlig ut. Som programvareingeniør vet jeg ikke ‘ om noen CPUer som fungerer på den måten. Hvis et tall renner over, går ‘ 1 ‘ til venstre for nummeret bare bort (og setter kanskje også et overløpsflagg, avhengig av arkitekturen.) Jeg ‘ er ikke klar over noen arkitekturer som vil flyte over et tall til neste minneadresse, spesielt siden matematikk ikke ‘ t skjer som regel direkte på data i minnet. Matematikk skjer vanligvis på data som er lagret i registre, og når matematikken er fullført, blir dataene skrevet tilbake til minnet om nødvendig.
  • @willoller Nei, det er ikke ‘ t. Heltalloverløp og bufferoverløp er to helt separate, ikke-relaterte konsepter. Bufferoverløp er resultatet av at du ikke kontrollerer grensene for tildelt minne før du skriver noe til det (eller leser noe fra det, alt etter omstendighetene.) Heltalloverløp er når du utfører en aritmetisk operasjon som resulterer i et tall større (mindre ) enn den maksimale (minimum) verdien som støttes av datatypen. Heltalloverløp forårsaker ikke bufferoverløp. Det fører vanligvis bare til at heltallet ‘ vikles rundt ‘ til den andre enden av sitt utvalg av gyldige verdier.

Svar

Pacman Museum har en artikkel om å få 3 333 360 Poeng. Og her «sa video av en eller annen fyr som gjør nivå 255 og 256 , med viktig informasjon angående nivå 256.

Nivå 1 til 255

Spise prikker : Det er 240 vanlige prikker per nivå, verdt 10 poeng hver, Netting 2400 poeng per nivå Hvis du spiser de fire energizer-punktene, verdt 50 poeng hver, gir du deg ytterligere 200 poeng.
⇒ 255 × 2600 = 663000

Spise «frukt» : Det er ett spiselig objekt per nivå som bare vises for en viss mengde tid, to ganger per nivå. Avhengig av type frukt, som igjen avhenger av nivået du spiller, får du en annen mengde poeng. Totalt får du
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Spise spøkelser : Å spise et spøkelse i samme energizer-periode gir deg 200 poeng, og doble det for hvert ekstra spøkelse du spiser (400, 800 og 1600 for henholdsvis 2. til 4. spøkelse).Du kan gjøre dette 4 ganger per nivå, men bare opp til nivå 16, og på nivå 18, siden spøkelsene ikke blinker i nivå 17 og 19+ ⇒ 4 × 3000 × 17 = 204000

Legger til disse tall gir 3326600 , bare 6760 poeng som ikke er perfekt.

Nivå 256

Dette oddetallet kan fås i det utglittede nivået 256.

Skjermbilde av et normalt Pac-Man-nivå Skjermbilde av et glitched Pac-Man-nivå

Synlige prikker : Som du ser, mangler litt mer enn halvparten av skjermen, noe som betyr at du bare kan få 112 normale og 2 energizer-punkter.
⇒ 1220

Enkelt frukt : Due til glitc hed-skjerm, du kan bare få nøkkelen («frukten») en gang
⇒ 5000

Glitched Dots : Det er 9 normale prikker i det glitched out-området som dukker opp igjen hver gang du dør. Ved fem ekstra liv kan du få dem 6 ganger
⇒ 6 × 90 = 540

Grand Totalt

(663000 + 1220 + 540 (prikker)) + (2459600 + 5000 (frukt)) + (204000 (spøkelser)) = 3333360

Kommentarer

  • Jeg begynte å skrive inn svaret, og trodde at tallene ville slå seg helt fint, og de gjorde ikke ‘ t. Tok litt tid å finne ut om det rare som er poengene i nivå 256.
  • 256 er ganske viktig.
  • @Howdy_McGee Spesielt på en 8-biters prosessor …
  • Er 256. nivå feil med vilje – eller er det noe som er en faktisk feil?
  • @ RPi_Awesomeness det ‘ er en faktisk feil, som har å gjøre med tall som ruller over i binær. 256 er 100000000 i binær, men tallet støtter ikke ‘ t mer enn 8 binære sifre, og kutter dermed 1, noe som gjør det til 00000000, som er 0. For noen ikke egentlig relaterte problemer , dette forårsaker feil, i stedet for å sette deg i nivå 0 igjen.

Svar

Poengsummen er begrenset fordi det oppstår en feil på nivå 256 som overskriver halvparten av skjermen med søppel. Spillet lar ikke en spiller gå videre fra et brett til det neste uten å spise 244 prikker og energizer, men feilen overskriver mange av prikkene. Dette vil gjøre at spilleren ikke kan spise 244 prikker og energizer, og dermed ikke kan forlate Hvis du lurer på hvorfor feilen oppstår, ligner maskinkoden i Pac-Man å tegne fruktene 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); 

Merk at i motsetning til mange maskiner bruker Pac Man et ganske nysgjerrig skjermminnelayout som plasserer påfølgende byte horisontalt på toppen og bunnen av skjermen, og vertikalt i midten. Dette ble mest sannsynlig gjort for å gjøre det slik at når du tegner hoveddelen av skjermen, vil minneadressene økes med en kraft på to av åtte skannelinjer (merk at «toppen» av skjermen er på høyre side av bilde). I hovedsak konverterte kretser rad- / kolonneindekser til minneadresser med en tilordning som ligner på:

//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 implementert i kretser i stedet for kode. Dette tillot at skjermadresser kan beregnes ved hjelp av et par tellere og et kretsløp for å velge en av to permutasjoner av disse tellerbitene. Maskinvaren som kreves for å ha minneadresse øker med 36 for hver rad i stedet for 32 ville ha vært mer komplisert av sammenligning.

Kommentarer

  • @Kevin: Den oppgitte poengsummen er den maksimale mulige i Pac Man fordi feilen vist ovenfor (i C-kode som er funksjonelt ligner Z80-koden i selve spillet) skriver ubrukelig søppel over mye av skjermen, og overskriver prikkene spilleren skal spise. Det andre svaret sier hva som synlig skjer for å begrense poengsummen, men det ovennevnte indikerer (for teknisk innstilt lesere) hvorfor det skjer (og antyder at begrensningen på 256 nivå sannsynligvis ikke var ‘ t bevisst, men i stedet oppstår på grunn av et tilsyn).
  • Begge svarene utfyller spørsmålet svært godt.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *