(挖坑🕳️)居然被小学二年级学生用五子棋♟打败了☹️

2021-04-14  本文已影响0人  Pope怯懦懦地

学了两天 HTML 5 ,终于把棋盘用 <canvas> 画出来了😑。代码太脏,就不贴出来了:

棋盘

想着最好能算出下一步最佳落子点。不想去写什么 alpha-beta 剪枝✂️,上笨办法,给每一种情况手工赋值(落子价值),然后把各个方向扫一遍,数值加总:

{
    "🔳🔳🔳🔳🔳": [0, 0.05, 0.1, 0.05, 0],

    "⭕️🔳🔳🔳🔳": [0, 0.1, 0, 0, 0],
    "🔳⭕️🔳🔳🔳": [0.1, 0, 0.2, 0, 0],
    "🔳🔳⭕️🔳🔳": [0, 0.2, 0, 0.2, 0],
    "🔳🔳🔳⭕️🔳": [0, 0, 0.2, 0, 0.1],
    "🔳🔳🔳🔳⭕️": [0, 0, 0, 0.1, 0],

    "⭕️⭕️🔳🔳🔳": [0, 0, 0.2, 0, 0],
    "⭕️🔳⭕️🔳🔳": [0, 0.2, 0, 0, 0],
    "⭕️🔳🔳⭕️🔳": [0, 0.1, 0.1, 0, 0],
    "⭕️🔳🔳🔳⭕️": [0, 0.05, 0, 0.05, 0],
    "🔳⭕️⭕️🔳🔳": [0.2, 0, 0, 0.4, 0],
    "🔳⭕️🔳⭕️🔳": [0, 0, 0.4, 0, 0],
    "🔳⭕️🔳🔳⭕️": [0, 0, 0.2, 0.2, 0],
    "🔳🔳⭕️🔳⭕️": [0, 0, 0, 0.2, 0],
    "🔳🔳🔳⭕️⭕️": [0, 0, 0.2, 0, 0],

    "🔳⭕️⭕️⭕️🔳": [0.5, 0, 0, 0, 0.5],
    "🔳⭕️⭕️🔳⭕️": [0.05, 0, 0, 0.9, 0],
    "🔳⭕️🔳⭕️⭕️": [0.1, 0, 0.9, 0, 0],
    "🔳🔳⭕️⭕️⭕️": [0.1, 0.9, 0, 0, 0],
    "⭕️🔳⭕️⭕️🔳": [0, 0.9, 0, 0, 0],
    "⭕️🔳⭕️🔳⭕️": [0, 0.2, 0, 0.2, 0],
    "⭕️🔳🔳⭕️⭕️": [0, 0.1, 0.2, 0, 0],
    "⭕️⭕️🔳⭕️🔳": [0, 0, 0.2, 0, 0],
    "⭕️⭕️🔳🔳⭕️": [0, 0, 0.4, 0.1, 0],
    "⭕️⭕️⭕️🔳🔳": [0, 0, 0, 0.5, 0],

    "🔳⭕️⭕️⭕️⭕️": [1, 0, 0, 0, 0],
    "⭕️🔳⭕️⭕️⭕️": [0, 1, 0, 0, 0],
    "⭕️⭕️🔳⭕️⭕️": [0, 0, 1, 0, 0],
    "⭕️⭕️⭕️🔳⭕️": [0, 0, 0, 1, 0],
    "⭕️⭕️⭕️⭕️🔳": [0, 0, 0, 0, 1]
}
但可以看到这种方法有明显的缺陷。比如:现在白子应该落在 `F5` ,但算出来最佳落子点在 `F6` 。这可能是由于该算法没有考虑多个方向的叠加效果。

现在手动调整我已经厌倦了,能不能自动推算出一个值来🤔?这种算法相当于手工发现特征,能不能自动识别特征(包括多个方向的特征),并推算落子价值?怎么感觉得上神经网络了☹️。

  1. 有哪些必胜阵形?
  2. 如何从这些必胜阵形获取信息?即如何从对弈记录中学习阵形特征?
  3. 哪些阵形是等价的?即如何运用图论知识减少计算?
  4. 哪些是好棋?
  5. 哪些是坏棋?

对于问题 3 ,因为需要考虑横竖撇捺四个方向,所以可以把五子棋问题拆解为六个二维空间的约束问题,即 <横, 竖> <竖, 撇> <撇, 捺> <捺, 横> <横, 撇> <竖, 捺> 。现在我们可以通过变换把各式阵形变换为规范阵形了。

必胜阵形的本质是在某一个维度上增加一个点,同时也会在另一个维度上增加一,致使一颗子不能在两个维度上封堵。

(待续……)

上一篇 下一篇

猜你喜欢

热点阅读