コード例 #1
0
ファイル: PlayerModel.cs プロジェクト: Avatarchik/ZGXQ
    public void ChessMove(StackPlayChess onceMove)
    {
        // 如果下棋符合规则
        if (AiMoveSearch.LegalMove(onceMove.mvResult))
        {
            Debuger.Log(string.Format("GameModel->ChessMove (  ) 下棋符合规则,mvResult= {0}, pcCaptured= {1}", onceMove.mvResult, onceMove.pcCaptured));

            // 如果没有被将军
            if (AiMoveSearch.MakeMove(onceMove.mvResult, 0))
            {
                //father.playSound(2, 1);// 播放声音玩家走棋

                s_stack.Push(onceMove);
                AddMoveCount( );
                SwitchPlayChess( );
                OnChessMove( );
            }
        }
        else
        {
            Debuger.Log(string.Format("GameModel->ChessMove (  ) 下棋不符合规则,mvResult= {0}, pcCaptured= {1}", onceMove.mvResult, onceMove.pcCaptured));
        }

        //AiMoveSearch.ChangeSide( );
    }
コード例 #2
0
ファイル: ChessAiModel.cs プロジェクト: Avatarchik/ZGXQ
        public void AiOnceMove( )
        {
            // 如果正在进行电脑下棋
            if (!isValidTouch)
            {
                return;
            }

            //...省略Android前面的代码

            // 电脑走棋
            // 启动一个线程进行电脑下棋
            Thread aiThread = new Thread(new ThreadStart(() => {
                Debuger.LogWarning("GameView onTouchEvent函数,电脑走棋线程开始");
                ViewConstant.endTime = ViewConstant.zTime; // 时间初始化

                isRedPlayChess = true;                     // 正在下棋
                isValidTouch   = false;                    // 正在下棋标志

                draw( );                                   // 重绘方法

                // 电脑走棋
                AiMoveSearch.SearchMain( );

                int sqSrc      = Chess_LoadUtil.SRC(AiMoveSearch.mvResult); // 得到起始位置的数组下标
                int sqDst      = Chess_LoadUtil.DST(AiMoveSearch.mvResult); // 得到目标位置的数组下标
                int pcCaptured = ucpcSquares[sqDst];                        // 得到目的格子的棋子
                Debuger.LogWarning(string.Format("GameView onTouchEvent函数,走法起点={0},走法终点={1}, 得到目的格子的棋子={2}", sqSrc, sqDst, pcCaptured));

                // 线程安全事件管理器,分发事件,到UI线程处理,棋子的移动
                // AI移动棋子(U3D API),移动到 256数组【sqDst】
                AIMoveEvent aIMoveEvent = new AIMoveEvent( );
                aIMoveEvent.from        = sqSrc;
                aIMoveEvent.to          = sqDst;
                // 派发事件,AI移动棋子事件
                EventDispatcher.Instance( ).DispatchEvent(AIMoveEvent.AI_MOVE_EVNET, aIMoveEvent);
                Debuger.Log("GameView onTouchEvent函数->派发事件,AI移动棋子事件");

                // 电脑走一步棋
                AiMoveSearch.MakeMove(AiMoveSearch.mvResult, 0);

                StackPlayChess stackplayChess = new StackPlayChess(AiMoveSearch.mvResult, pcCaptured);
                // 下棋步骤入栈
                stack.Push(stackplayChess);

                initArrays( );// 数组操作

                // 如果电脑赢了
                if (AiMoveSearch.IsMate( ))
                {
                    AiMoveSearch.Startup( ); // 初始化棋盘
                    initArrays( );           // 初始化数组
                    ViewConstant.shuJMflag = true;
                    //father.playSound(5, 1);// b播放声音,输了
                }
                else
                {
                    //father.playSound(2, 1);// b播放声音,电脑下棋了
                    isValidTouch = true;// 下完棋子,玩家可以操控了。
                }

                isRedPlayChess       = false;
                ViewConstant.endTime = ViewConstant.zTime;
                draw( );// 重绘方法

                Debuger.LogWarning("电脑走棋线程执行完毕!!");
            }));

            //aiThread.IsBackground = true;
            // 加入线程管理,并启动线程
            ThreadManager.Instance.addWorkThread(aiThread);
        }