【python】day07 pygame的几款游戏练习(简单版)找不同、消灭单词、汤姆猫、看图猜名

目录

 

01-pygame编写小程序的模板

02-找不同

02-1:项目解释

02-2:项目代码

02-2-1:初始介绍:

02-2-2 完整版:

03-消灭单词

03-1:项目解释

03-2:项目代码

04-汤姆猫

02-1:项目解释

02-2:项目代码

02--2-1:一个点击图标动画

02--2-2:点击图标+点击区域动画

05-看图猜名

02-1:项目解释

02-2:项目代码


01-pygame编写小程序的模板

写项目直接复制下来,然后改掉不同的部分,比如屏幕大小,名称和背景颜色等。

import sys,pygame

class FindDifference:
    #1.初始化函数
    def __init__(self):
        #设置初始化屏幕大小
        self.screen=pygame.display.set_mode((800,600))
    #2.主架构函数
    def menu(self):
        # 2.1 设置窗口名称
        pygame.display.set_caption('找不同')
        # 2.2 死循环
        while True:
            # 2.3 设置屏幕背景颜色
            self.screen.fill((255,255,255))
            # 2.4 调用业务执行函数
            self.action()
            # 2.5 调用绘制函数
            self.paint()
            # 2.7 延迟刷新频率
            pygame.time.delay(10)
            # 2.6 设置屏幕刷新
            pygame.display.update()
    #3.业务执行函数
    def action(self):
        # 3.1 获取pygame中所有的监听事件
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
    #4.绘制函数
    def paint(self):
        pass
    
if __name__=='__main__':
    fd=FindDifference()
    fd.menu()

02-找不同

02-1:项目解释

找到两张图片的不同之处:

        其实就是点击左边的图(或者右边的图)的不同之处时,能够在两张图上分别绘制出一个矩形框。【这个找不同并不是高级的深度学习类似的匹配,也不能精确框出一个物体】

02-2:项目代码

02-2-1:初始介绍:

此时通过鼠标点击图片可以获取鼠标的坐标值,依此可以获得不同之处的左上角。

python利用左上角作为原点,对一个图片进行排放。

此时的代码:

'''
找不同游戏
    点击图片中不一样的区域 产生两个红色矩形框(红色)
    鼠标的监听事件
    if event.type == pygame.MOUSEBUTTONDOWN:
        # 获取鼠标的坐标值
        mx,my = pygame.mouse.get_pos()
        # 获取鼠标的左键是否点击
        leftFlag = pygame.mouse.get_pressed()[0]
        if leftFlag and 100<mx<200 and 100<my<200:
            print("恭喜您,答对了")
'''
import sys,pygame

class FindDifference:
    #1.初始化函数
    def __init__(self):
        # 设置初始化屏幕大小
        self.screen=pygame.display.set_mode((800,600))
        # 背景图片
        self.back=pygame.image.load('FindDifference.png')
    #2.主架构函数
    def menu(self):
        # 2.1 设置窗口名称
        pygame.display.set_caption('找不同')
        # 2.2 死循环
        while True:
            # 2.3 设置屏幕背景颜色
            self.screen.fill((255,255,255))
            # 2.4 调用业务执行函数
            self.action()
            # 2.5 调用绘制函数
            self.paint()
            # 2.7 延迟刷新频率
            pygame.time.delay(10)
            # 2.6 设置屏幕刷新
            pygame.display.update()
    #3.业务执行函数
    def action(self):
        # 3.1 获取pygame中所有的监听事件
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
            # 3.3 判断是否点击该位置
            if event.type==pygame.MOUSEBUTTONDOWN:
                # 3.3.1 左键是否点击 0左键  1代表双击 2右击
                leftFlag=pygame.mouse.get_pressed()[0]
                #运行时点击图片获得点击位置
                mx,my=pygame.mouse.get_pos()
                print(f'mx:{mx},my:{my}')

    #4.绘制函数
    def paint(self):
        #设置背景图
        self.screen.blit(self.back,(0,0))

if __name__=='__main__':
    fd=FindDifference()
    fd.menu()

