コード例 #1
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static LiuheChessBoard getTryChessesEndBoard(List <ChessObj> coses, LiuheChessBoard lcb)
        {
            LiuheChessBoard lcb2 = lcb.getCopy();

            foreach (ChessObj co in coses)
            {
                //获取新棋子
                LiuheChess     lc  = lcb.findChessByIdnum(co._ChessIdentityNumber);
                int[]          pos = lcb.getPointPos(lc.x, lc.y, lc.dir);
                GridValidState gvs = getGridValidState(lcb, pos[0], pos[1]);

                if (gvs != GridValidState.VOID)
                {
                    return(null);
                }
                //棋子存在而且位置可用
                else
                {
                    LiuheChess lc2 = lcb2.findChessByIdnum(lc.identityNumber);
                    //移动棋子
                    if (lc2 == null)
                    {
                        //不可移动的时候严重错误
                        Debug.Log("严重错误");
                        return(null);
                    }
                    lc2.x = pos[0];
                    lc2.y = pos[1];
                }
            }

            GameBoardCalculateItself(lcb2);
            return(lcb2);
        }
コード例 #2
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static bool moveChessInBoard(LiuheChess lc, LiuheChessBoard lcb)
        {
            int[]          pos = lcb.getPointPos(lc.x, lc.y, lc.dir);
            GridValidState gvs = getGridValidState(lcb, pos[0], pos[1]);

            if (gvs != GridValidState.VOID)
            {
                return(false);
            }
            else
            {
                LiuheChessBoard lcb2 = lcb.getCopy();
                LiuheChess      lc2  = lcb2.findChessByIdnum(lc.identityNumber);
                if (lc2 == null)
                {
                    Debug.Log("严重错误");
                    return(false);
                }
                lc2.x = pos[0];
                lc2.y = pos[1];

                GameBoardCalculateItself(lcb2);
                if (lc2.health <= 0)
                {
                    return(false);
                }

                lc.x = pos[0];
                lc.y = pos[1];
                GameBoardCalculateItself(lcb);
            }

            return(true);
        }
コード例 #3
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static LiuheChessBoard getTryEndBoard(ChessObj co, LiuheChessBoard lcb)
        {
            LiuheChess lc = lcb.findChessByIdnum(co._ChessIdentityNumber);

            int[]          pos = lcb.getPointPos(lc.x, lc.y, lc.dir);
            GridValidState gvs = getGridValidState(lcb, pos[0], pos[1]);

            if (gvs != GridValidState.VOID)
            {
                return(null);
            }
            else
            {
                LiuheChessBoard lcb2 = lcb.getCopy();
                LiuheChess      lc2  = lcb2.findChessByIdnum(lc.identityNumber);
                if (lc2 == null)
                {
                    Debug.Log("严重错误");
                    return(null);
                }
                lc2.x = pos[0];
                lc2.y = pos[1];

                GameBoardCalculateItself(lcb2);
                return(lcb2);
            }
        }
コード例 #4
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static bool moveChessInBoardUnsafe(LiuheChess lc, LiuheChessBoard lcb)
        {
            int[] pos = lcb.getPointPos(lc.x, lc.y, lc.dir);

            lc.x = pos[0];
            lc.y = pos[1];
            GameBoardCalculateItself(lcb);
            return(true);
        }
