问题标签 [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 投票
5 回答
1841 浏览

c++ - 为移动井字选择 X 或 O

我正在制作井字游戏,并创建了一个将 X 或 O 插入我的数组的函数。我的设计遇到了一个问题。我调用该函数为 X 移动,但是当下一个玩家轮到时,我如何让它调用 O?

有没有办法在我放 makeMove() 之后我可以以某种方式调用它来代替 X。因为你可以看到如果我做 X 它总是会要求 X 而不是 O。我怎样才能做到选择拉入 X 或 O 转弯。

问题是我只需要一个可以移动的功能。

0 投票
1 回答
612 浏览

c++ - C++ 和 SDL TicTacToe - 轮换

在我的游戏中,我在改变玩家之间的回合时遇到了问题。当我运行它时,它似乎按任何顺序运行。正因为如此,显示轮到谁的文本被搞砸了。

0 投票
1 回答
2916 浏览

c++ - 无递归实现 Minimax

我正在建造一个井字游戏解决机器人。为了练习,我使用极小极大算法编写了一个井字游戏,效果非常好。当我想将我的代码移植到控制器时,我发现这个控制器的 C/C++ 编译器都不支持递归函数。因此,我需要帮助将此递归 minimax 函数转换为使用迭代或内部堆栈的函数:

我完全不知道如何做到这一点。我很感激任何帮助:)

0 投票
1 回答
13658 浏览

c# - 井字完美AI算法:更深的“造叉”步骤

我已经在 StackOverflow 上阅读了许多井字游戏主题。我发现维基百科上的策略适合我的演示项目:

如果玩家选择下表[3]中优先级最高的着法,则玩家可以玩完美的井字游戏。

1) 获胜:如果你连续获得两个,则玩第三个以获得连续三个。

2)阻挡:如果对手连续两个,打第三个来阻挡他们。

3)分叉:创造一个机会,你可以通过两种方式获胜。

4) 阻止对手的分叉:

选项 1:连续制造两个以迫使对手防守,只要这不会导致他们制造分叉或获胜。例如,如果“X”有角球,“O”有中锋,而“X”也有对角角,则“O”必须不打角球才能获胜。(在这种情况下打角球会为“X”赢得一个分叉。)

选项 2:如果存在对手可以分叉的配置,则阻止该分叉。

5)中锋:打中锋。

6) 对角:如果对手在角,打对角。

7)空角:打一个空角。

8) Empty Side:玩空的一面。

我已经按照这些步骤操作了,计算机永远不会丢失。但是,它的攻击方式并不完美。因为我不知道如何执行第 3 步。这是我在第 3 步中所做的:扫描每个单元格,检查在该单元格上放置令牌是否会创建一个分叉,然后将其放在那里。

请给我一些关于这一步的建议。

EDIT1:count fork 将计算计算机有多少个fork(计算机的token为2,玩家token为1,因为我在第4步也使用了该方法,所以函数中有token的参数countFork)。

EDIT2:我说它不完美的原因是这个(CPU先走,它的细胞是蓝色的,人体细胞是红色的)。 在此处输入图像描述 如您所见,如果我放入顶部单元格,则计算机获胜。但是如果我输入右边的单元格,那就是平局,尽管计算机仍然可以获胜。

EDIT3:不知道为什么,但我注释掉了第 3 步,并且电脑播放......完美!我真的很惊讶!这是我的countFork函数(我需要将此代码移植到不支持二维数组的Alice,所以我使用getNumberFromXY将二维数组转换为一维):

EDIT4:根据 soandos 修复了错误,并在 EDIT 3 更新了代码,现在它可以完美运行了!

0 投票
4 回答
7292 浏览

ios - 如何以编程方式画线?

井字游戏对我来说似乎是一个不错的运动。

我想先画井字游戏网格。
Interface Builder 没有用于绘制线条的内置类。

因此我的问题是:我可以使用哪个类以编程方式绘制网格线?

0 投票
1 回答
9168 浏览

c# - 井字递归算法

我可以看到这个问题(或类似的问题)已被问过几次,并且我已经在谷歌上搜索了很多,以便我可以尝试理解它,但是我绝对被卡住了。

