大家好,我是Lex 喜欢欺负超人那个Lex
划重点:马上就到毕业季了,你心中的那个学姐,你真的放下了吗?
今天跟着lex,用pygame为你的学姐,定制开发一个拼图游戏【完整项目代码】
代码干货满满,建议收藏+实操!!!有问题及需要,请留言哦~~
事情是这样的
马上就快到毕业季了,大四的学姐们快要离校了
你心中那个没有说出口的学姐,你还记得吗

跟着博主,用pygame给你心中那个学姐
做一款专属于她的拼图游戏
万一有什么意外收获呢?

先上效果
我用隔壁诗诗学姐的照片,给她做了一个拼图游戏

结果,我自己的拼不出来了

配置环境
安装pygame模块
  
   - 
    
     
    
    
     
      #pip install pygame
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      PS C:\Users\lex> pip install pygame Looking 
      in indexes: 
     
    
- 
    
     
    
    
     
      http://mirrors.aliyun.com/pypi/simple Requirement already satisfied:
     
    
- 
    
     
    
    
     
       pygame 
      in f:\develop\python36\lib\site-packages (2.0.1)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      PS C:\Users\lex>
     
    
配置文件
cfg.py
配置需要读取的学姐的照片路径、引入游戏引用到的字体及颜色。
  
   - 
    
     
    
    
     
      '''配置文件'''
     
    
- 
    
     
    
    
     
      import os
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''屏幕大小'''
     
    
- 
    
     
    
    
     
      SCREENSIZE = (
      640, 
      640)
     
    
- 
    
     
    
    
     
      '''读取学姐照片'''
     
    
- 
    
     
    
    
     
      PICTURE_ROOT_DIR = os.path.join(os.getcwd(), 
      'resources/pictures')
     
    
- 
    
     
    
    
     
      '''字体路径'''
     
    
- 
    
     
    
    
     
      FONTPATH = os.path.join(os.getcwd(), 
      'resources/font/FZSTK.TTF')
     
    
- 
    
     
    
    
     
      '''定义一些颜色'''
     
    
- 
    
     
    
    
     
      BACKGROUNDCOLOR = (
      255, 
      255, 
      255)
     
    
- 
    
     
    
    
     
      RED = (
      255, 
      0, 
      0)
     
    
- 
    
     
    
    
     
      BLUE = (
      0, 
      0, 
      255)
     
    
- 
    
     
    
    
     
      BLACK = (
      0, 
      0, 
      0)
     
    
- 
    
     
    
    
     
      '''FPS'''
     
    
- 
    
     
    
    
     
      FPS = 
      40
     
    
- 
    
     
    
    
     
      '''随机打乱拼图次数'''
     
    
- 
    
     
    
    
     
      NUMRANDOM = 
      100
     
    
引入资源
将诗诗学姐的照片,添加到resources/pictures路径下,
游戏启动时,根据我们在cfg.py中的配置,会自动将该路径的照片
加载成为我们拼图的原材料。

主函数代码
pintu.py
代码结构搞的简单一点。一个配置文件cfg,一个资源路径resources,存放字体和图片。
主函数代码放在这里:
1、定义四个可移动函数,在存在空格的情况下,允许向空格的方向移动。
2、createboard:随机将图片拆分,并且打乱。
3、开始时,随机从图片文件夹获取一张图片:如果想给整个宿舍的学姐做游戏,
就把所有人的照片放进去,这样每次打开,会随机生成一个学姐的照片作为游戏背景。
  
   - 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      Function:
     
    
- 
    
     
    
    
     
       拼图小游戏
     
    
- 
    
     
    
    
     
      作者:
     
    
- 
    
     
    
    
     
       LexSaints
     
    
- 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      import os
     
    
- 
    
     
    
    
     
      import sys
     
    
- 
    
     
    
    
     
      import cfg
     
    
- 
    
     
    
    
     
      import random
     
    
- 
    
     
    
    
     
      import pygame
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''判断游戏是否结束'''
     
    
- 
    
     
    
    
     
      def isGameOver(board, size):
     
    
- 
    
     
    
    
         
      assert isinstance(size, int)
     
    
