18 |
インベーダーゲームのソースの研究(2) |
インベーダーゲームのソースの研究を読んで理解したことを記します。
UFOスコア表
参考にしたUFOスコア表です。

BSV実装
この表には重なりがあるので、実は、表は1つで問題ありません。 弊社のBSV実装では以下の表を用いています。
UInt#(5) ufo_score[15] = {10,10,10,5,15,10,10,5,5,10,15,10,10,5,30};
ただし、インデックスの初期値を6としており、7番目から使用することで上記のアルゴリズムを再現しています。まず、インデックスの初期化です。
ufo_score_idx <= 6;
次にインクリメント部です。この表は15エントリしかないので、15でラップアラウンドします。
ufo_score_idx <= ufo_score_idx + 1;
if (ufo_score_idx == 15) ufo_score_idx <= 0;
また、インベーダーゲームは得点の1の位は常に0なので、得点は1/10で記憶しています。
オリジナル
さて、ソースコードの研究によると、少々ズレています。

コメントでも書かれているように、UFOスコア表は16エントリにも関わらず、バグにより15個までしか使用されず、15番目の次は0番目に戻っています。従って、最後の50点は使用されません。
Javascript実装
最後に、Javascriptによる実装でも同様なアルゴリズムにより、自弾ショット数の15の剰余を取った数に6のオフセットをかけています。
const
// UFOスコアテーブル
us = [100,100,100,50,150,100,100,50,50,100,150,100,100,50,300];
const plus = us[(6 + shotCount) % 15];
結果として、上記4種類は実装は微妙に異なるものの、最終的には同一の結果となります。