page contents

如何利用pygame实现简单的五子棋游戏

这篇文章主要给大家介绍了关于如何利用pygame实现简单的五子棋游戏的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用pygame具有一定的参考学习价值。 准备 python相关准备:...

这篇文章主要给大家介绍了关于如何利用pygame实现简单的五子棋游戏的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用pygame具有一定的参考学习价值。

准备


python相关准备:

  1. 安装pygame,命令:pip install pygame

  2. 如安装较慢,可以参考如下命令,更改pip源为国内镜像站点:
    pip config set global.index-url

    https://pypi.tuna.tsinghua.edu.cn/simple

计划


完成五子棋单机人机游戏,目前已完成界面以及判定输赢等功能,主要功能如下:

  1. 五子棋界面的绘制,鼠标左键点击落子(黑子先下,黑白子交替顺序)。

  2. 判定黑子或白子五子连珠。

  3. 一方胜利后弹出提示,结束游戏。

游戏界面是下面这个样子:


设计思路


整个游戏的核心是将棋盘分成两个层面:

第一个层面是物理层面上的,代表在物理像素的位置,主要用于绘图等操作;

另外一个层面是将棋盘抽象成15*15的一个矩阵,黑子和白子是落在这个矩阵上的某个位置,具体位置用坐标(i,j)(0<=i,j<15)来表示,主要用于判断输赢和落子等。

1.棋盘的绘制

网上有棋盘和黑白子的图片资源可以下载使用。

我下载后由于棋盘图片格子线像素位置不太精确,所以自己用ps做了一张544544的木质背景图,然后用程序来绘制棋盘线(如果PS更熟悉点的话,建议棋盘格线之类就画在棋盘背景图上),棋盘格线上下左右空20像素,棋盘格子大小36像素,网上下载的棋子大小是3232像素的。

2.输赢的判断

由于未出输赢的时候肯定没有五子连成线的,所以只需要判断最后落子位置的横、竖、斜、反斜四个方向上有没有五子连成线即可。


主要代码


1. main函数,pygame的主要控制流程,缩写代码如下:

  1. def main():
  2. pygame.init() #pygame初始化
  3. size = width,height = 544,544
  4. screen = pygame.display.set_mode(size, 0, 32)
  5. pygame.display.set_caption('五子棋')
  6. font = pygame.font.Font('simhei.ttf', 48)
  7. clock = pygame.time.Clock() #设置时钟
  8. game_over = False
  9. renju = Renju() # Renju是核心类,实现落子及输赢判断等
  10. renju.init() # 初始化
  11.  
  12. while True:
  13. clock.tick(20) # 设置帧率
  14. for event in pygame.event.get():
  15. if event.type == pygame.QUIT:
  16. sys.exit()
  17. if event.type == pygame.MOUSEBUTTONDOWN and (not game_over):
  18. if event.button == 1: # 按下的是鼠标左键
  19. i,j = renju.get_coord(event.pos) # 将物理坐标转换成矩阵的逻辑坐标
  20. if renju.check_at(i, j): # 检查(i,j)位置能否被占用,如未被占用返回True
  21. renju.drop_at(i, j) # 在(i,j)位置落子,该函数将黑子或者白子画在棋盘上
  22. if renju.check_over(): # 检查是否存在五子连线,如存在则返回True
  23. text = ''
  24. if renju.black_turn: #check_at会切换落子的顺序,所以轮到黑方落子,意味着最后落子方是白方,所以白方顺利
  25. text = '白方获胜,游戏结束!'
  26. else:
  27. text = '黑方获胜,游戏结束!'
  28. gameover_text = font.render(text, True, (255,0,0))
  29. renju.chessboard().blit(gameover_text, (round(width/2-gameover_text.get_width()/2), round(height/2-gameover_text.get_height()/2)))
  30. game_over = True
  31. else:
  32. print('此位置已占用,不能在此落子')
  33. screen.blit(renju.chessboard(),(0,0))
  34. pygame.display.update()
  35. pygame.quit()


2. renju类,核心类,落子及判断输赢等操作,代码如下:

  1. Position = namedtuple('Position', ['x', 'y'])
  2.  
  3. class Renju(object):
  4. background_filename = 'chessboard.png'
  5. white_chessball_filename = 'white_chessball.png'
  6. black_chessball_filename = 'black_chessball.png'
  7. top, left, space, lines = (20, 20, 36, 15) # 棋盘格子位置相关???
  8. color = (0, 0, 0) # 棋盘格子线颜色
  9. black_turn = True # 黑子先手
  10. ball_coord = [] # 记录黑子和白子逻辑位置
  11. def init(self):
  12. try:
  13. self._chessboard = pygame.image.load(self.background_filename)
  14. self._white_chessball = pygame.image.load(self.white_chessball_filename).convert_alpha()
  15. self._black_chessball = pygame.image.load(self.black_chessball_filename).convert_alpha()
  16. self.font = pygame.font.SysFont('arial', 16)
  17. self.ball_rect = self._white_chessball.get_rect()
  18. self.points = [[] for i in range(self.lines)]
  19. for i in range(self.lines):
  20. for j in range(self.lines):
  21. self.points[i].append(Position(self.left + i*self.space, self.top + j*self.space))
  22. self._draw_board()
  23. except pygame.error as e:
  24. print(e)
  25. sys.exit()
  26. def chessboard(self):
  27. return
  • 发表于 2019-12-31 09:39
  • 阅读 ( 848 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章