我的任务是使用递归函数,该函数使用“善良”变量来确定计算机可以做出的最佳移动,我什至有一个文档可以帮助解决这个问题,但对于我的生活,我只是不不明白。

如果有人可以花一些时间来帮助我或分解我实际需要做的事情,我将不胜感激,我将在下面链接我目前拥有的代码,但这是一项作业,因此指导比直接回答更可取。我已经查看了 MinMax 解决方案,这似乎超出了我的掌握,我对编程非常陌生(尤其是在 C# 中只有几个月的经验)所以放轻松!

这是我要遵循的建议解决方案:

http://erwnerve.tripod.com/prog/recursion/tictctoe.htm

0 投票
1 回答
1068 浏览

c++ - 井字游戏图形设计?

这是我作业中的一个一般性问题,我只是要求一些想法或伪代码。

假设我正在使用 C++ 构建一个井字游戏。我已经拥有的是一个Node类,它包含一个 const 成员数据表示当前游戏板状态,以及一个指向其他节点的指针的 const 数组,其中包含每个可能的下一步状态。所以这将是一个没有重复节点的有向图(每个节点都有其独特的游戏状态。)。

当我尝试生成这样的图表时遇到了麻烦。似乎我需要使用递归,因为所有数据成员Nodeclass 是 const 所以没有办法改变它们。如果不复制节点,我很难想出一个好主意来立即生成这样的图(我的意思是让它成为一棵树很容易,但它会浪费大量的空间和时间。)。一件事可能会有所帮助,我能够比较两种不同的游戏状态,而且我认为我不能使用除<set>.

因此,如果有人对此有任何想法,请随意写下您的想法或伪代码。谢谢

0 投票
2 回答
1584 浏览

vb.net - Minmax 算法仅在直接看到移动时获胜。否则总是让玩家获胜

在我第一次尝试极小极大算法和一般的递归调用(我对编程相对较新)时,我已经花了三天时间试图弄清楚我在哪些小代码中出了什么问题。基本上,除了我想在其中实际学习和研究的东西:极小极大算法之外,我的应用程序中的所有东西都在工作。

基本上,每当玩家移动时,计算机将执行以下两项操作之一:

  • 如果它旁边有一个获胜的举动,它将使用该举动。非常简单。
  • 然而,如果这个动作不是直接可见的,它会选择任何让玩家获胜的动作。与它应该做的完全相反。

我知道它不是来自:

  • 合法移动吸气剂
  • 板评估器本身,不知道它是否可能来自带有指向它的一些奇怪的东西,但评估器正在返回正确的分数。

这是代码(我删掉了一些启动程序的函数):

希望你能帮忙!

0 投票
5 回答
4361 浏览

algorithm - 如何在井字游戏中设置表格的分数?

我有表格和一些函数,如 Generate_moves() 等,但要使 minmax 算法起作用,我需要为表格设置分数,以使计算机选择最佳表格。

MycanWin(string)返回一个数字,告诉我在一条直线或一列中有多少个 X 或 Os,但我怀疑这是为表格设置分数的一个很好的原因。

如果我有桌子:

分数应该与

并且应该大于

而且我不知道如何让 Score 函数告诉我不同​​的分数。我怎样才能实现方法 Score 来告诉我这个?

编辑:

如果计算机首先是 X 而我是 O

现在我怎样才能让计算机选择下一个最佳选项

0 投票
2 回答
551 浏览

artificial-intelligence - How can i extract my best move from Min Max in TicTacToe?

The thing is that this little function tells me if the game is a win, a lose or a draw, but how can i get the move that will led me to a win? My Point class is a simple Class With 2 coordinates X, Y and i want to get the answer as a point so i can latter say something like game.Do_Move(myPoint).

In case some functions aren't obvious:

game.IsFinished() - returns true if win/lose/draw else otherwise

game.Score(turn) - returns -1/0/1 in case is a lose/draw/win for the player with the next move

game.Generate_Moves() - returns a List with available moves

game.Do_Move() - void that applies the move to game

game.Undo_Move() - talks for itself