Volgens de Wikipedia-pagina voor Pac-Man is de hoogst mogelijke score 3333360 punten. Het wordt een perfect spel genoemd en het is al door 3 verschillende mensen behaald.

Wat ik wil weten is: WAAROM is het precies 3333360 punten? Het moet een technische beperking zijn, maar dit aantal slaat naar mijn mening niet op.

Ik weet dat het spel 255 niveaus heeft. 255 is 11111111 in binair en niveau 256 (dat mystiek lijkt te bestaan) brengt het 8-bits cijfer naar een overloop, die eindigt in een crash van het spel.

Maar 3333360 lijkt zo willekeurig.

Reacties

  • Het ‘ is geen technische beperking zoveel als het de score die je krijgt als je elke korrel en stuk fruit eet op één leven op elk niveau.
  • Het probleem is niet het feit dat het niveau 0 probeert te laden. Het probleem is dat het nummer 256 (100000000 in binair getal) wordt opgeslagen in geheugen dat slechts 8 bits mag bevatten. De eerste wordt daarom in het geheugen geschreven dat aan iets anders is toegewezen, wat in wezen het hele spel bederft.
  • @LeeWhite: That ‘ s niet helemaal het probleem. Het probleem is dat de code die de vruchten moet trekken, begint door aan te nemen dat het aantal vruchten overeenkomt met het niveaunummer, controleert of het ‘ groter is dan 7, en zo ja stelt het in op 7. Vervolgens werkt de logica om de vruchten weer te geven door herhaaldelijk een vrucht te tekenen, het aantal te trekken vruchten te verlagen en te herhalen totdat de afname nul oplevert. Als het niveaunummer nul was, probeert de code 256 vruchten te tekenen, waarbij het weergavegeheugen wordt overschreven buiten de regio waar de vruchten zouden moeten gaan.
  • @LeeWhite Dat klinkt erg onwaarschijnlijk. Als software-engineer weet ik geen ‘ of er CPUs zijn die op die manier werken. Als een nummer overloopt, verdwijnt de ‘ 1 ‘ die links van het nummer wordt gedragen (en stelt misschien ook een overloopvlag in, afhankelijk van de architectuur.) Ik ‘ ben niet op de hoogte van architecturen die een getal naar het volgende geheugenadres zouden overlopen, vooral omdat wiskunde niet ‘ t gebeurt meestal toch rechtstreeks op gegevens in het geheugen. Wiskunde gebeurt meestal op gegevens die zijn opgeslagen in registers en nadat de wiskunde is voltooid, worden de gegevens indien nodig teruggeschreven naar het geheugen.
  • @willoller Nee, het is niet ‘ t. Geheel getaloverloop en bufferoverloop zijn twee volledig afzonderlijke, niet-gerelateerde concepten. Bufferoverloop is het resultaat van het niet controleren van de grenzen van het toegewezen geheugen voordat er iets naar wordt geschreven (of er iets uit wordt gelezen, al naargelang het geval). Geheel getaloverloop is wanneer u een rekenkundige bewerking uitvoert die resulteert in een groter (kleiner getal) ) dan de maximale (minimum) waarde die wordt ondersteund door het gegevenstype. Een overloop van gehele getallen veroorzaakt geen bufferoverloop. Het zorgt er meestal voor dat het gehele getal ‘ omwikkelt ‘ naar het andere uiteinde van zijn reeks geldige waarden.

Antwoord

Het Pacman Museum heeft een artikel over 3.333.360 Punten. En hier “sa video van iemand die level 255 en 256 doet , met belangrijke informatie over level 256.

Level 1 tot 255

Stippen eten : er zijn 240 gewone stippen per level, elk 10 punten waard, goed voor 2400 punten per level . Bovendien levert het eten van de vier energizer-stippen, elk 50 punten waard, nog eens 200 punten op.
⇒ 255 × 2600 = 663000

“fruit” eten : er is één eetbaar object per niveau dat slechts voor een bepaald hoeveelheid tijd, twee keer per niveau. Afhankelijk van het soort fruit, dat weer afhangt van het niveau dat je speelt, krijg je een ander aantal punten. In totaal krijg je
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Geesten eten : Een geest eten in dezelfde energizer-periode levert 200 punten op, en het dubbele van dat voor elke extra geest die je eet (respectievelijk 400, 800 en 1600 voor de 2e tot en met 4e geest).Je kunt dit 4 keer per level doen, maar alleen tot level 16, en op level 18, aangezien de spoken niet knipperen in level 17 en 19+ ⇒ 4 × 3000 × 17 = 204000

