De acordo com a página da Wikipedia para Pac-Man , a pontuação mais alta possível é 3333360 pontos. É chamado de jogo perfeito e já foi alcançado por 3 pessoas diferentes.

O que eu quero saber é: POR QUE são exatamente 3333360 pontos? Deve ser uma limitação técnica, mas esse número não faz sentido na minha opinião.

Sei que o jogo tem 255 níveis. 255 é 11111111 em binário e nível 256 (que parece existir misticamente) traz o dígito de 8 bits a um estouro, que termina em uma falha do jogo.

Mas, 3333360 apenas parece tão aleatório.

Comentários

  • Isso ‘ não é um técnico limitação tanto quanto a pontuação que você obtém se comer cada pílula e pedaço de fruta em uma vida em cada nível.
  • O problema não é o fato de que ele tenta carregar o nível 0. O problema é que o número 256 (100000000 em binário) está sendo armazenado na memória que foi alocada para conter apenas 8 bits. O primeiro é, portanto, gravado na memória atribuída a outra coisa, o que essencialmente corrompe todo o jogo.
  • @LeeWhite: Isso ‘ s não é bem o problema. O problema é que o código que supostamente extrai as frutas começa assumindo que o número de frutas deve corresponder ao número do nível, verifica se ‘ é maior que 7 e, em caso afirmativo define-o como 7. Então, a lógica para renderizar as frutas funciona desenhando repetidamente uma fruta, diminuindo o número de frutas a serem desenhadas e fazendo um loop até que o decremento produza zero. Se o número do nível for zero, o código tenta desenhar 256 frutas, sobrescrevendo a memória de exibição além da região onde as frutas devem ir.
  • @LeeWhite Isso parece muito improvável. Como engenheiro de software, não ‘ não conheço nenhuma CPU que funcione dessa forma. Se um número estourar, o ‘ 1 ‘ carregado à esquerda do número simplesmente vai embora (e talvez também defina um sinalizador de estouro, dependendo da arquitetura.) Eu ‘ não estou ciente de nenhuma arquitetura que transbordaria um número para o próximo endereço de memória, especialmente porque a matemática não ‘ t geralmente acontece diretamente nos dados na memória de qualquer maneira. A matemática geralmente acontece em dados armazenados em registros e, após a conclusão da matemática, os dados são gravados de volta na memória, se necessário.
  • @willoller Não, não é ‘ t. O estouro de inteiro e o estouro de buffer são dois conceitos totalmente separados e não relacionados. O estouro de buffer é o resultado da falha em verificar os limites da memória alocada antes de gravar algo nela (ou ler algo dela, conforme o caso). O estouro de inteiros ocorre quando você executa uma operação aritmética que resulta em um número maior (menor ) do que o valor máximo (mínimo) suportado pelo tipo de dados. O estouro de inteiro não causa um estouro de buffer. Normalmente, faz com que o número inteiro ‘ contorne ‘ para a outra extremidade de seu intervalo de valores válidos.

Resposta

O Pacman Museum tem um artigo sobre como conseguir 3.333.360 Pontos. E aqui “sa vídeo de um cara fazendo o nível 255 e 256 , com informações importantes sobre o nível 256.

Nível 1 a 255

Comendo pontos : Existem 240 pontos regulares por nível, valendo 10 pontos cada, obtendo 2.400 pontos por nível . Além disso, comer os quatro pontos do energizador, que valem 50 pontos cada, dá a você outros 200 pontos.
⇒ 255 × 2600 = 663000

Comer “frutas” : há um objeto comestível por nível que só aparece por um certo quantidade de tempo, duas vezes por nível. Dependendo do tipo de fruta, que por sua vez depende do nível que você está jogando, você ganha uma quantidade diferente de pontos. No total, você ganha
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600