02-2-2 完整版:

'''
找不同游戏
    点击图片中不一样的区域 产生两个红色矩形框(红色)
    鼠标的监听事件
    if event.type == pygame.MOUSEBUTTONDOWN:
        # 获取鼠标的坐标值
        mx,my = pygame.mouse.get_pos()
        # 获取鼠标的左键是否点击
        leftFlag = pygame.mouse.get_pressed()[0]
        if leftFlag and 100<mx<200 and 100<my<200:
            print("恭喜您,答对了")
'''
import sys,pygame

class FindDifference:
    #1.初始化函数
    def __init__(self):
        # 设置初始化屏幕大小
        self.screen=pygame.display.set_mode((800,600))
        # 背景图片
        self.back=pygame.image.load('FindDifference.png')
        # 不同区域列表
        self.dif=[
            #[左上角横坐标,左上角纵坐标,框选区域横长,框选区域纵长]
            [51,114,50,50],
            [0,230,90,90],
            [360,450,35,50]
        ]
        self.rec=[]
    #2.主架构函数
    def menu(self):
        # 2.1 设置窗口名称
        pygame.display.set_caption('找不同')
        # 2.2 死循环
        while True:
            # 2.3 设置屏幕背景颜色
            self.screen.fill((255,255,255))
            # 2.4 调用业务执行函数
            self.action()
            # 2.5 调用绘制函数
            self.paint()
            # 2.7 延迟刷新频率
            pygame.time.delay(10)
            # 2.6 设置屏幕刷新
            pygame.display.update()
    #3.业务执行函数
    def action(self):
        # 3.1 获取pygame中所有的监听事件
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
            # 3.3 判断是否点击该位置
            if event.type==pygame.MOUSEBUTTONDOWN:
                # 3.3.1 左键是否点击 0左键  1代表双击 2右击
                leftFlag=pygame.mouse.get_pressed()[0]
                #运行时点击图片获得点击位置
                mx,my=pygame.mouse.get_pos()
                print(f'mx:{mx},my:{my}')
                for df in self.dif:
                    if leftFlag\
                        and df[0]<=mx<=df[0]+df[2]\
                        and df[1]<=my<=df[1]+df[2]:
                        self.rec.append(df)

    #4.绘制函数
    def paint(self):
        #设置背景图
        self.screen.blit(self.back,(0,0))
        #绘制选中框
        for df in self.rec:
            #左边
            pygame.draw.rect(self.screen,(255,0,0),(df[0],df[1],df[2],df[3]),8)
            #右边
            pygame.draw.rect(self.screen, (255, 0, 0), (df[0]+400,df[1],df[2], df[3]), 8)

if __name__=='__main__':
    fd=FindDifference()
    fd.menu()

03-消灭单词

03-1:项目解释

01-MyWord
1.搭建项目架构
2.初始化函数
3.主架构函数
4.业务执行函数
5.绘制函数
6.main函数

业务需求:
    1.创建10个字母 从上往下落
        1.1 init函数设置
            self.x ===>随机的坐标值
            self.y ===>随机的坐标值
            self.word ====>存储的是10个随机字母====>ASCCII码值
        1.2 paint函数
            使用绘制字符串
        1.3 action函数中
            循环修改y的坐标值
            使用key与我们的系统产生的words进行比较

课堂练习
    1.绘制背景图片
    2.字体颜色  固定每次字体下落的颜色 单击成功后修改颜色
        self.colors = []
    3.设置分数
        self.score = 0
        绘制到界面上
        字母击中  +5分
        字母落下  超过下边界 -10分
    4. 根据分数修改速度
        self.speed = 10
        分数越高  下落的速度越快

03-2:项目代码

