Esempio n. 1
0
        //public int searchtslot() // 去找可能的t坑
        //{

        //}

        public bool hasnextT(Juraknifecore bot, int nowidx)
        {
            for (int i = nowidx, j = 0; i < bot.nextcnt && j < 5; ++i, ++j)
            {
                if (bot.nextqueue[i % 30] == 2)
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 2
0
 public void bot_init(weights w = null, int nextcnt = 3)
 {
     init();
     if (w == null)
     {
         bot = new Juraknifecore();
     }
     else
     {
         bot = new Juraknifecore(w);
     }
     //Minorule = new mino_gene();
     bot.init();
     for (int i = 0; i < nextcnt; ++i)
     {
         int next = Minorule.genebag7int();
         bot.add_next(next);
         Board.add_next_piece(next);
     }
     bot.extend_node();
 }
Esempio n. 3
0
        public void findalladd(Juraknifecore bot)
        {
            // 攻击力判定 + t旋只改场地分
            if (pieceidx >= bot.nextcnt)
            {
                return;
            }
            Tuple <int, int> res;

            this.nowpiece = bot.nextqueue[pieceidx % 30];
            isextend      = true;
            inplan        = false;
            Board.piece   = defaultop.demino.getmino(nowpiece);
            Board.piece.setpos(19, 3);
            List <mino> allpos   = seacher.findallplace(Board);
            int         chirdidx = pieceidx + 1;

            if (allpos == null)
            {
                tree chird = clone(); chird.isdead = true; chird.pieceidx = chirdidx; chird.inplan = false; chird.isextend = true; treenode.Add(chird); return;
            }
            ;
            foreach (mino m in allpos)
            {
                // 场外死亡判断
                tree chird = clone();
                chird.Board.piece = m;

                res                = lock_piece_calc(ref chird.Board);
                chird.attack       = chird.maxattack = res.Item1;
                chird.def          = chird.maxdef = res.Item1 + res.Item2; // 已经消除了 还能叫防御吗
                chird.finmino      = m;
                chird.father       = this;
                chird.ishold       = false;
                chird.isdead       = false;
                chird.holdpiece    = holdpiece;
                chird.pieceidx     = chirdidx;
                chird.depth        = depth + 1;
                chird.maxdepth     = chird.depth;
                chird.maxdepth     = chird.pieceidx;
                chird.inplan       = true;
                chird.res          = bot.evalweight.evalfield(chird);
                chird.fieldscore   = (int)chird.res.score;
                chird.battlescore += bot.evalweight.evalbattle(chird); // 相同的不要反复判了
                chird.movescore    = bot.evalweight.evalmove(chird);   // 相同的不要反复判了
                chird.atkscore     = bot.evalweight.evalatkdef(chird); // 相同的不要反复判了
                if (true || chird.holdT || hasnextT(bot, chirdidx))    // 当前块是t的时候
                {
                    tree Tchird1 = chird.clone();
                    Tchird1.Board.piece = defaultop.demino.getmino(2);
                    Tchird1.Board.piece.setpos(19, 3);
                    List <mino> Alltslot = search_tspin.findalltslot(Tchird1.Board); // 修改  /// 我是把tspin后的状态 提前压回该节点
                    if (Alltslot.Count != 0)
                    {
                        //List<mino> Alltslot = search_tspin.findalltslot(chird.Board);
                        tree bestT;
                        long minscore = chird.fieldscore;

                        foreach (mino t in Alltslot) // 超过一个 干掉
                        {
                            if (!t.Tspin)
                            {
                                continue;
                            }
                            tree Tchird = chird.clone();
                            Tchird.Board.piece = t;
                            Tchird.finmino     = t;
                            res = lock_piece_calc(ref Tchird.Board);

                            if (!t.mini)
                            {
                                Tchird.fieldscore  = bot.evalweight.evalfield(Tchird).score;
                                Tchird.fieldscore += bot.evalweight.W.tslot[res.Item2];
                            }
                            else
                            {
                                Tchird.fieldscore = chird.fieldscore + bot.evalweight.W.tslot[4];
                            }
                            //Tchird.score += bot.evalweight.evalbattle(Tchird); // 是否要battle也加上 // 其他节点借用了这个t的分值? 需不需要加入t坑评分
                            // 攻击也需要
                            if (Tchird.fieldscore > minscore && Tchird.Board.piece.Tspin)
                            {
                                minscore = Tchird.fieldscore;
                                bestT    = Tchird;
                            }
                        }
                        chird.fieldscore = minscore;
                    }
                }

                // 回传父节点

                chird.updatefather(); // check update
                treenode.Add(chird);
            }

            if (holdpiece == -1)
            {
                int holdidx = pieceidx + 1, nextnext = pieceidx + 2;

                if (holdidx < bot.nextcnt)
                {
                    // 保持连击的加分 // 防御是否应该削去
                    // 防御是给没打出攻击时才有的
                    // combo应该是个可延续状态

                    // 问题 特别喜欢打t1
                    // 不喜欢留防御

                    // todo T比较近的时候就可以开搜
                    // 优化

                    // 多next看t
                    // 为什么不喜欢堆防御

                    // keepcombo的 def
                    // 子节点也要前面的攻击
                    // 软降优化

                    // 扩展被选中的节点的所有子节点

                    // 需要参与排序的有 自身场地状态 从根到该节点所打出的攻击总数 该点的攻击,该点开始保持连击打出的最大防御数 路径总数(? 浪费t总数(这个不确定
                    //

                    Board.piece = defaultop.demino.getmino(bot.nextqueue[holdidx % 30]);
                    Board.piece.setpos(19, 3);
                    List <mino> allpos2 = seacher.findallplace(Board);
                    foreach (mino m in allpos2)
                    {
                        tree chird = clone();
                        chird.Board.piece = m;
                        res                = lock_piece_calc(ref chird.Board);
                        chird.attack       = chird.maxattack = res.Item1;
                        chird.def          = chird.maxdef = res.Item1 + res.Item2; // 已经消除了 还能叫防御吗
                        chird.finmino      = m;
                        chird.isdead       = false;
                        chird.ishold       = true;
                        chird.holdpiece    = nowpiece;
                        chird.father       = this;
                        chird.pieceidx     = nextnext;
                        chird.depth        = depth + 1;
                        chird.maxdepth     = chird.pieceidx;
                        chird.inplan       = true;
                        chird.res          = bot.evalweight.evalfield(chird);
                        chird.fieldscore   = (int)chird.res.score;
                        chird.battlescore += bot.evalweight.evalbattle(chird); // 作为攻击回传
                        chird.movescore    = bot.evalweight.evalmove(chird);   // 相同的不要反复判了
                        chird.atkscore     = bot.evalweight.evalatkdef(chird); // 相同的不要反复判了
                        if (true || chird.holdT || hasnextT(bot, nextnext))
                        {
                            tree Tchird1 = chird.clone();
                            Tchird1.Board.piece = defaultop.demino.getmino(2);
                            Tchird1.Board.piece.setpos(19, 3);
                            List <mino> Alltslot = search_tspin.findalltslot(Tchird1.Board);
                            //List<mino> Alltslot = search_tspin.findalltslot(chird.Board);
                            if (Alltslot.Count != 0)
                            {
                                tree bestT;
                                long minscore = chird.fieldscore;
                                foreach (mino t in Alltslot)
                                {
                                    if (!t.Tspin)
                                    {
                                        continue;
                                    }
                                    tree Tchird = chird.clone();
                                    Tchird.Board.piece = t;
                                    Tchird.finmino     = t;
                                    res = lock_piece_calc(ref Tchird.Board); // 作为防御回传

                                    Tchird.fieldscore = bot.evalweight.evalfield(Tchird).score;

                                    //Tchird.score += bot.evalweight.evalbattle(Tchird); // 是否要battle也加上
                                    if (!t.mini)
                                    {
                                        Tchird.fieldscore  = bot.evalweight.evalfield(Tchird).score;
                                        Tchird.fieldscore += bot.evalweight.W.tslot[res.Item2];
                                    }
                                    else
                                    {
                                        Tchird.fieldscore = chird.fieldscore + bot.evalweight.W.tslot[4];
                                    }
                                    if (Tchird.fieldscore > minscore && Tchird.Board.piece.Tspin)
                                    {
                                        minscore = Tchird.fieldscore;
                                        bestT    = Tchird;
                                    }
                                }
                                chird.fieldscore = minscore;
                            }
                        }
                        chird.updatefather();
                        // 回传父节点
                        treenode.Add(chird);
                    }
                    // 回传父节点
                }
            }
            else
            {
                int temp = nowpiece;
                nowpiece    = holdpiece;
                Board.piece = defaultop.demino.getmino(nowpiece);
                Board.piece.setpos(19, 3);
                List <mino> allpos1 = seacher.findallplace(Board);
                // 先对相对有用的节点更新
                foreach (mino m in allpos1)
                {
                    tree chird = clone();
                    chird.Board.piece = m;
                    res                = lock_piece_calc(ref chird.Board);
                    chird.attack       = chird.maxattack = res.Item1;
                    chird.def          = chird.maxdef = res.Item1 + res.Item2; // 已经消除了 还能叫防御吗
                    chird.finmino      = m;
                    chird.isdead       = false;
                    chird.ishold       = true;
                    chird.holdpiece    = temp; // oops
                    chird.pieceidx     = chirdidx;
                    chird.father       = this;
                    chird.depth        = depth + 1;
                    chird.maxdepth     = chird.depth;
                    chird.maxdepth     = chird.pieceidx;
                    chird.inplan       = true;
                    chird.res          = bot.evalweight.evalfield(chird);
                    chird.fieldscore   = (int)chird.res.score;
                    chird.battlescore += bot.evalweight.evalbattle(chird);
                    chird.movescore    = bot.evalweight.evalmove(chird);   // 相同的不要反复判了
                    chird.atkscore     = bot.evalweight.evalatkdef(chird); // 相同的不要反复判了
                    if (true || chird.holdT || hasnextT(bot, chirdidx))
                    {
                        tree Tchird1 = chird.clone();
                        Tchird1.Board.piece = defaultop.demino.getmino(2);
                        Tchird1.Board.piece.setpos(19, 3);
                        List <mino> Alltslot = search_tspin.findalltslot(Tchird1.Board);
                        //List<mino> Alltslot = search_tspin.findalltslot(chird.Board);
                        if (Alltslot.Count != 0)
                        {
                            tree bestT;
                            long minscore = chird.fieldscore;
                            foreach (mino t in Alltslot)
                            {
                                if (!t.Tspin)
                                {
                                    continue;           // 相同场地不要去 有些无用场地需要吗
                                }
                                tree Tchird = chird.clone();
                                Tchird.Board.piece = t;
                                Tchird.finmino     = t;
                                res = lock_piece_calc(ref Tchird.Board);
                                Tchird.fieldscore = bot.evalweight.evalfield(Tchird).score;
                                //Tchird.battlescore += bot.evalweight.evalbattle(Tchird); // 是否要battle也加上
                                if (!t.mini)
                                {
                                    Tchird.fieldscore  = bot.evalweight.evalfield(Tchird).score;
                                    Tchird.fieldscore += bot.evalweight.W.tslot[res.Item2];
                                }
                                else
                                {
                                    Tchird.fieldscore = chird.fieldscore + bot.evalweight.W.tslot[4];
                                }
                                if (Tchird.fieldscore > minscore && Tchird.Board.piece.Tspin) // 可以优化计算顺序
                                {
                                    minscore = Tchird.fieldscore;
                                    bestT    = Tchird;
                                }
                            }
                            chird.fieldscore = minscore;
                        }
                    }
                    chird.updatefather();
                    // 回传父节点
                    treenode.Add(chird);
                }
            }
        }
Esempio n. 4
0
        public void run()
        {
            while (true)
            {
                Juraknifecore bot = new Juraknifecore();
                bot.init();
                //bot.boardtree.Board.console_print(false);
                mino_gene mino_Gene = new mino_gene();
                Random    rand      = new Random();
                for (int i = 0; i < 3; ++i)
                {
                    //bot.add_next(rand.Next() % 7);
                    bot.add_next(mino_Gene.genebag7int());
                }
                //char a2 = Console.ReadKey().KeyChar;
                //bot.add_next(3);
                //bot.add_next(2);

                int t = 7;

                //int[] nextqq = { 3, 1, 6, 2, 0, 5, 2, 1, 4, 0, 1, 6, 5 };
                Queue <tree> ans = new Queue <tree>();
                while (true)
                //foreach (int q in nextqq)
                {
                    //bot.add_next(rand.Next() % 7);
                    bot.add_next(mino_Gene.genebag7int());
                    //bot.add_next(q);
                    bot.extend_node();
                    //if (bot.boardtree.treenode[0].res.score < -1000000)
                    {
                        Console.WriteLine("ressearch");
                        foreach (tree chird in bot.boardtree.treenode)

                        {
                            chird.Board.console_print(false);
                            Console.WriteLine("atk = {0}", chird.attack);
                            Console.WriteLine("maxattack = {0}", chird.maxattack);
                            Console.WriteLine("def = {0}", chird.def);
                            Console.WriteLine("maxdef = {0}", chird.maxdef);
                            Console.WriteLine("atkscore = {0}", chird.atkscore);
                            Console.WriteLine("battlescore = {0}", chird.battlescore);
                            Console.WriteLine("combo = {0}", chird.Board.combo);
                            Console.WriteLine("clearrow = {0}", chird.Board.clearrow);
                            Console.WriteLine("movetime = {0}", chird.finmino.path.movetime);
                            Console.WriteLine("name = {0}", chird.finmino.name);
                            Console.WriteLine("Tspin = {0}", chird.finmino.Tspin);
                            Console.WriteLine("isb2bclear = {0}", chird.Board.isb2bclear);

                            Console.WriteLine("nodebattlescore = {0}", bot.evalweight.evalbattle(chird));
                            Console.WriteLine(chird.score);
                            Console.WriteLine("maxdepth = {0}", chird.maxdepth);
                            //Console.WriteLine("scoreex = {0}", chird.scoreex);

                            //Console.WriteLine(chird.finmino.minopos.x);
                            //Console.WriteLine(chird.finmino.minopos.y);
                            //Console.WriteLine(chird.finmino.stat);
                            Console.WriteLine(chird.finmino.name);
                            //foreach (int a in chird.Board.column_height)
                            //{
                            //    Console.Write(a);
                            //    Console.Write(" ");
                            //}
                            //Console.WriteLine("");
                            chird.finmino.console_print();
                            if (chird.holdpiece != -1)
                            {
                                defaultop.demino.getmino(chird.holdpiece).console_print();
                            }
                            double kk = 0;
                            //eval.evalhole(chird, chird.Board.column_height, 0, ref kk);
                            //chird.res.print();
                            //char a1 = Console.ReadKey().KeyChar;
                        }
                    }
                    tree root = bot.requset_next_move();
                    if (root.isdead)
                    {
                        Console.WriteLine(root.pieceidx);; break;
                    }
                    ;
                    //ans.Enqueue(root);
                    //if (ans.Count > 200) ans.Dequeue();
                    //eval.evalfield(root);
                    //Console.Clear();
                    //root.Board.console_print(true, root.finmino);
                    //if (root.pieceidx % 1 == 0 || root.score < -1000000)
                    {
                        root.Board.console_print(false);
                        Console.WriteLine("resroot");
                        Console.WriteLine("atk = {0}", root.attack);
                        Console.WriteLine("maxattack = {0}", root.maxattack);
                        Console.WriteLine("def = {0}", root.def);
                        Console.WriteLine("maxdef = {0}", root.maxdef);
                        Console.WriteLine("atkscore = {0}", root.atkscore);
                        Console.WriteLine("battlescore = {0}", root.battlescore);
                        Console.WriteLine("combo = {0}", root.Board.combo);
                        Console.WriteLine("clearrow = {0}", root.Board.clearrow);
                        Console.WriteLine("movetime = {0}", root.finmino.path.movetime);
                        Console.WriteLine("name = {0}", root.finmino.name);
                        Console.WriteLine("Tspin = {0}", root.finmino.Tspin);
                        Console.WriteLine("isb2bclear = {0}", root.Board.isb2bclear);
                        Console.WriteLine("nodebattlescore = {0}", bot.evalweight.evalbattle(root));
                        Console.WriteLine(root.score);
                        Console.WriteLine("maxdepth = {0}", root.maxdepth);
                        //Console.WriteLine("scoreex = {0}", root.scoreex);
                        //Console.WriteLine(bot.nodequeue.Count);
                        //Console.WriteLine(root.pieceidx);
                        //Console.WriteLine(root.Board.piece.name);
                        //root.res.print();
                        //foreach (int a in root.Board.column_height)
                        //{
                        //    Console.Write(a);
                        //    Console.Write(" ");
                        //}
                    }

                    //foreach (int a in root.Board.column_height)
                    //{
                    //    Console.Write(a);
                    //    Console.Write(" ");
                    //}
                    Console.WriteLine("");
                    //root.res.print();
                    Console.WriteLine("-----------------------------------------------");
                    root.finmino.console_print();
                    if (root.holdpiece != -1)
                    {
                        defaultop.demino.getmino(root.holdpiece).console_print();
                    }
                    // char a1 = Console.ReadKey().KeyChar;

                    //char a2 = Console.ReadKey().KeyChar;
                    //foreach (tree a in bot.boardtree.treenode)
                    //{
                    //    //a.Board.console_print(false);
                    //    //char a1 = Console.ReadKey().KeyChar;
                    //}

                    //bot.add_next(2);
                    //foreach (tree a in bot.boardtree.treenode)
                    //{
                    //    bot.extend_node(a);
                    //    foreach (tree a1 in a.treenode)
                    //    {
                    //        a1.Board.console_print(false);
                    //        char a2 = Console.ReadKey().KeyChar;
                    //        //char a1 = Console.ReadKey().KeyChar;
                    //    }

                    //}
                }

                //foreach (tree root in ans)
                //{
                //    root.Board.console_print(false);
                //    Console.WriteLine("resroot");
                //    Console.WriteLine(root.score);
                //    Console.WriteLine(bot.nodequeue.Count);
                //    Console.WriteLine(root.pieceidx);
                //    Console.WriteLine(root.Board.piece.name);
                //    root.res.print();
                //}
            }
        }