基于Qt的用户界面连接自主游戏模型

2024-09-25 00:30:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python创建了一个简单的基于控制台的拼字游戏。我尽量从I/O封装游戏模型,这意味着我创建了几个类来描述游戏规则和当前状态。基本上我想到了这些课程:

  • LetterSet:描述游戏中的牌(分数、总金额等)
  • Board:用它的分片和辅助功能来表示电路板
  • Player:一个虚拟类,将像Human或Bot这样的真实类进行子类化,得到一个方法play(),它应该返回玩家的移动
  • Game:嗯。。。在

在我的控制台应用程序中使用简单的线性和同步流,一切都很好。在

但事实证明,将这个概念移植到Qt并不容易。我已经创建了所有必要的小部件,比如一个可拖动的板,描述游戏状态的一般视觉元素和简单的按钮,如“通过”、“继续”、“交换”。在

问题是,我不确定如何处理play()方法,该方法可能使用我创建的Qt接口来生成有效的移动。这对Bot来说没有问题,它只搜索一个移动而不进行任何交互。在

我目前的想法是创建一个类似于所描述的here的本地事件循环,并等待在Human(Bot)中定义的play()方法中单击按钮。这有点难看,所以我想知道有没有更好的方法。在

我希望主逻辑是相同的,例如,Player类服务于生成移动并返回它的play()方法。这样就可以创建任何类型的Player,比如网络播放器或机器人。这种同步方式与基于Qt的signal/slot方式不太适合。希望有人想出个好主意来解决我的问题。在

总结:如何在play()方法中生成Player的移动,并像一个简单的move = player.play(game)调用一样返回它?

编辑:快照,了解我在说什么: snapshot
(来源:b52 at reaktor42.de

Edit2:这是一个相当古老的问题,我在大约两年前成功地完成了这项任务。尽管如此,我认为如果我发布results through github,它可能对其他人有用。在

先谢谢你,奥利


Tags: 方法模型游戏play状态bot方式qt
3条回答

My current idea is to create a local event loop like described here and to wait for the buttons to get clicked in my play() method defined in Human(Bot). This is kinda ugly so I'm wondering if there is a better way to do it.

我不明白你为什么觉得这很难看。实际上,任何GUI程序都是这样工作的:初始化一组控件(按钮等),等待用户与控件交互,响应交互,然后重复。在

我建议你给玩家一个按钮来提交他们的移动。{1}事件处理程序通知事件处理程序,^事件处理程序发出一个事件。游戏逻辑检查移动是否合法(您应该将代码放在这里而不是GUI类中),如果移动合法,则将控制权传递给下一个Player对象。在

我认为您是对的,GUI环境中基于事件的模型与您最初的应用程序设计之间有点脱节。对于控制台应用程序,您可以编写事件循环,但在我所知的任何框架中的GUI应用程序中,框架都有自己的一个。在

我会让玩家对象通过信号把它的移动发送到游戏对象。你需要围绕这个设计来构建你的基本播放器类。它不应该那么难做,因为你已经有了实际的逻辑,你只是重新布线了一点。在

请注意,你的播放器对象实际上只是游戏和实际玩家之间的接口,可能是在用户界面中点击按钮的人,或者是通过网络连接的远程玩家。只有在bot的情况下,player对象才能真正成为player,即使在这种情况下,最好使用单独的策略引擎对象。这样想可能有助于掌握设计。在

你不必那样做。你可以解决它,例如通过你描述的方法,但是我不想在一个有自己的GUI事件循环的应用程序中处理我自己的事件循环。这是在对抗GUI框架,而不是使用它。不仅仅是Qt是这样的,在任何GUI框架中都会出现类似的问题。这是一种思考构建应用程序的不同方式,我建议采用它。在

在Player play函数中可以做的是:

  1. 启用按钮并将其连接到插槽(每个操作一个)
  2. 等待玩家移动被验证(或任何其他原因退出)
  3. 收到(或验证)玩家移动后,断开插槽信号

这是一种方法,但你应该修改它以适合你的游戏模型

相关问题 更多 >