'''
01-MyWord
1.搭建项目架构
2.初始化函数
3.主架构函数
4.业务执行函数
5.绘制函数
6.main函数

业务需求:
    1.创建10个字母 从上往下落
        1.1 init函数设置
            self.x ===>随机的坐标值
            self.y ===>随机的坐标值
            self.word ====>存储的是10个随机字母====>ASCCII码值
        1.2 paint函数
            使用绘制字符串
        1.3 action函数中
            循环修改y的坐标值
            使用key与我们的系统产生的words进行比较

课堂练习
    1.绘制背景图片
    2.字体颜色  固定每次字体下落的颜色 单击成功后修改颜色
        self.colors = []
    3.设置分数
        self.score = 0
        绘制到界面上
        字母击中  +5分
        字母落下  超过下边界 -10分
    4. 根据分数修改速度
        self.speed = 10
        分数越高  下落的速度越快
'''
import pygame,sys,random

class MyWord:
    # 1.初始化函数
    def __init__(self):
        # 1.1 窗口对象
        self.screen=pygame.display.set_mode((800,600))
        # 1.2 设置随机坐标值
        self.x=[random.randint(0,800) for i in range(10)]
        self.y=[random.randint(0,600) for i in range(10)]
        # 1.3 设置随机产生的字母
        # A===>65 a===>97 产生大写字母的ASCCII值
        self.word=[random.randint(65,90) for i in range(10)]
        # 1.4 背景图片
        self.back=pygame.image.load('myword.png')
        # 1.5 字体颜色 getColor函数返回  列表 [R,G,B]
        self.colors = [self.getColor() for i in range(10)]
        # 1.6 分数
        self.score=0
        # 1.7 速度
        self.speed = 10
    # 2.窗口的架构
    def menu(self):
        # 2.1 设置窗口的标题
        pygame.display.set_caption('MyWord')
        # 2.2 设置死循环
        while True:
            # 2.3 设置背景颜色
            self.screen.fill((255,255,255))
            # 2.4 调用业务执行函数
            self.action()
            # 2.5 调用绘制函数
            self.paint()
            # 2.6 延迟刷新
            pygame.time.delay(self.speed)
            # 2.7 刷新屏幕
            pygame.display.update()
    # 3.业务执行函数
    def action(self):
        # 3.1 循环遍历所有的监听事件
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
            # 3.3 键盘监听事件
            if event.type==pygame.KEYDOWN:
                # 循环遍历进行判断
                # 键盘与words比较如下
                for i in range(10):
                    # key中的所有值  比较小写的字母  97 a  65 A
                    # if event.key==self.words[i]+32:
                    if event.key==self.word[i]+32\
                        and self.y[i]>0:# 字母显示在窗口中
                        # 修改分数
                        self.score+=5
                        # 修改颜色值,让单词消失,也就是将原本的单词替换成新的单词
                        self.colors[i]=self.getColor()
                        self.x[i]=random.randint(0,800)
                        self.y[i]=random.randint(0,600)
                        self.word[i]=random.randint(65,90)
                        break
        # 3.4 循环遍历坐标值
        for i in range(10):
            self.y[i]+=1
            if self.y[i]>600:
                # 修改分数
                self.score-=10
                self.y[i]=0
        # 3.5 根据分数修改速度
        if 0<=self.score<50:
            self.speed=8
        elif 50<=self.score<70:
            self.score=5
        elif 70<=self.score<90:
            self.score=3
        elif 90<=self.score:
            self.speed=1

    # 4.绘制图形图案函数
    def paint(self):
        '''绘制背景图'''
        self.screen.blit(pygame.transform.scale(self.back,(800,600)),(0,0))
        # 4.1 初始化字体
        pygame.font.init()
        # 4.2 设置字体样式
        ft=pygame.font.Font('msyhbd.ttc',28)
        # 4.3 绘制内容
        for i in range(0,10):
            strName = chr(self.word[i])
            ftRender= ft.render(strName,True,(255,255,255))
            self.screen.blit(ftRender,(self.x[i],self.y[i]))
        # 4.4 绘制分数
        ftScore=ft.render('score:%d'%self.score,True,(255,0,0))
        self.screen.blit(ftScore,(100,100))

    # 5.获取颜色列表
    def getColor(self):
        R=random.randint(0,255)
        G = random.randint(0, 255)
        B = random.randint(0, 255)
        return [R,G,B]

if __name__=='__main__':
    mWord=MyWord()
    mWord.menu()

04-汤姆猫

