当程序员纠结中午应该吃什么,那就用pygame来解决吧

写多了kotlin和android,最近想搞点小东西,于是拿出了长期没有宠爱的python,打算搞个小项目

想想应该写什么,对了,该吃饭了,诶,刚好,写一个能随机选择吃什么的小程序吧,只需要点击按钮,就会随机出现菜谱,然后再点一下,就会得出今天吃什么的结论

思路是这样的,读入一个txt文件,文件中写满想吃的东西,做到数据和代码区分,然后开始写UI,UI通过按钮点击随机展示美食即可

麻辣香锅
糖醋排骨
红烧肉
...
    import pygame
    import random
    ​
    class App:
        def __init__(self):
            # 初始化 Pygame
            pygame.init()
    ​
            # 创建窗口和设置标题
            self.window_size = (600, 300)
            self.window = pygame.display.set_mode(self.window_size)
            pygame.display.set_caption("What to Eat Today")
    ​
            # 设置字体对象
            self.font = pygame.font.Font('myfont.ttf', 32)
    ​
            # 加载菜单数据
            self.menu = []
            with open("menu.txt", "r") as f:
                for line in f:
                    line = line.strip()
                    if line != "":
                        self.menu.append(line)
                    print(line) # 打印数据
    ​
    if __name__ == "__main__":
        app = App()
    ​

运行一下

image-20230828201918635.png

nice,文件已经读入

这个时候的UI是一闪而过的,因为程序瞬间就执行完毕了,ok,那么我们就需要用一个循环维持UI窗口,然后设置开始选择按键,以及键盘控制按键,同时设置变量

today_menu表示今天吃的东西,

btn_start_stop表示按键文字,

cur_menu表示正处于随机中的美食,当我们按下开始按键时,cur_menu开始变换,当我们按下关闭按键时,cur_menu的数据就赋值到today_menu中,

show_wheel表示当前正处于随机中,还是已经结束了

只要增加一个无限循环,一切就会好起来的


            # 随机选择一道菜
            self.today_menu = ""
            self.btn_start_stop = "start"
            self.cur_menu = ""
    ​
            # 游戏主循环
            self.running = True
            self.show_wheel = False
    ​
    ​
            # 开关程序
            while self.running:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        self.running = False
                    elif event.type == pygame.MOUSEBUTTONDOWN:
                    ...
    ​
                    # 增加一个elif 按键s,show_wheel为true, 按下q, show_wheel为false
                    elif event.type == pygame.KEYDOWN:
                    ...

运行结果

image-20230828202631700.png

现在已经有了窗口,接下来需要在上面画东西了

