示例#1
0
    void Start()
    {
        _moduleId = _moduleIdCounter++;

        var rnd = RuleSeedable.GetRNG();

        Debug.LogFormat("[Mahjong #{0}] Using rule seed: {1}", _moduleId, rnd.Seed);

        var skip = rnd.Next(0, 100);

        for (var i = 0; i < skip; i++)
        {
            rnd.NextDouble();
        }

        var tilesIxs = Enumerable.Range(0, 42).ToList();

        rnd.ShuffleFisherYates(tilesIxs);
        _matchRow1   = tilesIxs.Take(14).ToArray();
        _matchRow2   = tilesIxs.Skip(14).Take(14).ToArray();
        _countingRow = tilesIxs.Skip(28).Take(14).ToArray();

        var sn = Bomb.GetSerialNumber().Select(ch => (ch >= '0' && ch <= '9' ? ch - '0' : ch - 'A' + 10) % 14).ToArray();

        for (int i = 0; i < 3; i++)
        {
            Debug.LogFormat(@"[Mahjong #{0}] Swapping {1} and {2}", _moduleId, tileName(_matchRow1[sn[2 * i]]), tileName(_matchRow2[sn[2 * i + 1]]));
            var t = _matchRow1[sn[2 * i]];
            _matchRow1[sn[2 * i]]     = _matchRow2[sn[2 * i + 1]];
            _matchRow2[sn[2 * i + 1]] = t;
        }

        Debug.LogFormat(@"[Mahjong #{0}] After swaps, match rows are:", _moduleId);
        Debug.LogFormat(@"[Mahjong #{0}] Row 1: {1}", _moduleId, _matchRow1.Select(tileShortName).JoinString(" "));
        Debug.LogFormat(@"[Mahjong #{0}] Row 2: {1}", _moduleId, _matchRow2.Select(tileShortName).JoinString(" "));

        var offset = Rnd.Range(0, 14);

        CountingTile.material.mainTexture = TileTextures[_countingRow[offset]];
        Debug.LogFormat(@"[Mahjong #{0}] Counting tile is {1} ⇒ shift is {2} to the right", _moduleId, tileName(_countingRow[offset]), offset);
        _matchRow2 = _matchRow2.Skip(14 - offset).Concat(_matchRow2.Take(14 - offset)).ToArray();

        Debug.LogFormat(@"[Mahjong #{0}] After shift, match rows are:", _moduleId);
        Debug.LogFormat(@"[Mahjong #{0}] Row 1: {1}", _moduleId, _matchRow1.Select(tileShortName).JoinString(" "));
        Debug.LogFormat(@"[Mahjong #{0}] Row 2: {1}", _moduleId, _matchRow2.Select(tileShortName).JoinString(" "));

        // Decide on a layout
        var layouts = new[]
        {
            @"/.1.1/..2/.141..1.1.1/..2....242/.1.1..1.1.1",
            @"/..1.1/...2.2/..1.5.4/...2...2/....4.5.1/.....2.2/......1.1",
            @"//.....3/.1.1...1.1/..2.252.2/.1.1...1.1/.....3",
            @"/.1212121//.3.....3//.1212121",
            @"....1.1//....1.1/..2.2.2.2/....1.1/..2.2.2.2/....1.1//....1.1",
            @"/..1.1/1..2.2/..1.1/...2..1/....12.2/......1.1/......2.2/........1.1",
            @"/.....121/...12...21//..3.3//...12...21/.....121",
            @"//.121212121//....121//....121//....121",
            @"....3//...3.3//..3...3...3//.......3.3//........3",
            @"/...1.1.1/.1...2...1/.....1/.1.1...1.1/.....1/.1...2...1/...1.1.1",
            @"///1.1.1.1.1.1/.2.2.6.2.2/1.1.1.1.1.1",
            @"///.7.4.4.4.7//.7.4.4.4.7",
            @"//...7.5.7//...4...4//...7.5.7",
            @"/1/2.1/1.2.1/..1.2.1/....1.2.1/......1.2.1/........1.2/..........1",
            @"/.3.3//.3.3/....4.4/.......3.3//.......3.3",
            @"..1/....1/1.1/...2/.1..4R4..1/.......2/........1.1/......1/........1",
            @".1.1/.2.2/1.5.1/.2.2/.1.1.3/.......2/......1.1/..........1",
            @"///...7.7.7//...7.7.7",
            @"/1/..1.1.1.1/1.........1/..1.1.1.1/1.........1/..1.1.1.1/00........1",
            @"/.1.1.1.1/..2.2.2/..14141/...2.2/...1.1/....2/....1",
            @"....1//......12/........1/3.3.3.3.2.1/........1/......12//00..1",
            @"...1.1.1//...1.1.1/.1/...1.3.1/.........1/...1.1.1//00.1.1.1",
            @".....1/.....2/....141/....2.2/...14.41/....2.2/....141/00...2/00...1",
            @"//.....1/...12421/ 124...421/...12421/.....1",
            @"//...1.1.1/..2.2.2.2/...5.4.1/..2.2.2.2/...1.1.1"
        };
        var layoutRaw = layouts[Rnd.Range(0, layouts.Length)];

        // Find out which locations have a tile. Also place the tiles’ actual game objects in the right places (we’ll assign their textures later).
        _layout = LayoutInfo.Create(layoutRaw, _moduleId, Tiles);
        Debug.LogFormat(@"<Mahjong #{0}> Chosen layout has {1} tiles.", _moduleId, _layout.Tiles.Length);
        for (int i = _layout.Tiles.Length; i < Tiles.Length; i++)
        {
            Tiles[i].gameObject.SetActive(false);
        }

        var solution = _layout.FindSolutionPath(_moduleId);

        _taken = new bool[_layout.Tiles.Length];

        Debug.LogFormat(@"[Mahjong #{0}] Possible solution:", _moduleId);
        var pairIxs = Enumerable.Range(0, solution.Count).ToArray().Shuffle();

        for (int i = 0; i < solution.Count; i++)
        {
            _layout.Tiles[solution[i].Ix1].SetTextures(TileTextures[_matchRow1[pairIxs[i]]], TileTexturesHighlighted[_matchRow1[pairIxs[i]]]);
            _layout.Tiles[solution[i].Ix1].PairedWith = solution[i].Ix2;

            _layout.Tiles[solution[i].Ix2].SetTextures(TileTextures[_matchRow2[pairIxs[i]]], TileTexturesHighlighted[_matchRow2[pairIxs[i]]]);
            _layout.Tiles[solution[i].Ix2].PairedWith = solution[i].Ix1;

            Debug.LogFormat(@"[Mahjong #{0}] — {1} and {2}", _moduleId, tileName(_matchRow1[pairIxs[i]]), tileName(_matchRow2[pairIxs[i]]));
        }

        for (int i = 0; i < Tiles.Length; i++)
        {
            Tiles[i].OnInteract = clickTile(i);
        }
    }