- 
    
     
    
    
     
          num_cells = size * size
     
    
- 
    
     
    
    
         
      for i 
      in range(num_cells
      -1):
     
    
- 
    
     
    
    
             
      if board[i] != i: 
      return 
      False
     
    
- 
    
     
    
    
         
      return 
      True
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''将空白Cell左边的Cell右移到空白Cell位置'''
     
    
- 
    
     
    
    
     
      def moveR(board, blank_cell_idx, num_cols):
     
    
- 
    
     
    
    
         
      if blank_cell_idx % num_cols == 
      0: 
      return blank_cell_idx
     
    
- 
    
     
    
    
     
          board[blank_cell_idx
      -1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx
      -1]
     
    
- 
    
     
    
    
         
      return blank_cell_idx - 
      1
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''将空白Cell右边的Cell左移到空白Cell位置'''
     
    
- 
    
     
    
    
     
      def moveL(board, blank_cell_idx, num_cols):
     
    
- 
    
     
    
    
         
      if (blank_cell_idx+
      1) % num_cols == 
      0: 
      return blank_cell_idx
     
    
- 
    
     
    
    
     
          board[blank_cell_idx+
      1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+
      1]
     
    
- 
    
     
    
    
         
      return blank_cell_idx + 
      1
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''将空白Cell上边的Cell下移到空白Cell位置'''
     
    
- 
    
     
    
    
     
      def moveD(board, blank_cell_idx, num_cols):
     
    
- 
    
     
    
    
         
      if blank_cell_idx < num_cols: 
      return blank_cell_idx
     
    
- 
    
     
    
    
     
          board[blank_cell_idx-num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx-num_cols]
     
    
- 
    
     
    
    
         
      return blank_cell_idx - num_cols
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''将空白Cell下边的Cell上移到空白Cell位置'''
     
    
- 
    
     
    
    
     
      def moveU(board, blank_cell_idx, num_rows, num_cols):
     
    
- 
    
     
    
    
         
      if blank_cell_idx >= (num_rows
      -1) * num_cols: 
      return blank_cell_idx
     
    
- 
    
     
    
    
     
          board[blank_cell_idx+num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+num_cols]
     
    
- 
    
     
    
    
         
      return blank_cell_idx + num_cols
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''获得打乱的拼图'''
     
    
- 
    
     
    
    
     
      def CreateBoard(num_rows, num_cols, num_cells):
     
    
- 
    
     
    
    
     
          board = []
     
    
- 
    
     
    
    
         
      for i 
      in range(num_cells): board.append(i)
     
    
- 
    
     
    
    
         
      # 去掉右下角那块
     
    
- 
    
     
    
    
     
          blank_cell_idx = num_cells - 
      1
     
    
- 
    
     
    
    
     
          board[blank_cell_idx] = 
      -1
     
    
- 
    
     
    
    
         
      for i 
      in range(cfg.NUMRANDOM):
     
    
- 
    
     
    
    
             
      # 0: left, 1: right, 2: up, 3: down
     
    
- 
    
     
    
    
     
              direction = random.randint(
      0, 
      3)
     
    
- 
    
     
    
    
             
      if direction == 
      0: blank_cell_idx = moveL(board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
             
      elif direction == 
      1: blank_cell_idx = moveR(board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
             
      elif direction == 
      2: blank_cell_idx = moveU(board, blank_cell_idx, num_rows, num_cols)
     
    
- 
    
     
    
    
             
      elif direction == 
      3: blank_cell_idx = moveD(board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
         
      return board, blank_cell_idx
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''随机选取一张图片'''
     
    
- 
    
     
    
    
     
      def GetImagePath(rootdir):
     
    
- 
    
     
    
    
     
          imagenames = os.listdir(rootdir)
     
    
- 
    
     
    
    
         
      assert len(imagenames) > 
      0
     
    