Deze toevoegen getallen levert 3326600 op, alleen 6760 punten kort van perfect.

Level 256

Dit oneven aantal kan worden verkregen in het glitched-out level 256.

Screenshot van een normaal Pac-Man-level Screenshot van een foutief Pac-Man-level

Zichtbare punten : Zoals u kunt zien, ontbreekt iets meer dan de helft van het scherm, wat betekent dat u slechts 112 normale en 2 energizer-punten kunt krijgen.
⇒ 1220

Enkele vrucht : Vervallen naar de glitc hed-scherm, kunt u de sleutel (het “fruit”) slechts één keer krijgen
⇒ 5000

Glitched Dots : Er zijn 9 normale punten in het glitched-out gebied die elke keer dat je sterft weer verschijnen. Bij 5 extra levens kun je ze 6 keer krijgen
⇒ 6 × 90 = 540

Grand Totaal

(663000 + 1220 + 540 (dots)) + (2459600 + 5000 (fruit)) + (204000 (ghosts)) = 3333360

Reacties

  • Ik begon het antwoord te typen, in de veronderstelling dat de cijfers prima zouden kloppen en dat deden ze niet ‘ t. Het kostte nogal wat tijd om erachter te komen hoe vreemd de punten zijn in niveau 256.
  • 256 is een behoorlijk belangrijk getal.
  • @Howdy_McGee Vooral op een 8-bits processor …
  • Is de storing op het 256ste niveau met opzet – of is dat iets dat een echte storing is?
  • @ RPi_Awesomeness het ‘ is een feitelijke storing, die te maken heeft met getallen die in binair getal omslaan. 256 is 100000000 in binair, maar het getal ondersteunt niet meer dan 8 binaire cijfers, waardoor de 1 wordt afgebroken tot 00000000, wat 0 is. Voor sommige niet echt gerelateerde problemen , dit veroorzaakt de glitching, in plaats van dat u weer op niveau 0 komt.

Answer

De score is beperkt omdat er een storing optreedt op niveau 256 die de helft van het scherm overschrijft met afval. Het spel laat een speler niet van het ene bord naar het andere gaan zonder 244 punten en energizers te eten, maar de storing overschrijft veel van de punten; hierdoor kan de speler niet in staat zijn om 244 punten en energizers te eten, en dus niet in staat om de niveau. Als je je afvraagt waarom de storing optreedt, is de machinecode in Pac-Man om de vruchten te tekenen vergelijkbaar met de C-code:

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 op dat Pac Man, in tegenstelling tot veel machines, een nogal merkwaardige lay-out van het schermgeheugen gebruikt, waarbij opeenvolgende bytes horizontaal aan de boven- en onderkant van het scherm en verticaal in het midden worden geplaatst. Dit is waarschijnlijk gedaan om ervoor te zorgen dat bij het tekenen van het hoofdgedeelte van het scherm, de geheugenadressen worden verhoogd met een macht van twee om de acht scanlijnen (merk op dat de bovenkant van de monitor zich aan de rechterkant van de afbeelding). In wezen hebben schakelingen rij- / kolomindices geconverteerd naar geheugenadressen met een afbeelding die lijkt op:

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

maar geïmplementeerd in schakelingen in plaats van code. Hierdoor konden schermadressen worden berekend door een paar tellers en een schakeling te gebruiken om een van de twee permutaties van die tellersbits te selecteren. De hardware die nodig is om het geheugenadres met 36 te laten toenemen voor elke rij in plaats van 32 zou gecompliceerder zijn geweest door vergelijking.

Reacties

  • @Kevin: De vermelde score is de maximaal mogelijke score in Pac Man omdat de bug hierboven getoond (in C-code die functioneel vergelijkbaar met de Z80-code in het spel zelf) schrijft nutteloze rommel over een groot deel van het scherm, waarbij de punten worden overschreven die de speler zou moeten eten. Het andere antwoord geeft aan wat er zichtbaar gebeurt om de score te beperken, maar het bovenstaande geeft aan (voor technisch ingestelde lezers) waarom het gebeurt (en suggereert dat de beperking van 256 niveaus waarschijnlijk niet ‘ opzettelijk was, maar in plaats daarvan vanwege een vergissing).
  • Beide antwoorden vullen de vraag buitengewoon goed aan.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *