【问题标题】:If(), else if() alternative in c++(Is this AI?)if(), else if() 在 c++ 中的替代方案(这是 AI 吗?)
【发布时间】:2011-04-22 21:09:07
【问题描述】:

首先,我是一个菜鸟。我也是一名清洁工,从来没有写过一毛钱的代码。这只是我喜欢做的事情。这是为了好玩:) 话虽如此,我写了这个基于控制台的井字游戏,它有足够的 AI 不会输掉每一场比赛。 (我猜应该叫 ai。)它有类似 70 个 if/else if 用于计算机转动的语句。我使用了 3 个 int 数组,如下所示:

int L[2], M[2], R[2];

0 = 空白; 1 = X; 2 = O;
然后棋盘“看起来”像
L[0] |米[0] | R[0]
L[1] |米[1] | R[1]
L[2] |米[2] | R[2]

所以我基本上写出了我能想到的所有可能的场景:

if(M[0]==1 & M[1]==1 & M[2]==0){M[2] = 2;}//here the computer prevents a win 
else if(L[0] ==2&M[1]==2&R[2]==0){R[2]=2;}//here the computer wins
//and so on....68 more times!

我想我的问题是:
有更好的方法吗?
有没有办法用更少的代码行来实现相同的结果?
这被认为是人工智能?

【问题讨论】:

  • 井字游戏算法的一个有趣实现,可能作为 ImageJ 宏,将读取位于 xkcd.com/832(即 wget imgs.xkcd.com/comics/tic_tac_toe_large.png)的 PNG 图像并从中提取答案...有接受者吗?
  • 继续玩得开心!显然,根据回答,您可以学习很多东西。它的美妙之处在于,学习下面的一个花哨的流行语可以打开更多的东西来玩。搜索“tic-tac-toe ai”以找到解决问题的一些方法。所以你知道,对“有更好的编程方法吗?”的正确回答。是“是的。我的方式。” :)
  • 研究计算机玩游戏取胜是人工智能领域的一部分。事实上,游戏是人工智能领域的第一个案例研究。话虽如此,为每一个可能的举动提供预设的反应并不是真正的人工智能。 :-) 你是提供情报的人;计算机并没有自己“解决”它。几乎任何介绍性 AI 教科书都会讨论 Colin 下面的回答中描述的 Minimax 算法。
  • ++ 希望你能尽快找到工作编写代码。
  • @Mike Dunlavey 是的,让我们。我愿意接受任何想要高质量菜鸟代码的人的钱。

标签: c++ optimization if-statement artificial-intelligence


【解决方案1】:

这方面的标准算法称为Minimax。它基本上构建了一棵树,游戏的开始是根,然后孩子代表 X 在第一轮可以做出的每一个可能的移动,然后每个节点的孩子都是 O 可以做出的所有响应,等一旦整个树被填满(这对于井字游戏来说是可能的,但对于像国际象棋计算机这样的游戏仍然没有足够的内存),假设两个玩家都足够聪明,你可以恢复原状。最佳移动,并达到最佳移动。这里是Minimax的another explanation,专门以井字游戏为例。

【讨论】:

    【解决方案2】:

    井字游戏上的维基百科页面有一个非常好的算法大纲,用于赢得(或平局)每场比赛: http://en.wikipedia.org/wiki/Tic-tac-toe这是我几年前用来制作井字游戏的。

    在您了解算法之后,实现井字游戏计算机播放器的最聪明的方法之一就是使用幻方。该方法在here 讨论。就大小而言,我已经看到它在大约 50 行代码中实现,如果我找到它,我会发布代码:)

    这在技术上不是人工智能,因为人工智能通常指的是人工神经元、神经元层、梯度下降、支持向量机、求解复杂多项式等。解决井字游戏

    【讨论】:

      【解决方案3】:

      是的,还有更好的方法。

      最明显的是考虑董事会的不同镜像视图如何简化案例数量。

      另外,考虑在数组中预先存储“有趣”的模式,然后将游戏状态与数据进行比较。例如,一系列模式将是玩家在下一步中获胜的所有方式。

      另外,请注意,声明 int L[2] 时,数组 L 中只有两个条目,即 L[0]L[1]。您必须对L[2]M[2] 等的引用是应该被编译器捕获的错误。考虑调高警告级别。如何做到这一点取决于编译器。对于gcc,它是-Wall

      这算作人工智能的一种形式。这一系列if 陈述是积累的知识:如何识别一种情况以及对它做出适当的最佳反应。

      【讨论】:

      • 我是这么想的。神经网络似乎适用于具有更多可能结果的事物。这让我感觉好多了。我还在代码中将数组声明为 L[5]。我不知道这是否是一种好习惯,但出于某种原因,我喜欢多做一些。(?)
      • 额外的空间通常是好的做法,特别是如果有解释(在声明旁边的注释中),如“暂时未使用”。在这种情况下,额外的元素加起来就是一堆未使用的字节。这就像“免费”一样。
      【解决方案4】:

      解决此类游戏最接近真正 AI 的方法是编写人工网络并使用所有tictactoe 游戏组合对其进行训练。

      在这种情况下,代码不会做太多 if then else 来解决问题,但会通过从经过训练的模式中做出最合理的选择来解决问题。

      但是编写神经网络并不是一件小事:)

      【讨论】:

      • 你不需要神经网络——你可以用一堆火柴盒和一些珠子来做这一切。尝试在谷歌上搜索“matchbox tic tac toe”
      • mini-max 或 alpha-beta 算法也被认为是整个 AI 领域的一部分,对于这类问题会更​​简单有效
      【解决方案5】:

      当需要编写基于规则的系统(例如您正在构建的 AI)时,您可以使用规则引擎,例如 CLIPS(这是 NASA 开发的用于创建用 C 语言编写的专家系统的工具)。

      http://en.wikipedia.org/wiki/CLIPS

      也许玩井字游戏有点过头了,但如果你有心情学习很酷的 AI 知识,专家系统是一个非常有趣的领域,但与神经网络不同(而且可能不那么棘手)。

      玩得开心!

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        相关资源
        最近更新 更多