通过Python把学姐照片做成拼图游戏


Posted in Python onFebruary 15, 2022

前言

事情是这样的

马上就快到毕业季了,大四的学姐们快要离校了

你心中那个没有说出口的学姐,你还记得吗

通过Python把学姐照片做成拼图游戏

跟着博主,用pygame给你心中那个学姐做一款专属于她的拼图游戏

万一有什么意外收获呢?

通过Python把学姐照片做成拼图游戏

先上效果

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

通过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中的配置,会自动将该路径的照片

加载成为我们拼图的原材料。

通过Python把学姐照片做成拼图游戏

主函数代码

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把学姐照片做成拼图游戏的详细内容,更多关于Python拼图游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现的jpg格式图片修复代码
Apr 21 Python
Python闭包实现计数器的方法
May 05 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
使用python对excle和json互相转换的示例
Oct 23 Python
python3正则提取字符串里的中文实例
Jan 31 Python
python读写配置文件操作示例
Jul 03 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
PyTorch-GPU加速实例
Jun 23 Python
Python何绘制带有背景色块的折线图
Apr 23 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 #Python
python flappy bird小游戏分步实现流程
Python 居然可以在 Excel 中画画你知道吗
Feb 15 #Python
Python 恐龙跑跑小游戏实现流程
详解Python+OpenCV进行基础的图像操作
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 #Python
python 远程执行命令的详细代码
Feb 15 #Python
You might like
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
用Webpack构建Vue项目的实践
2017/11/07 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
关于vue面试题汇总
2018/03/20 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
新手简单了解vue
2019/05/29 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
Python探索之pLSA实现代码
2017/10/25 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
python实现图片插入文字
2019/11/26 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
Python中求对数方法总结
2020/03/10 Python
Python如何省略括号方法详解
2020/03/21 Python
Django配置跨域并开发测试接口
2020/11/04 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
中学生在校期间的自我评价分享
2013/11/13 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
党员承诺书范文
2014/05/19 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS