Ejemplo n.º 1
0
        //public board clone()
        //{
        //    board cp = new board();

        //    cp.field = (int[,])field.Clone();
        //    cp.isb2b = isb2b;
        //    cp.combo = combo;
        //    cp.column_height = (int[])column_height.Clone();
        //    if (piece != null)
        //        cp.piece = piece.clone();
        //    if (holdpiece != null)
        //        cp.holdpiece = holdpiece.clone();
        //    cp.isdead = isdead;
        //    cp.garbage_cnt = garbage_cnt;
        //    return cp;
        //}
        public simpboard tosimple()
        {
            simpboard sBoard = new simpboard();

            sBoard.isb2b      = isb2b;
            sBoard.isb2bclear = isb2bclear;
            sBoard.combo      = combo;
            if (piece != null)
            {
                sBoard.piece = piece.clone();
            }
            if (holdpiece != null)
            {
                sBoard.holdpiece = holdpiece.clone();
            }
            sBoard.isdead        = isdead;
            sBoard.column_height = (int[])column_height.Clone();
            sBoard.garbage_cnt   = garbage_cnt;
            for (int i = 0; i < 40; ++i)
            {
                for (int j = 0; j < 10; ++j)
                {
                    sBoard.field[i, j] = (field[i, j] != 0);
                }
            }
            return(sBoard);
        }
Ejemplo n.º 2
0
        public int soft_drop_floor(ref simpboard field)
        {
            int dist = 900;

            for (int i = 0; i < weight; i++)
            {
                for (int j = 0; j < height; ++j)
                {
                    if (minofield[j, i] != 0)
                    {
                        dist = Math.Min(dist, minopos.x - field.column_height[i + minopos.y] + j);
                        break;
                    }
                }
            }
            if (dist < 0)
            {
                dist = 0;
                while (check_mino_ok(ref field, minopos.x - dist - 1, minopos.y))
                {
                    dist++;
                }
            }

            if (dist > 0)
            ////while (check_mino_ok(ref field, minopos.x - 1, minopos.y))
            {
                minopos.x -= dist;
                spinlast   = false;
            }
            return(dist);
        }
Ejemplo n.º 3
0
 public bool ismin(ref simpboard field)
 {
     if (name != "T")
     {
         return(false);
     }
     if (stat == 1)
     {
         return(field.checkfield(minopos.x, minopos.y) &&
                field.checkfield(minopos.x + 1, minopos.y) &&
                field.checkfield(minopos.x + 2, minopos.y));
     }
     if (stat == 2)
     {
         return(field.checkfield(minopos.x + 2, minopos.y) &&
                field.checkfield(minopos.x + 2, minopos.y + 1) &&
                field.checkfield(minopos.x + 2, minopos.y + 2));
     }
     if (stat == 3)
     {
         return(field.checkfield(minopos.x, minopos.y + 2) &&
                field.checkfield(minopos.x + 1, minopos.y + 2) &&
                field.checkfield(minopos.x + 2, minopos.y + 2));
     }
     if (stat == 0)
     {
         return(field.checkfield(minopos.x, minopos.y) &&
                field.checkfield(minopos.x, minopos.y + 1) &&
                field.checkfield(minopos.x, minopos.y + 2));
     }
     return(false);
 }
Ejemplo n.º 4
0
 public bool soft_drop(ref simpboard field)
 {
     if (check_mino_ok(ref field, minopos.x - 1, minopos.y))
     {
         minopos.x -= 1;
         spinlast   = false;
         return(true);
     }
     return(false);
 }
Ejemplo n.º 5
0
 public bool right_move(ref simpboard field)
 {
     if (check_mino_ok(ref field, minopos.x, minopos.y + 1))
     {
         minopos.y += 1;
         spinlast   = false;
         return(true);
     }
     return(false);
 }
Ejemplo n.º 6
0
        public void reset_stat(board a)
        {
            Board = a.tosimple();
            tree temp = boardtree.clone();

            temp.pieceidx   = boardtree.pieceidx;
            boardtree       = temp;
            boardtree.Board = Board.clone();
            extend_node();
        }
Ejemplo n.º 7
0
 public void spinstatupdate(ref simpboard field)
 {
     if (isTspin(ref field))
     {
         Tspin = true;
         if (ismin(ref field))
         {
             mini = true;
         }
     }
 }