02-1:项目解释

点击6个图标和5个区域汤姆猫做出反应,即动画

02-2:项目代码

02--2-1:一个点击图标动画

'''
01-MyTom 帧动画
    1.搭建项目架构
    2.绘制背景图
        2.1  init函数 self.back变量
        2.2  paint函数 绘制背景图
    3.帧动画效果
        3.1 init函数  设置列表 self.eatList
        3.2 init函数  设置变量 self.ix
        3.3 action函数中  调整back的使用
    4.点击动画效果
        4.1 init函数 设置吃鸟动作 self.eatImg
        4.2 paint函数 绘制吃鸟图片
        4.3 action函数中 添加鼠标监听事件
    5.动画的停止
        5.1 init函数中  设置总帧数  self.counts
        5.2 action函数中 设置  self.counts =40的值
'''
import pygame,sys

class MyTom:
    # 1.初始化函数
    def __init__(self):
        # 1.1 设置窗口对象
        self.screen=pygame.display.set_mode((320,512))
        # 1.2 设置背景图片
        self.back = pygame.image.load('Animations/Eat/eat_00.jpg')
        # 1.3 设置吃鸟的动作列表
        # day08/Animations/Eat/eat_00.jpg
        # day08/Animations/Eat/eat_01.jpg
        self.eatList=['Animations/Eat/eat_%02d.jpg'%i for i in range(40)]
        # 1.4 设置背景图片下标
        self.ix=0
        # 1.5 设置吃鸟动作图片
        self.eatImg=pygame.image.load('Buttons/eat.png')
        # 1.6 设置动画的总帧数
        self.count=-1

    # 2.设置主结构
    def menu(self):
        # 2.1 设置标题
        pygame.display.set_caption("MyTom")
        # 2.2 死循环
        while True:
            self.screen.fill((255,255,255))
            # 2.3 调用业务执行函数
            self.action()
            # 2.4 调用绘制函数
            self.paint()
            # 2.5 延迟操作
            pygame.time.delay(5)
            # 2.6 刷新屏幕
            pygame.display.update()

    # 3.设置action
    def action(self):
        # 3.1 循环遍历
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
            '''动画效果开始 鼠标单击事件'''
            if event.type==pygame.MOUSEBUTTONDOWN:
                # 获取是否点击  0代表单击  1代表双击  2代表右击
                leftFlag=pygame.mouse.get_pressed()[0]
                # 获取鼠标的坐标值
                mx,my=pygame.mouse.get_pos()
                if leftFlag\
                    and 30<mx<30+60 and 350<my<350+60:
                    # 修改总帧数
                    self.count=40
        '''核心代码- 修改图片内容'''
        # 3.3 修改计数值  每运行一次 ix更改  0-39
        self.ix+=1
        # 3.4 根据ix的值修改背景图片
        # 根据ix值得到eatList中的图片路径 根据路径获取图片 根据图片修改back值
        # ix = 0 <  counts -1 False 不会修改图片
        # ix = 0 <  counts 40 True  会修改图片
        # ix = 40 < counts 40 False 停止动画效果   ix = 0 counts = -1
        if self.ix<self.count:
            self.back=pygame.image.load(self.eatList[self.ix])
        else:
            self.ix=0
            self.count=-1
        # 只展现一张图片
        # if self.ix<len(self.eatList):
        #     self.back=pygame.image.load(self.eatList[self.ix])
        # else:
        #     self.ix=0
    # 4.设置绘制函数
    def paint(self):
        # 4.1 绘制背景图
        self.screen.blit(pygame.transform.scale(self.back,(320,512)),(0,0))
        # 4.2 绘制吃鸟动作图片
        self.screen.blit(self.eatImg,(30,350))
        #pygame.draw.rect(self.screen,(255,0,0),(100,100,100,100),2)
if __name__=='__main__':
    mTom=MyTom()
    mTom.menu()

02--2-2:点击图标+点击区域动画