Comendo fantasmas : comer um fantasma no mesmo período de energização dá a você 200 pontos, e o dobro para cada fantasma adicional que você comer (400, 800 e 1600 do segundo ao quarto fantasma, respectivamente)Você pode fazer isso 4 vezes por nível, mas apenas até o nível 16 e no nível 18, já que os fantasmas não piscam nos níveis 17 e 19+ ⇒ 4 × 3000 × 17 = 204000

Adicionando estes números rendem 3326600 , apenas 6760 pontos aquém da perfeição.

Nível 256

Este número ímpar pode ser obtido no nível de falha 256.

Captura de tela de um nível normal do Pac-Man Captura de tela de um nível defeituoso do Pac-Man

Pontos visíveis : como você pode ver, falta um pouco mais da metade da tela, o que significa que você só pode obter 112 pontos normais e 2 pontos energizadores.
⇒ 1220

Fruta única : Prazo para o glitc tela hed, você só pode obter a chave (a “fruta”) uma vez
⇒ 5000

Pontos com falha : Existem 9 pontos normais na região com falha que reaparecem sempre que você morre. Com 5 vidas extras, você pode obtê-los 6 vezes
⇒ 6 × 90 = 540

Grande Total

(663000 + 1220 + 540 (pontos)) + (2459600 + 5000 (frutas)) + (204000 (fantasmas)) = 3333360

Comentários

  • Comecei a digitar a resposta, pensando que os números iriam somar bem e não deram ‘ t. Demorou um pouco para descobrir a estranheza que são os pontos no nível 256.
  • 256 é um número bastante importante.
  • @Howdy_McGee Especialmente em um processador de 8 bits …
  • A falha de nível 256 é propositalmente – ou é algo que é uma falha real?
  • @ RPi_Awesomeness é ‘ uma falha real, que tem a ver com números rolando em binário. 256 é 100000000 em binário, mas o número não ‘ suporta mais de 8 dígitos binários, cortando assim o 1, tornando-o 00000000, que é 0. Para algum problema não realmente relacionado , isso causa a falha, em vez de colocá-lo no nível 0 novamente.

Resposta

A pontuação é limitada porque ocorre uma falha no nível 256 que substitui metade da tela com lixo. O jogo não permitirá que um jogador avance de um tabuleiro para o próximo sem comer 244 pontos e energizadores, mas a falha sobrescreve muitos dos pontos; isso deixará o jogador incapaz de comer 244 pontos e energizadores e, portanto, incapaz de deixar o nível. Caso você “esteja se perguntando por que a falha ocorre, o código de máquina no Pac-Man para desenhar as frutas é semelhante ao código 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); 

Observe que, ao contrário de muitas máquinas, o Pac Man usa um layout de memória de tela bastante curioso que coloca bytes consecutivos horizontalmente na parte superior e inferior da tela e verticalmente no meio. Isso provavelmente foi feito para que, ao desenhar a parte principal da tela, os endereços de memória fossem incrementados em uma potência de dois a cada oito linhas de varredura (observe que a “parte superior” do monitor está no lado direito do foto). Essencialmente, os circuitos convertiam índices de linha / coluna em endereços de memória com um mapeamento semelhante a:

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

mas implementado em circuitos em vez de código. Isso permitiu que os endereços de tela fossem calculados usando um par de contadores e um circuito para selecionar uma das duas permutações desses bits de contadores. O hardware necessário para aumentar o endereço de memória em 36 para cada linha em vez de 32 teria sido mais complicado por comparação.

Comentários

  • @Kevin: A pontuação declarada é a máxima possível no Pac Man porque o bug mostrado acima (no código C que é funcional semelhante ao código Z80 no próprio jogo) escreve lixo inútil em grande parte da tela, sobrescrevendo os pontos que o jogador deve comer. A outra resposta afirma o que acontece visivelmente para limitar a pontuação, mas o acima indica (para os que pensam tecnicamente leitores) por que isso acontece (e sugere que a limitação de 256 níveis provavelmente não foi ‘ t deliberada, mas ocorreu devido a um descuido).
  • Ambas as respostas complementam a pergunta muito bem.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *