编写五子棋的完整python代码_【pygame】Python 制作五子棋人机对战

本文代码基于 python3.6 和 pygame1.9.4。

五子棋比起我之前写的几款游戏来说,难度提高了不少。如果是人与人对战,那么,电脑只需要判断是否赢了就可以。如果是人机对战,那你还得让电脑知道怎么下。

我们先从简单的问题来看。

开端

画棋盘

首先肯定是要画出棋盘来,用 pygame 画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了。

画棋子

需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。

我们用 pygame.draw.circle 画出来的圆形是这样的:

753333-20190125135748236-1107926805.png

锯齿状十分明显,pygame.draw 中有画抗锯齿直线的函数 aaline,但是并没有 aacircle 这样的函数来画一个抗锯齿的圆。

这里就需要用到 pygame.gfxdraw 啦。pygame.gfxdraw 目前还仅是实验版本,这意味着这个 API 可能会在以后的 pygame 版本中发生变化或消失。

要绘制抗锯齿和填充形状,请首先使用函数的aa *版本,然后使用填充版本。例如:

col = (255, 0, 0)

surf.fill((255, 255, 255))

pygame.gfxdraw.aacircle(surf, x, y, 30, col)

pygame.gfxdraw.filled_c

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Pythonpygame实现的五子棋人机对战游戏的介绍: 该游戏支持人机对战和人人对战两种模式,游戏初始界面会有5秒的规则介绍,五秒后自动进入人机对战模式。玩家可根据游戏中的提示按下Q键切换为初始人人对战对接,按下E键切换为初始人机对战界面。在游戏进行过程中,程序会记录并显示黑白两子的累计获胜局数,提高玩家体验。 如果您想了解更多关于该游戏的信息,可以参考以下两个引用: 引用:【源码】【G1】基于Python+pygame实现的人机AI对战五子棋游戏.zip-其他文档类资源-CSDN下载 引用:通过pythonpygame库,实现一款支持人机对战和人人对战的五子棋小游戏。 ```python # 以下是一个简单的五子棋人机对战游戏的代码示例 import pygame import sys import random # 初始化pygame pygame.init() # 设置游戏窗口大小 size = width, height = 640, 640 # 设置游戏窗口标题 pygame.display.set_caption("五子棋人机对战") # 设置游戏窗口 screen = pygame.display.set_mode(size) # 设置棋盘大小 board_size = 600 # 设置棋盘边距 margin = 20 # 设置棋盘格子大小 grid_size = board_size // 15 # 设置棋子半径 piece_radius = grid_size // 2 - 2 # 设置棋子颜色 black = (0, 0, 0) white = (255, 255, 255) # 设置棋盘背景颜色 board_color = (200, 150, 50) # 设置棋盘线条颜色 line_color = (0, 0, 0) # 设置字体 font = pygame.font.Font(None, 30) # 设置游戏状态 game_over = False # 设置棋盘数组 board = [[0] * 15 for i in range(15)] # 设置棋子数量 piece_count = 0 # 设置玩家颜色 player_color = black # 设置AI颜色 ai_color = white # 设置AI难度 ai_level = 2 # 设置AI下棋时间间隔 ai_think_time = 1000 # 设置AI下棋位置 ai_pos = (0, 0) # 设置获胜状态 win = 0 # 绘制棋盘 def draw_board(): # 绘制棋盘背景 screen.fill(board_color) # 绘制棋盘线条 for i in range(15): pygame.draw.line(screen, line_color, (margin, margin + i * grid_size), (margin + board_size, margin + i * grid_size), 2) pygame.draw.line(screen, line_color, (margin + i * grid_size, margin), (margin + i * grid_size, margin + board_size), 2) # 绘制星位 for i in [3, 7, 11]: for j in [3, 7, 11]: pygame.draw.circle(screen, line_color, (margin + i * grid_size, margin + j * grid_size), 5, 0) # 绘制棋子 def draw_piece(x, y, color): pygame.draw.circle(screen, color, (margin + x * grid_size, margin + y * grid_size), piece_radius, 0) # 判断是否获胜 def check_win(x, y, color): count = 0 # 判断横向是否获胜 for i in range(15): if board[x][i] == color: count += 1 else: count = 0 if count == 5: return True count = 0 # 判断纵向是否获胜 for i in range(15): if board[i][y] == color: count += 1 else: count = 0 if count == 5: return True count = 0 # 判断左上到右下是否获胜 for i in range(-4, 5): if x + i < 0 or x + i > 14 or y + i < 0 or y + i > 14: continue if board[x + i][y + i] == color: count += 1 else: count = 0 if count == 5: return True count = 0 # 判断左下到右上是否获胜 for i in range(-4, 5): if x + i < 0 or x + i > 14 or y - i < 0 or y - i > 14: continue if board[x + i][y - i] == color: count += 1 else: count = 0 if count == 5: return True return False # 判断是否平局 def check_draw(): for i in range(15): for j in range(15): if board[i][j] == 0: return False return True # AI下棋 def ai_move(): global ai_pos max_score = -1 for i in range(15): for j in range(15): if board[i][j] == 0: score = get_score(i, j, ai_color) if score > max_score: max_score = score ai_pos = (i, j) board[ai_pos[0]][ai_pos[1]] = ai_color draw_piece(ai_pos[0], ai_pos[1], ai_color) # 获取得分 def get_score(x, y, color): score = 0 # 判断横向得分 count = 0 empty = 0 for i in range(15): if board[x][i] == color: count += 1 elif board[x][i] == 0: empty += 1 else: break if count >= 5: score += 10000 elif count == 4 and empty == 1: score += 1000 elif count == 3 and empty == 2: score += 100 elif count == 2 and empty == 3: score += 10 # 判断纵向得分 count = 0 empty = 0 for i in range(15): if board[i][y] == color: count += 1 elif board[i][y] == 0: empty += 1 else: break if count >= 5: score += 10000 elif count == 4 and empty == 1: score += 1000 elif count == 3 and empty == 2: score += 100 elif count == 2 and empty == 3: score += 10 # 判断左上到右下得分 count = 0 empty = 0 for i in range(-4, 5): if x + i < 0 or x + i > 14 or y + i < 0 or y + i > 14: continue if board[x + i][y + i] == color: count += 1 elif board[x + i][y + i] == 0: empty += 1 else: break if count >= 5: score += 10000 elif count == 4 and empty == 1: score += 1000 elif count == 3 and empty == 2: score += 100 elif count == 2 and empty == 3: score += 10 # 判断左下到右上得分 count = 0 empty = 0 for i in range(-4, 5): if x + i < 0 or x + i > 14 or y - i < 0 or y - i > 14: continue if board[x + i][y - i] == color: count += 1 elif board[x + i][y - i] == 0: empty += 1 else: break if count >= 5: score += 10000 elif count == 4 and empty == 1: score += 1000 elif count == 3 and empty == 2: score += 100 elif count == 2 and empty == 3: score += 10 return score # 主循环 while not game_over: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: if win != 0: continue x, y = event.pos if x < margin or x > margin + board_size or y < margin or y > margin + board_size: continue i = (x - margin) // grid_size j = (y - margin) // grid_size if board[i][j] != 0: continue board[i][j] = player_color draw_piece(i, j, player_color) piece_count += 1 if check_win(i, j, player_color): win = 1 text = font.render("黑棋获胜!", True, black) screen.blit(text, (margin, margin + board_size + 10)) pygame.display.update() continue if check_draw(): win = 2 text = font.render("平局!", True, black) screen.blit(text, (margin, margin + board_size + 10)) pygame.display.update() continue player_color, ai_color = ai_color, player_color if ai_level > 0: pygame.time.set_timer(pygame.USEREVENT, ai_think_time) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_q: player_color, ai_color = ai_color, player_color ai_level = 0 draw_board() for i in range(15): for j in range(15): if board[i][j] == black: draw_piece(i, j, black) elif board[i][j] == white: draw_piece(i, j, white) pygame.display.update() elif event.key == pygame.K_e: player_color, ai_color = ai_color, player_color ai_level = 2 pygame.time.set_timer(pygame.USEREVENT, ai_think_time) draw_board() for i in range(15): for j in range(15): if board[i][j] == black: draw_piece(i, j, black) elif board[i][j] == white: draw_piece(i, j, white) pygame.display.update() elif event.type == pygame.USEREVENT: ai_move() piece_count += 1 if check_win(ai_pos[0], ai_pos[1], ai_color): win = -1 text = font.render("白棋获胜!", True, black) screen.blit(text, (margin, margin + board_size + 10)) pygame.display.update() continue if check_draw(): win = 2 text = font.render("平局!", True, black) screen.blit(text, (margin, margin + board_size + 10)) pygame.display.update() continue player_color, ai_color = ai_color, player_color pygame.time.set_timer(pygame.USEREVENT, 0) # 绘制棋盘 draw_board() # 绘制棋子 for i in range(15): for j in range(15): if board[i][j] == black: draw_piece(i, j, black) elif board[i][j] == white: draw_piece(i, j, white) # 判断游戏是否结束 if win != 0: continue # 更新屏幕 pygame.display.update() # 相关问题: --相关问题--:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值