'''
01-MyTom 帧动画
    1.搭建项目架构
    2.绘制背景图
        2.1  init函数 self.back变量
        2.2  paint函数 绘制背景图
    3.帧动画效果
        3.1 init函数  设置列表 self.eatList
        3.2 init函数  设置变量 self.ix
        3.3 action函数中  调整back的使用
    4.点击动画效果
        4.1 init函数 设置吃鸟动作 self.eatImg
        4.2 paint函数 绘制吃鸟图片
        4.3 action函数中 添加鼠标监听事件
    5.动画的停止
        5.1 init函数中  设置总帧数  self.counts
        5.2 action函数中 设置  self.counts =40的值
'''
import pygame,sys

class MyTom:
    # 1.初始化函数
    def __init__(self):
        # 1.1 设置窗口对象
        self.screen=pygame.display.set_mode((320,512))
        # 1.2 设置背景图片
        self.back = pygame.image.load('Animations/Eat/eat_00.jpg')
        # 1.3 设置吃鸟的动作列表
        # day08/Animations/Eat/eat_00.jpg
        # day08/Animations/Eat/eat_01.jpg
        self.eatList=['Animations/Eat/eat_%02d.jpg'%i for i in range(40)]
        # 1.4 设置背景图片下标
        self.ix=0
        # 1.5 设置动作图片
        # 吃鸟
        self.eatImg=pygame.image.load('Buttons/eat.png')
        # 喝牛奶
        self.drink = pygame.image.load("Buttons/drink.png")
        # 敲钹
        self.cymbal = pygame.image.load("Buttons/cymbal.png")
        # 放屁
        self.fart = pygame.image.load("Buttons/fart.png")
        # 派
        self.pie = pygame.image.load("Buttons/pie.png")
        # 抓
        self.scratch = pygame.image.load("Buttons/scratch.png")
        # 1.6 设置动画的总帧数
        self.count=-1
        # 1.7 图标动画列表
        self.image = [
            [40, 'eat', 30, 350],
            [81, 'drink', 30, 420],
            [13, 'cymbal', 30, 280],
            [28, 'fart', 240, 280],
            [24, 'pie', 240, 350],
            [56, 'scratch', 240, 420]
        ]
        # 脸
        self.btList = [
            [60, 85, 190, 165],
            [166, 313, 100, 34],
            [114, 458, 40, 20],
            [163, 464, 40, 20],
            [211, 378, 26, 80]
        ]
        # 1.8 绘制列表
        self.rectList = []
        # 1.9 图片路径存储列表
        self.pathList = []
    # 2.设置主结构
    def menu(self):
        # 2.1 设置标题
        pygame.display.set_caption("MyTom")
        # 2.2 死循环
        while True:
            self.screen.fill((255,255,255))
            # 2.3 调用业务执行函数
            self.action()
            # 2.4 调用绘制函数
            self.paint()
            # 2.5 延迟操作
            pygame.time.delay(5)
            # 2.6 刷新屏幕
            pygame.display.update()

    # 3.设置action
    def action(self):
        # 3.1 循环遍历
        for event in pygame.event.get():
            # 3.2 判断是否退出
            if event.type==pygame.QUIT:
                sys.exit()
            '''动画效果开始 鼠标单击事件'''
            if event.type==pygame.MOUSEBUTTONDOWN:
                # 获取是否点击  0代表单击  1代表双击  2代表右击
                leftFlag=pygame.mouse.get_pressed()[0]
                # 获取鼠标的坐标值
                mx,my=pygame.mouse.get_pos()
                #图标动画
                if leftFlag:
                    for bt in self.image:
                        # 1.吃鸟
                        if bt[2] < mx < bt[2] + 60 and bt[3] < my < bt[3] + 60:
                            # 1.1 修改总数
                            self.counts = bt[0]
                            # 1.2 修改列表的值
                            self.updateImage("%s" % bt[1])
                # if leftFlag:
                #     if self.btList[0][0]<=mx<=self.btList[0][0]+self.btList[0][2]\
                #             and self.btList[0][1]<=my<=self.btList[0][1]+self.btList[0][3]:
                #             self.counts=26
                #             self.updateImage("angry")
                #     elif self.btList[1][0]<=mx<=self.btList[1][0]+self.btList[1][2]\
                #             and self.btList[1][1]<=my<=self.btList[1][1]+self.btList[1][3]:
                #             self.counts = 34
                #             self.updateImage("stomach")
                #     elif
                # for bt in self.btList:
                #     if leftFlag \
                #             and bt[0] <= mx <= bt[0] + bt[2] \
                #             and bt[1] <= my <= bt[1] + bt[3]:
                #         # 将选中的不同点击添加到列表中
                #         self.rectList.append(bt)
                #         print(f'bt:{bt}')
                # for rt in self.rectList:
                #     if int(rt[0][0])==:
                #         self.counts=26
                #         self.updateImage("angry")
                #     elif self.rectList[rt]==self.btList[1]:
                #         self.counts=34
                #         self.updateImage("stomach")
                #     elif self.rectList[rt]==self.btList[2]:
                #         self.counts=30
                #         self.updateImage("footright")
                #     elif self.rectList[rt]==self.btList[3]:
                #         self.counts=30
                #         self.updateImage("footleft")
                #     elif self.rectList[rt]==self.btList[4]:
                #         self.counts=81
                #         self.updateImage("knockout")
                #     else:
                #         break
                # 7.循环遍历 0x   1y  2w  3h
                #身体区域动画
                if leftFlag:
                    for i in range(5):
                        if self.btList[i][0] <= mx <= self.btList[i][0] + self.btList[i][2] \
                                and self.btList[i][1] <= my <= self.btList[i][1] + self.btList[i][3]:
                            if i == 0:
                                self.counts = 26
                                self.updateImage("angry")
                            elif i == 1:
                                self.counts = 34
                                self.updateImage("stomach")
                            elif i == 2:
                                self.counts = 30
                                self.updateImage("footright")
                            elif i == 3:
                                self.counts = 30
                                self.updateImage("footleft")
                            elif i == 4:
                                self.counts = 81
                                self.updateImage("knockout")
                            else:
                                break
        '''核心代码- 修改图片内容'''
        # 3.3 修改计数值  每运行一次 ix更改  0-39
        self.ix+=1
        # 3.4 根据ix的值修改背景图片
        # 根据ix值得到eatList中的图片路径 根据路径获取图片 根据图片修改back值
        # ix = 0 <  counts -1 False 不会修改图片
        # ix = 0 <  counts 40 True  会修改图片
        # ix = 40 < counts 40 False 停止动画效果   ix = 0 counts = -1
        # 减少动画频率值
        index = int(self.ix / 10 % self.counts + 1)
        if index < self.counts:
            self.back = pygame.image.load(self.pathList[index])
        else:
            self.ix=0
            self.count=-1
            # 如果动画停止  列表进行清空 self.pathList = []
            del self.pathList[:]
        # 只展现一张图片
        # if self.ix<len(self.eatList):
        #     self.back=pygame.image.load(self.eatList[self.ix])
        # else:
        #     self.ix=0
    # 4.设置绘制函数
    def paint(self):
        # 4.1 绘制背景图
        self.screen.blit(pygame.transform.scale(self.back,(320,512)),(0,0))
        # 4.2 绘制吃鸟动作图片
        self.screen.blit(self.eatImg,(30,350))
        # 4.3 绘制喝牛奶
        self.screen.blit(self.drink,(30,420))
        # 4.4 绘制钹
        self.screen.blit(self.cymbal,(30,280))
        # 4.5 绘制放屁
        self.screen.blit(self.fart, (240, 280))
        # 4.6 绘制派
        self.screen.blit(self.pie, (240, 350))
        # 4.7 绘制抓
        self.screen.blit(self.scratch, (240, 420))
    # 5.修改列表的图片值
    def updateImage(self,name):
        # 要先设置self.counts的值
        for i in range(0,self.counts):
            # Animations/%s/%s_%02d.jpg
            self.pathList.append("Animations/%s/%s_%02d.jpg"%(name,name,i))

