我正在尝试写一个很好的图解来展示棋盘游戏的棋盘以及玩家在棋盘周围的移动。 棋盘是一个由方块组成的网格,玩家可以向上、向下、向左或向右移动。 几组连续的图块被分组到命名区域中。 有些瓷砖之间有墙壁阻碍移动。
基本上就是这样。 我想如果所有玩家都是人类控制的,我知道从哪里开始,但我正在努力解决计算机控制玩家会发生的情况。 我希望玩家能够对自己说:“我在 x 方格,我经常想去 R 区,也想去 S 区一点。我有 6 步可用,因此我应该做……”
我不知道从哪里开始。 有什么想法吗? 这将采用现代面向对象语言。
编辑:我(还)不关心电路板的图形表示,它更多的是关于寻路部分。
我想说使用树结构来表示每个可能的移动。 您可以使用Minimax类型的算法来计算出计算机应该采取什么动作。
有一个 Player 类,其中具有将方块与移动到那里的概率相关联的 Map 字段,即 Map
有一个 Board 类,封装了一系列 Squares。每个方块将有四个布尔值或类似的值来标记它有墙的位置、坐标以及上面的玩家(如果有)。
我可以告诉你什么对我来说对商业棋盘游戏风格的产品有用。
将棋盘和核心游戏逻辑的表示分解为自己的模块,并为游戏的其余部分提供明确定义的接口。 我们有 bool IsValidMove(origin, dest) 和 bool PerformMove(origin, dest) 等函数,以及返回 GUI 的接口,例如 AnimateMove(gamePieceID, origin, dest, animInfo)。
董事会和规则只知道董事会的状态,以及什么是有效的。 它对渲染、人工智能、动画、声音、输入或其他任何东西一无所知。 每一帧,我们都会在 GUI 级别处理用户的输入,将命令发送到棋盘/游戏状态代码,然后完成。 游戏状态代码将获取命令,解析它们是否有效,更新游戏状态和棋盘,然后将消息发送回 GUI 以直观地表示棋盘的新状态。 这些更新由视觉表示系统排队,因此我们可以批量处理一堆动画以按顺序发生。
这样做的好处是董事会不了解也不关心人类玩家与人工智能玩家。 您的 AI 可以是一个轮流执行操作的独立子模块。 它可以发送与人类玩家相同的命令,游戏逻辑和视觉结果将是相同的。 您需要拥有有关游戏板状态的本地每个 AI 信息,或者从游戏逻辑中公开一些 BoardSnapshot() 功能,让 AI“看到”板,但仅此而已。 或者,您可以将每个 AI 注册为游戏状态上的观察者模式,这样他们也会在棋盘更新时收到通知,以防他们需要进行任何复杂的实时规划。
保持游戏的每个部分独立和隔离将有助于单元测试,并提供更强大的系统。 定义良好的界面是你的朋友。
如果您正在寻找游戏的内存表示(及其状态),矩阵是最简单的。然而,根据董事会、策略的复杂性,您可能必须维护一个状态列表。
如果您指的是屏幕上的表示,则首先需要一些图形库。