Według strony Wikipedii dotyczącej Pac-Mana , najwyższy możliwy wynik to 3333360 zwrotnica. Nazywa się to idealną grą i została osiągnięta już przez 3 różne osoby.

Chcę wiedzieć: DLACZEGO to dokładnie 3333360 punktów? To musi być techniczne ograniczenie, ale moim zdaniem ta liczba nie ma sensu.

Wiem, że gra ma 255 poziomów. 255 to 11111111 w systemie binarnym i poziomie 256 (który wydaje się istnieć mistycznie) powoduje przepełnienie 8-bitowej cyfry, co kończy się zawieszeniem gry.

Ale 3333360 po prostu wydaje się taki przypadkowy.

Komentarze

  • To ' to nie techniczne ograniczenie tak bardzo, jak wynik, który otrzymujesz, jeśli zjesz każdy granulat i kawałek owocu na jedno życie na każdym poziomie.
  • Problem nie polega na tym, że próbuje załadować poziom 0. Problem polega na tym, że liczba 256 (100000000 binarnie) jest przechowywana w pamięci, która została przydzielona tylko na 8 bitów. Pierwszy jest więc zapisywane w pamięci, która jest przypisana do czegoś innego, co zasadniczo psuje całą grę.
  • @LeeWhite: That ' s nie do końca problem. Problem polega na tym, że kod, który ma rysować owoce, zaczyna się od założenia, że liczba owoców powinna odpowiadać numerowi poziomu, sprawdza, czy ' jest większa niż 7, a jeśli tak ustawia ją na 7. Następnie logika renderowania owoców działa poprzez wielokrotne rysowanie owocu, zmniejszanie liczby owoców do narysowania i zapętlanie aż do zera. Jeśli numer poziomu wynosił zero, kod próbuje narysować 256 owoców, nadpisując pamięć wyświetlacza poza regionem, do którego mają trafić.
  • @LeeWhite To brzmi bardzo mało prawdopodobne. Jako inżynier oprogramowania nie ' nie znam żadnych procesorów, które działają w ten sposób. Jeśli jakaś liczba się przepełni, ' 1 ' przeniesiony na lewo od liczby po prostu znika (i może też ustawia flagę przepełnienia, w zależności od architektury). ' nie znam żadnej architektury, która przepełniłaby liczbę do następnego adresu pamięci, zwłaszcza że matematyka nie ' t i tak zwykle występuje bezpośrednio na danych w pamięci. Matematyka zwykle dotyczy danych przechowywanych w rejestrach, a po zakończeniu matematyki dane są w razie potrzeby zapisywane z powrotem do pamięci.
  • @willoller Nie, to nie jest ' t. Przepełnienie całkowitoliczbowe i przepełnienie bufora to dwie całkowicie oddzielne, niepowiązane ze sobą pojęcia. Przepełnienie buforu jest wynikiem niepowodzenia sprawdzenia granic przydzielonej pamięci przed zapisaniem czegoś do niej (lub odczytaniem czegoś z niej, w zależności od przypadku). Przepełnienie liczby całkowitej występuje, gdy wykonujesz operację arytmetyczną, która skutkuje większą liczbą (mniejszą ) niż maksymalna (minimalna) wartość obsługiwana przez typ danych. Przepełnienie liczby całkowitej nie powoduje przepełnienia buforu. Zwykle powoduje to po prostu ' zawijanie liczby całkowitej wokół ' do drugiego końca zakresu prawidłowych wartości.

Odpowiedź

Pacman Museum zawiera artykuł o zdobyciu 3333360 Zwrotnica. A tutaj „sa film przedstawiający gościa na poziomie 255 i 256 , zawierający ważne informacje dotyczące poziomu 256.

Poziom od 1 do 255

Kropki jedzenia : Na każdym poziomie jest 240 zwykłych kropek, każdy o wartości 10 punktów, Netto 2400 punktów na poziom . Ponadto zjedzenie czterech kropek aktywatora, każda wartych 50 punktów, daje kolejne 200 punktów.
⇒ 255 × 2600 = 663000

Jedzenie „owoców” : Na każdym poziomie znajduje się jeden jadalny przedmiot, który pojawia się tylko przez określony czas ilość czasu, dwa razy na poziom. W zależności od rodzaju owocu, który z kolei zależy od poziomu, na którym grasz, otrzymujesz różną liczbę punktów. W sumie otrzymujesz
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Jedzenie duchów : Zjedzenie ducha w tym samym okresie energetyzatora daje 200 punktów, a dwa razy tyle za każdego kolejnego zjedzonego ducha (odpowiednio 400, 800 i 1600 od drugiego do czwartego ducha).Możesz to zrobić 4 razy na poziom, ale tylko do poziomu 16, a na poziomie 18, , ponieważ duchy nie mrugają na poziomach 17 i 19+ ⇒ 4 × 3000 × 17 = 204000

