zoukankan      html  css  js  c++  java
  • Hex棋

    Hex棋,又叫六角棋,译作海克斯棋。据说这个游戏是约翰·纳什发明的。网上并没有太多介绍,第一次听说是在“中国大学生计算机博弈大赛”官网上。

    棋盘为11×11的六边形小格子组成,它是一种两人添子类游戏(跟五子棋一样)。

    它的游戏规则是:两人轮流下子,直到有一方用棋子沟通了两条边(比如先手沟通上下两边则胜利,后手沟通左右两边则胜利)

    这是一个先手必胜的游戏
    这是一个没有和棋的游戏(我认为这就是这个游戏的魅力所在,我们要证明的就是它到底是先手必胜还是先手必败)
    如何证明这个游戏不可能和棋呢?
    这个问题等价于“给定一个下满棋盘的Hex棋,必然能够找到一条线沟通两边”
    实际上,对于一个平面图,要想隔断两条边必然要连接另两条边。这句话就是证明。
    Hex棋显然是一个平面图,因为它的棋盘边没有交叉。

    如何证明这个游戏先手必胜呢?
    假设这个游戏后手必胜,那么先手从第一个子就模拟后手的必胜走法,从而先手必胜。推出矛盾,所以这个游戏先手必胜。
    一言以蔽之,这个游戏是一个子越多越好的游戏。如果这个游戏子多反而是一种累赘,那么先手不一定必胜。

    这是一个状态挺多的游戏,一般添子类游戏状态都很多。
    它的状态数多达10的56次幂之多,比象棋(中象国象差不多)的10的40次幂还要多,但是感觉Hex比象棋简单多了。

    下面统计一下添子类游戏(不包括围棋,围棋是添子吃子类游戏,象棋是不添子吃子类游戏)的状态数

    0 0
    1 0
    2 13.0
    3 2509.0
    4 5183757.0
    5 82109232401.0
    6 1.2159122802580694e+16
    7 1.6639278209049916e+22
    8 2.0909903631443116e+29
    9 2.4017537903420486e+37
    10 2.5134265191388166e+46
    11 2.390899903133055e+56
    12 2.063808117058896e+67
    13 1.6144415223776914e+79
    14 1.1433467158917951e+92
    15 7.324613324267597e+105
    16 4.24188344332279e+120
    17 2.2195633321116892e+136
    18 1.0488619415965058e+153
    19 4.4745506430191615e+170
    

    python代码如下

    def c(x, y):
        ans = 1
        for i in range(1, y + 1):
            ans = ans * (x + 1 - i) / i
        return ans
    
    
    for n in range(20):
        print(n,sum([c(n * n, i) * c(n * n - i, i) for i in range(n * n // 2)]))
    

    这个游戏的棋盘其实可以变成如下这样:

    from  PIL import Image, ImageDraw
    
    w = 30
    n = 11
    
    img = Image.new("RGBA", (w * n, w * n), "orange")
    draw = ImageDraw.ImageDraw(img)
    for i in range(n):
        draw.line((w / 2, w / 2 + i * w, w / 2 + (n - 1) * w, w / 2 + i * w), 'black', 3)
        draw.line((w / 2 + i * w, w / 2, w / 2 + i * w, w / 2 + (n - 1) * w), 'black', 3)
        draw.line((w / 2, w / 2 + i * w, w / 2 + i * w, w / 2), "black", 3)
        draw.line((w / 2 + (n - 1) * w, w / 2 + i * w, w / 2 + i * w, w / 2 + (n - 1) * w), "black", 3)
    img.show()
    img.save("haha.jpg")
    
    
  • 相关阅读:
    EL表达式(Expression Language)
    JSP简单功能介绍
    MySQL基础使用
    JDBC
    MySQL安装卸载
    stanfordnlp dependencies(依存关系简写表)
    不需要深度学习就能做的文本分类器
    词向量的cbow模型
    pytorch实现自己的textCNN
    OpenCV编译viz模块
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6416417.html
Copyright © 2011-2022 走看看