开发西洋跳棋(跳棋)引擎,如何开始?
Developing a Checkers (Draughts) engine, how to begin?
我是一个相对缺乏经验的程序员,最近我对为学校项目制作跳棋游戏应用程序很感兴趣。我不确定我可以从哪里开始(或者我是否应该尝试)创建它。我想到的项目可能只涉及简单的 AI 和多人游戏模式。
谁能给我一些提示/指导让我开始学习?
在某种程度上,我同意关于建议 'try something simpler first' 的问题的一些评论,但是西洋跳棋非常简单,您可以得到一个可以工作的程序——而且您肯定会学到有用的东西,因为你去吧
我的建议是把问题分成几个部分依次解决。例如:
1) 电路板表示 - 或许使用 8x8 阵列来表示电路板。你需要能够用空的、白色的棋子、黑色的棋子、白色的王、黑色的王来填满一个方格。一个更有效的解决方案可能是查看 'bit-boards',其中板的占用由一组 64 位整数描述。您可能希望最终得到可以加载或保存板状态、打印或显示板以及确定某个位置的内容(如果有的话)的函数。
2) 移动表示 - 找到一种计算合法移动的方法。哪些棋子可以移动,可以移动到哪里。您需要考虑 - 离开棋盘边缘、阻挡移动、跳跃、多次跳跃、国王移动 'backwards' 等。您可能希望最终得到可以计算一块棋子所有合法移动的函数,确定建议的动作是否合法,将游戏记录为一系列动作,可能与最终用户交互,因此通过鼠标或输入文本命令,您可以 'play' 在棋盘上玩游戏。因此,即使你只做到了那么远,你也有一个 'product' 你可以展示并且人们可以与之互动。
3) 玩电脑——这是比较难的部分——你需要学习极小极大、alpha-beta 剪枝、迭代加深以及所有与电脑游戏 AI 相关的废话——有些听起来比它更难实际上是。您还需要开发一种位置评估算法来衡量位置的价值,以便计算机可以决定 'best' 走哪一步。这可以像天真地假设吃掉对手的棋子总比不吃一子好,做王总比不做王好,或者给你留下更多未来棋子的棋子好于让你留下更多棋子的棋子一样简单。你下一步的选择更少。在实践中,即使是非常简单的 'greedy' 电路板评估也可以很好地发挥作用,前提是您可以向前看 2-3 步。
总而言之,看一些比西洋跳棋更简单的东西可能更简单 - 奥赛罗可能是一个不错的选择,而且不难写出一个可以击败没有的人的奥赛罗棋手玩了很多游戏。 3D tic-tac-toe 或小型的点和框游戏也可能适合。像这样的游戏更简单,因为没有国王或界限使事情复杂化,所有(大多数)动作都是合法的,并且它们足以 'fun' 玩成为一个有价值的软件演示。
首先让我声明一下,你所说的任务比你想象的要大得多。
您应该如何将其分解成非常小的可管理部分。
原因是
- 步骤越小越容易理解
- 获得快速反馈将有助于激励您继续前进,并帮助您解决问题。
当你开始考虑做某事的最小步骤时。以下是一些要开始的部分想法:
- 制作一个简单的标题屏幕- 只需标题并按下一个键即可
走开。
- 为空棋盘格制作 UI。
我知道这些听起来并不多,但它们可能比您想象的要花费更多的时间。
然后添加诸如添加跳棋、保留游戏板数据等内容,
在没有 UI.
的两个玩家都可以玩的游戏之前,甚至不要考虑 AI
你应该想的是:我能做的最小增量是多少然后加上那个,加上那个然后再想想下一小块是什么。
相信我,这是解决问题的最佳方式。如果您尝试一次写完所有内容,那将永远不会发生。
我是一个相对缺乏经验的程序员,最近我对为学校项目制作跳棋游戏应用程序很感兴趣。我不确定我可以从哪里开始(或者我是否应该尝试)创建它。我想到的项目可能只涉及简单的 AI 和多人游戏模式。
谁能给我一些提示/指导让我开始学习?
在某种程度上,我同意关于建议 'try something simpler first' 的问题的一些评论,但是西洋跳棋非常简单,您可以得到一个可以工作的程序——而且您肯定会学到有用的东西,因为你去吧
我的建议是把问题分成几个部分依次解决。例如:
1) 电路板表示 - 或许使用 8x8 阵列来表示电路板。你需要能够用空的、白色的棋子、黑色的棋子、白色的王、黑色的王来填满一个方格。一个更有效的解决方案可能是查看 'bit-boards',其中板的占用由一组 64 位整数描述。您可能希望最终得到可以加载或保存板状态、打印或显示板以及确定某个位置的内容(如果有的话)的函数。
2) 移动表示 - 找到一种计算合法移动的方法。哪些棋子可以移动,可以移动到哪里。您需要考虑 - 离开棋盘边缘、阻挡移动、跳跃、多次跳跃、国王移动 'backwards' 等。您可能希望最终得到可以计算一块棋子所有合法移动的函数,确定建议的动作是否合法,将游戏记录为一系列动作,可能与最终用户交互,因此通过鼠标或输入文本命令,您可以 'play' 在棋盘上玩游戏。因此,即使你只做到了那么远,你也有一个 'product' 你可以展示并且人们可以与之互动。
3) 玩电脑——这是比较难的部分——你需要学习极小极大、alpha-beta 剪枝、迭代加深以及所有与电脑游戏 AI 相关的废话——有些听起来比它更难实际上是。您还需要开发一种位置评估算法来衡量位置的价值,以便计算机可以决定 'best' 走哪一步。这可以像天真地假设吃掉对手的棋子总比不吃一子好,做王总比不做王好,或者给你留下更多未来棋子的棋子好于让你留下更多棋子的棋子一样简单。你下一步的选择更少。在实践中,即使是非常简单的 'greedy' 电路板评估也可以很好地发挥作用,前提是您可以向前看 2-3 步。
总而言之,看一些比西洋跳棋更简单的东西可能更简单 - 奥赛罗可能是一个不错的选择,而且不难写出一个可以击败没有的人的奥赛罗棋手玩了很多游戏。 3D tic-tac-toe 或小型的点和框游戏也可能适合。像这样的游戏更简单,因为没有国王或界限使事情复杂化,所有(大多数)动作都是合法的,并且它们足以 'fun' 玩成为一个有价值的软件演示。
首先让我声明一下,你所说的任务比你想象的要大得多。
您应该如何将其分解成非常小的可管理部分。
原因是
- 步骤越小越容易理解
- 获得快速反馈将有助于激励您继续前进,并帮助您解决问题。
当你开始考虑做某事的最小步骤时。以下是一些要开始的部分想法:
- 制作一个简单的标题屏幕- 只需标题并按下一个键即可 走开。
- 为空棋盘格制作 UI。
我知道这些听起来并不多,但它们可能比您想象的要花费更多的时间。
然后添加诸如添加跳棋、保留游戏板数据等内容,
在没有 UI.
的两个玩家都可以玩的游戏之前,甚至不要考虑 AI你应该想的是:我能做的最小增量是多少然后加上那个,加上那个然后再想想下一小块是什么。
相信我,这是解决问题的最佳方式。如果您尝试一次写完所有内容,那将永远不会发生。