/// <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); } }
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( ); }
public void UndoChessMove(StackPlayChess onceMove) { Debuger.Log(string.Format("GameModel->UndoChessMove ( )")); s_stack.Pop( ); SubMoveCount( ); SwitchPlayChess( ); OnUndoChessMove( ); }
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); } }