Ejemplo n.º 8
0
 public bool check_mino_ok(ref simpboard field, pos p, int[,] minofield)
 {
     for (int i = 0; i < height; ++i)
     {
         for (int j = 0; j < weight; ++j)
         {
             if (field.checkfield(i + p.x, j + p.y) &&
                 minofield[i, j] != 0)
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Ejemplo n.º 9
0
        public void reset_stat(bool[,] field, bool b2b, int combo)
        {
            tree temp = boardtree.clone();

            temp.pieceidx       = boardtree.pieceidx;
            Board               = temp.Board.clone();
            Board.field         = field;
            Board.column_height = Board.updatecol();

            Board.isb2b     = b2b;
            Board.combo     = combo;
            boardtree       = temp;
            boardtree.Board = Board.clone();
            extend_node();
        }
Ejemplo n.º 10
0
        public bool isTspin(ref simpboard field)
        {
            if (name != "T")
            {
                return(false);
            }
            if (!spinlast)
            {
                return(false);
            }
            int cnt = (field.checkfield(minopos.x, minopos.y) ? 1 : 0) +
                      (field.checkfield(minopos.x + 2, minopos.y) ? 1 : 0) +
                      (field.checkfield(minopos.x, minopos.y + 2) ? 1 : 0) +
                      (field.checkfield(minopos.x + 2, minopos.y + 2) ? 1 : 0);

            return(cnt >= 3);
        }
Ejemplo n.º 11
0
        public simpboard clone()
        {
            simpboard cp = new simpboard();

            cp.field         = (bool[, ])field.Clone();
            cp.isb2b         = isb2b;
            cp.combo         = combo;
            cp.column_height = (int[])column_height.Clone();
            if (piece != null)
            {
                cp.piece = piece.clone();
            }
            if (holdpiece != null)
            {
                cp.holdpiece = holdpiece.clone();
            }
            cp.isdead      = isdead;
            cp.garbage_cnt = garbage_cnt;
            return(cp);
        }
Ejemplo n.º 12
0
        public Tuple <int, int> lock_piece_calc(ref simpboard Board)
        {
            rule gamerule = defaultop.defrule;

            Board.piece.mino_lock(ref Board);

            bool isb2b = Board.isb2b;

            int row = Board.clear_full();
            int atk = 0;

            if (Board.isperfectclear)
            {
                atk += 6;
            }
            if (Board.piece.Tspin)
            {
                atk += gamerule.GetTspindmg(row);
            }
            else
            {
                atk += gamerule.Getcleardmg(row);
            }
            atk += gamerule.Getrendmg(Board.combo);

            if (isb2b)
            {
                atk += gamerule.Getb2bdmg(row);
            }
            if (Board.piece.mini && row == 1)
            {
                atk -= 1;
            }
            // attack calu
            //if (Board.piece.isTspin())
            //Board.cl
            //int clear

            return(new Tuple <int, int>(atk, row));
        }
Ejemplo n.º 13
0
        public int right_rotation(ref simpboard field)
        {
            int a = height, b = weight;
            int kick_try = 0;

            int[,] newfield = new int[a, b];

            right_roll(ref newfield);

            for (int kick = 0; kick < kicktable.GetLength(1); ++kick)
            {
                if (!check_mino_ok(ref field, minopos.x + kicktable[stat, kick].y, minopos.y + kicktable[stat, kick].x, newfield))
                {
                    kick_try += 1;
                }
                else
                {
                    minopos.x += kicktable[stat, kick].y;
                    minopos.y += kicktable[stat, kick].x;
                    break;
                }
            }
            if (kick_try > 4)
            {
                return(-1);
            }

            stat += 1;
            stat %= 4;
            for (int i = 0; i < a; ++i)
            {
                for (int j = 0; j < b; ++j)
                {
                    minofield[i, j] = newfield[i, j];
                }
            }
            spinlast = true;
            return(kick_try);
        }
Ejemplo n.º 14
0
        public bool mino_lock(ref simpboard field)
        {
            if (!check_mino_ok(ref field, minopos))
            {
                return(false);
            }
            soft_drop_floor(ref field);

            for (int i = 0; i < height; i++)
            {
                for (int j = weight - 1; j >= 0; --j)
                {
                    if (minofield[j, i] != 0)
                    {
                        field.column_height[i + minopos.y] = Math.Max(field.column_height[i + minopos.y], minopos.x + j + 1);
                        break;
                    }
                }
            }

            spinstatupdate(ref field);

            for (int i = 0; i < height; ++i)
            {
                for (int j = 0; j < weight; ++j)
                {
                    if (minofield[i, j] != 0)
                    {
                        field.field[i + minopos.x, j + minopos.y] = true;
                    }
                }
            }
            locked = true;

            //if (minopos.x >= 20) return false;
            return(true);
        }  // 不锁定判断tspin
Ejemplo n.º 15
0
        static public List <mino> findalltslot(simpboard Board)
        {
            List <mino> allpos = new List <mino>();

            bool[,,] visit  = new bool[42, 12, 4];
            bool[,,] visit1 = new bool[42, 12, 4];
            Queue <mino_stat> minoque = new Queue <mino_stat>();

            if (!Board.piece.check_mino_ok(ref Board, Board.piece.minopos))
            {
                return(allpos);
            }
            minoque.Enqueue(new mino_stat(Board.piece.minopos, Board.piece.stat));
            visit[Board.piece.minopos.x + 2, Board.piece.minopos.y + 2, Board.piece.stat] = true;
            mino_gene minogen = new mino_gene();
            mino      temp    = Board.piece.clone();

            while (minoque.Count != 0)
            {
                mino_stat node = minoque.Dequeue();

                //visit[node.minoopos.x, node.minoopos.y, node.stat] = true; // 硬降
                temp.setpos(node.minoopos);
                temp.setstat(node.stat);
                if (temp.left_rotation(ref Board) != -1)
                {
                    if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                    {
                        visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;
                        minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 2, node.movetime));
                    }
                }

                temp.setpos(node.minoopos);
                temp.setstat(node.stat);
                if (temp.right_rotation(ref Board) != -1)
                {
                    if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                    {
                        visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;
                        minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 3, node.movetime));
                    }
                }

                temp.setpos(node.minoopos);
                temp.setstat(node.stat);

                if (temp.left_move(ref Board))
                {
                    if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                    {
                        visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;
                        minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 0, node.movetime));
                    }
                }
                temp.setpos(node.minoopos);
                temp.setstat(node.stat);
                if (temp.right_move(ref Board))
                {
                    if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                    {
                        visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;
                        minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 1, node.movetime));
                    }
                }

                temp.setpos(node.minoopos);
                temp.setstat(node.stat);

                int dis = temp.soft_drop_floor(ref Board);
                //{
                if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                {
                    visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;
                    minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, -dis, node.movetime, repeat: dis));
                }
                //}
                if (!visit1[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat])
                {
                    visit1[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true;

                    mino fi = temp.clone();
                    fi.spinstatupdate(ref Board);
                    fi.path = node;
                    allpos.Add(fi);
                }



                //source.setpos
            }

            return(allpos);
        }