Laut der Wikipedia-Seite für Pac-Man beträgt die höchstmögliche Punktzahl 3333360 Punkte. Es wird als perfektes Spiel bezeichnet und wurde bereits von 3 verschiedenen Personen erreicht.
Ich möchte Folgendes wissen: WARUM sind es genau 3333360 Punkte? Es muss eine technische Einschränkung sein, aber diese Zahl macht meiner Meinung nach keinen Sinn.
Ich weiß, dass das Spiel 255 Level hat. 255 ist 11111111
in Binär und Level 256 (das scheint mystisch zu existieren) bringt die 8-Bit-Ziffer zu einem Überlauf, der zu einem Absturz des Spiels führt.
Aber nur 3333360 scheint so zufällig zu sein.
Kommentare
- Es ist ‚ kein technisches Einschränkung ebenso wie die Punktzahl, die Sie erhalten, wenn Sie jedes Pellet und Obststück in einem Leben in jedem Level essen.
- Das Problem ist nicht die Tatsache, dass versucht wird, Level 0 zu laden. Das Problem ist, dass die Nummer 256 (
100000000
in Binärform) in einem Speicher gespeichert wird, der nur 8 Bit enthält. Die erste wird daher in einen Speicher geschrieben, der etwas anderem zugewiesen ist, was im Wesentlichen das gesamte Spiel beschädigt. - @LeeWhite: Das ‚ s nicht ganz das Problem. Das Problem ist, dass der Code, der die Früchte zeichnen soll, zunächst davon ausgeht, dass die Anzahl der Früchte mit der Ebenennummer übereinstimmen soll, prüft, ob ‚ größer als 7 ist, und wenn ja setzt es auf 7. Dann funktioniert die Logik zum Rendern der Früchte, indem wiederholt eine Frucht gezeichnet, die Anzahl der zu zeichnenden Früchte dekrementiert und eine Schleife ausgeführt wird, bis die Dekrementierung Null ergibt. Wenn die Ebenennummer Null war, versucht der Code, 256 Früchte zu zeichnen und den Anzeigespeicher über den Bereich hinaus zu überschreiben, in den die Früchte gehen sollen.
- @LeeWhite Das klingt sehr unwahrscheinlich. Als Softwareentwickler kenne ich ‚ keine CPUs, die auf diese Weise funktionieren. Wenn eine Zahl überläuft, verschwindet die ‚ 1 ‚ links von der Zahl einfach (und setzt möglicherweise auch ein Überlauf-Flag). abhängig von der Architektur.) Ich ‚ kenne keine Architekturen, die eine Zahl in die nächste Speicheradresse überlaufen würden, zumal Mathe nicht ‚ t geschieht normalerweise sowieso direkt auf Daten im Speicher. Mathematik findet im Allgemeinen an Daten statt, die in Registern gespeichert sind, und nach Abschluss der Mathematik werden die Daten bei Bedarf in den Speicher zurückgeschrieben.
- @willoller Nein, es ist nicht ‚ t. Ganzzahlüberlauf und Pufferüberlauf sind zwei völlig getrennte, nicht miteinander verbundene Konzepte. Ein Pufferüberlauf ist das Ergebnis eines Versagens, die Grenzen des zugewiesenen Speichers zu überprüfen, bevor etwas darauf geschrieben wird (oder gegebenenfalls etwas daraus gelesen wird). Ein ganzzahliger Überlauf tritt auf, wenn Sie eine arithmetische Operation ausführen, die zu einer größeren (kleineren) Zahl führt ) als der vom Datentyp unterstützte maximale (minimale) Wert. Ein ganzzahliger Überlauf verursacht keinen Pufferüberlauf. Normalerweise bewirkt dies nur, dass die Ganzzahl ‚ ‚ an das andere Ende ihres Gültigkeitsbereichs umschließt.
Antwort
Das Pacman Museum enthält einen Artikel über das Erhalten von 3.333.360 Punkte. Und hier „sa Video von einem Typ, der Level 255 und 256 mit wichtigen Informationen zu Level 256 macht.
Level 1 bis 255
Punkte essen : Es gibt 240 reguläre Punkte pro Level, die jeweils 10 Punkte wert sind und 2400 Punkte pro Level erzielen Wenn Sie außerdem die vier Energizer-Punkte mit einem Wert von jeweils 50 Punkten essen, erhalten Sie weitere 200 Punkte.
⇒ 255 × 2600 = 663000
Essen von „Früchten“ : Es gibt ein essbares Objekt pro Ebene, das nur für eine bestimmte erscheint Zeit, zweimal pro Level. Abhängig von der Art der Frucht, die wiederum von dem Level abhängt, das Sie spielen, erhalten Sie eine unterschiedliche Anzahl von Punkten. Insgesamt erhalten Sie
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600
Geister essen : Wenn Sie einen Geist in derselben Energizer-Periode essen, erhalten Sie 200 Punkte und das Doppelte für jeder zusätzliche Geist, den Sie essen (400, 800 und 1600 für den 2. bis 4. Geist).Sie können dies 4 Mal pro Level tun, jedoch nur bis Level 16 und auf Level 18 , da die Geister in Level 17 und 19+ nicht blinken ⇒ 4 × 3000 × 17 = 204000
Hinzufügen dieser Zahlen ergeben 3326600 , nur 6760 Punkte sind nicht perfekt.
Stufe 256
Diese ungerade Zahl kann in der fehlerhaften Stufe 256 erhalten werden.
Sichtbare Punkte : Wie Sie sehen, fehlt etwas mehr als die Hälfte des Bildschirms, was bedeutet, dass Sie nur 112 normale und 2 Energizer-Punkte erhalten können.
⇒ 1220
Einzelfrucht : Fällig zum glitc Auf dem Bildschirm können Sie den Schlüssel (die „Frucht“) nur einmal erhalten.
⇒ 5000
Fehlerhafte Punkte : In der fehlerhaften Region befinden sich 9 normale Punkte, die bei jedem Tod erneut angezeigt werden. Bei 5 zusätzlichen Leben können Sie sie 6 Mal erhalten.
⇒ 6 × 90 = 540
Grand Gesamt
(663000 + 1220 + 540 (Punkte)) + (2459600 + 5000 (Frucht)) + (204000 (Geister)) = 3333360
Kommentare
- Ich begann mit der Eingabe der Antwort und dachte, die Zahlen würden sich gut summieren und sie taten es nicht ‚ t. Es hat einige Zeit gedauert, um herauszufinden, wie seltsam die Punkte in Level 256 sind.
- 256 ist eine ziemlich wichtige Zahl.
- @Howdy_McGee Besonders auf einem 8-Bit-Prozessor …
- Ist der Fehler der 256. Ebene absichtlich ein Fehler – oder ist das ein tatsächlicher Fehler?
- @ RPi_Awesomeness ‚ ist ein tatsächlicher Fehler, der mit Zahlen zu tun hat, die in Binärform übergehen. 256 ist 100000000 in Binärform, aber die Zahl ‚ unterstützt nicht mehr als 8 Binärziffern, wodurch die 1 abgeschnitten wird und 00000000 angezeigt wird, was 0 ist. Für einige nicht wirklich verwandte Probleme Dies führt zu Störungen, anstatt Sie erneut in Stufe 0 zu versetzen.
Antwort
Die Punktzahl ist begrenzt weil auf Stufe 256 ein Fehler auftritt, der den halben Bildschirm mit Müll überschreibt. Das Spiel lässt einen Spieler nicht von einem Brett zum nächsten vorrücken, ohne 244 Punkte und Energizer zu essen, aber der Fehler überschreibt viele der Punkte. Dadurch kann der Spieler keine 244 Punkte und Energizer essen und somit auch nicht mehr Für den Fall, dass Sie sich fragen, warum die Störung auftritt, ähnelt der Maschinencode in Pac-Man zum Zeichnen der Früchte dem 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);
Beachten Sie, dass Pac Man im Gegensatz zu vielen anderen Maschinen ein ziemlich merkwürdiges Bildschirmspeicherlayout verwendet, bei dem aufeinanderfolgende Bytes horizontal oben und unten auf dem Bildschirm und vertikal in der Mitte platziert werden. Dies wurde höchstwahrscheinlich gemacht, um zu erreichen, dass beim Zeichnen des Hauptteils des Bildschirms die Speicheradressen um eine Potenz von zwei alle acht Scanzeilen erhöht werden (beachten Sie, dass sich die „Oberseite“ des Monitors auf der rechten Seite des Bildschirms befindet Bild). Im Wesentlichen konvertierte die Schaltung Zeilen- / Spaltenindizes in Speicheradressen mit einer Zuordnung ähnlich der folgenden:
//Using column values in the range 30 to 1, wrapping after 63... address = (column & 32) ? (row << 5) | (column & 31) : ((28 | (column & 3)) << 5) | row);
, jedoch eher in der Schaltung als im Code implementiert. Dies ermöglichte die Berechnung von Bildschirmadressen unter Verwendung eines Paares von Zählern und einer Schaltung, um eine von zwei Permutationen dieser Zählerbits auszuwählen. Die Hardware, die erforderlich ist, um die Speicheradresse für jede Zeile um 36 anstatt um 32 zu erhöhen, wäre durch komplizierter gewesen Vergleich.
Kommentare
- @Kevin: Die angegebene Punktzahl ist das maximal mögliche Ergebnis in Pac Man, da der oben gezeigte Fehler (in C-Code, der funktional ist) Ähnlich wie der Z80-Code im Spiel selbst) schreibt er nutzlosen Müll über einen Großteil des Bildschirms und überschreibt die Punkte, die der Spieler essen soll. Die andere Antwort gibt an, was sichtbar passiert, um die Punktzahl zu begrenzen, aber das Obige zeigt (für technisch denkende) Leser) warum es passiert (und legt nahe, dass die Beschränkung auf 256 Ebenen wahrscheinlich nicht ‚ absichtlich war, sondern aufgrund eines Versehens auftritt).
- Beide Antworten ergänzen die Frage außerordentlich gut.