コード例 #5
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        private static bool hasChessThisInList(List <RingInfo> rfs, LiuheChess lc)
        {
            foreach (RingInfo r in rfs)
            {
                if (r.chess == lc)
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
ファイル: LiuheLogger.cs プロジェクト: shacleff/LianQiClient
        public static void Log(LiuheChess chess)
        {
            string str = "";

            str += "ID:" + chess.identityNumber + "  Pos: (" + chess.x + ", " + chess.y + ", " + chess.dir + ")  Ownner: " + chess.ownner + "\n"
                   + "Attack: " + chess.attack + "  Health: " + chess.health + "  Absorb: " + chess.absorb + "\n";
            foreach (BufferEffect be in chess.buffers)
            {
                str += be.bfType;
                str += "  " + be.healthChange + "  " + be.attackChange + "  " + be.absorbChange + "  from-" + be.perfromChess + "  to-" + be.acceptChess + "\n";
            }

            Debug.Log(str);
        }
コード例 #7
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        //递归函数
        private static int getNextLength(LiuheChess origin, LiuheChess thisC, LiuheChessBoard boardRef, int depth, List <RingInfo> rfs)
        {
            //当递归回到了头的时候-->返回长度
            if (thisC == origin)
            {
                rfs.Add(new RingInfo(thisC, depth + 1));
                return(depth + 1);
            }

            if (depth > 10)
            {
                Debug.Log("环过长");
                return(-1);
            }


            //对于所有五种方向进行判断(除了自己指向的方向)
            for (int i = 0; i < 6; i++)
            {
                if (thisC.dir == i)
                {
                    continue;
                }

                //获得现在这个方向的棋子
                LiuheChess nc = boardRef.findChessInDir(thisC.x, thisC.y, i);
                if (nc != null && nc.ownner == thisC.ownner)
                {
                    //如果非空则找这个棋子指向的对象
                    LiuheChess nc2 = boardRef.findChessInDir(nc.x, nc.y, nc.dir);

                    //如果这个棋子指向自己
                    if (nc2 == thisC)
                    {
                        //对这个方向进行搜索
                        int result;
                        result = getNextLength(origin, nc, boardRef, depth + 1, rfs);
                        //递归回来的结果如果是可用的
                        if (result > 0)
                        {
                            rfs.Add(new RingInfo(thisC, result));
                            return(result);
                        }
                        //否则继续找其他方向
                    }
                }
            }
            //如果这里所有方向都不行,则返回不可用的-1
            return(-1);
        }
コード例 #8
0
ファイル: ChessObj.cs プロジェクト: shacleff/LianQiClient
    public void setDigitals(LiuheChess lc)
    {
        if (_Health != lc.health)
        {
            _UI_Health.transform.localScale = new Vector3(0, 0, 1);
            _UI_Health.transform.DOScale(new Vector3(1, 1, 1), 0.5f);
            _UI_Health.gameObject.SetActive(true);
            _UI_Health.text = "" + lc.health;
            _Health         = lc.health;
        }

        if (_Health <= 0)
        {
            _DeadMark.DOScale(new Vector3(1, 1, 1), 0.25f);
            transform.SetParent(_Father._UnderChess);
        }
        else
        {
            _DeadMark.DOScale(new Vector3(0, 0, 1), 0.25f);
            transform.SetParent(_Father._ChessRoot);
        }

        if (_Attack != lc.attack)
        {
            _UI_Attack.transform.localScale = new Vector3(0, 0, 1);
            _UI_Attack.transform.DOScale(new Vector3(1, 1, 1), 0.5f);
            _UI_Attack.gameObject.SetActive(true);
            _UI_Attack.text = "" + lc.attack;
            _Attack         = lc.attack;
        }

        if (_Absorb != lc.absorb)
        {
            if (lc.absorb == 0)
            {
                _UI_Absorb.transform.DOScale(new Vector3(0, 0, 1), 0.5f);
                _UI_Absorb.gameObject.SetActive(true);
                _Absorb         = 0;
                _UI_Absorb.text = "" + _Absorb;
            }
            else
            {
                _UI_Absorb.transform.localScale = new Vector3(0, 0, 1);
                _UI_Absorb.transform.DOScale(new Vector3(1, 1, 1), 0.5f);
                _UI_Absorb.gameObject.SetActive(true);
                _Absorb         = lc.absorb;
                _UI_Absorb.text = "" + _Absorb;
            }
        }
    }
コード例 #9
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static LiuheChessBoard washChessBoard(LiuheChessBoard lcb)
        {
            foreach (SpecialChessLink item in lcb.deads)
            {
                if (item._Type == SpecialLinkType.DEAD)
                {
                    LiuheChess lc = lcb.findChessByIdnum(item._From_Idm);
                    lcb.chesses.Remove(lc);
                }
            }
            GameBoardCalculateItself(lcb);


            return(lcb);
        }
コード例 #10
0
ファイル: AI_Manager.cs プロジェクト: shacleff/LianQiClient
    public LiuheChessBoard isValid(LiuheChessBoard lcb)
    {
        int idm = lcb.addNewChessUnSafe(this.x, this.y, this.direction, this.ownner);

        Rules.GameBoardCalculateItself(lcb);

        LiuheChess lc = lcb.findChessByIdnum(idm);

        Assert.IsNotNull(lc, "找到了空棋子,ai下子有问题");

        if (lc.health <= 0)
        {
            return(null);
        }
        else
        {
            return(lcb);
        }
    }
コード例 #11
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        private static void checkRing(LiuheChessBoard boardRef, int idm, List <RingInfo> rfs)
        {
            LiuheChess l = boardRef.findChessByIdnum(idm);

            if (l == null)
            {
                Debug.Log("严重错误! 找不到的开始值!");
                return;
            }

            LiuheChess fc = boardRef.findChessInDir(l.x, l.y, l.dir);

            //l指向的不为空,fc是己方
            if (fc != null && fc.ownner == l.ownner)
            {
                getNextLength(fc, l, boardRef, 0, rfs);
            }
            return;
        }
コード例 #12
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
        public static void GameBoardCalculateItself(LiuheChessBoard lcb)
        {
            List <LiuheChess> lcs = lcb.chesses;


            //清空buff列表
            foreach (LiuheChess l in lcs)
            {
                l.buffers = new List <BufferEffect>();
            }

            List <RingInfo> rfs;

            rfs = new List <RingInfo>();

            foreach (LiuheChess l in lcs)
            {
                if (hasChessThisInList(rfs, l))
                {
                    continue;
                }
                else
                {
                    checkRing(lcb, l.identityNumber, rfs);
                }
            }

            foreach (RingInfo r in rfs)
            {
                r.chess.buffers.Add(new BufferEffect()
                                    .set(r.chess.identityNumber,
                                         r.chess.identityNumber,
                                         BufferType.RING, r.level, 0, 0));
            }


            //重新获得buff列表(Basic,Thron,Kiss,Ring)
            foreach (LiuheChess l in lcs)
            {
                bool       hasFront = false;
                bool       hasBack  = false;
                LiuheChess fc       = null;
                LiuheChess bc       = null;

                //获取前方棋子
                int[] pos = lcb.getPointPos(l.x, l.y, l.dir);

                int bh;

                bh = 3;

                GridValidState gvs = Rules.getGridValidState(lcb, pos[0], pos[1]);

                if (gvs == GridValidState.USING)
                {
                    hasFront = true;
                    fc       = lcb.findChessByPosition(pos[0], pos[1]);
                    if (fc != null)
                    {
                        if (fc.ownner != l.ownner)
                        {
                            bh--;
                            //Debug.Log("here");
                        }
                    }
                    else
                    {
                        Debug.Log("指向的格子上应该有棋子却找不到!!");
                        return;
                    }
                }
                else
                {
                    hasFront = false;
                }


                //获取后方棋子
                int[] pos2 = lcb.getPointPos(l.x, l.y, (l.dir + 3) % 6);

                gvs = Rules.getGridValidState(lcb, pos2[0], pos2[1]);

                if (gvs == GridValidState.USING)
                {
                    hasBack = true;
                    bc      = lcb.findChessByPosition(pos2[0], pos2[1]);
                    if (bc != null)
                    {
                        if (bc.ownner != l.ownner)
                        {
                            bh--;
                            //Debug.Log("here");
                        }
                    }
                    else
                    {
                        Debug.Log("指向的格子上应该有棋子却找不到!!");
                        return;
                    }
                }
                else
                {
                    hasBack = false;
                }

                //增加基础buff
                l.buffers.Add(new BufferEffect().set(l.identityNumber, l.identityNumber, BufferType.BASIC, bh, 1, 0));


                //如果后背的是己方,并且方向和自己正好相反(背对背),增加双三的buff
                if (hasBack && bc.ownner == l.ownner && (l.dir + 3) % 6 == bc.dir)
                {
                    l.buffers.Add(new BufferEffect().set(bc.identityNumber, l.identityNumber, BufferType.THRON, 0, 3, 0));
                }

                //如果前面是友方,而且方向正好相对(面对面),加上吸收力增值
                if (hasFront && fc.ownner == l.ownner && (l.dir + 3) % 6 == fc.dir)
                {
                    l.buffers.Add(new BufferEffect().set(fc.identityNumber, l.identityNumber, BufferType.ABSORBER, 0, 0, 2));
                    //如果有吸收,而且后方是敌人,就加一个吸收的debuff
                    if (hasBack && bc.ownner != l.ownner)
                    {
                        bc.buffers.Add(new BufferEffect().set(l.identityNumber, bc.identityNumber, BufferType.ABSORBEE, 0, -2, 0));
                    }
                }


                if (hasFront)
                {
                    if (fc.ownner == l.ownner)
                    {
                        fc.buffers.Add(new BufferEffect().set(l.identityNumber, fc.identityNumber, BufferType.SUPPORT, 0, 0, 0));
                    }
                    else
                    {
                        fc.buffers.Add(new BufferEffect().set(l.identityNumber, fc.identityNumber, BufferType.ATTACK, 0, 0, 0));
                    }
                }


                BufferEffect be = l.getSuchBuff(BufferType.BASIC);

                if (be != null)
                {
                    l.health = be.healthChange;
                    l.absorb = 0;
                    l.attack = be.attackChange;
                }
                else
                {
                    Debug.Log("严重错误,没有基础buff");
                }

                be = l.getSuchBuff(BufferType.THRON);
                if (be != null)
                {
                    l.attack = be.attackChange;
                }

                be = l.getSuchBuff(BufferType.ABSORBER);
                if (be != null)
                {
                    l.absorb = be.absorbChange;
                }

                be = l.getSuchBuff(BufferType.RING);
                if (be != null)
                {
                    l.health += be.healthChange;
                }

                //此处不能更新被吸收的buff,因为这个时候可能没加上
            }

            //减少基本攻击力,最小到0
            foreach (LiuheChess l in lcs)
            {
                BufferEffect be = l.getSuchBuff(BufferType.ABSORBEE);
                if (be != null)
                {
                    l.attack += be.attackChange;
                    if (l.attack < 0)
                    {
                        l.attack = 0;
                    }
                }
            }


            //更新互助列表
            foreach (LiuheChess l in lcs)
            {
                List <BufferEffect> bes = l.getSuchBuffAll(BufferType.SUPPORT);
                foreach (BufferEffect bfe in bes)
                {
                    LiuheChess nc = lcb.findChessByIdnum(bfe.perfromChess);
                    if (nc == null)
                    {
                        Debug.Log("重大错误!! 找不到本能找到的棋子!");
                        return;
                    }
                    bfe.attackChange = nc.attack;
                    bfe.absorbChange = 0;
                    bfe.healthChange = 1;
                }
            }

            //更新攻击列表,直接减少生命
            foreach (LiuheChess l in lcs)
            {
                List <BufferEffect> bes = l.getSuchBuffAll(BufferType.SUPPORT);
                foreach (BufferEffect bfe in bes)
                {
                    l.attack += bfe.attackChange;
                    l.health += bfe.healthChange;
                }
            }

            foreach (LiuheChess l in lcs)
            {
                List <BufferEffect> bes = l.getSuchBuffAll(BufferType.ATTACK);
                foreach (BufferEffect bfe in bes)
                {
                    LiuheChess nc = lcb.findChessByIdnum(bfe.perfromChess);
                    if (nc == null)
                    {
                        Debug.Log("重大错误!! 找不到本能找到的棋子!");
                        return;
                    }
                    l.health -= nc.attack;
                }
            }

            lcb.attacks = new List <SpecialChessLink>();
            lcb.skills  = new List <SpecialChessLink>();
            lcb.deads   = new List <SpecialChessLink>();

            List <SpecialChessLink> tscl = new List <SpecialChessLink>();

            foreach (LiuheChess lc in lcb.chesses)
            {
                if (lc.health <= 0)
                {
                    lcb.deads.Add(new SpecialChessLink(SpecialLinkType.DEAD, lc.identityNumber, lc.identityNumber));
                    List <BufferEffect> bes = lc.buffers;
                    foreach (BufferEffect be in bes)
                    {
                        if (be.bfType == BufferType.ATTACK)
                        {
                            tscl.Add(new SpecialChessLink(SpecialLinkType.ATTACK, be.perfromChess, be.acceptChess));
                        }
                    }
                }
            }

            foreach (SpecialChessLink scl in tscl)
            {
                if (!lcb.deads.Contains(scl))
                {
                    lcb.attacks.Add(scl);
                }
            }
        }
コード例 #13
0
ファイル: Rules.cs プロジェクト: shacleff/LianQiClient
 public RingInfo(LiuheChess lc, int ll)
 {
     chess = lc;
     level = ll;
 }
コード例 #14
0
ファイル: Display.cs プロジェクト: shacleff/LianQiClient
    public void changeDgree(float dg)
    {
        if (!_Manager.ifThisPlayerLocal())
        {
            return;
        }

        if (!_IsStarted)
        {
            return;
        }

        if (_TempChess == null)
        {
            return;
        }
        _ChessLog2Transform.DOMove(_ChessLogStart.position, 0.5f);
        _ChessLog3Transform.DOMove(_ChessLogStart.position, 0.5f);


        int i = (int)(Mathf.Rad2Deg * dg);

        i = (i + 480) % 360;
        i = i / 60;

        if (i == _TempChess._Direction)
        {
            return;
        }

        _TempChess.rotate(i);

        List <int> oks = _Manager.getUsableDirection();

        //如果这个方向不禁手
        if (oks.Contains(i))
        {
            LiuheChessBoard lcb = _Manager.tryToPlace(_TempChess.x, _TempChess.y, _TempChess._Direction);


            if (lcb == null)
            {
                Debug.Log("严重错误,不能增加棋子的格子增加棋子了!");
                return;
            }

            //更新棋子显示
            updateBoard(lcb.chesses);

            LiuheChess lc = lcb.findChessByPosition(_TempChess.x, _TempChess.y);
            if (lc == null)
            {
                Debug.Log("严重错误,不能增加棋子的格子增加棋子了!");
                return;
            }

            if (lc.health <= 0)
            {
                _WarningText.text = _Warning_Info[0];
                _ChessLogTransform.DOMove(_ChessLogEnd.position, 0.5f);
            }
            else
            {
                _ChessLogTransform.DOMove(_ChessLogStart.position, 0.5f);
            }
            //Debug.Log("可以下哦");
        }
        //如果这个方向禁手
        else
        {
            _WarningText.text = _Warning_Info[1];
            _ChessLogTransform.DOMove(_ChessLogEnd.position, 0.5f);
            _TempChess.setVoid();
            updateBoard();
            //Debug.Log("不可以下哦");
        }
    }