- 
    
     
    
    
         
      return os.path.join(rootdir, random.choice(imagenames))
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''显示游戏结束界面'''
     
    
- 
    
     
    
    
     
      def ShowEndInterface(screen, width, height):
     
    
- 
    
     
    
    
     
          screen.fill(cfg.BACKGROUNDCOLOR)
     
    
- 
    
     
    
    
     
          font = pygame.font.Font(cfg.FONTPATH, width//
      15)
     
    
- 
    
     
    
    
     
          title = font.render(
      '恭喜! 你成功完成了拼图!', 
      True, (
      233, 
      150, 
      122))
     
    
- 
    
     
    
    
     
          rect = title.get_rect()
     
    
- 
    
     
    
    
     
          rect.midtop = (width/
      2, height/
      2.5)
     
    
- 
    
     
    
    
     
          screen.blit(title, rect)
     
    
- 
    
     
    
    
     
          pygame.display.update()
     
    
- 
    
     
    
    
         
      while 
      True:
     
    
- 
    
     
    
    
             
      for event 
      in pygame.event.get():
     
    
- 
    
     
    
    
                 
      if (event.type == pygame.QUIT) 
      or (event.type == pygame.KEYDOWN 
      and event.key == pygame.K_ESCAPE):
     
    
- 
    
     
    
    
     
                      pygame.quit()
     
    
- 
    
     
    
    
     
                      sys.exit()
     
    
- 
    
     
    
    
     
              pygame.display.update()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''显示游戏开始界面'''
     
    
- 
    
     
    
    
     
      def ShowStartInterface(screen, width, height):
     
    
- 
    
     
    
    
     
          screen.fill(cfg.BACKGROUNDCOLOR)
     
    
- 
    
     
    
    
     
          tfont = pygame.font.Font(cfg.FONTPATH, width//
      4)
     
    
- 
    
     
    
    
     
          cfont = pygame.font.Font(cfg.FONTPATH, width//
      20)
     
    
- 
    
     
    
    
     
          title = tfont.render(
      '拼图游戏', 
      True, cfg.RED)
     
    
- 
    
     
    
    
     
          content1 = cfont.render(
      '按H或M或L键开始游戏', 
      True, cfg.BLUE)
     
    
- 
    
     
    
    
     
          content2 = cfont.render(
      'H为5*5模式, M为4*4模式, L为3*3模式', 
      True, cfg.BLUE)
     
    
- 
    
     
    
    
     
          trect = title.get_rect()
     
    
- 
    
     
    
    
     
          trect.midtop = (width/
      2, height/
      10)
     
    
- 
    
     
    
    
     
          crect1 = content1.get_rect()
     
    
- 
    
     
    
    
     
          crect1.midtop = (width/
      2, height/
      2.2)
     
    
- 
    
     
    
    
     
          crect2 = content2.get_rect()
     
    
- 
    
     
    
    
     
          crect2.midtop = (width/
      2, height/
      1.8)
     
    
- 
    
     
    
    
     
          screen.blit(title, trect)
     
    
- 
    
     
    
    
     
          screen.blit(content1, crect1)
     
    
- 
    
     
    
    
     
          screen.blit(content2, crect2)
     
    
- 
    
     
    
    
         
      while 
      True:
     
    
- 
    
     
    
    
             
      for event 
      in pygame.event.get():
     
    
- 
    
     
    
    
                 
      if (event.type == pygame.QUIT) 
      or (event.type == pygame.KEYDOWN 
      and event.key == pygame.K_ESCAPE):
     
    
- 
    
     
    
    
     
                      pygame.quit()
     
    
- 
    
     
    
    
     
                      sys.exit()
     
    
- 
    
     
    
    
                 
      elif event.type == pygame.KEYDOWN:
     
    
- 
    
     
    
    
                     
      if event.key == ord(
      'l'): 
      return 
      3
     
    
- 
    
     
    
    
                     
      elif event.key == ord(
      'm'): 
      return 
      4
     
    
- 
    
     
    
    
                     
      elif event.key == ord(
      'h'): 
      return 
      5
     
    
