效果图
核心
我认为这个五子棋核心还是在于二维数组,将实际当中鼠标点击的物理位置转换到棋盘中的逻辑地址,之后便用数组的方法进行操作,例如检测是否获胜,电脑下棋策略等。
class Checkerboard:
def __init__(self, line_points):
self._line_points = line_points
# _ 仅仅是一个循环标志,相当i,j
# _checkerboard 19*19的二维数组
self._checkerboard = [[0] * line_points for _ in range(line_points)]
检测
- 是否可落子
def can_drop(self, point):# 判断是否可落子,看这个地方有没有被标记过
return self._checkerboard[point.Y][point.X] == 0
- 是否有输赢
def _get_count_on_direction(self, point, value, x_offset, y_offset): #数步数
count = 1
ls = []
for step in range(1, 5):#前进数
x = point.X + step * x_offset
y = point.Y + step * y_offset
if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
ls.append((x,y))
count += 1
else:
break
for step in range(1, 5):#后退数
x = point.X - step * x_offset
y = point.Y - step * y_offset
if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
ls.append((x, y))
count += 1
else:
break
if count==5:
ls.append((point.X,point.Y))
# print(ls)
a =sorted(ls)
return a #好像放这里有点多余,但是只是想得到划线的xy
return count >= 5 #0,1
标记位
每次标记最新下棋的位置即可
def draw_all(self,checkerboard, AI_x, AI_y): # 每次都要重新画一次
for i, row in enumerate(checkerboard.checkerboard): # 画棋盘上已有的棋子 因为下一次刷新一次,
for j, cell in enumerate(row):
if cell == BLACK_CHESSMAN.Value:
if j == AI_x and i == AI_y: # 增加标记位
flag = 1
else:
flag = 0
self._draw_chessman(screen, Point(j, i), BLACK_CHESSMAN.Color, flag)
elif cell == WHITE_CHESSMAN.Value:
if j == AI_x and i == AI_y: # 增加标记位
flag = 1
else:
flag = 0
self._draw_chessman(screen, Point(j, i), WHITE_CHESSMAN.Color, flag)
人机对战
电脑下棋
- 策略:主要根据一个网上的经验评分表 (效果还挺不错)
- 电脑先手,就只需要让电脑随机选取一个位置,并标记二维数组对应的位置。
def randDrop(self): #随机落子
x = random.randint(5,13) #选取中间位置
y = random.randint(5,13)
point = Point(x,y)
self._checkerboard[point.Y][point.X] = self._my.Value
return point
总结
五子棋这个我一开始也是找的别人的代码(毕竟知识学得没有那么牢固),最开始的实现人机对战部分,我在此基础上加入了人人对战,同时加入进入界面(这个界面完全就是ps,没有一点技术),也就是我的人工智能大作业——五子棋,之后便很长一段时间没有再管,直到我发现有评论,还有人收藏,所以决定再优化(对当前所下的棋子做一个标记。(主要针对人机对战部分,电脑下得实在太快了))Python实现五子棋续,主要也是为了回顾之前所学的知识。至于这篇文章主要是加入了可以选择是电脑先手还是人先手(默认白子先手)这个功能。
ps:学海无涯,学无止境。
源码自取,下面是文件目录
自此,五子棋应该暂时告一段落了。