美文网首页
怎样追女孩子?当然是用python把她的照片做成拼图游戏,给她看

怎样追女孩子?当然是用python把她的照片做成拼图游戏,给她看

作者: 程序员小西 | 来源:发表于2022-03-02 11:03 被阅读0次

    前言:

    跟着小编,用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、开始时,随机从图片文件夹获取一张图片:如果想给整个宿舍的学姐做游戏,

    就把所有人的照片放进去,这样每次打开,会随机生成一个学姐的照片作为游戏背景。

    '''

    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把她的照片做成拼图游戏,给她看

          本文链接:https://www.haomeiwen.com/subject/egpsrrtx.html