我是一个围棋业余3段的人,学了三年,一直想拥有一个属于自己的AI,目前围棋基础还可以,就是苦于自己的编程实力不够,最近看到了一个非常棒的教程,有兴趣的去找tyler_download看他的文章,代码非常详细具体,适合小白,现将我的学习心得和要点一一陈述出来
要做围棋AI先要把架子打出来,先实现基本围棋游戏再考虑引入神经网络,今天就先完成棋盘和落子的类构建
如果你有一定围棋基础,理解下面的代码就很容易,如果没有,可以先去学习围棋的气、交叉点、胜负判断等知识,我在分析时也会穿插一些围棋基本知识
步骤
1 棋手类
分析:围棋有黑棋和白棋,这里的棋手代表黑白两方,属性就是颜色,方法是返回对方的颜色
import enum
#棋手(棋子颜色)
class Player(enum.Enum):
black=1
white=2
#返回对方棋子颜色
def other(self):
if self == Player.black:
return Player.white
else:
return Player.black
2. 棋盘交叉点类
分析: 围棋的棋子是下在交叉点上的,有9*9=81,13*13=169,19*19=361三种,而一个交叉点有上下左右四个方向的相邻点,而这个相邻点在我们之后算棋子的气(棋子的自由点)以及棋子块相连都有非常重要的用处,因此定义这个类的属性就是该点的行与列,方法就是返回该点的相邻点的集合
from collections import namedtuple
#棋盘交叉点
class Point(namedtuple("Point","row col")):#增加可读性,即可通过point.row,point.col得到行列
#返回棋盘一个点的四个方向相邻点
def neighbor(self):
return[
Point(self.row,self.col+1),
Point(self.row,self.col-1),
Point(self.row+1,self.col),
Point(self.row-1,self.col)
]
那位博主为了增代码可读性,引入了namedtuple
3.落子类
分析:落子的一个属性是所下的交叉点,然后落子前需要判断当前玩家有无pass,如果pass就让另一个玩家下,还要判断当前玩家有无投降,如果投降就不会做下