0

我在简明扼要地描述我正在尝试做的事情时遇到了一些麻烦,这损害了我寻找答案的能力。我会尽量具体说明我的问题,如果有人可以提出建议或指出我的学习方向,我将不胜感激。Tr

我正在尝试编写纸牌游戏 Dominion 的 GUI 版本,在其中玩不同的纸牌会产生不同的结果和选择。这些卡中的许多具有相似的起始选择(例如,从您的手上选择一张卡并将其丢弃/查看敌人的手牌),但不同的结束选择(例如,将已丢弃的卡升级/将已丢弃的卡给另一个玩家)。在玩牌时,程序会查找唯一的数字卡代码并开始执行特定于该卡的代码。

这是我挂断电话的地方:

我希望有更通用的方法来监听唯一卡代码内的用户输入,但我不断收到错误。理想情况下,我可以做类似的事情

for(int i = 0; i < totalPlayers; i++)
{
    showEnemyHand(i);
}

或者

for(int i = 0; i < totalPlayers; i++)
{
    thiefEffect(i);
}

在“buttonclicked”事件(特别是“play card”按钮)中。 showEnemyHand(int) 和 thiefEffect(int) 方法将等待用户输入,存储响应,然后立即返回到它被调用的 for 循环从,但它并不像我最初希望的那么容易。

我什至不知道我应该寻找什么,这让我感到最痛苦。我一直在阅读有关事件处理和委托的内容,但我不确定这是否是我所需要的。谁能指出我需要学习的方向,或者给我我想要解决的主题,以便我可以更轻松地搜索它?(当然,帮我解决它也将不胜感激=D)

非常感谢!杰克

4

1 回答 1

0

您的解决方案适用于基于命令行的游戏、具有延续/协程的语言,或者可能在showEnemyHand等会阻塞用户输入的多线程应用程序中。对于基于 GUI 的游戏,事件驱动架构确实最适合您,因此原则上我建议您了解更多有关它的信息。

但是,如果您真的想使用循环来做到这一点,我建议您阅读有关线程阻塞调用的内容。一旦你理解了这些概念,你应该能够:

  1. 创建一个单独的线程来托管您的循环;
  2. 创建一个,该锁将阻止执行,直到用户输入某些内容(请参阅链接问题中的示例);
  3. 在你的循环用户输入的回调中使用该锁:
    1. 在循环的开始,你等待你的锁;
    2. 当用户输入某些内容(您将使用事件处理程序检测到 - 请参阅您正在使用的特定 GUI 框架的文档)时,您保存选择了哪个操作并释放锁;
    3. 您的循环将自动继续,读取保存的操作并执行迭代,直到它再次到达同一点并等待另一个用户输入。

这种方法是否比使用事件驱动逻辑编写规则更容易或更难,这是值得商榷的。关于协程也可以这样说(尽管对此经验较少,但我无法发表意见)。我给出的建议应该可以帮助您入门。

于 2012-07-03T05:26:54.513 回答