Algorithm 扭动tic-tac-toe

Algorithm 扭动tic-tac-toe,algorithm,tic-tac-toe,minimax,Algorithm,Tic Tac Toe,Minimax,我正在写一个Tictaoe程序,但它不是你传统的Tictaoe 首先,棋盘是4x4,获胜的方法是让3个同类和1个对手排成一行、一列或对角。因此,通过第一列,以下将是“O”的胜利: O|_|X|_ O|X|_|_ O| |_|_ X|_|_|_ 我试图实现一个极大极小算法,以便给程序一个“硬”模式,不能被打败 我的问题是,我不能希望创建一个包含所有可能的游戏状态的树,因此我必须想出某种函数来评估我可以生成的游戏状态 我想我的问题是,我怎样才能得到这样一个函数 这个游戏对于蛮力来说绝对足够小 你可

我正在写一个Tictaoe程序,但它不是你传统的Tictaoe


首先,棋盘是4x4,获胜的方法是让3个同类和1个对手排成一行、一列或对角。因此,通过第一列,以下将是“O”的胜利:

O|_|X|_
O|X|_|_
O| |_|_
X|_|_|_
我试图实现一个极大极小算法,以便给程序一个“硬”模式,不能被打败

我的问题是,我不能希望创建一个包含所有可能的游戏状态的树,因此我必须想出某种函数来评估我可以生成的游戏状态


我想我的问题是,我怎样才能得到这样一个函数

这个游戏对于蛮力来说绝对足够小

你可以列举所有的州。有16个正方形,每个正方形有3个可能的值(X、O或空)

3^16=43046721,约4300万

这意味着一个用一个字节来描述每个状态可赢性的表将只有43兆字节

我将创建一个函数,将每个状态映射到一个介于1到4300万之间的索引(您只需要状态,而不需要可能的播放顺序),基本上将其表示为base-3中的一个数字,并允许您从索引创建状态

选择每个州可以采用的4个可赢性值-O可赢、X可赢、不可赢和未知

分配一个长度为43046721的缓冲区来存储每个游戏状态的可赢性

遍历所有索引编号,标记赢得的州。然后检查并反复填写其余各州的可赢性(如果已知)(根据轮到谁检查所有继任州)。这将在索引集上最多需要16次迭代,所以我看不出暴力在这里不起作用的任何原因


有一些优化,比如利用对称性,利用一个事实,即所有有n个棋子的状态都被有n+1个棋子的状态所取代,等等,但我认为你一开始并不需要这些优化。

游戏的启发式函数是一个评估游戏给定状态的函数。在这里,国家基本上由两部分组成:(1)董事会本身。(2) 轮到谁了

一些可能的启发式函数:

  • 行/列/对角线中X(或O,根据被评估玩家)的最大数量
  • “几乎获胜”限制的数量(少了一步)-可以最大限度地增加获胜的可能性
  • 我想人们可以想出更多的启发法。
    您可以将不同的启发式组合成一个“大”启发式函数,如下所示:

    a_1 * h_1(state) + a_2 * h_2(state) + ... + a_n * h_n(state)
    
    棘手的部分将是学习a_1,…,a_n的分数-这可以通过多种方式完成-其中之一是-基本上意味着:创建具有各种
    a_1,…,a_n
    值的各种代理,在它们之间进行比赛,比赛结束后,根据胜利者调整权重,并在你还有时间的时候重复这个过程(这是一个挑战)。
    完成后,使用学习到的最终代理权重


    注:可能的游戏数为~16!(需要确定所选方格的顺序-它选择游戏的其余部分将如何结束)-问问自己,它是否“小”到足以在您的约束范围内发展-还是太多,确实需要一个启发式的解决方案。

    第一步是确定/制定一个
    获胜策略
    (用词描述确保胜利所需的决策过程)。“3个同类,1个对手…”所以
    O
    玩家可以赢得像
    OOXO
    这样的一排,而不仅仅是
    OOOX
    xoo
    ?还有,使用minimax是解决问题的必要条件吗?或者你会欢迎其他方法吗?任何方法都会有效,我只是想尝试使用minimax,但我已经花了4个小时,而且我还没有真正使用minimaxotten anywhere。现在我只使用了一组if语句:\。是的,你对赢得游戏的不同组合的想法是正确的。不久前,你的实现需要30张软盘。你真的认为这是正确的方法吗?我认为OP会通过调查一段时间(而不仅仅是4个小时)学到更多在游戏树搜索中。我认为研究游戏树搜索是一件很好的事情,但我也认为这是解决这个问题最简单最直接的方法,实现类似的东西,然后比较各种优化和更智能的搜索策略是了解游戏搜索的一个很好的方法。