Dodawanie tych liczba daje 3326600 , po prostu 6760 punkty zabrakło do ideału.

Poziom 256

Tę nieparzystą liczbę można uzyskać na poziomie 256.

Zrzut ekranu normalnego poziomu Pac-Mana Zrzut ekranu przedstawiający błędny poziom Pac-Mana

Widoczne kropki : Jak widać, brakuje nieco ponad połowy ekranu, co oznacza, że można uzyskać tylko 112 normalnych i 2 punkty aktywatora.
⇒ 1220

Pojedynczy owoc : Termin do usterki ekran, klucz („owoc”) można pobrać tylko raz
⇒ 5000

Glitched Dots : W wyblakłym obszarze znajduje się 9 normalnych kropek, które pojawiają się ponownie za każdym razem, gdy umierasz. Przy 5 dodatkowych żyć możesz je zdobyć 6 razy
⇒ 6 × 90 = 540

Wielki Razem

(663000 + 1220 + 540 (kropki)) + (2459600 + 5000 (owoce)) + (204000 (duchy)) = 3333360

Komentarze

  • Zacząłem wpisywać odpowiedź, myśląc, że liczby będą się zgadzać, a one nie ' t. Zajęło trochę czasu, zanim dowiedziałem się o dziwności, jaką są punkty na poziomie 256.
  • 256 to dość ważna liczba.
  • @Howdy_McGee Zwłaszcza na 8-bitowym procesorze …
  • Czy usterka na 256. poziomie jest celowa – czy jest to coś, co jest prawdziwą usterką?
  • @ RPi_Awesomeness to ' to rzeczywisty błąd związany z przewijaniem liczb w systemie binarnym. 256 to 100000000 w systemie dwójkowym, ale liczba nie ' nie obsługuje więcej niż 8 cyfr binarnych, więc wycina 1, co daje 00000000, czyli 0. W przypadku niektórych niezbyt powiązanych problemów , powoduje to usterkę, zamiast ponownie umieszczać Cię na poziomie 0.

Odpowiedź

Wynik jest ograniczony ponieważ na poziomie 256 występuje usterka, która nadpisuje połowę ekranu śmieciami. Gra nie pozwoli graczowi przejść z jednej planszy do następnej bez zjedzenia 244 kropek i energizerów, ale usterka nadpisuje wiele kropek; to spowoduje, że gracz nie będzie mógł zjeść 244 kropek i energizerów, a tym samym nie będzie mógł opuścić Jeśli zastanawiasz się, dlaczego wystąpiła usterka, kod maszynowy w Pac-Manie do rysowania owoców jest podobny do kodu C:

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); 

Zauważ, że w przeciwieństwie do wielu maszyn, Pac Man używa dość dziwnego układu pamięci ekranu, który umieszcza kolejne bajty poziomo na górze i na dole ekranu oraz pionowo na środku. Najprawdopodobniej zrobiono to tak, aby podczas rysowania głównej części ekranu adresy pamięci były zwiększane o potęgę dwóch na osiem linii skanowania (zwróć uwagę, że „góra” monitora znajduje się po prawej stronie obrazek). Zasadniczo obwody konwertowały indeksy wierszy / kolumn na adresy pamięci z odwzorowaniem podobnym do:

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

ale zaimplementowane w obwodach, a nie w kodzie. Pozwoliło to na obliczenie adresów ekranów przy użyciu pary liczników i układu do wybrania jednej z dwóch permutacji bitów tych liczników. Sprzęt wymagany do zwiększenia adresu pamięci o 36 dla każdego wiersza zamiast o 32 byłby bardziej skomplikowany przez porównanie.

Komentarze

  • @Kevin: Podany wynik jest maksymalnym możliwym w Pac Manie, ponieważ błąd pokazany powyżej (w kodzie C, który funkcjonalnie podobny do kodu Z80 w samej grze) zapisuje bezużyteczne śmieci na dużej części ekranu, nadpisując kropki, które gracz ma zjeść. Druga odpowiedź określa, co w widoczny sposób ogranicza wynik, ale powyższe wskazuje (dla osób zorientowanych technicznie czytelnicy) dlaczego tak się dzieje (i sugeruje, że ograniczenie 256 poziomów prawdopodobnie nie było ' celowe, ale zamiast tego występuje z powodu przeoczenia).
  • Obie odpowiedzi wyjątkowo dobrze uzupełniają pytanie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *