飞道的博客

100行python代码实现五子棋-教程

472人阅读  评论(0)

五子棋是是一种两人对弈的纯策略型棋类游戏。

五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。

案例展示

五子棋

pygame模块

游戏采用pygame模块需要先安装

pip install pygame

窗口启动


   
  1. import pygame
  2. pygame.init()
  3. pygame.display.set_caption( '五子棋-IT入门') # 改标题
  4. # pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
  5. screen = pygame.display.set_mode(( 640, 640))

绘制棋子

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

绘制棋盘


   
  1. # 定义棋盘这个类
  2. class RenjuBoard(object):
  3.     def __init__(self):
  4.         # self._board = board = [[EMPTY] *  15  for _ in  range( 15)]
  5.         # 将棋盘每一个交叉点都看作列表的一个元素位,一共有 15* 15225个元素
  6.         self._board = [[]] *  15
  7.         self.reset()
  8.     #重置棋盘
  9.     def reset(self):
  10.          for row in  range( len(self._board)):
  11.             self._board[row] = [EMPTY] *  15
  12.     #定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋
  13.     def move(self, row, col, is_black):
  14.          if self._board[row][col] == EMPTY:
  15.             self._board[row][col] = BLACK  if is_black  else WHITE
  16.              return True
  17.          return False
  18.     # 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来
  19.     def draw(self, screen):
  20.          for h in  range( 116):
  21.             pygame.draw.line(screen, black_color,
  22.                              [ 40, h *  40], [ 600, h *  40],  1)
  23.             pygame.draw.line(screen, black_color,
  24.                              [h *  40, 40], [h *  40600],  1)
  25.         # 给棋盘加一个外框,使美观
  26.         pygame.draw.rect(screen, black_color, [ 3636568568],  3)
  27.         # 在棋盘上标出,天元以及另外 4个特殊点位
  28.         pygame.draw.circle(screen, black_color, [ 320320],  50)
  29.         pygame.draw.circle(screen, black_color, [ 160160],  30)
  30.         pygame.draw.circle(screen, black_color, [ 160480],  30)
  31.         pygame.draw.circle(screen, black_color, [ 480160],  30)
  32.         pygame.draw.circle(screen, black_color, [ 480480],  30)
  33.         #做 2for循环取得棋盘上所有交叉点的坐标
  34.          for row in  range( len(self._board)):
  35.              for col in  range( len(self._board[row])):
  36.                 # 将下在棋盘上的棋子画出来
  37.                  if self._board[row][col] != EMPTY:
  38.                     ccolor = black_color \
  39.                          if self._board[row][col] == BLACK  else white_color
  40.                     # 取得这个交叉点下的棋子的颜色,并将棋子画出来
  41.                     pos = [ 40 * (col +  1),  40 * (row +  1)]
  42.                     # 画出棋子
  43.                     pygame.draw.circle(screen, ccolor, pos,  180)

