Python实现五子棋

效果图

在这里插入图片描述

核心

我认为这个五子棋核心还是在于二维数组,将实际当中鼠标点击的物理位置转换到棋盘中的逻辑地址,之后便用数组的方法进行操作,例如检测是否获胜,电脑下棋策略等。

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)]

检测

  1. 是否可落子
    def can_drop(self, point):# 判断是否可落子,看这个地方有没有被标记过
        return self._checkerboard[point.Y][point.X] == 0
  1. 是否有输赢
    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)

人机对战

电脑下棋

  1. 策略:主要根据一个网上的经验评分表 (效果还挺不错)
  2. 电脑先手,就只需要让电脑随机选取一个位置,并标记二维数组对应的位置。
    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:学海无涯,学无止境。

源码自取,下面是文件目录

在这里插入图片描述
自此,五子棋应该暂时告一段落了。在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值