所用到的就是draw函数


        def draw(self):
            # 绘制界面
            self.window.fill((255, 255, 255))
    ​
            # 绘制菜单
            menu_surface = self.font.render(f"Today's Menu: {self.today_menu}", True, (0, 0, 0))
            ...
    ​
            # 绘制按钮
            button_size = min(self.window_size[0] // 4, self.window_size[1] // 4)
            ...
    ​
            btn_start = self.font.render(f"{self.btn_start_stop}", True, (0, 0, 0))
             # 缩小start 文字字号 以适应按钮
            btn_start = pygame.transform.scale(btn_start, (button_size // 3 * 2, button_size // 3 * 2))
            self.window.blit(btn_start, (button_x + button_size // 2 - btn_start.get_width() // 2, button_y + button_size // 2 - btn_start.get_height() // 2))
    ​
            # 滚轮动画
            ...
            pygame.display.update()

运行

image-20230828202741990.png

上面的代码仅仅能够展示一个静态的页面,

虽然界面平平无奇,似乎只有两行字?不然,实际上暗藏玄🐔,只要我们加上这段,


            # 绘制滚轮动画
            if self.show_wheel:
                wheel_size = min(self.window_size) // 2
                wheel_x = self.window_size[0] // 2 - wheel_size // 2
                wheel_y = self.window_size[1] // 2 - wheel_size // 2
                wheel_rect = pygame.Rect(wheel_x, wheel_y, wheel_size, wheel_size)
                ...
    ​
                # 随机选择并显示菜谱
                menu_index = random.randint(0, len(self.menu) - 1)
                menu_surface = self.font.render(self.menu[menu_index], True, (0, 0, 0))
                self.window.blit(menu_surface, (wheel_x + wheel_size // 2 - menu_surface.get_width() // 2, wheel_y + wheel_size // 2 - menu_surface.get_height() // 2))
                self.cur_menu = self.menu[menu_index]

当我们点击“start"
在这里插入图片描述

发现中间的菜谱动了起来,动了起来!都是大家爱吃的,只需要点击右边的stop就可以固定结果!

真正麻烦的在于那个滚轮动画,可以想见,我们需要额外的一个无限循环,每一帧都要修改cur_menu,同时更新动画中的菜谱,然后点击stop后,将cur_menu赋值给到today_menu,最麻烦的不是这些逻辑,而是位置,滚轮动画的位置设置为窗口正中间,然后画了两条线,看起来更好看,有一种,狙击枪瞄准的感觉

最后,进行简单优化,比如设置定时关闭等,全代码如下,如果你也不知道吃什么,就用这段代码 + 在同目录自定义一个txt文件,把自己想吃的写上去吧

    import pygame
    import random
    ​
    class App:
        def __init__(self):
            # 初始化 Pygame
            pygame.init()
    ​
            # 创建窗口和设置标题
            self.window_size = (600, 300)
            self.window = pygame.display.set_mode(self.window_size)
            pygame.display.set_caption("What to Eat Today")
    ​
            # 设置字体对象
            self.font = pygame.font.Font('myfont.ttf', 32)
    ​
            # 加载菜单数据
            self.menu = []
            with open("menu.txt", "r") as f:
                for line in f:
                    line = line.strip()
                    if line != "":
                        self.menu.append(line)
    ​
            # 随机选择一道菜
            self.today_menu = ""
            self.btn_start_stop = "start"
            self.cur_menu = ""
    ​
            # 游戏主循环
            self.running = True
            self.show_wheel = False
            self.wheel_count = 0     # 记录滚轮动画播放的帧数
    ​
    ​
            # 开关程序
            while self.running:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        self.running = False
                    elif event.type == pygame.MOUSEBUTTONDOWN:
                        if not self.show_wheel:
                            self.show_wheel = True
                            self.wheel_count = 0  # 点击按钮后重置计数器为0
                            self.btn_start_stop = "stop"
                        else:
                            self.show_wheel = False
                            self.today_menu = self.cur_menu  # 点击停止赋值
                            self.btn_start_stop = "start"
    ​
                    # 增加一个elif 按键s,show_wheel为true, 按下q, show_wheel为false
                    elif event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_s:  # 按下 s 键
                            self.show_wheel = True
                            self.wheel_count = 0  # 重置计数器为0
                        elif event.key == pygame.K_q:  # 按下 q 键
                            self.show_wheel = False
                            self.today_menu = self.cur_menu  # 停止赋值
    ​
                self.draw()
    ​
        def draw(self):
            # 绘制界面
            self.window.fill((255, 255, 255))
    ​
            # 绘制菜单
            menu_surface = self.font.render(f"Today's Menu: {self.today_menu}", True, (0, 0, 0))
            menu_x = self.window_size[0] // 2 - menu_surface.get_width() // 2
            menu_y = self.window_size[1] // 2 - menu_surface.get_height() // 2
            self.window.blit(menu_surface, (menu_x, menu_y))
    ​
            # 绘制按钮
            button_size = min(self.window_size[0] // 4, self.window_size[1] // 4)
            button_x = self.window_size[0] - button_size - 20
            button_y = self.window_size[1] - button_size - 20
            button_rect = pygame.Rect(button_x, button_y, button_size, button_size)
            pygame.draw.circle(self.window, (255, 0, 0), (button_x + button_size // 2, button_y + button_size // 2), button_size // 2)
            pygame.draw.rect(self.window, (255, 255, 255), button_rect.inflate(-button_size // 8, -button_size // 8))
    ​
            btn_start = self.font.render(f"{self.btn_start_stop}", True, (0, 0, 0))
             # 缩小start 文字字号 以适应按钮
            btn_start = pygame.transform.scale(btn_start, (button_size // 3 * 2, button_size // 3 * 2))
            self.window.blit(btn_start, (button_x + button_size // 2 - btn_start.get_width() // 2, button_y + button_size // 2 - btn_start.get_height() // 2))
    ​
            # 绘制滚轮动画
            if self.show_wheel:
                wheel_size = min(self.window_size) // 2
                wheel_x = self.window_size[0] // 2 - wheel_size // 2
                wheel_y = self.window_size[1] // 2 - wheel_size // 2
                wheel_rect = pygame.Rect(wheel_x, wheel_y, wheel_size, wheel_size)
                pygame.draw.circle(self.window, (0, 0, 0), (wheel_x + wheel_size // 2, wheel_y + wheel_size // 2), wheel_size // 2)
                pygame.draw.circle(self.window, (255, 255, 255), (wheel_x + wheel_size // 2, wheel_y + wheel_size // 2), wheel_size // 2 - 10)
                pygame.draw.line(self.window, (0, 0, 0), (wheel_x + 10, wheel_y + wheel_size // 2), (wheel_x + wheel_size - 10, wheel_y + wheel_size // 2))
                pygame.draw.line(self.window, (0, 0, 0), (wheel_x + wheel_size // 2, wheel_y + 10), (wheel_x + wheel_size // 2, wheel_y + wheel_size - 10))
    ​
                # 随机选择并显示菜谱
                menu_index = random.randint(0, len(self.menu) - 1)
                menu_surface = self.font.render(self.menu[menu_index], True, (0, 0, 0))
                self.window.blit(menu_surface, (wheel_x + wheel_size // 2 - menu_surface.get_width() // 2, wheel_y + wheel_size // 2 - menu_surface.get_height() // 2))
                self.cur_menu = self.menu[menu_index]
                # 播放一定帧数后停止动画
                self.wheel_count += 1
                if self.wheel_count > 500:
                    self.show_wheel = False
                    self.today_menu = self.cur_menu  # 自动停止赋值
            pygame.display.update()
    ​
    if __name__ == "__main__":
        app = App()
    ​

Python 的迅速崛起对整个行业来说都是极其有利的 ,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
点击这里

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值