/// <summary>
        /// 玩家下定一步棋
        /// </summary> 
        protected virtual void OnChessMoveFinish(StackPlayChess stackPlayChess)
        {
            // Do not propagate the click event if the button is disabled
            if (!IsEnabled) {
                return;
            }

            if (ChessMoveFinishEvent != null) {
                ChessMoveFinishEvent(stackPlayChess);
            }
        }
Exemple #2
0
    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( );
    }
Exemple #3
0
    public void UndoChessMove(StackPlayChess onceMove)
    {
        Debuger.Log(string.Format("GameModel->UndoChessMove (  )"));

        s_stack.Pop( );
        SubMoveCount( );
        SwitchPlayChess( );
        OnUndoChessMove( );
    }
Exemple #4
0
        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);
        }
 void ChessOnceMoveFinish(StackPlayChess stackPlayChess)
 {
     OnChessMoveFinish(stackPlayChess);
 }
        // At the drag end
        void On_DragEnd(Gesture gesture)
        {
            if (gesture.pickObject == m_selfGameObject) {
                m_selfGameObject.renderer.material.color = Color.white;

                if (null != m_IndexTriger) {
                    //设置棋子落下的位置
                    this.transform.localPosition = m_IndexTriger.transform.localPosition;
                } else {
                    Debuger.LogError("m_IndexTriger is null !!");
                    return;
                }

                byte xzgz = (byte)(16 * (m_IndexTriger.m_i + 3) + (3 + m_IndexTriger.m_j));// 落下棋子的格子是这么多,也就是其在256数组的下标
                IndexCtrlBehaviour.s_xzgz = xzgz;
                Debuger.LogWarning("棋子" + this.name + "落子到了" + m_IndexTriger.name + "位置上!其在的256数组的下标为" + xzgz);

                //copy drag start..
                int sqDst = Chess_LoadUtil.DST(xzgz + ((m_IndexTriger.m_i + 3) * 16 + m_IndexTriger.m_j + 3) * 256);       // 选中的棋子在256数组的下标
                int pcCaptured = IndexCtrlBehaviour.m_qiZiPos[sqDst];// 通过256数组的下标值,得到选中格子是哪颗棋子
                int mv = xzgz + ((m_IndexTriger.m_i + 3) * 16 + m_IndexTriger.m_j + 3) * 256;   // 走一步棋的走法
                Debuger.LogWarning("sqDst = " + sqDst + ", 得到目的格子的棋子pcCaptured = " + pcCaptured + ", mv = " + mv);

                StackPlayChess stackPlayChess = new StackPlayChess(mv, pcCaptured);
                // 调用玩家下完一步棋事件
                ChessOnceMoveFinish(stackPlayChess);
            }
        }