0%

围棋之棋子分块

人工智能真正的起点,我认为还是从AlphaGo说起,所以本源还是通过围棋的智能程序开始逐步推广应用到一般工业场景中.本文讲述围棋程序的基础功能就是计算气,而计算气首先要对某种颜色的棋子进行分块,某一些棋子相连时给予编号,具体实现如下:

1. 通过棋子的迭代查找将相邻的棋子染上同样的序号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func do_color(x :Int,y:Int,num :Int) {
labelNodes[x,y] = num

var xx = x + 1
if xx < 13 && blackNodes[xx,y] == 1 && labelNodes[xx,y] == 0 {
do_color(x:xx,y:y,num: num)
}

xx = x - 1
if xx > 0 && blackNodes[xx,y] == 1 && labelNodes[xx,y] == 0 {
do_color(x:xx,y:y,num: num)
}

var yy = y + 1
if yy < 13 && blackNodes[x,yy] == 1 && labelNodes[x,yy] == 0 {
do_color(x: x, y: yy, num: num)
}

yy = y - 1
if yy > 0 && blackNodes[x,yy] == 1 && labelNodes[x,yy] == 0 {
do_color(x: x, y: yy, num: num)
}
}

2. 对棋盘上所有的交叉点遍历一遍,已经标记的交叉点跳过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 对黑棋进行分块标记
func do_label_black() {
var label_count = 1
for y in 1...13 {
for x in 1...13 {
if blackNodes[x,y] != 1 || labelNodes[x,y] != 0 {
continue
}// end if

do_color(x: x, y: y, num: label_count)
label_count += 1
}
}

//
for x in 1...13 {
for y in 1...13 {
debugNumber(
pos: CGPoint(x: margin + space * CGFloat(x-1), y: margin + space * CGFloat(y-1)),
num: labelNodes[x,y])
}
}
}

3. 棋子的分块

分块编号是根据不同块进行叠加