通过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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
python中的字典操作及字典函数
Jan 03 Python
python入门前的第一课 python怎样入门
Mar 06 Python
python MySQLdb使用教程详解
Mar 20 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Django数据统计功能count()的使用
Nov 30 Python
python基于爬虫+django,打造个性化API接口
Jan 21 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
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
python中List的sort方法指南
2014/09/01 Python
python3抓取中文网页的方法
2015/07/28 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
学生自我鉴定
2013/12/18 职场文书
综艺节目策划方案
2014/06/13 职场文书
心得体会的写法
2014/09/05 职场文书
2015年化验室工作总结
2015/04/23 职场文书
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
浅谈Redis缓冲区机制
2022/06/05 Redis