c# - 最推荐的游戏 AI 线程模式是什么以及如何实现?

标签 c# multithreading artificial-intelligence backgroundworker threadpool

我是 C# 线程的新手,尽管阅读了很多有关线程的理论,但它在实践中对我没有多大帮助。

我想为跳棋游戏编写 AI 函数(minmax Alphabeta)并在不同的线程中执行它。

有 4 个选项:常规 Tread、线程池、异步委托(delegate)、BackgroundWorker。

在我看来,BackgroundWorker 非常适合此操作,它具有完成委托(delegate),因此我可以运行“makemove”函数,该函数实际上会在棋盘上进行计算出的移动并更新进度栏。

我对此有 3 个问题:

  1. BackgroundWorker 真的是这种情况下的最佳解决方案吗?

  2. BackgroundWorker是在线程池中执行的,这样做有什么好处呢?人们总是说,当您有许多不同的线程时,线程池会很好,但这并不完全是我的情况。

  3. 我看到的所有代码示例都太简单,并且展示了如何创建一个这样的线程。在我的程序中,每次轮到计算机时我都需要运行这个函数,所以我可能需要杀死前一个线程并启动一个新线程。实现这一切的正确方法是什么?

如有任何帮助,我们将不胜感激。

最佳答案

1) 所有这些解决方案都有效;你只需要使用稍微不同的逻辑来处理每一个。

2) 当你有一组可以在多个线程上执行的东西时,ThreadPool 也很有用(例如,在中国跳棋游戏中,你可以通过 ThreadPool 运行 5 个不同的 AI 模拟,并且它将在计算机上以最佳方式运行有两个核心,而使用线程会由于上下文切换而减慢进程速度)。它当然适合您的情况 - 您只需对第二个 AIEvaluation 或其他内容进行排队,它就会尽快开始执行。

3)嗯,不是真的。计算机只有在运行 Alphabeta(大概有一定的截止深度:P)之后才能真正移动,因此 AI 线程无论如何都会完成其工作。您每次都可以只使用 ThreadPool/BackgroundWorker。

关于BackgroundWorker的一些一般信息:它在你有“额外”CPU时间时运行,所以如果你的主线程由于某种原因占用CPU,它不会做很多事情。使用普通的ThreadPool可能会更好。

假设您的程序在 AI 启动主线程时调用 AIAct()。另外,让timerTick 成为Windows 窗体中存在的那种计时器。此外,让 AIState 和 GameBoard 类封装 alpha-beta 所需的功能。

using System.Threading;

const int CUTOFF_DEPTH = 6;//Maximum plys for alpha-beta
AIState state;

void AIAct()
{
    state = new AIState( this.GameBoard.GetState() );
ThreadPool.QueueUserWorkItem(RunMinimax, state);

    //assume that timerTick is a Timer (Windows Forms Timer) that ticks every 100 ms
    timerTick.Enabled = true;
}

void timerTick_Tick(object sender, EventArgs e)
{
    if (state.IsComplete)
    {
        ExecuteAction(state.Result);
        timerTick.Enabled = false;
        //whatever else you need to do
    }
}

private static void RunMinimax(object args)
{
    AIState state = args as AIState;
    if (state == null)
    {
        //error handling of some sort
        Thread.CurrentThread.Abort();
    }

    //run your minimax function up to max depth of CUTOFF_DEPTH
    state.Result = Minimax( /* */ );
    state.IsComplete = true;
}

private class AIState
{
    public AIState(GameBoard board)
    {
        this.Board = board;
    }

    public readonly GameBoard Board;

    public AIAction Result;
    public volatile bool IsComplete;
}

关于c# - 最推荐的游戏 AI 线程模式是什么以及如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554643/

相关文章:

c# - .net 正则表达式拆分

C# For 循环困惑

java - 核心java多线程-线程没有结束

java - Runnable 不执行应该执行的操作

artificial-intelligence - 遗传算法理论题

python - 如何估计特定文档的查询的重要性?

c# - 确定 UIView 是否包含在屏幕边界内

c# - 调用选择文件对话框时出现 NullReferenceException 错误

c# - 使用 Task.Factory.StartNew 时更新 UI 标签

deep-learning - 如何在 YOLOv5 中仅在感兴趣的区域进行检测?