怎样使用python制作智能五子棋简易版
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,今天就跟大家聊聊有关怎样使用python制作智能五子棋简易版,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前段时间不是制作了一款升级版本五子棋
千家信息网最后更新 2025年11月09日怎样使用python制作智能五子棋简易版
今天就跟大家聊聊有关怎样使用python制作智能五子棋简易版,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
前段时间不是制作了一款升级版本五子棋的嘛!
但是居然有粉丝私信我说:
"准备拿到代码玩一下ok过去了!太难了准备放收藏夹"

所噶,今天先放一个简易版本的五子棋给大家看看!学习嘛~从简单到难 还是慢慢来撒~
学玩这篇可以学下一篇难一点的撒:
Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?
正文
嘿嘿!这五子棋只有人机对战了哈!不要看人机对战感觉很简单,其实代码量也超多滴。
主要代码:都有注释的撒!就不一步一步介绍了。
import sysimport randomimport pygamefrom pygame.locals import *import pygame.gfxdrawfrom checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, offset, Point SIZE = 30 # 棋盘每个点时间的间隔Line_Points = 19 # 棋盘每行/每列点数Outer_Width = 20 # 棋盘外宽度Border_Width = 4 # 边框宽度Inside_Width = 4 # 边框跟实际的棋盘之间的间隔Border_Length = SIZE * (Line_Points - 1) + Inside_Width * 2 + Border_Width # 边框线的长度Start_X = Start_Y = Outer_Width + int(Border_Width / 2) + Inside_Width # 网格线起点(左上角)坐标SCREEN_HEIGHT = SIZE * (Line_Points - 1) + Outer_Width * 2 + Border_Width + Inside_Width * 2 # 游戏屏幕的高SCREEN_WIDTH = SCREEN_HEIGHT + 200 # 游戏屏幕的宽 Stone_Radius = SIZE // 2 - 3 # 棋子半径Stone_Radius2 = SIZE // 2 + 3Checkerboard_Color = (0xE3, 0x92, 0x65) # 棋盘颜色BLACK_COLOR = (0, 0, 0)WHITE_COLOR = (255, 255, 255)RED_COLOR = (200, 30, 30)BLUE_COLOR = (30, 30, 200) RIGHT_INFO_POS_X = SCREEN_HEIGHT + Stone_Radius2 * 2 + 10 def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)): imgText = font.render(text, True, fcolor) screen.blit(imgText, (x, y)) def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('五子棋') font1 = pygame.font.SysFont('SimHei', 32) font2 = pygame.font.SysFont('SimHei', 72) fwidth, fheight = font2.size('黑方获胜') checkerboard = Checkerboard(Line_Points) cur_runner = BLACK_CHESSMAN winner = None computer = AI(Line_Points, WHITE_CHESSMAN) black_win_count = 0 white_win_count = 0 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_RETURN: if winner is not None: winner = None cur_runner = BLACK_CHESSMAN checkerboard = Checkerboard(Line_Points) computer = AI(Line_Points, WHITE_CHESSMAN) elif event.type == MOUSEBUTTONDOWN: if winner is None: pressed_array = pygame.mouse.get_pressed() if pressed_array[0]: mouse_pos = pygame.mouse.get_pos() click_point = _get_clickpoint(mouse_pos) if click_point is not None: if checkerboard.can_drop(click_point): winner = checkerboard.drop(cur_runner, click_point) if winner is None: cur_runner = _get_next(cur_runner) computer.get_opponent_drop(click_point) AI_point = computer.AI_drop() winner = checkerboard.drop(cur_runner, AI_point) if winner is not None: white_win_count += 1 cur_runner = _get_next(cur_runner) else: black_win_count += 1 else: print('超出棋盘区域') # 画棋盘 _draw_checkerboard(screen) # 画棋盘上已有的棋子 for i, row in enumerate(checkerboard.checkerboard): for j, cell in enumerate(row): if cell == BLACK_CHESSMAN.Value: _draw_chessman(screen, Point(j, i), BLACK_CHESSMAN.Color) elif cell == WHITE_CHESSMAN.Value: _draw_chessman(screen, Point(j, i), WHITE_CHESSMAN.Color) _draw_left_info(screen, font1, cur_runner, black_win_count, white_win_count) if winner: print_text(screen, font2, (SCREEN_WIDTH - fwidth)//2, (SCREEN_HEIGHT - fheight)//2, winner.Name + '获胜', RED_COLOR) pygame.display.flip() def _get_next(cur_runner): if cur_runner == BLACK_CHESSMAN: return WHITE_CHESSMAN else: return BLACK_CHESSMAN # 画棋盘def _draw_checkerboard(screen): # 填充棋盘背景色 screen.fill(Checkerboard_Color) # 画棋盘网格线外的边框 pygame.draw.rect(screen, BLACK_COLOR, (Outer_Width, Outer_Width, Border_Length, Border_Length), Border_Width) # 画网格线 for i in range(Line_Points): pygame.draw.line(screen, BLACK_COLOR, (Start_Y, Start_Y + SIZE * i), (Start_Y + SIZE * (Line_Points - 1), Start_Y + SIZE * i), 1) for j in range(Line_Points): pygame.draw.line(screen, BLACK_COLOR, (Start_X + SIZE * j, Start_X), (Start_X + SIZE * j, Start_X + SIZE * (Line_Points - 1)), 1) # 画星位和天元 for i in (3, 9, 15): for j in (3, 9, 15): if i == j == 9: radius = 5 else: radius = 3 # pygame.draw.circle(screen, BLACK, (Start_X + SIZE * i, Start_Y + SIZE * j), radius) pygame.gfxdraw.aacircle(screen, Start_X + SIZE * i, Start_Y + SIZE * j, radius, BLACK_COLOR) pygame.gfxdraw.filled_circle(screen, Start_X + SIZE * i, Start_Y + SIZE * j, radius, BLACK_COLOR) # 画棋子def _draw_chessman(screen, point, stone_color): # pygame.draw.circle(screen, stone_color, (Start_X + SIZE * point.X, Start_Y + SIZE * point.Y), Stone_Radius) pygame.gfxdraw.aacircle(screen, Start_X + SIZE * point.X, Start_Y + SIZE * point.Y, Stone_Radius, stone_color) pygame.gfxdraw.filled_circle(screen, Start_X + SIZE * point.X, Start_Y + SIZE * point.Y, Stone_Radius, stone_color) # 画左侧信息显示def _draw_left_info(screen, font, cur_runner, black_win_count, white_win_count): _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, Start_X + Stone_Radius2), BLACK_CHESSMAN.Color) _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, Start_X + Stone_Radius2 * 4), WHITE_CHESSMAN.Color) print_text(screen, font, RIGHT_INFO_POS_X, Start_X + 3, '玩家', BLUE_COLOR) print_text(screen, font, RIGHT_INFO_POS_X, Start_X + Stone_Radius2 * 3 + 3, '电脑', BLUE_COLOR) print_text(screen, font, SCREEN_HEIGHT, SCREEN_HEIGHT - Stone_Radius2 * 8, '战况:', BLUE_COLOR) _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, SCREEN_HEIGHT - int(Stone_Radius2 * 4.5)), BLACK_CHESSMAN.Color) _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, SCREEN_HEIGHT - Stone_Radius2 * 2), WHITE_CHESSMAN.Color) print_text(screen, font, RIGHT_INFO_POS_X, SCREEN_HEIGHT - int(Stone_Radius2 * 5.5) + 3, f'{black_win_count} 胜', BLUE_COLOR) print_text(screen, font, RIGHT_INFO_POS_X, SCREEN_HEIGHT - Stone_Radius2 * 3 + 3, f'{white_win_count} 胜', BLUE_COLOR) def _draw_chessman_pos(screen, pos, stone_color): pygame.gfxdraw.aacircle(screen, pos[0], pos[1], Stone_Radius2, stone_color) pygame.gfxdraw.filled_circle(screen, pos[0], pos[1], Stone_Radius2, stone_color) # 根据鼠标点击位置,返回游戏区坐标def _get_clickpoint(click_pos): pos_x = click_pos[0] - Start_X pos_y = click_pos[1] - Start_Y if pos_x < -Inside_Width or pos_y < -Inside_Width: return None x = pos_x // SIZE y = pos_y // SIZE if pos_x % SIZE > Stone_Radius: x += 1 if pos_y % SIZE > Stone_Radius: y += 1 if x >= Line_Points or y >= Line_Points: return None return Point(x, y) class AI: def __init__(self, line_points, chessman): self._line_points = line_points self._my = chessman self._opponent = BLACK_CHESSMAN if chessman == WHITE_CHESSMAN else WHITE_CHESSMAN self._checkerboard = [[0] * line_points for _ in range(line_points)] def get_opponent_drop(self, point): self._checkerboard[point.Y][point.X] = self._opponent.Value def AI_drop(self): point = None score = 0 for i in range(self._line_points): for j in range(self._line_points): if self._checkerboard[j][i] == 0: _score = self._get_point_score(Point(i, j)) if _score > score: score = _score point = Point(i, j) elif _score == score and _score > 0: r = random.randint(0, 100) if r % 2 == 0: point = Point(i, j) self._checkerboard[point.Y][point.X] = self._my.Value return point def _get_point_score(self, point): score = 0 for os in offset: score += self._get_direction_score(point, os[0], os[1]) return score def _get_direction_score(self, point, x_offset, y_offset): count = 0 # 落子处我方连续子数 _count = 0 # 落子处对方连续子数 space = None # 我方连续子中有无空格 _space = None # 对方连续子中有无空格 both = 0 # 我方连续子两端有无阻挡 _both = 0 # 对方连续子两端有无阻挡 # 如果是 1 表示是边上是我方子,2 表示敌方子 flag = self._get_stone_color(point, x_offset, y_offset, True) if flag != 0: for step in range(1, 6): x = point.X + step * x_offset y = point.Y + step * y_offset if 0 <= x < self._line_points and 0 <= y < self._line_points: if flag == 1: if self._checkerboard[y][x] == self._my.Value: count += 1 if space is False: space = True elif self._checkerboard[y][x] == self._opponent.Value: _both += 1 break else: if space is None: space = False else: break # 遇到第二个空格退出 elif flag == 2: if self._checkerboard[y][x] == self._my.Value: _both += 1 break elif self._checkerboard[y][x] == self._opponent.Value: _count += 1 if _space is False: _space = True else: if _space is None: _space = False else: break else: # 遇到边也就是阻挡 if flag == 1: both += 1 elif flag == 2: _both += 1 if space is False: space = None if _space is False: _space = None _flag = self._get_stone_color(point, -x_offset, -y_offset, True) if _flag != 0: for step in range(1, 6): x = point.X - step * x_offset y = point.Y - step * y_offset if 0 <= x < self._line_points and 0 <= y < self._line_points: if _flag == 1: if self._checkerboard[y][x] == self._my.Value: count += 1 if space is False: space = True elif self._checkerboard[y][x] == self._opponent.Value: _both += 1 break else: if space is None: space = False else: break # 遇到第二个空格退出 elif _flag == 2: if self._checkerboard[y][x] == self._my.Value: _both += 1 break elif self._checkerboard[y][x] == self._opponent.Value: _count += 1 if _space is False: _space = True else: if _space is None: _space = False else: break else: # 遇到边也就是阻挡 if _flag == 1: both += 1 elif _flag == 2: _both += 1 score = 0 if count == 4: score = 10000 elif _count == 4: score = 9000 elif count == 3: if both == 0: score = 1000 elif both == 1: score = 100 else: score = 0 elif _count == 3: if _both == 0: score = 900 elif _both == 1: score = 90 else: score = 0 elif count == 2: if both == 0: score = 100 elif both == 1: score = 10 else: score = 0 elif _count == 2: if _both == 0: score = 90 elif _both == 1: score = 9 else: score = 0 elif count == 1: score = 10 elif _count == 1: score = 9 else: score = 0 if space or _space: score /= 2 return score # 判断指定位置处在指定方向上是我方子、对方子、空 def _get_stone_color(self, point, x_offset, y_offset, next): x = point.X + x_offset y = point.Y + y_offset if 0 <= x < self._line_points and 0 <= y < self._line_points: if self._checkerboard[y][x] == self._my.Value: return 1 elif self._checkerboard[y][x] == self._opponent.Value: return 2 else: if next: return self._get_stone_color(Point(x, y), x_offset, y_offset, False) else: return 0 else: return 0 if __name__ == '__main__': main()效果如下:哈哈哈哈!人机都下不赢的我23333~哭辽。
看完上述内容,你们对怎样使用python制作智能五子棋简易版有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
棋盘
五子棋
五子
空格
边框
简易
制作
人机
代码
内容
对方
方子
棋子
网格
智能
两端
也就是
位置
坐标
宽度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
小学生要怎样注意网络安全
青熠网络技术服务公司
熊才全数据库
京华软件开发深圳有限公司
如何推进网络安全等级保护
后台服务器测试
网络安全法一年进行几次评估
浙江机架服务器公司云主机
电大全文数据库
分散数据库同步技术
银行软件开发岗unity
惠州商城软件开发热线
软件开发费用怎么入账
软件开发如何实现基本功能
淘宝网的服务器是谁提供的
计算机网络技术属于科技类专业
网络安全校园日宣有什么意义
深圳尚米网络技术有
刘老师网络技术分享
应用软件开发公司简介
江西有单互联网科技有限公司
每日运维时序数据库
通州区技术软件开发服务供应
it软件开发出来什么工作吗
使命召唤18选择哪个服务器
简单网络安全手抄报一二年级
网络安全教育日记
网络安全设计方案范本
北京字跳网络技术和字节跳动
政府购买软件开发服务合同