- 
    
     
    
    
     
              pygame.display.update()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''主函数'''
     
    
- 
    
     
    
    
     
      def main():
     
    
- 
    
     
    
    
         
      # 初始化
     
    
- 
    
     
    
    
     
          pygame.init()
     
    
- 
    
     
    
    
     
          clock = pygame.time.Clock()
     
    
- 
    
     
    
    
         
      # 加载图片
     
    
- 
    
     
    
    
     
          game_img_used = pygame.image.load(GetImagePath(cfg.PICTURE_ROOT_DIR))
     
    
- 
    
     
    
    
     
          game_img_used = pygame.transform.scale(game_img_used, cfg.SCREENSIZE)
     
    
- 
    
     
    
    
     
          game_img_used_rect = game_img_used.get_rect()
     
    
- 
    
     
    
    
         
      # 设置窗口
     
    
- 
    
     
    
    
     
          screen = pygame.display.set_mode(cfg.SCREENSIZE)
     
    
- 
    
     
    
    
     
          pygame.display.set_caption(
      '拼图游戏 —— Linux黑客小课堂')
     
    
- 
    
     
    
    
         
      # 游戏开始界面
     
    
- 
    
     
    
    
     
          size = ShowStartInterface(screen, game_img_used_rect.width, game_img_used_rect.height)
     
    
- 
    
     
    
    
         
      assert isinstance(size, int)
     
    
- 
    
     
    
    
     
          num_rows, num_cols = size, size
     
    
- 
    
     
    
    
     
          num_cells = size * size
     
    
- 
    
     
    
    
         
      # 计算Cell大小
     
    
- 
    
     
    
    
     
          cell_width = game_img_used_rect.width // num_cols
     
    
- 
    
     
    
    
     
          cell_height = game_img_used_rect.height // num_rows
     
    
- 
    
     
    
    
         
      # 避免初始化为原图
     
    
- 
    
     
    
    
         
      while 
      True:
     
    
- 
    
     
    
    
     
              game_board, blank_cell_idx = CreateBoard(num_rows, num_cols, num_cells)
     
    
- 
    
     
    
    
             
      if 
      not isGameOver(game_board, size):
     
    
- 
    
     
    
    
                 
      break
     
    
- 
    
     
    
    
         
      # 游戏主循环
     
    
- 
    
     
    
    
     
          is_running = 
      True
     
    
- 
    
     
    
    
         
      while is_running:
     
    
- 
    
     
    
    
             
      # --事件捕获
     
    
- 
    
     
    
    
             
      for event 
      in pygame.event.get():
     
    
- 
    
     
    
    
                 
      # ----退出游戏
     
    
- 
    
     
    
    
                 
      if (event.type == pygame.QUIT) 
      or (event.type == pygame.KEYDOWN 
      and event.key == pygame.K_ESCAPE):
     
    
- 
    
     
    
    
     
                      pygame.quit()
     
    
- 
    
     
    
    
     
                      sys.exit()
     
    
- 
    
     
    
    
                 
      # ----键盘操作
     
    
- 
    
     
    
    
                 
      elif event.type == pygame.KEYDOWN:
     
    
- 
    
     
    
    
                     
      if event.key == pygame.K_LEFT 
      or event.key == ord(
      'a'):
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
                     
      elif event.key == pygame.K_RIGHT 
      or event.key == ord(
      'd'):
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
                     
      elif event.key == pygame.K_UP 
      or event.key == ord(
      'w'):
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)
     
    
- 
    
     
    
    
                     
      elif event.key == pygame.K_DOWN 
      or event.key == ord(
      's'):
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
                 
      # ----鼠标操作
     
    
- 
    
     
    
    
                 
      elif event.type == pygame.MOUSEBUTTONDOWN 
      and event.button == 
      1:
     
    
- 
    
     
    
    
     
                      x, y = pygame.mouse.get_pos()
     
    
- 
    
     
    
    
     
                      x_pos = x // cell_width
     
    
- 
    
     
    
    
     
                      y_pos = y // cell_height
     
    
- 
    
     
    
    
     
                      idx = x_pos + y_pos * num_cols
     
    
- 
    
     
    
    
                     
      if idx == blank_cell_idx
      -1:
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
                     
      elif idx == blank_cell_idx+
      1:
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
                     
      elif idx == blank_cell_idx+num_cols:
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)
     
    
- 
    
     
    
    
                     
      elif idx == blank_cell_idx-num_cols:
     
    
- 
    
     
    
    
     
                          blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)
     
    
- 
    
     
    
    
             
      # --判断游戏是否结束
     
    
- 
    
     
    
    
             
      if isGameOver(game_board, size):
     
    
- 
    
     
    
    
     
                  game_board[blank_cell_idx] = num_cells - 
      1
     
    
- 
    
     
    
    
     
                  is_running = 
      False
     
    
- 
    
     
    
    
             
      # --更新屏幕
     
    
- 
    
     
    
    
     
              screen.fill(cfg.BACKGROUNDCOLOR)
     
    
- 
    
     
    
    
             
      for i 
      in range(num_cells):
     
    
- 
    
     
    
    
                 
      if game_board[i] == 
      -1:
     
    
- 
    
     
    
    
                     
      continue
     
    
- 
    
     
    
    
     
                  x_pos = i // num_cols
     
    
- 
    
     
    
    
     
                  y_pos = i % num_cols
     
    
- 
    
     
    
    
     
                  rect = pygame.Rect(y_pos*cell_width, x_pos*cell_height, cell_width, cell_height)
     
    
- 
    
     
    
    
     
                  img_area = pygame.Rect((game_board[i]%num_cols)*cell_width, (game_board[i]//num_cols)*cell_height, cell_width, cell_height)
     
    
- 
    
     
    
    
     
                  screen.blit(game_img_used, rect, img_area)
     
    
- 
    
     
    
    
             
      for i 
      in range(num_cols+
      1):
     
    
- 
    
     
    
    
     
                  pygame.draw.line(screen, cfg.BLACK, (i*cell_width, 
      0), (i*cell_width, game_img_used_rect.height))
     
    
- 
    
     
    
    
             
      for i 
      in range(num_rows+
      1):
     
    
- 
    
     
    
    
     
                  pygame.draw.line(screen, cfg.BLACK, (
      0, i*cell_height), (game_img_used_rect.width, i*cell_height))
     
    
- 
    
     
    
    
     
              pygame.display.update()
     
    
- 
    
     
    
    
     
              clock.tick(cfg.FPS)
     
    
- 
    
     
    
    
         
      # 游戏结束界面
     
    
- 
    
     
    
    
     
          ShowEndInterface(screen, game_img_used_rect.width, game_img_used_rect.height)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      '''run'''
     
    
- 
    
     
    
    
     
      if __name__ == 
      '__main__':
     
    
- 
    
     
    
    
     
          main()
     
    
游戏运行方法
1、开发工具启动
如果你有python开发环境VScode、sublimeText、notepad+、pycharm等等这些环境,可以直接在工具中,运行游戏。
2、命令行运行游戏
如下图:

推荐阅读
python实战
【python实战】前女友发来加密的 “520快乐.pdf“,我用python破解开之后,却发现。。。
【python实战】昨晚,我用python帮隔壁小姐姐P证件照 自拍,然后发现...
【python实战】女友半夜加班发自拍 python男友用30行代码发现惊天秘密
【python实战】python你TM太皮了——区区30行代码就能记录键盘的一举一动
【python实战】女神相册密码忘记了,我只用Python写了20行代码~~~
渗透测试
【渗透测试】密码暴力破解工具——九头蛇(hydra)使用详解及实战
【渗透学习】Web安全渗透详细教程+学习线路+详细笔记【全网最全+建议收藏】
【渗透案例】如何用ssh工具连接前台小姐姐的“小米手机”——雷总看了直呼内行!!!
【渗透测试】密码暴力破解工具——九头蛇(hydra)使用详解及实战
pygame系列文章
一起来学pygame吧 游戏开发30例(三)——射击外星人小游戏
一起来学pygame吧 游戏开发30例(四)——俄罗斯方块小游戏
一起来学pygame吧 游戏开发30例(五)——消消乐 小游戏
一起来学pygame吧 游戏开发30例(六)——高山滑雪 小游戏
CSDN官方学习推荐 ↓ ↓ ↓
CSDN出的Python全栈知识图谱,太强了,推荐给大家!
 
转载:https://blog.csdn.net/weixin_42350212/article/details/117231108
