问题标签 [connect-four]

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 投票
1 回答
193 浏览

c++ - C++ Connect 4 Minimax + Alpha Beta Pruning AI 做出糟糕的决定

这篇文章是我上一篇文章的后续。为了提高 minimax connect-4 AI 算法的效率,我决定使用 alpha-beta 剪枝。这肯定有助于程序的长时间运行(我以前认为这是一个无限递归),但是 AI 并没有按照我想要的方式工作。

AI只是选择下一个可用的空白点进行标记,即使它会导致损失。

我尝试增加和减少深度级别,并确保检查获胜者的功能确实有效。此外,我将先前用于电路板的 2d 矢量转换为 1d 矢量,并相应地更新了其他功能。

任何有关 AI 为何如此行事的帮助将不胜感激。

代码:

0 投票
0 回答
63 浏览

java - 减少游戏的状态空间 Connect Four 应用 RL 算法 SARSA 和 Q-Learning

我想为棋盘游戏 Connect Four 实施强化学习算法 SARSA 和 Q-Learning。

由于将所有这些信息存储在 Q-Table 中,我熟悉这些算法并且知道它们对大型状态空间的限制。连接四有一个估计约为 7.1*10 13的大状态空间,例如 MIT Slide 7,这就是为什么简单地应用这些算法是行不通的(尽管这篇论文声称它确实如此)

但是,我找到了一个类似帖子的答案,该帖子提出了一种可能的解决方案来简化状态空间。

一方面,您可以通过分离动作空间来简化问题。如果您分别考虑每列的值,则基于它旁边的两列,您将 N 减少到 3 并将状态空间大小减少到 10 6。现在,这是非常易于管理的。您可以创建一个数组来表示此值函数并使用简单的 RL 算法(例如 SARSA)对其进行更新

不幸的是,我不理解提议的简化,并想问以下问题:

  1. 通过分别考虑每一列,将动作空间与状态空间分开。但是,如果我对 SARSA 和 QL 的理解是正确的,它们会使用它们Q(S,A)来估计价值函数,因此状态动作对被分配了一个值。
  2. 如何根据旁边的两列计算一列的值?
  3. 在这种情况下,它旁边的含义是什么?如果使用每列的两个相邻列,那么我们创建五对(N=5)还是从内向外创建对(例如中间三列、中间五列、全部七列)?
  4. 一个状态(整个板的?)然后映射到包含每个动作/列的值函数的数组?

任何对其他文献或简化的参考将不胜感激!

0 投票
0 回答
38 浏览

javascript - 为什么这个“while”循环不迭代而只是退出?

我正在为 Connect Four 游戏开发一个对手。我让它随机选择七列中的一列,然后该函数将通过向 thatgetFirstOpenCellForColumn添加一个类来标记第一个打开的单元格。reddiv

然后,代码会检查移动是否与玩家获胜checkStatusOfGame(aiCell)并交换玩家并移除显示在游戏板外部列顶部的用作“选择器”的令牌。

我正在寻找一种方法让计算机在列中的最后一个空间被占用时生成一个新的随机数来选择一列。我认为这会做到这一点,因为当计算机选择一个完整的列时,它会给我这个错误消息:

但它似乎并没有回到选择一个随机数,而是简单地跳到yellowIsNext = !yellowIsNext这样我现在放置计算机的红色令牌而不是我的黄色令牌。

基本上,我希望代码

  1. 选择一个随机数
  2. 将令牌放在与该数字对应的列中
  3. 如果该列已满,请返回#1

你知道为什么这不起作用吗?还有另一种写while循环的方法,还是let aiCell = null不正确?

谢谢!

0 投票
1 回答
26 浏览

javascript - 为什么我的函数在这个 Connect Four 游戏结束时执行不正常?它适用于某些浏览器

我在这里有两个时间问题,一旦获胜,都涉及到这个游戏的过程:https ://codepen.io/acchang/pen/XWePpWB

理想情况下,我应该(1)选择获胜空间(2)看到获胜空间被填满(3)有警报宣布获胜者。

我看到和不喜欢的是:

*checkForWinners()运行

  • winDeclared()运行并alert "winner"首先弹出

  • 然后在清除警报后,drawboard()运行,将获胜的棋子添加到游戏板上。

这在 Firefox 中并没有那么糟糕。这件作品是在警报弹出的同时添加的。

然后,在 中winDeclared(),我还更改了右上角的显示以指示获胜者。但swapTurns()似乎执行之前winDeclared()

那是因为winDeclared()两个功能深入checkForWinners()吗?有什么办法可以延缓吗?

谢谢!

0 投票
1 回答
37 浏览

javascript - 为什么这个循环是 Minimax 语句的一部分,由于添加了“if”条件而失败?

我正在使用 Minimax 开发 Connect Four 游戏:https ://codepen.io/acchang/pen/XWePpWB

我被困在 Minimax 的第一部分,即构建一个函数,该函数将优先考虑导致连续三个标记的移动。

我想我快到了,但我无法弄清楚为什么在function scorePositionHoriz()评估第一个位置之后循环就关闭了我。

当我注释掉if条件并循环遍历整个数组时,它就起作用了parallelBoard。但是,当我取消注释时if,javascript 控制台会显示循环在一次尝试后关闭。

以下是两个关键功能。你能说为什么for循环会因条件而关闭,if还有其他方法吗?

0 投票
0 回答
12 浏览

python - 为什么我的 csv 文件不能准确保存反向列表

所以我试图创建一个连接四个游戏,每次玩家'O'玩我想询问用户是否想要保存并且我希望excel文件显示('X' as '1')('O' as ' 2')(''作为'0')。这里的问题是我必须反转list1才能将list1的行转换为excel文件上的列(excel将板的列显示为行),当我反转list1时,excel列中的每个单元格都变为'0 ' (即使有一个 'X' 或 'O'),而当 list1.reverse() 不存在时,它打印得很好,但列的单元格的顺序是相反的。这是为什么?

0 投票
1 回答
40 浏览

python - 为什么这个循环不改变 th excel 文件中的列

我正在尝试制作一个循环,以在一轮结束时保存连接四的游戏中的进度。csv 必须按如下方式显示游戏板。每个空白点用“0”表示,“O”用“2”表示,“X”用 1 表示。现在,这个循环应该循环并更改csv 文件,我将所有内容都堆叠在一列中。这是为什么?

(显示 8 列和 8 行的板的示例,第 1 列有“X”,第 2 列有“O”:) windows 终端:

csv显示:

0 投票
0 回答
22 浏览

python - 为什么将我的 np.array 更改为列表会给 Connect Four 中的 minimax 带来不同的结果?

目前正在测试一个使用 minimax 实现的连接四,并且正在使用 numpy 数组和一个常规矩阵。我尝试使用使用常规列表矩阵而不是 numpy 数组创建的板来运行 minimax 函数,并且它不断填充板状态而不是仅丢弃一块。我认为创建董事会状态的浅表副本并通过它不会影响事情,但我对此有点难过。它适用于 numpy 数组。

在这里测试,只丢一块,然后运行 ​​minimax 以获得最好的一块。

0 投票
0 回答
18 浏览

matlab - (Matlab)如何在连接四中检查对角线的获胜条件?

我已经对我的程序进行了编码,以便它检查列和行是否获胜,但我不确定如何处理对角线。任何帮助将非常感激!