if __name__=='__main__':
    mTom=MyTom()
    mTom.menu()

05-看图猜名

02-1:项目解释

1.完成超级猜图的游戏代码编写
    1.1 答案 选项 都是列表形式
    1.2 init函数中就需要读取文件并解析内容存储到各种列表中

02-2:项目代码

'''
1.完成超级猜图的游戏代码编写
    1.1 答案 选项 都是列表形式
    1.2 init函数中就需要读取文件并解析内容存储到各种列表中
'''
import  pygame,os,sys

class Guess:
    # 1.初始化函数
    def __init__(self):
        # 1.1 窗口对象
        self.screen = pygame.display.set_mode((1000, 600))
        # 1.2 设置答案的列表
        self.answerList = []
        # 1.3 设置标题列表
        self.titleList = []
        # 1.4 设置图片列表
        self.iconList = []
        # 1.5 设置选项列表
        self.optionsList = []
        # 1.6 读取文件内容 函数
        self.getList()
        # 1.7 设置图片关卡 当前第几张图
        self.numbers = 0
        # 1.8 设置用户的答案选项
        self.userAnswer = []
    # 2.主架构
    def menu(self):
        # 2.1 设置标题内容
        pygame.display.set_caption("超级猜图")
        # 2.2 死循环
        while True:
            # 2.3 设置背景颜色
            self.screen.fill((0, 0, 0))
            # 2.4 调用业务执行函数
            self.action()
            # 2.5 调用绘制函数
            self.paint()
            # 2.6 设置刷新屏幕
            pygame.display.update()

    # 3.业务函数
    def action(self):
        # 3.1获取所有的监听事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            '''鼠标监听事件'''
            if event.type == pygame.MOUSEBUTTONDOWN:
                # 3.2获取鼠标的点击
                leftFlag = pygame.mouse.get_pressed()[0]
                # 3.3获取鼠标的坐标值
                mx, my = pygame.mouse.get_pos()
                # 3.4判断是否在选项区域
                self.judgeOptionRect(leftFlag, mx, my)
                # 3.5判断是否在答案区域
                self.judgeAnswerRect(leftFlag, mx, my)
        # 3.6 判断是否胜利
        self.judgeWin()

    # 3.4 判断是否在选项区域
    def judgeOptionRect(self, leftFlag, mx, my):
        # 3.4.1 判断顶级是否在选项区域
        if leftFlag and 100 < mx < 100 + 10 * 80 and 450 < my < 590:
            # 判断点击哪一行那一列的框
            col = int((mx - 100) / 80)
            row = int((my - 450) / 50)
            # 设置变量twoCol 二维列表0-9第一行的数据 10-19第二行的数据
            # col 第二行需要+10再去取列表中的值
            twoCol = 10 + col if row > 0 else col
            if len(self.userAnswer)<len(self.answerList[self.numbers]):
                self.userAnswer.append(self.optionsList[self.numbers][twoCol])

    # 3.5 判断是否在答案区域
    def judgeAnswerRect(self,leftFlag,mx,my):
        rtx = 320 / len(self.answerList[self.numbers])
        if leftFlag and \
            320 < mx<320+rtx*len(self.answerList[self.numbers]) \
            and 390<my<440:
            col = int ((mx -320)/rtx)
            if len(self.userAnswer)!=0:
                del self.userAnswer[col]

    # 3.6 判断是否胜利
    def judgeWin(self):
        # 将用户的答案组成字符串
        userMsg = ""
        for ms in self.userAnswer:
            userMsg += ms
        # 判断是否一致
        if userMsg == self.answerList[self.numbers]:
            print("组件的字符串:", userMsg)
            del self.userAnswer[:]
            self.numbers += 1

    # 4.绘制函数
    def paint(self):
        # 4.1 绘制标题以及关卡
        pygame.font.init()
        ft = pygame.font.Font("msyhbd.ttc", 28)
        ftReader = ft.render("第%d图" % (self.numbers + 1), True, (255, 255, 0))
        self.screen.blit(ftReader, (300, 20))

        ft = pygame.font.Font("msyhbd.ttc", 30)
        ftReader = ft.render(self.titleList[self.numbers], True, (255, 0, 0))
        self.screen.blit(ftReader, (400, 20))
        # 4.2 绘制海报
        self.paintIcon()
        # 4.3 绘制填空选项(答案区域)
        self.paintAnswerRect()
        # 4.4 绘制选项框以及选项
        self.paintOptionRect()

    # 4.2 绘制海报
    def paintIcon(self):
        # 4.2.1 获取海报图片名称并加载
        iconImg = pygame.image.load("Image/%s.png" % self.iconList[self.numbers])
        # 4.2.2 绘制海报图片
        self.screen.blit(pygame.transform.scale(iconImg, (320, 300)), (300, 70))

    # 4.3 绘制填空选项
    def paintAnswerRect(self):
        # 4.3.1 设置绘制字体样式
        pygame.font.init()
        ft = pygame.font.Font("msyhbd.ttc", 35)
        # 4.3.2 循环遍历当前关卡的答案长度进行绘制填空框
        for i in range(0, len(self.answerList[self.numbers])):
            # 4.3.3 设置x值  rx是以左侧320的尺寸为起点
            rectW = 320 / len(self.answerList[self.numbers])
            # 320 400 480 560
            rx = 320 + rectW * i
            # rx是x坐标  450是y坐标  50,50 宽度和高度
            pygame.draw.rect(self.screen, (255, 255, 255), (int(rx), 390, 50, 50))
            '''4.3.4 绘制用户添加的答案'''
            for i in range(0, len(self.userAnswer)):
                ax = int(320 + rectW * i)
                ftRender = ft.render(self.userAnswer[i], True, (255, 0, 0))
                self.screen.blit(ftRender, (ax + 5, 390))

    # 4.4 绘制选线框以及选项
    def paintOptionRect(self):
        pass
        # 4.4.1 设置字体样式
        pygame.font.init()
        ft = pygame.font.Font("msyhbd.ttc",35)
        for i in range(0,20):
            # 第一行
            if i  < 10:
                rx = 100 + i * 80
                # 选项框
                pygame.draw.rect(self.screen,(255,255,255),(rx,450,50,50))
                ftRender = ft.render(self.optionsList[self.numbers][i],True,(255,0,0))
                self.screen.blit(ftRender,(rx+5,450))
            # 第二行
            else:
                rx = 100 + (i-10) * 80
                pygame.draw.rect(self.screen,(255,255,255),(rx,540,50,50))
                ftRender = ft.render(self.optionsList[self.numbers][i],True,(255,0,0))
                self.screen.blit(ftRender,(rx+5,540))

    # 5.获取文本的数据
    def getList(self):
        # 5.1 打开文件
        file = open("guess.txt", 'r')
        # 5.2 获取文件所有的内容
        lines = file.readlines()
        # 5.3 关闭文件
        file.close()
        # 5.4 循环遍历每一行文件内容
        for line in lines:
            # 5.5 调用解析函数进行数据分割
            self.clearData(line)

    # 6.数据解析分割函数
    def clearData(self,line):
        '''
            0 answer 0   越光宝盒 1
            1 icon:movie_ygbh
            2 title:恶搞风格的喜剧大片
            3 options:线,话,飞,人,笑,越,黄,工,大,超,传,特,宝,鸿,队,赤,光,人,壁,盒,王
        '''
        # 6.1 进行分割
        dataList = line.split("#")
        # 6.2 答案数据分割添加  <越光宝盒>
        self.answerList.append(dataList[0].split(":")[1])
        print("self.answerList:",self.answerList)
        # 6.3 图片数据分割添加 <movie_ygbh>
        self.iconList.append(dataList[1].split(":")[1])
        # 6.4 标题数据分割添加 <恶搞风格的喜剧大片>
        self.titleList.append(dataList[2].split(":")[1])
        # 6.5 选项数据的添加 <线,话,飞,人,笑,越,黄,工,大,超,传,特,宝,鸿,队,赤,光,人,壁,盒,王>
        option = dataList[3].split(":")[1].replace("\n","")
        # 二维选项列表
        self.optionsList.append(option.split(","))

if __name__=='__main__':
    guess=Guess()
    guess.menu()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值