ぬるーむ

Unity初心者が誰もが知っているゲームの模倣をしています。個人的な備忘録ですが、入門書を読み終えたばかりの初心者の方は「こんなへなちょこでもいいのか!」「俺の方がうまく作れる」と作成意欲がわいたりするかもしれません。

Unityでぷよぷよを作ってみた 6


スポンサードリンク

得点の計算

計算式

総ボーナス = (連鎖ボーナス + 連結ボーナス + 色数ボーナス)
(ただし、全てのボーナスが0の場合は1になる。)

得点 = 消したぷよの数 ×10 × 総ボーナス

連鎖ボーナス

連鎖数によりつくボーナス。

f:id:Nullsuke:20201026233047p:plain
連鎖ボーナス

連結ボーナス

つながっているぷよの数によるボーナス。色ごとにつく。例えば、赤を4つ、青を5つ、黄を6つ同時に消した場合、0 + 2 + 3 =5つく。

f:id:Nullsuke:20201026233240p:plain
連結ボーナス

色数ボーナス

同時に消した色の数につくボーナス。

f:id:Nullsuke:20201027215818p:plain
色数ボーナス

実装

public class Scorer
{
    private static readonly int[] chainBonus = { 0, 0, 8, 16, 32, 64, 96, 128, 160, 192, 224,
        256, 288, 320, 352, 384, 416, 448, 480, 512 };
    private static readonly int[] stickBonus =
        { 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7};
    private static readonly int[] colorBonus = {0, 0, 3, 6, 12, 24 };

    public static int CountScore(List<Puyo> vanishable, int chainCount)
    {
        //連鎖ボーナス
        int chain = chainBonus[chainCount];
        
        var q = vanishable.GroupBy(p => p.Color)
            .Select(p => new { Color = p.Key, Number = p.Count() });

        int stick = 0;

        //連結ボーナス
        foreach (var p in q)
        {
            if (p.Number >= 11) stick += 10;
            else stick += stickBonus[p.Number];
        }

        int colorCount = q.Count();
        //色数ボーナス
        int color = colorBonus[colorCount];

        int total = Mathf.Max(chain + stick + color, 1);

        int score = vanishable.Count * 10 * total;
        
        return score;
    }
}