当前位置:   article > 正文

【定制开发】【M3】基于Python+pygame实现的人机AI对战五子棋游戏(保姆级入门讲解)_pygame五子棋ai算法

pygame五子棋ai算法

一、效果展示

二、功能介绍

五子棋是一种两人对弈的纯策略型棋类游戏。五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。本代码实现的是第一种玩法。

三、开发环境搭建

首先安装Python,再安装pip命令,最后安装pygame模块。

目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。

  1. python官网:https://www.python.org/ 下载

    ​​​

  2. pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。pip 官网: https://pypi.org/project/pip  注意:Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。

        你可以通过以下命令来判断是否已安装:pip --version

3. 安装pygame:pip install pygame

四、关键代码

1. 设置棋盘宽高颜色,棋子尺寸等样式

  1. SIZE = 30  # 棋盘每个点之间的间隔
  2. Line_Points = 19  # 棋盘每行/每列点数
  3. Outer_Width = 20  # 棋盘外宽度
  4. Border_Width = 4  # 边框宽度
  5. Inside_Width = 4  # 边框跟实际的棋盘之间的间隔
  6. Border_Length = SIZE * (Line_Points - 1+ Inside_Width * 2 + Border_Width  # 边框线的长度
  7. Start_X = Start_Y = Outer_Width + int(Border_Width / 2+ Inside_Width  # 网格线起点(左上角)坐标
  8. SCREEN_HEIGHT = SIZE * (Line_Points - 1+ Outer_Width * 2 + Border_Width + Inside_Width * 2  # 游戏屏幕的高
  9. SCREEN_WIDTH = SCREEN_HEIGHT + 200  # 游戏屏幕的宽
  10. Stone_Radius = SIZE // 2 - 3  # 棋子半径
  11. Stone_Radius2 = SIZE // 2 + 3
  12. Checkerboard_Color = (0xE30x920x65)  # 棋盘颜色
  13. BLACK_COLOR = (000)
  14. WHITE_COLOR = (255255255)
  15. RED_COLOR = (2003030)
  16. BLUE_COLOR = (3030200)

2. 绘制棋盘

  1. # 画棋盘
  2. def _draw_checkerboard(screen):
  3.     # 填充棋盘背景色
  4.     screen.fill(Checkerboard_Color)
  5.     # 画棋盘网格线外的边框
  6.     pygame.draw.rect(screen, BLACK_COLOR, (Outer_Width, Outer_Width, Border_Length, Border_Length), Border_Width)
  7.     # 画网格线
  8.     for i in range(Line_Points):
  9.         pygame.draw.line(screen, BLACK_COLOR,
  10.                          (Start_Y, Start_Y + SIZE * i),
  11.                          (Start_Y + SIZE * (Line_Points - 1), Start_Y + SIZE * i),
  12.                          1)
  13.     for j in range(Line_Points):
  14.         pygame.draw.line(screen, BLACK_COLOR,
  15.                          (Start_X + SIZE * j, Start_X),
  16.                          (Start_X + SIZE * j, Start_X + SIZE * (Line_Points - 1)),
  17.                          1)

3. 胜负判定

  1.  def _get_direction_score(self, point, x_offset, y_offset):
  2.         count = 0   # 落子处我方连续子数
  3.         _count = 0  # 落子处对方连续子数
  4.         space = None   # 我方连续子中有无空格
  5.         _space = None  # 对方连续子中有无空格
  6.         both = 0    # 我方连续子两端有无阻挡
  7.         _both = 0   # 对方连续子两端有无阻挡
  8.         # 如果是 1 表示是边上是我方子,2 表示敌方子
  9.         flag = self._get_stone_color(point, x_offset, y_offset, True)
  10.         if flag != 0:
  11.             for step in range(16):
  12.                 x = point.X + step * x_offset
  13.                 y = point.Y + step * y_offset
  14.                 if 0 <= x < self._line_points and 0 <= y < self._line_points:
  15.                     if flag == 1:
  16.                         if self._checkerboard[y][x] == self._my.Value:
  17.                             count += 1
  18.                             if space is False:
  19.                                 space = True
  20.                         elif self._checkerboard[y][x] == self._opponent.Value:
  21.                             _both += 1
  22.                             break
  23.                         else:
  24.                             if space is None:
  25.                                 space = False
  26.                             else:
  27.                                 break   # 遇到第二个空格退出
  28.                     elif flag == 2:
  29.                         if self._checkerboard[y][x] == self._my.Value:
  30.                             _both += 1
  31.                             break
  32.                         elif self._checkerboard[y][x] == self._opponent.Value:
  33.                             _count += 1
  34.                             if _space is False:
  35.                                 _space = True
  36.                         else:
  37.                             if _space is None:
  38.                                 _space = False
  39.                             else:
  40.                                 break
  41.                 else:
  42.                     # 遇到边也就是阻挡
  43.                     if flag == 1:
  44.                         both += 1
  45.                     elif flag == 2:
  46.                         _both += 1
  47.         if space is False:
  48.             space = None

五、启动命令

启动游戏:python aivsman.py

重置游戏: 任一方获胜后,按esc或enter键复原初始状态

六、源码下载

【源码】【G1】基于Python+pygame实现的人机AI对战五子棋游戏.zip-其他文档类资源-CSDN下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/984863
推荐阅读
相关标签
  

闽ICP备14008679号