パックマンのウィキペディアページによると、最高スコアは3333360です。ポイント。これはパーフェクトゲームと呼ばれ、すでに3人の異なる人々によって達成されました。

知りたいのは、なぜ正確に3333360ポイントなのですか? 技術的な制限である必要がありますが、この数値は私の意見では意味がありません。

ゲームには255のレベルがあることを知っています。255は11111111(神秘的に存在しているようです)は、8ビットの数字をオーバーフローさせ、ゲームのクラッシュで終了します。

しかし、3333360だけとてもランダムに見えます。

コメント

  • それは技術的ではありません' >すべてのレベルで1つのライフですべてのペレットとフルーツを食べた場合に得られるスコアと同じくらいの制限。
  • 問題は、レベル0をロードしようとするという事実ではありません。問題は、数値256(バイナリでは100000000)が、8ビットを含むように割り当てられたメモリに格納されていることです。最初のは、他の何かに割り当てられたメモリに書き込まれ、ゲーム全体が本質的に破損します。
  • @LeeWhite:その' sそれほど問題ではありません。問題は、果物を描画することになっているコードが、果物の数がレベル番号と一致する必要があると想定して開始し、'が7より大きいかどうかを確認することです。次に、果物をレンダリングするロジックは、果物を繰り返し描画し、描画する果物の数をデクリメントし、デクリメントがゼロになるまでループすることで機能します。レベル番号がゼロの場合、コードは256個の果物を描画しようとし、果物が移動するはずの領域を超えて表示メモリを上書きします。
  • @LeeWhiteそれはほとんどありません。ソフトウェアエンジニアとして、私は'そのように動作するCPUを知りません。数値がオーバーフローすると、数値の左側にある' 1 'が消えます(オーバーフローフラグも設定されます。アーキテクチャによって異なります。)私は'、特に数学が' tは通常、メモリ内のデータで直接発生します。計算は通常、レジスタに格納されているデータで行われ、計算が完了した後、必要に応じてデータがメモリに書き戻されます。
  • @willollerいいえ、' t。整数オーバーフローとバッファオーバーフローは、まったく別の無関係な概念です。バッファオーバーフローは、割り当てられたメモリに何かを書き込む前に(または場合によってはそこから何かを読み取る前に)割り当てられたメモリの境界をチェックできなかった結果です。整数オーバーフローは、数値が大きくなる(小さくなる)算術演算を実行する場合です。 )データ型でサポートされている最大(最小)値より。整数オーバーフローはバッファオーバーフローを引き起こしません。通常、整数は有効な値の範囲のもう一方の端に'ラップアラウンド'します。

回答

パックマン博物館に3,333,360の取得に関する記事がありますポイント。そして、ここに「レベル255と256を実行している人のビデオとレベル256に関する重要な情報があります。

レベル1から255

ドットを食べる:レベルごとに240個の通常のドットがあり、それぞれ10ポイントの価値があり、レベルごとに2400ポイントを獲得します。 。さらに、それぞれ50ポイントの価値がある4つのエナジャイザードットを食べると、さらに200ポイントが得られます。
⇒ 255 × 2600 = 663000

「果物」を食べる:レベルごとに1つの食用オブジェクトがあり、特定の場合にのみ表示されます時間の長さ、レベルごとに2回。フルーツの種類に応じて、つまりプレイしているレベルに応じて、得られるポイントの量が異なります。合計で、
⇒ 2 ×(100 + 300 + 2 × 500 + 2 × 700 + 2 × 1000 + 2 × 2000 + 2 × 3000 + 243 × 5000)= 2459600

幽霊を食べる:同じエナジャイザー期間に幽霊を食べると200ポイントが得られ、追加のゴーストを食べるたびに(2番目から4番目のゴーストの場合はそれぞれ400、800、1600)。これはレベルごとに4回実行できますが、レベル16までとレベル18までのみです。レベル17と19+ではゴーストが点滅しないため、 ⇒ 4 × 3000 × 17 = 204000

これらを追加する数値は 3326600 を生成し、 6760 ポイントは完全ではありません。

レベル256

この奇数は、グリッチアウトされたレベル256で取得できます。

通常のパックマンレベルのスクリーンショット グリッチのあるパックマンレベルのスクリーンショット

目に見えるドット:ご覧のとおり、画面の半分より少し多くが欠落しています。つまり、112個の通常のドットと2個のエナジャイザードットしか取得できません。
⇒ 1220

シングルフルーツ:期限glitcに画面では、キー(「フルーツ」)を取得できるのは1回のみです
⇒ 5000

グリッチドット:グリッチアウト領域には、死ぬたびに再表示される9つの通常のドットがあります。 5回の追加ライフで、6回取得できます
⇒ 6 × 90 = 540

グランド合計

(663000 + 1220 + 540(ドット))+(2459600 + 5000(フルーツ))+(204000(ゴースト))= 3333360

コメント

  • 数字がうまく加算されると思って答えを入力し始めましたが、 ' t。レベル256のポイントである奇妙さを見つけるのにかなりの時間がかかりました。
  • 256は非常に重要な数字です。
  • @Howdy_McGee特に8ビットプロセッサの場合…
  • 256レベルのグリッチは意図的なものですか?それとも実際のグリッチですか?
  • @ RPi_Awesomeness it 'は実際のグリッチであり、数値が2進数でロールオーバーすることに関係しています。 256は2進数で100000000ですが、この数値は8桁を超える2進数をサポートしていないため、1を切り取って00000000、つまり0になります。あまり関係のない問題の場合、これにより、レベル0に戻るのではなく、グリッチが発生します。

回答

スコアは制限されていますレベル256でグリッチが発生し、画面の半分がゴミで上書きされるためです。ゲームでは、244ドットとエナジャイザーを食べずに、プレーヤーが1つのボードから次のボードに進むことはできませんが、グリッチによって多くのドットが上書きされます。これにより、プレーヤーは244ドットとエナジャイザーを食べることができなくなり、レベル。「グリッチが発生する理由がわからない場合は、パックマンでフルーツを描画するためのマシンコードは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); 

多くのマシンとは異なり、パックマンはかなり奇妙な画面メモリレイアウトを使用しており、連続するバイトを画面の上部と下部に水平に配置し、中央に垂直に配置します。これは、画面の主要部分を描画するときに、メモリアドレスが8スキャンラインごとに2の累乗でインクリメントされるようにするために行われた可能性があります(モニターの「上部」が右側にあることに注意してください)画像)。基本的に、回路は次のようなマッピングで行/列インデックスをメモリアドレスに変換しました:

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

ただし、コードではなく回路に実装されています。これにより、カウンターのペアと、それらのカウンターのビットの2つの順列の1つを選択する回路を使用して、画面アドレスを計算できました。メモリアドレスを32ではなく36ずつ増やす必要があるハードウェアは、比較。

コメント

  • @Kevin:上記のバグ(機能的にはCコード)のため、記載されているスコアはパックマンで可能な最大値です。ゲーム自体のZ80コードと同様に、画面の大部分に役に立たないジャンクを書き込み、プレーヤーが食べるはずのドットを上書きします。他の回答は、スコアを制限するために目に見える形で何が起こるかを示していますが、上記は(技術的な志向の場合)読者)なぜ発生するのか(そして、256レベルの制限はおそらく意図的ではなく'意図的ではなく、見落としが原因で発生することを示唆しています)。
  • どちらの回答も質問を非常によく補完します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です