Ejemplo n.º 1
0
    // 次のブロックの色を取得する(ゲームスタート時に、全部を埋めるとき用).
    public Block.COLOR_TYPE getNextColorStart(int x, int y)
    {
#if false
        Block.COLOR_TYPE color_type;

        color_type = (Block.COLOR_TYPE)Random.Range((int)Block.NORMAL_COLOR_FIRST, (int)Block.NORMAL_COLOR_LAST + 1);

        return(color_type);
#else
        StackBlock[,]           blocks = this.control.blocks;
        ConnectChecker   connect_checker = this.control.connect_checker;
        Block.COLOR_TYPE org_color;
        int sel;

        //

        org_color = blocks[x, y].color_type;

        // 『出現する色の候補のリスト』を初期化する.
        // (リストにすべての色が含まれるようにする).
        this.init_candidates();

        // 各色を置いたとき、同じ色が何個並ぶかを調べておく.

        for (int i = 0; i < (int)Block.NORMAL_COLOR_NUM; i++)
        {
            // i 番目のカラーのブロックを置く
            blocks[x, y].setColorType((Block.COLOR_TYPE)i);

            connect_checker.clearAll();

            // 連結数をカウント
            this.connect_num[i] = connect_checker.checkConnect(x, y);
        }

        if (this.connect_arrow_num > 0)
        {
            // まだあがり目ができてもいい場合.

            // connect_num[] の中の最大値(最大で max_num 個同じ色のブロックが並ぶ).
            int max_num = this.get_max_connect_num();

            // max_num じゃないものを削除する(最大値をとるものだけを候補に残す).
            this.erase_candidate_if_not(max_num);

            sel = Random.Range(0, candidates.Count);

            // 同じ色が4つ並んだら、あがり目の残り数を減らしておく
            if (this.connect_num[(int)candidates[sel]] >= 4)
            {
                this.connect_arrow_num--;
            }
        }
        else
        {
            // もうあがり目を作れない場合.

            // 同じ色が4つならんでしまう色を候補から外す.
            for (int i = candidates.Count - 1; i >= 0; i--)
            {
                if (this.connect_num[(int)candidates[i]] >= 4)
                {
                    candidates.RemoveAt(i);
                }
            }

            if (candidates.Count == 0)
            {
                this.init_candidates();
                Debug.Log("give up");
            }

            // connect_num[] の中の最大値(最大で max_num 個同じ色のブロックが並ぶ).
            int max_num = this.get_max_connect_num();

            // max_num じゃないものを削除する(最大値をとるものだけを候補に残す).
            this.erase_candidate_if_not(max_num);

            sel = Random.Range(0, candidates.Count);
        }


        //

        blocks[x, y].setColorType(org_color);

        return((Block.COLOR_TYPE)candidates[sel]);
#endif
    }
    // 取得下一个方块的颜色(游戏开始时,全部设置后)
    public Block.COLOR_TYPE getNextColorStart(int x, int y)
    {
#if false
        Block.COLOR_TYPE color_type;

        color_type = (Block.COLOR_TYPE)Random.Range((int)Block.NORMAL_COLOR_FIRST, (int)Block.NORMAL_COLOR_LAST + 1);

        return(color_type);
#else
        StackBlock[,]           blocks = this.control.blocks;
        ConnectChecker   connect_checker = this.control.connect_checker;
        Block.COLOR_TYPE org_color;
        int sel;

        //

        org_color = blocks[x, y].color_type;

        // 初始化“出现时颜色的候选值列表”
        // (使列表包含所有的颜色)
        this.init_candidates();

        // 设置各个方块的颜色时,探测已经排列了几个同种颜色的方块

        for (int i = 0; i < (int)Block.NORMAL_COLOR_NUM; i++)
        {
            // 放置第i项颜色的方块
            blocks[x, y].setColorType((Block.COLOR_TYPE)i);

            connect_checker.clearAll();

            // 计算连结数
            this.connect_num[i] = connect_checker.checkConnect(x, y);
        }

        if (this.connect_arrow_num > 0)
        {
            // 生成好了初始的同色4方块组

            // connect_num[] 中的最大值(最大允许max_num 个同色方块排列)
            int max_num = this.get_max_connect_num();

            // 如果数量不是max_num 则删除(只保留适当对象作为候补)
            this.erase_candidate_if_not(max_num);

            sel = Random.Range(0, candidates.Count);

            // 如果同色4个方块排列后,初始连结好的4方块组的数量将减少1
            if (this.connect_num[(int)candidates[sel]] >= 4)
            {
                this.connect_arrow_num--;
            }
        }
        else
        {
            // 还没有生成初始的同色4方块组

            // 如果同种颜色已经有4个方块排列好了则从候补值中剔除
            for (int i = candidates.Count - 1; i >= 0; i--)
            {
                if (this.connect_num[(int)candidates[i]] >= 4)
                {
                    candidates.RemoveAt(i);
                }
            }

            if (candidates.Count == 0)
            {
                this.init_candidates();
                Debug.Log("give up");
            }

            // connect_num[] 中的最大值(最大允许max_num 个同色方块排列)
            int max_num = this.get_max_connect_num();

            // 如果数量不是max_num 则删除(只保留适当对象作为候补)
            this.erase_candidate_if_not(max_num);

            sel = Random.Range(0, candidates.Count);
        }


        //

        blocks[x, y].setColorType(org_color);

        return((Block.COLOR_TYPE)candidates[sel]);
#endif
    }
Ejemplo n.º 3
0
    // ---------------------------------------------------------------- //

    public void     create()
    {
        //

        this.blocks = new StackBlock[BLOCK_NUM_X, BLOCK_NUM_Y];

        for (int y = 0; y < BLOCK_NUM_Y; y++)
        {
            for (int x = 0; x < BLOCK_NUM_X; x++)
            {
                GameObject game_object = GameObject.Instantiate(this.StackBlockPrefab) as GameObject;

                StackBlock block = game_object.GetComponent <StackBlock>();

                block.place.x = x;
                block.place.y = y;

                this.blocks[x, y] = block;

                block.setUnused();

                block.stack_control = this;
            }
        }

        //

        this.is_color_enable = new bool[Block.NORMAL_COLOR_NUM];

        for (int i = 0; i < this.is_color_enable.Length; i++)
        {
            this.is_color_enable[i] = true;
        }

        // ピンクは封印
        this.is_color_enable[(int)Block.COLOR_TYPE.PINK] = false;

        //

        this.connect_checker = new ConnectChecker();

        this.connect_checker.stack_control = this;
        this.connect_checker.blocks        = this.blocks;
        this.connect_checker.create();

        this.block_feeder         = new BlockFeeder();
        this.block_feeder.control = this;
        this.block_feeder.create();

        //

        this.setColorToAllBlock();

        //

        this.combo.is_now_combo        = false;
        this.combo.combo_count_last    = 0;
        this.combo.combo_count_current = 0;

        this.eliminate_count   = 0;
        this.eliminate_to_fall = ELIMINATE_TO_FALL_INIT;
        this.eliminate_to_cake = ELIMINATE_TO_CAKE_INIT;


        this.is_scroll_enable        = true;
        this.is_connect_check_enable = true;
    }