我是 C# 线程的新手,尽管阅读了很多有关线程的理论,但它在实践中对我没有多大帮助。
我想为跳棋游戏编写 AI 函数(minmax Alphabeta)并在不同的线程中执行它。
有 4 个选项:常规 Tread、线程池、异步委托(delegate)、BackgroundWorker。
在我看来,BackgroundWorker 非常适合此操作,它具有完成委托(delegate),因此我可以运行“makemove”函数,该函数实际上会在棋盘上进行计算出的移动并更新进度栏。
我对此有 3 个问题:
BackgroundWorker 真的是这种情况下的最佳解决方案吗?
BackgroundWorker是在线程池中执行的,这样做有什么好处呢?人们总是说,当您有许多不同的线程时,线程池会很好,但这并不完全是我的情况。
我看到的所有代码示例都太简单,并且展示了如何创建一个这样的线程。在我的程序中,每次轮到计算机时我都需要运行这个函数,所以我可能需要杀死前一个线程并启动一个新线程。实现这一切的正确方法是什么?
如有任何帮助,我们将不胜感激。
最佳答案
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/