El Musée Pacman a un article sur l'obtention de 3 333 360 points. Et voici un vidéo d'un gars qui fait les niveaux 255 et 256 avec des informations importantes concernant le niveau 256.
Niveau 1 à 255
Points d'alimentation : Il y a 240 points réguliers par niveau, valant 10 points chacun, ce qui vous rapporte 2400 points par niveau. De plus, manger les quatre points énergisants, qui valent 50 points chacun, vous donne 200 points supplémentaires.
⇒ 255 × 2600 = 663000
Manger des "fruits" : Il y a un objet comestible par niveau qui n'apparaît que pendant un certain temps, deux fois par niveau. En fonction du type de fruit, qui dépend lui-même du niveau auquel vous jouez, vous obtenez un nombre de points différent. Au total, vous obtenez
⇒ 2 × (100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000) = 2459600
Manger des fantômes : Manger un fantôme dans la même période d'énergisation vous donne 200 points, et le double pour chaque fantôme supplémentaire que vous mangez (400, 800 et 1600 pour le 2e à 4e fantôme, respectivement). Vous pouvez faire cela 4 fois par niveau, mais seulement jusqu'au niveau 16, et au niveau 18, puisque les fantômes ne clignotent pas aux niveaux 17 et 19+. ⇒ 4 × 3000 × 17 = 204000
En additionnant ces chiffres, on obtient 3326600 juste 6760 points de moins que la perfection.
Niveau 256
Ce nombre impair peut être obtenu dans le niveau 256 caché.
Points visibles : Comme vous pouvez le voir, il manque un peu plus de la moitié de l'écran, ce qui signifie que vous ne pouvez obtenir que 112 points normaux et 2 points énergisants.
⇒ 1220
Fruit unique : En raison de l'écran glitched, vous ne pouvez obtenir la clé (le "fruit") qu'une seule fois.
⇒ 5000
Pointillés glacés : Il y a 9 points normaux dans la région glitchée qui réapparaissent à chaque fois que vous mourrez. Avec 5 vies supplémentaires, vous pouvez les obtenir 6 fois.
⇒ 6 × 90 = 540
Total général
(663000 + 1220 + 540 (points)) + (2459600 + 5000 (fruits)) + (204000 (fantômes)) = 3333360
69 votes
Ce n'est pas un technique limiter autant que possible le score que vous obtenez si vous mangez toutes les boulettes et tous les fruits sur une vie dans chaque niveau.
24 votes
Le problème n'est pas le fait qu'il essaie de charger le niveau 0. Le problème est que le nombre 256 (
100000000
en binaire) est stockée dans une mémoire qui n'a été allouée que pour contenir 8 bits. Le premier1
est donc écrit dans la mémoire qui est assignée à quelque chose d'autre, ce qui corrompt essentiellement l'ensemble du jeu.39 votes
@LeeWhite : Ce n'est pas vraiment le problème. Le problème est que le code qui est censé dessiner les fruits commence par supposer que le nombre de fruits doit correspondre au nombre de niveaux, vérifie s'il est supérieur à 7, et si oui, le met à 7. Ensuite, la logique de rendu des fruits fonctionne en dessinant de manière répétée un fruit, en décrémentant le nombre de fruits à dessiner, et en bouclant jusqu'à ce que la décrémentation donne zéro. Si le nombre de niveaux était égal à zéro, le code tente de dessiner 256 fruits, écrasant la mémoire d'affichage au-delà de la région où les fruits sont censés aller.
28 votes
@LeeWhite Cela semble très peu probable. En tant qu'ingénieur logiciel, je ne connais pas de processeurs qui fonctionnent de cette façon. Si un nombre déborde, le '1' porté à gauche du nombre disparaît simplement (et peut également activer un drapeau de débordement, en fonction de l'architecture). Je ne connais pas d'architectures qui feraient déborder un nombre à l'adresse mémoire suivante, d'autant plus que les mathématiques ne sont généralement pas effectuées directement sur les données en mémoire. Les maths se font généralement sur des données stockées dans des registres et, une fois les maths terminées, les données sont réécrites en mémoire si nécessaire.
1 votes
@reirab N'est-ce pas exactement ce qu'est un dépassement de tampon ?
9 votes
@willoller Non, ce n'est pas le cas. Le dépassement d'entier et le dépassement de tampon sont deux concepts totalement distincts et sans rapport. Le dépassement de tampon est le résultat de l'absence de vérification des limites de la mémoire allouée avant d'y écrire quelque chose (ou d'y lire quelque chose, selon le cas). Le dépassement d'entier se produit lorsque vous effectuez une opération arithmétique qui produit un nombre plus grand (plus petit) que la valeur maximale (minimale) supportée par le type de données. Le dépassement d'entier ne provoque pas de dépassement de tampon. En général, il fait simplement en sorte que le nombre entier se retrouve à l'autre extrémité de sa plage de valeurs valides.
0 votes
Lee dit que ce n'est pas un dépassement d'entier. Si le nombre entier déborde, il tient toujours sur 8 bits.
3 votes
@reirab : Je ne pense pas que la situation décrite par Lee White puisse se produire de manière réaliste sur le Z80, mais quelque chose de très similaire peut se produire dans le code du 8088 utilisé dans le PC original. Sur le 8088, il n'était pas rare que le code d'assemblage écrit à la main utilise les moitiés supérieure et inférieure d'un registre de 16 bits à des fins différentes ; parce que par exemple INC BX était un octet mais INC BL en était deux, le code voulant incrémenter juste la moitié inférieure d'un registre utiliserait souvent le premier si la valeur existante était connue pour être inférieure à 255. Si la valeur était de 255, cependant, l'octet supérieur serait bloqué.
1 votes
@reirab : Un problème connexe qui peut se produire occasionnellement sur le Z80, mais plus souvent sur le 6502, est que lorsque le code qui a besoin que la retenue soit effacée est précédé d'une opération arithmétique qui est censée se terminer avec la retenue effacée, le programmeur peut ne pas écrire une instruction pour régler/effacer explicitement la retenue. Si l'opération précédente a un report inattendu, le résultat de la dernière opération peut être corrompu en conséquence. Le seul scénario probable pour cela sur le Z80 serait avec SBC HL,xx` puisque les instructions mathématiques peuvent spécifier si elles doivent utiliser ou ignorer la retenue entrante.