万万没想到 一盒月饼火了!这款秘制Python月饼,拿走不谢!

Posted 顾木子吖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万万没想到 一盒月饼火了!这款秘制Python月饼,拿走不谢!相关的知识,希望对你有一定的参考价值。

导语

每年的中秋节,

总会有一大批不明觉厉的月饼悄悄出现~

总有一款适合你

而今年这款月饼却意外脱颖而出...

当当当当!你见过Python馅儿的月饼嘛?

没错,这就是今年的新口味月饼

Python牌月饼

哈哈哈,前一篇文章就是python牌儿的巧克力月饼,欢迎阅读哦~

【中秋来袭】卧槽!没想到,用Python竟能做巧克力月饼![附源码]

木木子几乎可以想象,Python牌月饼将受到怎样的热捧,大约每个人都想入手一堆

一天吃不完?没关系,你有中秋长假可以慢慢品尝。

假期这么长、月亮这么圆,记得要和爱的人团聚

而今天木木子想趁时光正好,带你们去尝一下自己秘制的中秋“月饼”!

 

 正文

本文是制作一款Python月饼牌儿的拼图小游戏哈!

Python馅儿的月饼制作就在之前写过的记得阅读啦!

(1)环境安装。

Python版本:Python 3.6  、开发工具:PyCharm。部分Python自带内置模块。

第三方模块:pygame。  

注意:在使用第三方模块时,首先需要使用pip install命令安装该模块,可以在命令窗口中执行以下命令: 

 pip install pygame

(2)月饼图片素材。

​​

(3)游戏开始界面设置,主要分三个等级的模式:H为5*5模式, M为4*4模式, L为3*3模式。

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()

​​

​(4)准备了几张月饼的素材图片,是定义的随机生成,也可以指定哈。

def GetImagePath(rootdir):
    imagenames = os.listdir(rootdir)
    assert len(imagenames) > 0
    return os.path.join(rootdir, random.choice(imagenames))

(5)游戏结束界面,完成拼图。

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 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('拼图游戏 —— 源码基地:959755565')
    # 游戏开始界面
    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)

​游戏效果:

​​​​​总结

最难的那关,我图都不敢放了,你们自己去试试吧??制作不易,记得一键三连哦!!

如果需要本文完整的代码+图片素材, 欢迎阅读往期文章哦~

Python新手安装包、免费激活码、等等更多Python资料 

老规矩源码基地见:【959755565】即可免费领取哦!!

以上是关于万万没想到 一盒月饼火了!这款秘制Python月饼,拿走不谢!的主要内容,如果未能解决你的问题,请参考以下文章

知乎之后,B站的月饼也“喷射”了?

中秋节月饼不知道买哪种?Python爬取4000种月饼类别告诉你答案!

亲测吃知乎月饼变身“喷射战士”,我给大家科普一下发生甚么事了

L2-003 月饼 python实现

最好吃的月饼!用Python爬取了某宝1166家月饼进行可视化分析!

把月亮带回家,让白月光照亮这人间圆满——澳门Branco A LUA月饼包装设计