全部代码


   
  1. import pygame
  2. # 导入pygame模块
  3. print(pygame.ver)
  4. # 检查pygame的版本,检查pygame有没有导入成功
  5. EMPTY =  0
  6. BLACK =  1
  7. WHITE =  2
  8. # 定义三个常量函数,用来表示白棋,黑棋,以及 空
  9. black_color = [ 000]
  10. # 定义黑色(黑棋用,画棋盘)
  11. white_color = [ 255255255]
  12. # 定义白色(白棋用)
  13. # 定义棋盘这个类
  14. class RenjuBoard(object):
  15.     def __init__(self):
  16.         # self._board = board = [[EMPTY] *  15  for _ in  range( 15)]
  17.         # 将棋盘每一个交叉点都看作列表的一个元素位,一共有 15* 15225个元素
  18.         self._board = [[]] *  15
  19.         self.reset()
  20.     #重置棋盘
  21.     def reset(self):
  22.          for row in  range( len(self._board)):
  23.             self._board[row] = [EMPTY] *  15
  24.     #定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋
  25.     def move(self, row, col, is_black):
  26.          if self._board[row][col] == EMPTY:
  27.             self._board[row][col] = BLACK  if is_black  else WHITE
  28.              return True
  29.          return False
  30.     # 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来
  31.     def draw(self, screen):
  32.          for h in  range( 116):
  33.             pygame.draw.line(screen, black_color,
  34.                              [ 40, h *  40], [ 600, h *  40],  1)
  35.             pygame.draw.line(screen, black_color,
  36.                              [h *  40, 40], [h *  40600],  1)
  37.         # 给棋盘加一个外框,使美观
  38.         pygame.draw.rect(screen, black_color, [ 3636568568],  3)
  39.         # 在棋盘上标出,天元以及另外 4个特殊点位
  40.         pygame.draw.circle(screen, black_color, [ 320320],  50)
  41.         pygame.draw.circle(screen, black_color, [ 160160],  30)
  42.         pygame.draw.circle(screen, black_color, [ 160480],  30)
  43.         pygame.draw.circle(screen, black_color, [ 480160],  30)
  44.         pygame.draw.circle(screen, black_color, [ 480480],  30)
  45.         #做 2for循环取得棋盘上所有交叉点的坐标
  46.          for row in  range( len(self._board)):
  47.              for col in  range( len(self._board[row])):
  48.                 # 将下在棋盘上的棋子画出来
  49.                  if self._board[row][col] != EMPTY:
  50.                     ccolor = black_color \
  51.                          if self._board[row][col] == BLACK  else white_color
  52.                     # 取得这个交叉点下的棋子的颜色,并将棋子画出来
  53.                     pos = [ 40 * (col +  1),  40 * (row +  1)]
  54.                     # 画出棋子
  55.                     pygame.draw.circle(screen, ccolor, pos,  180)
  56. # 定义函数,传入当前棋盘上的棋子列表,输出结果,不管黑棋白棋胜,都是传回False,未出结果则为True
  57. def is_win(board):
  58.      for n in  range( 15):
  59.         # 判断垂直方向胜利
  60.         flag =  0
  61.         # flag是一个标签,表示是否有连续以上五个相同颜色的棋子
  62.          for b in board._board:
  63.              if b[n] ==  1:
  64.                 flag +=  1
  65.                  if flag ==  5:
  66.                      print( '黑棋胜')
  67.                      return False
  68.              else:
  69.             #  else表示此时没有连续相同的棋子,标签flag重置为 0
  70.                 flag =  0
  71.         flag =  0
  72.          for b in board._board:
  73.              if b[n] ==  2:
  74.                 flag +=  1
  75.                  if flag ==  5:
  76.                      print( '白棋胜')
  77.                      return False
  78.              else:
  79.                 flag =  0
  80.         # 判断水平方向胜利
  81.         flag =  0
  82.          for b in board._board[n]:
  83.              if b ==  1:
  84.                 flag +=  1
  85.                  if flag ==  5:
  86.                      print( '黑棋胜')
  87.                      return False
  88.              else:
  89.                 flag =  0
  90.         flag =  0
  91.          for b in board._board[n]:
  92.              if b ==  2:
  93.                 flag +=  1
  94.                  if flag ==  5:
  95.                      print( '白棋胜')
  96.                      return False
  97.              else:
  98.                 flag =  0
  99.         # 判断正斜方向胜利
  100.          for x in  range( 425):
  101.             flag =  0
  102.              for i,b in enumerate(board._board):
  103.                  if  14 >= x - i >=  0 and b[x - i] ==  1:
  104.                     flag +=  1
  105.                      if flag ==  5:
  106.                          print( '黑棋胜')
  107.                          return False
  108.                  else:
  109.                     flag =  0
  110.          for x in  range( 425):
  111.             flag =  0
  112.              for i,b in enumerate(board._board):
  113.                  if  14 >= x - i >=  0 and b[x - i] ==  2:
  114.                     flag +=  1
  115.                      if flag ==  5:
  116.                          print( '白棋胜')
  117.                          return False
  118.                  else:
  119.                     flag =  0
  120.         #判断反斜方向胜利
  121.          for x in  range( 11-11-1):
  122.             flag =  0
  123.              for i,b in enumerate(board._board):
  124.                  if  0 <= x + i <=  14 and b[x + i] ==  1:
  125.                     flag +=  1
  126.                      if flag ==  5:
  127.                          print( '黑棋胜')
  128.                          return False
  129.                  else:
  130.                     flag =  0
  131.          for x in  range( 11-11-1):
  132.             flag =  0
  133.              for i,b in enumerate(board._board):
  134.                  if  0 <= x + i <=  14 and b[x + i] ==  2:
  135.                     flag +=  1
  136.                      if flag ==  5:
  137.                          print( '白棋胜')
  138.                          return False
  139.                  else:
  140.                     flag =  0
  141.      return True
  142. def main():
  143.     # 创建棋盘对象
  144.     board = RenjuBoard()
  145.     # 用于判断是下黑棋还是白棋
  146.     is_black = True
  147.     # pygame初始化函数,固定写法
  148.     pygame.init()
  149.     pygame.display.set_caption( '五子棋-IT入门') # 改标题
  150.     # pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
  151.     screen = pygame.display.set_mode(( 640, 640))
  152.     # 给窗口填充颜色,颜色用三原色数字列表表示
  153.     screen.fill([ 125, 95, 24])
  154.     board.draw(screen)  # 给棋盘类发命令,调用draw()函数将棋盘画出来
  155.     pygame.display.flip()  # 刷新窗口显示
  156.     running = True
  157.     # while 主循环的标签,以便跳出循环
  158.     while running:
  159.         # 遍历建立窗口后发生的所有事件,固定写法
  160.          for event in pygame.event.get():
  161.             # 根据事件的类型,进行判断
  162.              if event. type == pygame.QUIT:
  163.                 running = False
  164.             elif event. type == pygame.KEYUP:
  165.                 pass
  166.             # pygame.MOUSEBUTTONDOWN表示鼠标的键被按下
  167.             elif event. type == pygame.MOUSEBUTTONDOWN and \
  168.                     event.button ==  1:# button表示鼠标左键
  169.                 x, y = event.pos  # 拿到鼠标当前在窗口上的位置坐标
  170.                 # 将鼠标的(x, y)窗口坐标,转化换为棋盘上的坐标
  171.                 row = round((y -  40) /  40)     
  172.                 col = round((x -  40) /  40)
  173.                  if board.move(row, col, is_black):
  174.                     is_black = not is_black
  175.                     screen.fill([ 1259524])
  176.                     board.draw(screen)
  177.                     pygame.display.flip()
  178.                     # 调用判断胜负函数
  179.                      if not is_win(board):
  180.                         # break
  181.                         running = False
  182.     pygame.quit()
  183. if __name__ ==  '__main__':
  184.     main()

author:wills

 

推荐阅读  点击标题可跳转

★Python100行-贪吃蛇小游戏 

python俄罗斯方块教程-100行代码

50行python代码写个计算器教程

★教你用Python画了一棵圣诞树

20行python代码的入门级小游戏

10行python代码做出哪些酷炫的事情?

一行Python代码能做出哪些神器的事情

都来到这了,拜托拜托点个赞


转载:https://blog.csdn.net/bigzql/article/details/112386871
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场