You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tap手势执行后添加暂停?单人游戏人机回合间隔实现

解决方案

核心问题在于你之前用Thread.Sleep阻塞了UI线程,导致玩家操作的UI渲染被延迟到整个Tap事件执行完毕才进行。下面是具体的修复方案:

1. 用异步等待替代线程休眠

放弃Thread.Sleep,改用Task.Delay实现异步等待,这样不会阻塞UI线程,让玩家的移动操作能立刻完成渲染。同时配合Task.Yield()确保UI线程优先处理完当前渲染任务。

修改后的Tap事件代码:

_tapGestureRecognizer.Tapped += async (s, e) =>
{
    var boardcell = (BoardCell)s;

    if (boardcell.GamePiece.Fill == null)
    {
        var isMoveValid = MakeMove(boardcell);

        if (!GameViewModel.Game.IsTwoPlayer && isMoveValid)
        {
            // 让UI线程先完成玩家移动的渲染
            await Task.Yield();
            // 设置暂停时长(这里是1000毫秒,可根据需求调整)
            await Task.Delay(1000);
            // 执行电脑回合
            await ComputerMoveAsync();
        }
    }
};

2. 重构ComputerMove为异步方法

把电脑移动逻辑抽离成独立的异步方法,如果涉及AI思考这类耗时操作,要放到后台线程执行,避免卡顿UI:

private async Task ComputerMoveAsync()
{
    // 在后台线程执行AI计算,不阻塞UI
    var bestMove = await Task.Run(() => CalculateComputerBestMove());

    // 回到UI线程执行移动操作,更新界面
    Dispatcher.Dispatch(() =>
    {
        // 这里写电脑移动的具体逻辑,比如调用对应方法更新棋盘
        ApplyComputerMove(bestMove);
    });
}

关键原理

  • Task.Yield()会让UI线程先处理队列里的渲染任务,确保玩家的移动立刻显示在屏幕上。
  • Task.Delay()是异步等待,期间UI线程可以继续响应其他操作,不会出现冻结。
  • 耗时的AI计算放到Task.Run中,避免占用UI线程导致界面卡顿。

内容的提问来源于stack exchange,提问作者Aaron White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:20:41