如何通过Python把照片做成拼图游戏
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关如何通过Python把照片做成拼图游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上效果我用隔壁诗诗学姐的照片,给她做了一个拼图游戏结果,我自
千家信息网最后更新 2026年11月03日如何通过Python把照片做成拼图游戏
这篇文章给大家分享的是有关如何通过Python把照片做成拼图游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
先上效果
我用隔壁诗诗学姐的照片,给她做了一个拼图游戏
结果,我自己的拼不出来了
配置环境
安装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 osimport sysimport cfgimport randomimport 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把照片做成拼图游戏"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
照片
图片
空白
配置
函数
文件
界面
路径
代码
位置
字体
模式
环境
运行
内容
大小
屏幕
工具
更多
空格
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
喔噻互联网科技有限公司
北京路客互联网科技有限公司
广州百单互联网科技有限公司
互联网品科技
与互联网科技公司
喔噻互联网科技
深圳互联网络科技有限公司
致骋互联网科技
新浪科技互联网
深圳天众互联网科技公司
天速互联网络科技有限公司
金融科技与互联网金融相同和不同
栖莱科技互联网股份有限公司
互联网金融中的现代科技
浙江互联网科技研学营
黑科技闪耀互联网之光
互联网行业科技股
互联网方面的科技前沿
互联网安防科技感
35岁以上互联网科技行业
互联网的科技
互联网下的科技发展
腾讯科技 互联网女皇
广州优美互联网科技
哈尔滨新华互联网科技学院
互联网为啥属于高科技
苏州铭阳互联网科技有限公司
西安小鹰速贷互联网科技有限公司
华夏恒生科技与互联网科技
每日互联网科技新闻