如何通过Python把照片做成拼图游戏
发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章给大家分享的是有关如何通过Python把照片做成拼图游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上效果我用隔壁诗诗学姐的照片,给她做了一个拼图游戏结果,我自
千家信息网最后更新 2025年11月12日如何通过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安全错误
数据库的锁怎样保障安全
互联网科技聚焦
服务器管理器打开服务器
西安培训软件开发的有哪些
怎么创建我的世界中国版服务器
嵌入式软件开发的基本逻辑
网络安全的职业方向
数据库2017年怎么表示
镇江小型工控机服务器
数据库id关联不好迁移
计算机网络技术和算法
数据库系统是哪4部分组成
五年级网络安全答题库
软件开发是服务吗
手把手游戏服务器
软件开发100种方法
软件开发基础学习心得
公安院校网络安全智力探索论文
技术软件开发企业优惠
深圳工业软件开发靠谱吗
网络安全红蓝对抗纪录片
数据库选中c
网络技术调试费
考研北交大网络安全会不会提分
软件开发在求职时有哪些优势
药品广告数据库胃康灵胶囊
表格公式回车后才出数据库
什么时候选择非关系型数据库
我国网络安全人才培养的建议
抢红包 数据库设计
肇庆电商软件开发订制