问题标签 [tic-tac-toe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
10627 浏览

algorithm - 检测无效和十字架的获胜游戏

我需要知道在棋盘游戏中检测获胜棋步的最佳方法。源代码无所谓,我只需要一个例子或者我可以开始的东西。

我唯一能想到的就是使用循环并测试玩家每一个动作的每个方向,例如连续搜索五个。有没有更快更有效的方法?

0 投票
7 回答
268 浏览

refactoring - Python:将此检查重构为自己的方法是否有意义?

我还在学习python。我刚刚编写了这个方法来确定玩家是否已经赢得了井字游戏,给定的棋盘状态如下:'[['o','x','x'],['x','o','-'],['x','o','o']]'

我突然想到,我多次检查 3 个字符的列表,并且可以将检查重构为自己的方法,如下所示:

...但后来意识到真正要做的只是改变行,例如:

到:

...坦率地说,这似乎并没有太大的改进。你有没有更好的重构方法?或者一般来说是一个更 Pythonic 的选项?我很想听听!

0 投票
5 回答
11758 浏览

c++ - 井字游戏 AI:如何制作树?

我在制作井字游戏机器人时试图理解“树”有很大的障碍。我理解这个概念,但我不知道如何实现它们。

有人可以向我展示如何为这种情况生成树的示例吗?还是生成树的好教程?我想困难的部分是生成部分树。我知道如何实现生成一整棵树,但不是它的一部分。

0 投票
7 回答
1764 浏览

search - 井字游戏战略缩减

我决定写一个解决井字游戏的小程序,以尝试一些剪枝技术在一个小游戏上的效果。使用 minimax 解决它的完整博弈树最终只有 549,946 个可能的博弈。通过 alpha-beta 剪枝,需要评估的状态数量减少到 18,297 个。然后我应用了一个转置表,将数字降低到 2,592。现在我想看看这个数字能走多低。

我要应用的下一个增强功能是战略性缩减。其基本思想是结合具有同等战略价值的国家。例如,在第一步中,如果 X 先下,那么选择一个角而不是另一个角在策略上没有什么不同(假设你的对手打得最好)。在同样的情况下,板壁的中心也是如此,中心也很重要。通过仅减少重要状态,您最终只会在第一步中评估 3 个状态而不是 9 个。这种技术应该非常有用,因为它会修剪靠近博弈树顶部的状态。这个想法来自 CMU 的一个小组创建的 GameShrink 方法,只是我试图避免编写通用形式,而只是做将技术应用于井字游戏所需的操作。

为了实现这一点,我修改了我的哈希函数(用于转置表)以枚举所有战略上等效的位置(使用旋转和翻转函数),并且只返回每个板的最低值。不幸的是,现在我的程序认为 X 在先走时可以从空棋盘中强制在 5 步内获胜。经过长时间的调试会话后,我发现程序总是返回具有最低战略意义的移动(我将最后一个移动存储在换位表中作为我的状态的一部分)。有没有更好的方法可以添加此功能,或者有一种简单的方法来确定适用于当前情况的正确移动方式以及我已经完成的操作?

0 投票
1 回答
299 浏览

data-structures - 在井字游戏网格中表示所有有效“行”的紧凑方式

我一直在用各种语言编写井字游戏作为练习,并且出现的一种模式是,我为定义有效的获胜行提出的每个表示都被令人失望地硬编码。它们通常分为两类:

首先,棋盘表示为一维或二维数组,行由位置的三元组显式定义(数字为空格):

这具有非神奇的明确性的优点,但它看起来很冗长。

另一种方法是使用数组数组并映射+减少行。它稍微好一点,但并没有让我一路走好:

垂直和水平匹配很棒,但我仍在对对角线进行硬编码。

任何人都可以想出一种方法来表征不依赖于显式地址的对角线(或完全不同的方法)吗?

我的伪代码是 Rubyish,但请随时以您喜欢的任何语言发布。我看到了井字游戏代码高尔夫,虽然其中一些解决方案很巧妙(尤其是魔方!)但我正在寻找一些不那么令人困惑的东西。

0 投票
4 回答
3613 浏览

c - 我正在学习 C,并且已经制作了一个井字游戏桌。现在,我如何引用单个单元格?

我正在学习 C,所以决定尝试制作一个井字游戏,使用 ASCII 艺术作为表格。

我还没有很多...

在命令行上运行时,我得到了这个输出

现在,当我弄清楚如何获取多个字符的输入时(getchar()到目前为止,我只知道如何用于获取单个字符,尽管对于本示例来说这可能工作正常),我想再次循环并放置一个X 对应的单元格。

我是否应该编写一个用于打印表格的函数,该函数采用诸如“int markerX,int markerY”之类的参数来放置X?

然后我将如何存储标记的位置,以便我可以检查游戏是否赢了?

我的选择哪个单元格放置标记是在命令行上要求用户输入游戏的最佳方式吗?

谢谢!

0 投票
7 回答
813 浏览

c# - 进行这个简单的井字游戏的最佳方法是什么?

一切都在这里,我只需要创建一个方法来检查是否有人赢了。

关于如何有效解决这个问题的任何建议?

谢谢您的帮助。

0 投票
3 回答
27065 浏览

python - Minimax 为白痴解释

我浪费了一整天的时间来尝试使用 minimax 算法来制作无与伦比的 tictactoe AI。我一路上错过了一些东西(脑筋急转弯)。

我不是在这里寻找代码,只是更好地解释我哪里出错了。

这是我当前的代码(由于某种原因,minimax 方法总是返回 0):

0 投票
6 回答
4285 浏览

c - 井字游戏:如何填充决策树?

我正在制作井字游戏程序。我计划使用极小极大。我为所有可能的游戏序列制作了一个带有空间的树,我正在寻找一种填充它的方法。我目前有这种类型:

我正在寻找一种填充网格的方法,就像这里显示的那样。我将如何填充网格以确保所有可能的组合都存在?我的计划是让游戏识别玩家可以采取的每一个动作,然后决定采取哪些步骤才能获胜(我仍然需要弄清楚决策部分,但我一直坚持到我可以填满树中的网格) .

0 投票
6 回答
4957 浏览

java - 关于井字游戏的建议

我正在为井字游戏设计我的实施策略。由于这是我的第一个游戏实现,我有点困惑,需要一些通用指针。

现在,井字游戏中的获胜组合总数为 8。目前,我计划将这些获胜组合存储在一个数组中。一旦最终用户进行了至少 3 次移动,我将开始通过将 Player 使用的当前位置与该数组进行比较来检查 Player 是否赢得了比赛。但是,我确信这不是检查玩家是否有获胜组合的有效方法。

谁能建议我如何设计游戏的逻辑?